首页 > 解决方案 > 子字符串的基本 LISP 递归替换

问题描述

我正在尝试使用mapcar递归函数中的基本 LISP 命令(例如 no )用“X”替换列表中给定字符串的任何出现。

(defun removetext (symbol list replaced)
    (if (not list)   ; if initial list has been exhausted, return replaced list
        replaced
        (progn
            (if (eql (car list) symbol)   ; otherwise, if first element of list = symbol, replace with "X"
                (removetext symbol (cdr list) (cons "X" replaced)) 
                (removetext symbol (cdr list) (cons (car list) replaced)) ; otherwise keep it 
            )
            (format t "~D" replaced)
        )
    )
)

如果我用(removetext "E" '(A B C D E F F E) "").

这将返回NIL并且打印输出看起来像(F F E D C B A . )(F E D C B A . )(E D C B A . )(D C B A . )(C B A . )(B A . )(A . ).

我希望它返回(A B C D X F F X)

标签: replacelispcommon-lisp

解决方案


(defun removetext (symbol list replaced)
  (if (null list)
      (reverse replaced)
    (if (eql (car list) symbol)
        (removetext symbol (cdr list) (cons 'x         replaced)) 
        (removetext symbol (cdr list) (cons (car list) replaced)))))

例子:

CL-USER > (removetext 'E '(A B C D E F F E) ())
(A B C D X F F X)

推荐阅读