2010-10-25 78 views
1

我正在寻找Scheme中的函数以用值替换等式中的元素。替换计划中的列表中的元素

例:'(+ a b c a)(1 2 3)应该给我'(+ 1 2 3 1)(我不希望解决的方程,这只是一个为例)

基本上,我想地说,A = 1,B = 2,C = 3

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

有关我如何继续的提示? 非常感谢。

+1

你有'A-> 1','B-> 2'等映射存储,或者是这两个列表中的元素的顺序是决定因素? – BudgieInWA 2010-10-25 19:52:21

+0

是的。 但变量可能会出现不止一次。 – esylvestre 2010-10-25 19:56:14

+0

对于这个或那个问题,回答“是”,而非常程序员,并没有告诉我们任何信息。另外,如果它是在顺序中,那么为什么被排除? – Greg 2010-10-25 20:00:33

回答

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

将采取列表和关联列表,并在最初的名单及其替代取代一切(如果有的话)。

+0

谢谢。我会试试看! – esylvestre 2010-10-25 20:08:31

+0

好的,正是我在找的东西。非常感谢!我会在明天解决你的问题。 – esylvestre 2010-10-25 21:13:25

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) 
+0

嗯,我会试试看它是否适用于我的情况。 – esylvestre 2010-10-26 17:26:03