pra*_*avj 5 ruby parsing abstract-syntax-tree s-expression ruby-ripper
我正在尝试学习Ruby词法分析器和解析器(whitequark解析器)以了解有关从Ruby脚本进一步生成机器代码的过程的更多信息.
在解析以下Ruby代码字符串时.
def add(a, b)
return a + b
end
puts add 1, 2
Run Code Online (Sandbox Code Playgroud)
它导致以下S表达式表示法.
s(:begin,
s(:def, :add,
s(:args,
s(:arg, :a),
s(:arg, :b)),
s(:return,
s(:send,
s(:lvar, :a), :+,
s(:lvar, :b)))),
s(:send, nil, :puts,
s(:send, nil, :add,
s(:int, 1),
s(:int, 3))))
Run Code Online (Sandbox Code Playgroud)
任何人都可以解释一下:在结果S表达式表示法中发送关键字的定义?
Ruby建立在"一切都是对象"范式的基础之上.也就是说,包括数字在内的一切都是一个对象.
正如我们在普通的ruby代码中看到的那样,运算符只不过是各个对象方法调用的语法糖:
3.14.+(42)
#? 45.14
Run Code Online (Sandbox Code Playgroud)
以上就是Ruby如何处理3.14 + 42短符号.反过来,它可能使用泛型编写Object#send:
3.14.send :+, 42
#? 45.14
Run Code Online (Sandbox Code Playgroud)
后者应理解为:"将:+带有参数[s](42)的消息发送给接收者3.14."