关键字的别名

时间:2013-11-14 14:13:45

标签: scheme

(define defun define)

它在Racket中引发错误define: not allowed in an expression context in: define。如何为defineletlambda等基本结构创建别名?

3 个答案:

答案 0 :(得分:4)

define是一种语法,而不是一流的对象。你不能把它称为对象。

正如贾斯汀所说,你可以创建一个宏。但请注意,Lisp风格的defun与Scheme风格define的语法不同,您的宏应考虑到这一点:

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

答案 1 :(得分:1)

不确定Racket,但更普遍的问题是在Scheme define中,letlambda是语法和/或特殊形式而不是函数。因此,如果将它们定义为函数,则无法在表达式上下文中引用它们。

但相反,您可以定义扩展为defun表达式的宏define

答案 2 :(得分:1)

使用正常程序,您可以使用define:

进行别名
(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))))
Scheme中的

definedefun有更多的帽子,主要是因为Scheme的单命名空间性质。 define适用于labelsfletdefconstantsetq(但对于以前绑定的,需要使用set!进行更新)。< / p>