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