1- $LOAD_PATH . unshift File . dirname ( __FILE__ )
1+ $: . unshift File . dirname ( __FILE__ )
22
3- require ' lisp/version'
4- require ' lisp/repl'
3+ require " lisp/version"
4+ require " lisp/repl"
55
66module Lisp
7- def self . eval ( string )
7+ def self . eval string
88 execute parse tokenize string
99 end
1010
11- def self . tokenize ( string )
12- string . gsub ( '(' , ' ( ' ) . gsub ( ')' , ' ) ' ) . split
11+ def self . tokenize string
12+ string . gsub ( "(" , " ( " ) . gsub ( ")" , " ) " ) . split
1313 end
1414
15- def self . parse ( tokens , tree = [ ] )
16- raise ' unexpected: eof' if tokens . size . zero?
15+ def self . parse tokens , tree = [ ]
16+ raise " unexpected: eof" if tokens . size . zero?
1717
1818 case token = tokens . shift
19- when '('
20- tree . push parse tokens while tokens [ 0 ] != ')'
19+ when "("
20+ while tokens [ 0 ] != ")" do
21+ tree . push parse tokens
22+ end
2123 tokens . shift
2224 tree
23- when ')'
24- raise ' unexpected: )'
25+ when ")"
26+ raise " unexpected: )"
2527 else
2628 atom token
2729 end
2830 end
2931
30- def self . atom ( token )
32+ def self . atom token
3133 case token
3234 when /\d /
3335 token . to_f % 1 > 0 ? token . to_f : token . to_i
@@ -36,7 +38,7 @@ def self.atom(token)
3638 end
3739 end
3840
39- def self . execute ( expression , scope = global )
41+ def self . execute expression , scope = global
4042 return scope . fetch ( expression ) { |var | raise "#{ var } is undefined" } if expression . is_a? Symbol
4143 return expression unless expression . is_a? Array
4244
@@ -46,14 +48,14 @@ def self.execute(expression, scope = global)
4648 scope [ var ] = execute expression , scope
4749 when :lambda
4850 _ , params , expression = expression
49- -> ( * args ) { execute expression , scope . merge ( Hash [ params . zip ( args ) ] ) }
51+ lambda { |* args | execute expression , scope . merge ( Hash [ params . zip ( args ) ] ) }
5052 when :if
5153 _ , test , consequent , alternative = expression
52- expression = execute test , scope ? consequent : alternative
54+ expression = if execute test , scope then consequent else alternative end
5355 execute expression , scope
5456 when :set!
55- _ , var , expression = expression
56- scope . key ?( var ) ? ( scope [ var ] = execute expression , scope ) : ( raise "#{ var } is undefined" )
57+ _ , var , expression = expression
58+ if scope . has_key ?( var ) then scope [ var ] = execute expression , scope else raise "#{ var } is undefined" end
5759 when :begin
5860 _ , *expression = expression
5961 expression . map { |expression | execute expression , scope } . last
@@ -67,7 +69,7 @@ def self.global
6769 @scope ||= begin
6870 operators = [ :== , :"!=" , :"<" , :"<=" , :">" , :">=" , :+ , :- , :* , :/ ]
6971 operators . inject ( { } ) do |scope , operator |
70- scope . merge operator => -> ( * args ) { args . inject &operator }
72+ scope . merge operator => lambda { |* args | args . inject &operator }
7173 end
7274 end
7375 end
0 commit comments