Common Lisp中的替换

时间:2017-01-11 20:18:40

标签: lisp common-lisp

我正在尝试用这种类型的两个参数编写一个函数:

substitutions (list_one, list_two)

list_one总是有这种形式(字母可以根据输入改变):

(1 ((1 2 ((1 2 r) (3 2 t) (4 3 c))) (3 4 ((5 6 y) (5 7 i)))))

list_two总是这种形式(数字可以根据输入改变):

(2 3 4 5 6)

我想用这种方式替代:

r-> 2
t -> 3
c -> 4
y -> 5
i -> 6

你能帮我吗?

2 个答案:

答案 0 :(得分:1)

一个不那么有效的解决方案是首先找到第一个树结构(第一个列表)中所有字母的列表,然后重复调用反复调用SUBST的结果。

要查找第一个列表中的非数字原子列表('字母'),您需要遍历在FIRST和REST列表上重复出现的树结构(第一个列表)

希望它有所帮助。

MA

答案 1 :(得分:1)

如果列表正确,您可以使用loop宏迭代它们并弹出可访问的自由变量中的参数:

(defun template-replace (template replacements)
  (labels ((iterate (template)
             (loop :for element :in template
                   :collect
                   (cond ((consp element) (iterate element))
                         ((symbolp element) (pop replacements))
                         (t element)))))
    (iterate template)))


(template-replace '(1 rep (4 rep (9 rep)) rep) '(foot inch mm multiplied))
; ==> (1 foot (4 inch (9 mm)) multiplied)