Scheme 关键字的别名

Scheme 关键字的别名,scheme,Scheme,它在Racket中的:define中的表达式上下文中引发错误define:not allowed。如何为基本构造(如define、let、lambda)创建别名?不确定Racket是否具体,但更普遍的问题是,在Schemedefine中,let和lambda是语法和/或特殊形式,而不是函数。因此,如果它们被定义为函数,则无法在表达式上下文中引用它们 但是,您可以定义宏defun,该宏扩展为define表达式。define是一种语法,而不是一级对象。不能将其作为对象引用 正如Justin所说,您可

它在Racket中的:define中的表达式上下文中引发错误
define:not allowed。如何为基本构造(如
define
let
lambda
)创建别名?

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


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

define
是一种语法,而不是一级对象。不能将其作为对象引用

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

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