2013-11-14 53 views
3
(define defun define) 

它在球拍中產生錯誤define: not allowed in an expression context in: define。如何爲基本結構創建別名,如defineletlambda別名爲關鍵字

回答

4

define是一種語法,而不是第一類對象。您不能將其稱爲對象。按照賈斯汀的說法,你可以創建一個宏。但是請注意,Lisp風格defun有不同的語法方案式define,和您的宏應該考慮到這一點:

(define-syntax-rule (defun name params body ...) 
    (define (name . params) 
    body ...)) 
1

對Racket沒有特別的瞭解,但更爲一般的問題是在方案define,letlambda是語法和/或特殊形式而不是函數。因此,如果將它們定義爲函數,則不能在表達式上下文中引用它們。

但相反,您可以定義一個擴展爲define表達式的宏defun

1

正常的程序,你可以用別名定義:

(define first car) ; first isn't defined in R[67]RS 

然而definedefun不形式兼容。這個宏將使全球defun,它作爲Common Lisp中:

#!r6rs 
(import (rnrs base)) 

(define-syntax defun 
    (syntax-rules() 
    ((defun name args . body) 
    (define (name . args) . body)))) 

define方案有更多的帽子比defun,主要是因爲方案的一個命名空間的性質。 define作爲labels,flet,defconstantsetq(但是對於先前的綁定,需要使用set!來更新)。