3
(define defun define)

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

4

3 回答 3

4

define是一种语法,而不是一流的对象。您不能将其称为对象。

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

(define-syntax-rule (defun name params body ...)
  (define (name . params)
    body ...))
于 2013-11-14T15:59:02.127 回答
1

具体不确定 Racket,但更普遍的问题是在 Scheme 中definelet并且lambda是语法和/或特殊形式而不是函数。因此,如果将它们定义为函数,则不能像在表达式上下文中那样引用它们。

但是,您可以定义一个defun扩展为define表达式的宏。

于 2013-11-14T14:47:32.317 回答
1

使用正常程序,您可以使用定义别名:

(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))))

definein Scheme 比 有更多的帽子defun,主要是因为 Scheme 的单一命名空间性质。define用作labels, flet, defconstantand setq(但对于以前绑定的,需要使用set!更新)。

于 2013-11-14T16:05:45.397 回答