Scheme 关键字的别名
它在Racket中的:define中的表达式上下文中引发错误Scheme 关键字的别名,scheme,Scheme,它在Racket中的:define中的表达式上下文中引发错误define:not allowed。如何为基本构造(如define、let、lambda)创建别名?不确定Racket是否具体,但更普遍的问题是,在Schemedefine中,let和lambda是语法和/或特殊形式,而不是函数。因此,如果它们被定义为函数,则无法在表达式上下文中引用它们 但是,您可以定义宏defun,该宏扩展为define表达式。define是一种语法,而不是一级对象。不能将其作为对象引用 正如Justin所说,您可
define:not allowed。如何为基本构造(如define
、let
、lambda
)创建别名?不确定Racket是否具体,但更普遍的问题是,在Schemedefine
中,let
和lambda
是语法和/或特殊形式,而不是函数。因此,如果它们被定义为函数,则无法在表达式上下文中引用它们
但是,您可以定义宏defun
,该宏扩展为define
表达式。define
是一种语法,而不是一级对象。不能将其作为对象引用
正如Justin所说,您可以创建一个宏。但是请注意,Lisp styledefun
与Scheme styledefine
有不同的语法,您的宏应该考虑到这一点:
(define defun define)
使用常规过程,您可以使用alias定义:
(define-syntax-rule (defun name params body ...)
(define (name . params)
body ...))
但是define
和defun
与表单不兼容。此宏将生成一个全局defun
,其工作方式与Common Lisp中的相同:
(define first car) ; first isn't defined in R[67]RS
Scheme中的define
比defun
有更多的hats,这主要是因为Scheme只有一个名称空间define
作为labels
、flet
、defcontent
和setq
(但对于以前的绑定,需要使用set!
进行更新)
#!r6rs
(import (rnrs base))
(define-syntax defun
(syntax-rules ()
((defun name args . body)
(define (name . args) . body))))