(define defun define)它在球拍中引起误差define: not allowed in an expression context in: define。如何为define、let、lambda等基本构造创建别名
发布于 2013-11-14 15:59:02
define是一个语法,而不是一个一流的对象.您不能将其称为对象。
正如Justin所说,您可以创建一个宏。但是请注意,Lisp样式的defun与Scheme样式的define有不同的语法,您的宏应该考虑到这一点:
(define-syntax-rule (defun name params body ...)
(define (name . params)
body ...))发布于 2013-11-14 14:47:32
确切地说,还不太清楚,但更普遍的问题是,在Scheme define中,let和lambda是语法和/或特殊形式,而不是函数。因此,如果将它们定义为函数,则不能在表达式上下文中引用它们。
但是,您可以定义一个扩展为defun表达式的宏define。
发布于 2013-11-14 16:05:45
对于正常的过程,您可以使用定义别名:
(define first car) ; first isn't defined in R[67]RS但是,define和defun格式不兼容。此宏将生成一个全局defun,其工作方式与通用Lisp相同:
#!r6rs
(import (rnrs base))
(define-syntax defun
(syntax-rules ()
((defun name args . body)
(define (name . args) . body))))方案中的define比defun具有更多的hats,这主要是因为Scheme的名称空间性质。define以labels、flet、defconstant和setq的身份工作(但对于以前绑定的,需要使用set!进行更新)。
https://stackoverflow.com/questions/19979942
复制相似问题