我將在示例中描述我的問題。我會得到(play '(left nothing right left))
。列表中的一些名稱是真實的程序,其他我想跳過。計劃中的簡單解釋器
(define (left)
'left
)
我需要解釋列表中名稱的過程。解決辦法是什麼?
當我嘗試((car '(left nothing right left)))
我得到錯誤:程序的應用程序:預計程序,因爲:左(無參數)
我將在示例中描述我的問題。我會得到(play '(left nothing right left))
。列表中的一些名稱是真實的程序,其他我想跳過。計劃中的簡單解釋器
(define (left)
'left
)
我需要解釋列表中名稱的過程。解決辦法是什麼?
當我嘗試((car '(left nothing right left)))
我得到錯誤:程序的應用程序:預計程序,因爲:左(無參數)
(car '(left nothing right left))
計算結果爲符號left
,這是的一個存儲過程的名稱,但實際上沒有一個程序,所以你不能稱它。
你想建立一個關聯表映射符號的程序:
(define actions `((left . ,(lambda() 'left))
(right . ,(lambda() 'right))
(nothing . ,(lambda() (display "I'm staying put")))))
那麼你可以爲
((cdr (assoc (car '(left nothing right left)) actions)))
您也可以撥打第一個元素的相應功能列表使用quasiquoting來構建一個列表,其中包含您想評估的符號以及您不需要的符號的混合,例如
(play `(,left nothing nothing ,right nothing))
left
和right
將擴大到任何已將其定義爲(如過程),而nothing
不是未引述所以它會留下一個符號。 play
然後將不得不測試每個成員,看看它是否是一個過程,如:
(define (play xs)(for-each (lambda (x)(if (procedure? x)(x) x)) xs))
這是我再次返回符號左,而不是過程,但謝謝。你的建議使用符號。過程對幫助我找到這個答案http://stackoverflow.com/a/1834145/1226100幾乎相同的問題,我認爲它正在做我想要的。 – Houp 2012-02-22 18:31:01
@Houp:這是給你一個符號,因爲你的函數返回一個符號。 – 2012-02-23 19:31:38