Копался во внутренностях гема rubocop (статический анализатор) и открыл для себя такой интересный гем как astrolabe
который рубокоп юзает для синтаксического разбора ruby кода.
Он переводит код ruby в абстрактное синтаксическое дерево.
Например такой код на руби
puts 'test'
arr = %w(1 2 3)
(begin
(send nil :puts
(str "test"))
(lvasgn :arr
(array
(str "1")
(str "2")
(str "3"))))
А вот такой
module Test3
end
class Test1
end
class Test2 < Test1
include Test3
def qwer
puts 'test'
arr = %w(1 2 3)
end
private
def qwer2(test, test1:, test2:)
@arr = (1..10).map(&:to_f)
end
def qwer3(**)
end
end
(begin
(module
(const nil :Test3) nil)
(class
(const nil :Test1) nil nil)
(class
(const nil :Test2)
(const nil :Test1)
(begin
(send nil :include
(const nil :Test3))
(def :qwer
(args)
(begin
(send nil :puts
(str "test"))
(lvasgn :arr
(array
(str "1")
(str "2")
(str "3")))))
(send nil :private)
(def :qwer2
(args
(arg :test)
(kwarg :test1)
(kwarg :test2))
(ivasgn :@arr
(send
(begin
(irange
(int 1)
(int 10))) :map
(block-pass
(sym :to_f)))))
(def :qwer3
(args
(kwrestarg)) nil)))),
Вопросы:
1) Какого хрена в моем уютном руби делает лисп?
2) Лисп так хорошо подходит для использования в качестве абстрактного синтаксического дерева?
3) Лиспофанатики кричащие о том что лисп это основа основ и нет ЯП кроме лиспа не так уж и далеки от правды?
4) Если лисп умер почему я встречаю его в самых неожиданных местах?
5) Как мне это развидеть? Мир уже никогда не будет прежним?