(define defun define)
define: not allowed in an expression context in: define
它会在 Racket 中引发错误。如何为define
, let
,等基本结构创建别名lambda
?
(define defun define)
define: not allowed in an expression context in: define
它会在 Racket 中引发错误。如何为define
, let
,等基本结构创建别名lambda
?
define
是一种语法,而不是一流的对象。您不能将其称为对象。
正如贾斯汀所说,您可以创建一个宏。但请注意,Lisp 风格defun
与 Scheme-style 有不同的语法define
,你的宏应该考虑到这一点:
(define-syntax-rule (defun name params body ...)
(define (name . params)
body ...))
具体不确定 Racket,但更普遍的问题是在 Scheme 中define
,let
并且lambda
是语法和/或特殊形式而不是函数。因此,如果将它们定义为函数,则不能像在表达式上下文中那样引用它们。
但是,您可以定义一个defun
扩展为define
表达式的宏。
使用正常程序,您可以使用定义别名:
(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
in Scheme 比 有更多的帽子defun
,主要是因为 Scheme 的单一命名空间性质。define
用作labels
, flet
, defconstant
and setq
(但对于以前绑定的,需要使用set!
更新)。