替换Scheme中列表中的元素

时间:2010-10-25 19:44:28

标签: list function replace scheme

我正在寻找Scheme中的一个函数,用一个值替换一个等式中的元素。

例如:'(+ a b c a) (1 2 3)应该给我'(+ 1 2 3 1)(我不想解决这个等式,它只是一个例子)

基本上,我想说a = 1,b = 2,c = 3

要继续,我会在另一个列表中提取我的第一个列表的变量。 然后,我在另一个列表中收到了预期的值。 现在,我想为变量赋值。

有关我如何进行的任何提示? 非常感谢。

2 个答案:

答案 0 :(得分:3)

您可以使用看似((a 1) (b 2) (c 3))的映射“关联列表”。

assq可以检索匹配对。因此,对于原始列表中的所有内容,您可以使用assq进行查找,然后将其替换。

所以:

  (lambda (ls a-list)
    (map (lambda (x)
           (let ((lookup (assq x a-list)))
             (if lookup
                 (cadr lookup)
                 x)))
         ls)))

将获取列表和关联列表,并将原始列表中的所有内容替换为替换(如果有)。

答案 1 :(得分:1)

这不是let做的吗?

> (let ((a 1) (b 2) (c 3))
     (+ a b c b))
=> 8

如果您不想评估表达式:

> (let ((a 1) (b 2) (c 3))
    `(+ ,a ,b ,c ,a))
=> (+ 1 2 3 1)