【问题标题】:print symbol and evaluate it with a macro打印符号并使用宏对其进行评估
【发布时间】:2020-06-11 18:43:18
【问题描述】:

我正在尝试编写一些代码来打印符号并在球拍中评估与之关联的函数

我已经设法在运行时使用 eval 实现了这一点,但我认为不使用 eval 也应该可以做到这一点。

评估版:

(define ns (namespace-anchor->namespace a))

(define (deco-display fun-sym bstr)
  (display (symbol->string fun-sym))
  (display ": ")
  (display (eval `(,fun-sym ,bstr) ns)))

示例用法:

(define (extract-id bstr)  (subbytes bstr  0  8 ))
(deco-display 'extract-id   bstr)

我试过了:

(define (xxx) (display "asdas"))

(define-syntax (print-and-do stx)
  (syntax-case stx ()
    [(_ p) #`(begin (display #'p) (newline) (p))]))

但结果不是我所期望的

(print-and-do xxx)
.#<syntax:interactions from an unsaved editor:5:16 xxx>
asdas

【问题讨论】:

  • 试试(display #''p)
  • 欢迎来到 Stack Overflow。您的解决方案是正确的,您是否愿意将其放入解决方案框中,以便我们对其进行投票,您可以接受它作为答案?
  • @soegaard 谢谢,我实际上使用您的提示更新了解决方案

标签: scheme racket


【解决方案1】:

感谢人们的评论和更多阅读,我完成了 3 个工作版本:

(define-syntax (print-and-do-v1 stx)
  (syntax-case stx ()
    [(_ p) #'(begin (display (syntax->datum #'p)) (newline) (p))]))

(define-syntax (print-and-do-v2 stx)
  (syntax-case stx ()
    [(_ p) #'(begin (display 'p) (newline) (p))]))

(define-syntax-rule (print-and-do-v3 p)
  (begin (display 'p) (newline) (p)))

【讨论】:

  • 您可以将打印表达式简化为(display (quote p))。宏用宏参数(例如,xxx)代替p,因此结果表达式为(display (quote xxx))(quote xxx) 像往常一样计算出名为xxx 的符号。您也可以在宏模板中写' 而不是quote,它的工作原理相同,但我喜欢在这些情况下写出quote,以暗示引用的术语包含模式变量。 (因此对于宏的单次使用而言它是恒定的,但在宏的所有使用中不是恒定的。)
  • @Ryan Culpepper 感谢您的评论,这是真的,我正在将 print-and-do 的最后一行从:[(_ p) #`(begin (display (syntax-&gt;datum #'p)) (newline) (p))])) 更新为 [(_ p) #'(begin (display 'p) (newline) (p))]))跨度>
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-07
  • 2020-08-26
相关资源
最近更新 更多