首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >卫生宏r7rs :返回第二个表达式值

卫生宏r7rs :返回第二个表达式值
EN

Stack Overflow用户
提问于 2018-11-27 15:14:03
回答 2查看 117关注 0票数 0

我目前正在学习一些r7rs,我正在尝试实现一个宏'begin‘,如下所示:

代码语言:javascript
复制
(begin0 expr0 expr1 ... expr2)

将expr作为正则表达式(例如(set!)(x (+ x1))

begin0作为宏计算所有表达式,但只返回expr1结果。

例如:

代码语言:javascript
复制
(let ((year 2017))
(begin1 (set! year (+ year 1))
  year
  (set! year (+ year 1))
  year)) 

它必须回到2018年

我首先创建了一个begin函数:

代码语言:javascript
复制
(define-syntax begin0
 (syntax-rules ()
  ((begin-0 body-expr-0 body-expr-1 ...)
   (let ((tmp body-expr-0)) body-expr-1 ... tmp))))

现在,我试着理解如何才能返回"body-expr-1“的值?我已经做了下面的代码,但是它说我遗漏了一些省略号,我不知道该如何做。

代码语言:javascript
复制
(define-syntax begin1
  (syntax-rules ()
    ((begin1 body-expr-0 body-expr-1 ... body-expr-2)
     (let ((tmp body-expr-0) body-expr-1 ... tmp)
       (cond (eq? tmp body-expr-1)
              (begin . tmp))))))

我希望这是可以理解的,谢谢你的回答。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-11-27 22:22:41

这是可以完成的,但是宏会产生干扰,所以您不能像使用begin1一样使用begin来完成所有的事情。

代码语言:javascript
复制
(define-syntax begin1
   (syntax-rules ()
     ((_ expr0 expr1 exprn ...)
      (begin
        expr0
        (let ((result expr1))
          exprn ...
          result)))))

不起作用的代码如下:

代码语言:javascript
复制
(begin1
  (define global1 10)
  test3
  (define global2 20))

原因很明显。它扩大到:

代码语言:javascript
复制
(begin1
  (define global1 10)
  (let ((result~1 test3))
    (define global2 20)
    result~1))

第二个define将更改为letrec,以便变量global2仅在let期间可用。我对此没有修正,因为它要求您能够从闭包中执行全局define

begin1是相当奇怪的特性。在Racket和可能的其他Scheme方言中,我们有返回第一个表达式结果的begin0。这很有用。例如:这里有一个柜台:

代码语言:javascript
复制
(define (get-counter from)
  (lambda ()
    (let ((tmp from))
      (set! from (+ from 1))
      tmp)))

以及使用begin0

代码语言:javascript
复制
(define (get-counter from)
  (lambda ()
    (begin0 
      from
      (set! from (+ from 1)))))

在球拍中,begin0是一个原始的。因此,它是完全扩展的程序中支持的一种形式,因此在C中实现,就像begin..

票数 2
EN

Stack Overflow用户

发布于 2018-11-27 16:12:10

因此,我找到了一种可能的方法,我没有,虽然我们可以只要求一个条件的即时价值:

代码语言:javascript
复制
(define-syntax begin1
  (syntax-rules ()
    ((begin1 body-expr-0 body-expr-1 body-expr-2 ...)
       (if body-expr-1
          (write body-expr-1)))))
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53502668

复制
相关文章

相似问题

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