macros - (Chez) 隐藏 lambda 的 Scheme 宏
问题描述
我想编写一个宏来创建用于隐藏更冗长的 lambda 表达式的速记语法,但我很难理解如何编写宏(我意识到这是反对使用它们的论据)。
给定这个例子:
(define alist-example
'((x 1 2 3) (y 4 5 6) (z 7 8 9)))
(define ($ alist name)
(cdr (assoc name alist)))
((lambda (a) (map (lambda (x y z) (+ x y z)) ($ a 'x) ($ a 'y) ($ a 'z))) alist-example)
((lambda (a) (map (lambda (y) (/ y (apply max ($ a 'y)))) ($ a 'y))) alist-example)
我想写一个宏,with-alist
,它可以让我写出最后两个类似的表达式:
(with-alist alist-example (+ x y z))
(with-alist alist-example (/ y (apply max y)))
有什么意见或建议吗?
解决方案
我看到的直接问题是没有办法知道选择哪些绑定。例如。是apply
alist 中的元素之一还是全局变量?那要看。我建议你这样做:
(with-alist ((x y z) '((x 1 2 3) (y 4 5 6) (z 7 8 9)))
(+ x y z))
(let ((z 10))
(with-alist ((x y) alist-example)
(+ x y z)))
它应该转化为:
(let ((tmp '((x 1 2 3) (y 4 5 6) (z 7 8 9))))
(apply map (lambda (x y z) (+ x y z))
(map (lambda (name) ($ tmp name)) '(x y z))))
(let ((z 10))
(let ((tmp alist-example))
(apply map (lambda (x y) (+ x y z))
(map (lambda (name) ($ tmp name)) '(x y)))))
这就是直截了当的处理syntax-rules
。例如。制作一个图案并写下替换。祝你好运。
推荐阅读
- swagger - Nestjs Swagger CLI 插件显示来自关系的实体,而不是只显示我的模块导入的实体
- google-analytics - GA中的产品列表位置归因
- django - froala 编辑器在 django 管理站点中显示 textarea
- c++ - 具有动态对象数组的参数化构造函数
- r-package - 加载 R 包 iZID 以模拟零膨胀分布
- assembly - 我们如何描述这些指令的区别?
- angular - Angular router.navigate 不适用于 canActivate() 中的子路由
- reactjs - React - 如何有条件地显示获取的数据
- c# - onglet(tagPage)迭代的问题:c#
- sql - 我想列出数据,如 SQL 中的输出表所示