公共Lisp中的替换

公共Lisp中的替换,lisp,common-lisp,Lisp,Common Lisp,我正在尝试编写一个具有两个此类参数的函数: substitutions (list_one, list_two) 列表\u始终包含此表单(字母可以根据输入内容更改): 列表2始终具有此表单(数字可以根据输入进行更改): 我想用这种方式代替: r-> 2 t -> 3 c -> 4 y -> 5 i -> 6 你能帮我个忙吗?一个不太有效的解决方案是首先在第一个树结构(第一个列表)中找到所有字母的列表,然后重复调用SUBST循环结果 要在第一个列表(“字母”)中找

我正在尝试编写一个具有两个此类参数的函数:

substitutions (list_one, list_two)
列表\u始终包含此表单(字母可以根据输入内容更改):

列表2始终具有此表单(数字可以根据输入进行更改):

我想用这种方式代替:

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

你能帮我个忙吗?

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

要在第一个列表(“字母”)中找到非数字原子列表,您需要遍历树结构(le first list),在列表的第一个和其余部分重复出现

希望能有帮助


MA

如果列表正确,您可以使用
循环
宏对其进行迭代,并弹出可访问自由变量中的参数:

(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)

因此,这不是一个免费的代码编写服务。你必须自己尝试解决这个问题。发布您的代码,然后我们将帮助您了解您做错了什么以及如何修复它。它如何知道哪些字母对应哪些数字?只是
list\u 1
中的第一个字母得到了
list\u two
中的第一个数字,第二个字母得到了第二个数字,依此类推?我尝试了各种方法,但都失败了,所以我决定在这里提问!我的问题是多层次列表。这意味着您需要编写一个递归函数。我知道它们不是答案,我没有在答案部分发布它们。它们旨在提示您自己解决问题。非常感谢!但是有没有其他方法可以不用标签和参数来做同样的事情?@Raynold总是有一些方法可以做得更紧凑一些,但是为什么你想用一种更困难、也许是次优的方式来解决它呢?一个提示是递归执行,它需要返回两个值。结果和剩余的替换。如果模板是
consp
,则使用
multiple value bind
car
获取结果,以便执行
cdr
。在rest中,如果元素不是符号且为null,则必须处理返回参数的操作,同时返回第一个替换项和其余替换项。
r-> 2
t -> 3
c -> 4
y -> 5
i -> 6
(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)