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.

  • 相关阅读:
    【QT 学习笔记】 一、 VS2015+ QT环境安装
    Ubuntu16.04 + caffe + cuda 环境搭建
    【Caffe学习笔记】一 、环境安装 Caffe + cuda + windows10 + VS2015 安装笔记, win7也适用
    【CNN】 吴恩达课程中几种网络的比较
    【图像处理】二 高斯滤波及其加速方法
    【图像处理 】 一、OSTU分割法
    1028: C语言程序设计教程(第三版)课后习题8.2
    函数和带参的宏,从三个数中找出最大的数
    Last Defence (run time error)
    Penalty
  • 原文地址:https://www.cnblogs.com/flowjacky/p/2842994.html
Copyright © 2011-2022 走看看