(define defun define)
它在球拍中產生錯誤define: not allowed in an expression context in: define
。如何爲基本結構創建別名,如define
,let
,lambda
?別名爲關鍵字
(define defun define)
它在球拍中產生錯誤define: not allowed in an expression context in: define
。如何爲基本結構創建別名,如define
,let
,lambda
?別名爲關鍵字
define
是一種語法,而不是第一類對象。您不能將其稱爲對象。按照賈斯汀的說法,你可以創建一個宏。但是請注意,Lisp風格defun
有不同的語法方案式define
,和您的宏應該考慮到這一點:
(define-syntax-rule (defun name params body ...)
(define (name . params)
body ...))
對Racket沒有特別的瞭解,但更爲一般的問題是在方案define
,let
和lambda
是語法和/或特殊形式而不是函數。因此,如果將它們定義爲函數,則不能在表達式上下文中引用它們。
但相反,您可以定義一個擴展爲define
表達式的宏defun
。
正常的程序,你可以用別名定義:
(define first car) ; first isn't defined in R[67]RS
然而define
和defun
不形式兼容。這個宏將使全球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
,defconstant
和setq
(但是對於先前的綁定,需要使用set!
來更新)。