2010-09-19 38 views

回答

3

Scheme中有許多咖喱實現 - 沒有一個可以像Haskell一樣優雅,因爲函數總是一元函數,所以所有東西都可以被粘貼。 (但這當然可以在一個足夠強大的方案中實現,如Racket。)

至於你挖出的宏 - 這是一個非常糟糕的宏:它不僅使用不衛生的宏,它也是明確地調用eval,並依賴於環境的實現等。但使用簡單的syntax-rules宏很容易。 AFAICT,這是它實現的:

(define-syntax-rule (clambda (x ... . r) b ...) 
    (let ([len (length '(x ...))] [real (lambda (x ... . r) b ...)]) 
    (let loop ([argss '()] [n 0]) 
     (lambda args 
     (let ([n (+ n (length args))] [argss (cons args argss)]) 
      (if (>= n len) 
      (apply real (apply append (reverse argss))) 
      (loop argss n))))))) 

但是這裏有一個重要的提示。您引用的頁面表明,函數版本的問題在於它是顯式的 - 但它也有一個重要的優點:在宏實現中,您必須使用clambda來定義函數,而功能版本可以與任何內置功能。在許多Scheme實現中,有許多工具可以檢查函數的參數,並且使用它可以實現知道何時調用原始函數的currying函數版本。