2017-01-11 146 views
-1

我試圖寫一個函數與此類型的兩個參數:替換Common Lisp中

substitutions (list_one, list_two) 

list_one始終這種形式(字母可以根據輸入更改):

(1 ((1 2 ((1 2 r) (3 2 t) (4 3 c))) (3 4 ((5 6 y) (5 7 i))))) 

list_two始終這種形式(數字可根據輸入更改):

(2 3 4 5 6) 

我想在THI替代s的方式:

r-> 2 
t -> 3 
c -> 4 
y -> 5 
i -> 6 

你能幫我嗎?

+5

等都不是免費的代碼編寫的服務。你必須嘗試自己解決問題。發佈您的代碼,然後我們會幫助您瞭解您做錯了什麼以及如何解決問題。 – Barmar

+0

它如何知道哪些字母映射到哪些數字?僅僅是'list_1'中的第一個字母得到了'list_two'中的第一個數字,第二個字母得到了第二個數字,依此類推? – Barmar

+0

我試過了,我失敗了,所以我決定在這裏問問!我的問題是更多的一級列表。 – Raynold

回答

0

一個不太有效的解決方案是首先找到第一個列表中的所有字母在第一個樹狀結構中(第一個列表),然後在LOOP上重複調用SUBST的結果。

要在第一個列表(「字母」)中找到非數字原子列表,您需要遍歷列表中第一個和第一個REST上的樹結構(第一個列表)。

希望它有幫助。

MA

+0

非常感謝! – Raynold

+0

歡迎您:) –

1

如果列表是正確的,你可以用loop宏觀迭代他們在訪問自由變量中彈出的參數:

(defun template-replace (template replacements) 
    (labels ((iterate (template) 
      (loop :for element :in template 
        :collect 
        (cond ((consp element) (iterate element)) 
         ((symbolp element) (pop replacements)) 
         (t element))))) 
    (iterate template))) 


(template-replace '(1 rep (4 rep (9 rep)) rep) '(foot inch mm multiplied)) 
; ==> (1 foot (4 inch (9 mm)) multiplied) 
+0

非常感謝!但是..有沒有另一種方式來做同樣的事情不使用標籤和:參數? – Raynold

+0

@Raynold總有辦法讓它變得更加狹隘,但你爲什麼要以更困難或者更不理想的方式來解決它?一個提示是遞歸地做它,它需要返回兩個值。結果和剩餘的替代品。如果模板是'consp',則使用'multiple-value-bind'從'car'中獲取結果,以便可以執行'cdr'。在其他情況下,如果元素不是符號,則必須處理返回參數,而在返回第一個元素和其餘的替換元素時返回null。 – Sylwester