2012-02-22 91 views
1

我將在示例中描述我的問題。我會得到(play '(left nothing right left))。列表中的一些名稱是真實的程序,其他我想跳過。計劃中的簡單解釋器

(define (left) 
    'left 
) 

我需要解釋列表中名稱的過程。解決辦法是什麼?

當我嘗試((car '(left nothing right left)))我得到錯誤:程序的應用程序:預計程序,因爲:左(無參數)

回答

4

(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))) 
+1

這是我再次返回符號左,而不是過程,但謝謝。你的建議使用符號。過程對幫助我找到這個答案http://stackoverflow.com/a/1834145/1226100幾乎相同的問題,我認爲它正在做我想要的。 – Houp 2012-02-22 18:31:01

+0

@Houp:這是給你一個符號,因爲你的函數返回一個符號。 – 2012-02-23 19:31:38

0

您也可以撥打第一個元素的相應功能列表使用quasiquoting來構建一個列表,其中包含您想評估的符號以及您不需要的符號的混合,例如

(play `(,left nothing nothing ,right nothing)) 

leftright將擴大到任何已將其定義爲(如過程),而nothing不是未引述所以它會留下一個符號。 play然後將不得不測試每個成員,看看它是否是一個過程,如:

(define (play xs)(for-each (lambda (x)(if (procedure? x)(x) x)) xs))