zoukankan      html  css  js  c++  java
  • 示例:字串代换

    CL-USER> (defstruct buf
           vec (start -1) (used -1) (new -1) (end -1))
    BUF


    CL-USER> (defun bref (buf n)
           (svref (buf-vec buf)
              (mod n (length (buf-vec buf)))))
    BREF


    CL-USER> (defun (setf bref) (val buf n)
           (setf (svref (buf-vec buf)
                (mod n (length (buf-vec buf))))
             val))
    (SETF BREF)


    CL-USER> (defun new-buf (len)
           (make-buf :vec (make-array len)))
    NEW-BUF


    CL-USER> (defun buf-insert (x b)
           (setf (bref b (incf (buf-end b))) x))
    BUF-INSERT


    CL-USER> (defun buf-pop (b)
            (prog1
            (bref b (incf (buf-start b)))
              (setf (buf-used b) (buf-start b)
                (buf-new b) (buf-end b))))
    BUF-POP


    CL-USER> (defun buf-next (b)
           (when (< (buf-used b) (buf-new b))
             (bref b (incf (buf-used b)))))
    BUF-NEXT


    CL-USER> (defun buf-reset (b)
           (setf (buf-used b) (buf-start b)
             (buf-new b) (buf-end b)))
    BUF-RESET


    CL-USER> (defun buf-clear (b)
           (setf (buf-start b) -1 (buf-used b) -1
             (buf-new b) -1 (buf-end b) -1))
    BUF-CLEAR


    CL-USER> (defun buf-flush (b str)
           (do ((i (1+ (buf-used b)) (1+ i)))
               ((> i (buf-end b)))
             (princ (bref b i) str)))
    BUF-FLUSH


    CL-USER> (defun file-subst (old new file1 file2)
           (with-open-file (in file1 :direction :input)
             (with-open-file (out file2 :direction :output
                      :if-exists :supersede)
               (stream-subst old new in out))))
    ;Compiler warnings :
    ;   In FILE-SUBST: Undefined function STREAM-SUBST
    FILE-SUBST


    CL-USER> (defun stream-subst (old new in out)
           (let* ((pos 0)
              (len (length old))
              (buf (new-buf len))
              (from-buf nil))
             (do ((c (read-char in nil :eof)
                 (or (setf from-buf (buf-next buf))
                 (read-char in nil :eof))))
             ((eql c :eof))
               (cond ((char= c (char old pos))
                  (incf pos)
                  (cond ((= pos len)
                     (princ new out)
                     (setf pos 0)
                     (buf-clear buf))               

                    ((not from-buf)
                     (buf-insert c buf))))
                 ((zerop pos)
                  (princ c out)
                  (when from-buf
                (buf-pop buf)
                (buf-reset buf)))
                 (t
                  (unless from-buf
                (buf-insert c buf))
                  (princ (buf-pop buf) out)
                  (buf-reset buf)
                  (setf pos 0))))
             (buf-flush buf out)))
    STREAM-SUBST

    然后在”C:\lispbox-0.7”路径下新建文件test1,test2

    test1中存储的内容:

    The struggle between Liberty and Authority is the most conspicuous feature
    in the portions of history with which we are earliest familiar, particularly
    in that of Greece, Rome, and England.
    然后在REPL中输入如下代码:

    CL-USER> (file-subst " th" " z" "test1" "test2")
    NIL

    打开test2,其内容为:

    The struggle between Liberty and Authority is ze most conspicuous feature
    in ze portions of history with which we are earliest familiar, particularly
    in zat of Greece, Rome, and England.

  • 相关阅读:
    LinkedHashMap源码学习
    HashMap源码学习
    Java中"或"运算与"与"运算快慢的三三两两
    Java源码记录
    SpringBoot系列随笔
    分布式事物
    分布式事物
    部署spring boot + Vue遇到的坑(权限、刷新404、跨域、内存)
    一次使用存储过程游标遇到的坑
    UML简单介绍—类图详解
  • 原文地址:https://www.cnblogs.com/flowjacky/p/2842994.html
Copyright © 2011-2022 走看看