有没有办法查看 Crystal 宏展开的结果?

7

我有一个宏无法按预期工作,想知道有没有类似于Lisp中的macroexpand-1的方式来查看它扩展成什么。如果有的话,怎样使用呢?谢谢!

2个回答

12

{% debug %}放在宏的末尾将在编译时打印其内容。

例如:

macro foo
  ...
  {% debug %}
end

太棒了!谢谢你! - Sunder

0

似乎又出现了另一个工具:crystal tool expand

例如文件 mapping_test.cr

require "json"
require "./json_mapping"# wget https://raw.githubusercontent.com/crystal-lang/json_mapping.cr/master/src/json_mapping.cr
class Location
  JSON.mapping(  # <---- line: 4, column: 3
    lat: Float64,
    lng: Float64,
  )
end

按照以下方式运行:

crystal tool expand -c mapping_test.cr:4:3 mapping_test.cr(必须在正确的位置或至少在宏内部,否则将会出现“未找到扩展”)

输出

1 expansion found
expansion 1:
   JSON.mapping(lat: Float64, lng: Float64)

# expand macro 'JSON.mapping' (/home/a/json_mapping.cr:236:3)
~> ::JSON.mapping({lat: {type: Float64, key_id: lat}, lng: {type: Float64, key_id: lng}})

...

参考 https://groups.google.com/g/crystal-lang/c/L7ADzhRQGLk


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接