(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!
来更新)。