diff --git a/README.md b/README.md index bd93e8a..d81b12e 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# Lucio (en) +# Lucio (en) ## What? Lucio is **intended to be** a Lisp-like language developed in Ruby only for knowledge and fun. No profit intended. @@ -89,3 +89,5 @@ A lista de colaboradores está no final desse arquivo e, espero que continue cre * Bruno Jessen * Santiago Nunes + + Douglas Campos (/qmx) [@qmx](http://twitter.com/qmx) \ No newline at end of file diff --git a/lib/lucio/lucio.rb b/lib/lucio/lucio.rb index c5aa393..702b128 100644 --- a/lib/lucio/lucio.rb +++ b/lib/lucio/lucio.rb @@ -38,7 +38,7 @@ def initialize(lexicon = LexiconStack.new) @lexicon.add_macro :define , lambda{|lexicon, items| define lexicon, items } @lexicon.add_macro :if , lambda{|lexicon, items| Evaluator.evaluate_tree(items[0], lexicon) ? Evaluator.evaluate_tree(items[1], lexicon) : (Evaluator.evaluate_tree(items[2], lexicon) if items[2]) } @lexicon.add_macro :fun , lambda{|lexicon, items| lexicon.add_function items.to_sym, Function.new(items, lexicon) } - @lexicon.add_macro :defmacro , lambda{|lexicon, items| h, t = Lucio.behead(items); lexicon.add_macro h, Macro.new(t, lexicon) } + @lexicon.add_macro :defmacro , lambda{|lexicon, items| h, t = Lucio.behead(items); lexicon.add_macro h, Macro.new(t) } @lexicon.add_macro :send , lambda{|lexicon, items| items[1].send(items[0], items[2]) } # eval('(include "lib/core")') diff --git a/lib/lucio/macro.rb b/lib/lucio/macro.rb index 2b77c5e..6961fed 100644 --- a/lib/lucio/macro.rb +++ b/lib/lucio/macro.rb @@ -1,5 +1,5 @@ class Macro - def initialize(declaration, lexicon) + def initialize(declaration) @signatures = {} declaration.each do |signature| @@ -20,32 +20,24 @@ def initialize(declaration, lexicon) end end - def call(global_lexicon, list) + def call(lexicon, list) signature = @signatures[list.size] parameters = signature[:parameters] + code = Array.new(signature[:code][0]) - result = replace(list, parameters, Array.new(signature[:code][0])) + replaced = replace(list, parameters, code) - p 'call', result - - result + Evaluator.evaluate_tree replaced, lexicon end def replace(list, parameters, result) - puts '' - p 'b4', result list.size.times do |item| result.map! do |part| - if part.is_array? - part = replace(list, parameters, part) - else - part == parameters[item] ? list[item] : part - end + part = part == parameters[item] ? list[item] : part end end - p 'aftr', result result end end diff --git a/misc/lucio.png b/misc/lucio.png new file mode 100644 index 0000000..1d7f367 Binary files /dev/null and b/misc/lucio.png differ diff --git a/misc/lucio.svg b/misc/lucio.svg new file mode 100644 index 0000000..f3d06b3 --- /dev/null +++ b/misc/lucio.svg @@ -0,0 +1,110 @@ + + + + + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + λuciο + + diff --git a/spec/macro_spec.rb b/spec/macro_spec.rb index fed4a60..6a57438 100644 --- a/spec/macro_spec.rb +++ b/spec/macro_spec.rb @@ -5,7 +5,7 @@ before :each do @lucio = Lucio.new end -=begin + it 'simple if implementation' do macro = ' (defmacro my-if @@ -21,7 +21,7 @@ (my-if (eql? 1 2) (true) (false))' - + @lucio.eval(macro + code_true).should be_true @lucio.eval(macro + code_false).should be_false @@ -46,7 +46,7 @@ it 'simple if implementation with variable = false' do code = <<-LISP (defmacro my-if - ([test? x truey x falsey x] + ([test? then truey else falsey end] `(display test?)(if test? truey falsey))) (define x false) @@ -64,7 +64,7 @@ @lucio.eval(code).should be_false end -=end + end end