我正在寻找Scheme中的函数以用值替换等式中的元素。替换计划中的列表中的元素
例:'(+ a b c a)
与(1 2 3)
应该给我'(+ 1 2 3 1)
。 (我不希望解决的方程,这只是一个为例)
基本上,我想地说,A = 1,B = 2,C = 3
要继续,我提取我的第一个列表在另一个列表中的变量。 然后,我收到另一个列表中的期望值。 现在,我想给变量赋值。
有关我如何继续的提示? 非常感谢。
我正在寻找Scheme中的函数以用值替换等式中的元素。替换计划中的列表中的元素
例:'(+ a b c a)
与(1 2 3)
应该给我'(+ 1 2 3 1)
。 (我不希望解决的方程,这只是一个为例)
基本上,我想地说,A = 1,B = 2,C = 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)))
将采取列表和关联列表,并在最初的名单及其替代取代一切(如果有的话)。
谢谢。我会试试看! – esylvestre 2010-10-25 20:08:31
好的,正是我在找的东西。非常感谢!我会在明天解决你的问题。 – esylvestre 2010-10-25 21:13:25
难道这就是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)
嗯,我会试试看它是否适用于我的情况。 – esylvestre 2010-10-26 17:26:03
你有'A-> 1','B-> 2'等映射存储,或者是这两个列表中的元素的顺序是决定因素? – BudgieInWA 2010-10-25 19:52:21
是的。 但变量可能会出现不止一次。 – esylvestre 2010-10-25 19:56:14
对于这个或那个问题,回答“是”,而非常程序员,并没有告诉我们任何信息。另外,如果它是在顺序中,那么为什么被排除? – Greg 2010-10-25 20:00:33