【发布时间】:2020-02-27 14:23:28
【问题描述】:
在他们的“经验丰富的计划者”一书中,Felleisen 和 Friedman 介绍了 try 函数。根据http://community.schemewiki.org/?seasoned-schemer,这个函数可以定义为
(define-syntax try
(syntax-rules ()
((try var a . b)
(letcc success
(letcc var (success a)) . b))))
letcc 定义为
(define-syntax letcc
(syntax-rules ()
((letcc var body ...)
(call-with-current-continuation
(lambda (var) body ... )))))
现在,虽然我了解 try 的作用以及如何使用它,但我很难遵循它的正式定义。行中letcc对success和(letcc var (success a)) . b的应用中点的具体含义是什么
(letcc success
(letcc var (success a)) . b)
try?或者换一种问法:如果在a 中调用var,try 定义的哪一部分确定try 被评估为b?
编辑 1: 抱歉,letcc 的定义不完整。添加了缺少的第一行。
编辑2:以下代码可以在Racket中运行。
(define-syntax letcc
(syntax-rules ()
((letcc var body ...)
(call-with-current-continuation
(lambda (var) body ... )))))
(define-syntax try
(syntax-rules ()
((try var a . b)
(letcc success
(letcc var (success a)) . b))))
(try var (+ 1 1) 4)
; output: 2
(try var (var '(2)) 4)
; output: 4
【问题讨论】:
-
请粘贴完整的工作代码。但是你可以在 mit-scheme 中使用
unsyntax来查看宏扩展器是如何去除语法糖的。
标签: syntax scheme seasoned-schemer