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 @@
+
+
+
+
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