This commit is contained in:
vonhyou 2021-04-15 01:11:04 +08:00
parent d9453149e0
commit 26072b2897

32
prol.rb
View file

@ -20,20 +20,15 @@ module Lisp
program.gsub('(', ' ( ').gsub(')', ' ) ').split program.gsub('(', ' ( ').gsub(')', ' ) ').split
end end
def self.make_list(tokens) def self.read_tokens(tokens, lst = [])
lst = []
lst << read_tokens(tokens) while tokens[0] != ')'
tokens.shift
lst
end
def self.read_tokens(tokens)
# read expressions from token # read expressions from token
raise SyntaxError, 'Unexpected EOF' if tokens.empty? raise SyntaxError, 'Unexpected EOF' if tokens.empty?
case token = tokens.shift case token = tokens.shift
when '(' when '('
make_list tokens lst << read_tokens(tokens) while tokens[0] != ')'
tokens.shift
lst
when ')' when ')'
raise SyntaxError, "Unexpected ')'" raise SyntaxError, "Unexpected ')'"
else else
@ -60,15 +55,16 @@ module Lisp
scope.merge op => ->(*args) { args.inject(&op) } scope.merge op => ->(*args) { args.inject(&op) }
end end
end end
lisp_methods = { 'min': ->(arr) { arr.min }, # @global_env.merge {
'max': ->(arr) { arr.max }, # 'min' : ->(*args) { args.min },
'car': ->(arr) { arr[0] }, # 'max' : ->(*args) { args.max },
'cdr': ->(arr) { arr[1..-1] }, # 'car' : ->(arr) { arr[0] },
'cons': ->(arr) { arr }, # 'cdr' : ->(arr) { arr[1..-1] },
'quote': ->(*args) { args }, # 'cons' : ->(arr) { arr },
'print': ->(arg) { p arg }, # 'quote' : ->(arr) { arr },
'begin': ->(*_args) { true }} # 'print' : ->(arg) { p arg },
@global_env.merge lisp_methods # 'begin' : ->(*_args) { true }
# }
end end
##### Lisp Eval ##### Lisp Eval