5
傑弗裏Meunier有一個隱含的咖喱宏here,它使用defmacro。我想知道是否有人用語法規則寫過這個東西?在語法規則中隱式加入Scheme中?
傑弗裏Meunier有一個隱含的咖喱宏here,它使用defmacro。我想知道是否有人用語法規則寫過這個東西?在語法規則中隱式加入Scheme中?
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函數版本。