示例:字串代换
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.