2013-11-14 54 views
3
(define defun define) 

它在球拍中产生错误define: not allowed in an expression context in: define。如何为基本结构创建别名,如defineletlambda别名为关键字

回答

4

define是一种语法,而不是第一类对象。您不能将其称为对象。按照贾斯汀的说法,你可以创建一个宏。但是请注意,Lisp风格defun有不同的语法方案式define,和您的宏应该考虑到这一点:

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

对Racket没有特别的了解,但更为一般的问题是在方案define,letlambda是语法和/或特殊形式而不是函数。因此,如果将它们定义为函数,则不能在表达式上下文中引用它们。

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

1

正常的程序,你可以用别名定义:

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

define方案有更多的帽子比defun,主要是因为方案的一个命名空间的性质。 define作为labels,flet,defconstantsetq(但是对于先前的绑定,需要使用set!来更新)。