本文介绍了寻找一个非常简单的球拍宏示例的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我做了以下操作:
#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的工作。
更多推荐
寻找一个非常简单的球拍宏示例
发布评论