我正在尋找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