2016-07-22 65 views
0

我試圖從參數創建一個lambda這樣(apply (make-lambda '(a b) '(+ a b)) '(1 2))回報3這是從計劃中的兩個列表創建lambda的正確方法嗎?

我第一次嘗試(define (make-lambda params func) (lambda params func))回報(+ a b)

此代碼的工作,但感覺不對我說:(define (make-lambda params func) (eval (list 'lambda params func)))

什麼正確這樣做的方式?

+0

是這是在它運行的方案環境中使用還是這是您正在編寫的方案解釋器的一部分?這兩個將需要不同的答案.. – Sylwester

+0

我傾斜計劃,並希望確保我的解決方案不醜。 –

+0

您給我的印象是您需要在運行時製作程序。 'eval'是唯一能做到這一點的構造。通常使用這個和eval對優化有很大的影響,所以如果你給我們一個例子說明你如何使用它,我們可能會提出一個更好的解決方案。通常使用lambda和更高階函數的閉包就足夠了。 – Sylwester

回答

2

您必須對列表進行評估才能將其用作過程,否則只是恰好將符號lambda作爲第一個元素的數據列表。此語法是有點簡單,但在本質上是相同的:

(define (make-lambda params func) 
    (eval `(lambda ,params ,func))) 

這應該工作:

(apply (make-lambda '(a b) '(+ a b)) '(1 2)) 
=> 3 

另外,使用宏的建議通過Leppie:

(define-syntax make-lambda 
    (syntax-rules() 
    ((_ args body) 
    (lambda args body)))) 

使用它像這樣:

(apply (make-lambda (a b) (+ a b)) '(1 2)) 
=> 3 
+0

如果可能,宏觀解決方案會更好。 – leppie

+0

@leppie我感興趣的不僅僅是讓它工作。如果你有一個好的解決方案,請發佈它。 –

+0

很酷,不確定'syntax-rules'是否將引號刪除:D – leppie

0

因爲我無聊,如果你的方案支持syntax-case :)

(define-syntax make-lambda 
    (lambda (x) 
    (syntax-case x (quote) 
     [(_ (quote pars) (quote body)) 
     #'(lambda pars body)]))) 

PS:可能會與syntax-rules工作太(見奧斯卡·洛佩斯的答案)。所以我也很懶。

例子:http://eval.ironscheme.net/?id=186

這裏是一個syntax-rules版本:

(define-syntax make-lambda 
    (syntax-rules (quote) 
    [(_ (quote pars) (quote body)) 
     (lambda pars body)])) 

例子:http://eval.ironscheme.net/?id=187

注:記住,這正是你問什麼:d

相關問題