寻找一个非常简单的球拍宏示例

编程入门 行业动态 更新时间:2024-10-11 09:27:36
本文介绍了寻找一个非常简单的球拍宏示例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧! 问题描述

我做了以下操作:

#lang racket (define-syntax-rule (macro-expansion-seconds) (current-seconds))

哪一项执行此操作

> (macro-expansion-seconds) 1639244531 > (macro-expansion-seconds) 1639244532 > (macro-expansion-seconds) 1639244533

它在展开时将(macro-expandsion-seconds)替换为(current-seconds),并且每次仍计算该表单。

但是如何使其在展开时计算(current-seconds),然后执行此操作?

> (macro-expansion-seconds) 1639244533 > (macro-expansion-seconds) 1639244533 > (macro-expansion-seconds) 1639244533

我知道在这种情况下我可以这样做

(define macro-expansion-seconds (current-seconds))

和这个

> macro-expansion-seconds 1639244766 > macro-expansion-seconds 1639244766 > macro-expansion-seconds 1639244766

(名称不再有意义)

但我正在尝试了解宏的工作原理,并认为这将是一个简单的示例,可以帮助我了解较难的宏。

推荐答案

最简单的方式是:

#lang racket (begin-for-syntax (define the-time (current-seconds))) (define-syntax (macro-expansion-seconds stx) (datum->syntax stx the-time)) (macro-expansion-seconds) (macro-expansion-seconds) (macro-expansion-seconds)

herebegin-for-syntax告诉扩展器以下表达式将在编译时求值。因此,the-time的值将是一个数字。然后,宏需要将数字(这是一个数据)转换为一段语法。这是datum->syntax的工作。

更多推荐

寻找一个非常简单的球拍宏示例

本文发布于:2023-11-10 07:10:51,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1574699.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:球拍   示例   简单

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!