首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关键词别名

关键词别名
EN

Stack Overflow用户
提问于 2013-11-14 14:13:44
回答 3查看 552关注 0票数 3
代码语言:javascript
复制
(define defun define)

它在球拍中引起误差define: not allowed in an expression context in: define。如何为defineletlambda等基本构造创建别名

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-11-14 15:59:02

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

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

代码语言:javascript
复制
(define-syntax-rule (defun name params body ...)
  (define (name . params)
    body ...))
票数 4
EN

Stack Overflow用户

发布于 2013-11-14 14:47:32

确切地说,还不太清楚,但更普遍的问题是,在Scheme define中,letlambda是语法和/或特殊形式,而不是函数。因此,如果将它们定义为函数,则不能在表达式上下文中引用它们。

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

票数 1
EN

Stack Overflow用户

发布于 2013-11-14 16:05:45

对于正常的过程,您可以使用定义别名:

代码语言:javascript
复制
(define first car)  ; first isn't defined in R[67]RS

但是,definedefun格式不兼容。此宏将生成一个全局defun,其工作方式与通用Lisp相同:

代码语言:javascript
复制
#!r6rs
(import (rnrs base))

(define-syntax defun
  (syntax-rules ()
    ((defun name args . body)
     (define (name . args) . body))))

方案中的definedefun具有更多的hats,这主要是因为Scheme的名称空间性质。definelabelsfletdefconstantsetq的身份工作(但对于以前绑定的,需要使用set!进行更新)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19979942

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档