2010-10-25 79 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