3

I know that Crystal has its macro system for defining code at compile time but is it possible to run code apart from that?

For example, can we do this so that it runs during compilation?

puts "foobar"

Or for a more serious example, can we read from and write to the file system where the compiler is running?

4

2 回答 2

6

我们可以!借助运行宏方法系统宏方法

让我们举个例子,每次构建时都会将随机问候语编译到程序中:

问候.txt:

Hello
Hey
Hi

问候.cr:

puts File.read_lines("#{__DIR__}/greetings.txt").sample

问候者.cr:

puts {{run("./greeting").stringify}}

使用 编译crystal build greeter.cr,您会注意到编译后的二进制文件的输出保持不变,但每次重新编译时都是随机的。

于 2015-06-25T21:30:07.557 回答
5

作为 Jonne 所说的附加答案,您可以在编译时使用 puts 输出一些东西,但在宏内部。例如:

{{ puts "foobar" }}

您会注意到在编译期间打印了“foobar”,但可执行文件什么也不做(尝试使用crystal build foo.cr; ./foo

当然只是在编译时输出一些东西不是很有用,但是当你想快速调试一些宏时它很有用。

puts宏方法记录在这里:http ://crystal-lang.org/api/Macros.html#puts%28expression%29%3ANop-instance-method

于 2015-06-25T22:24:18.143 回答