Module: DsLisp::CommonLispOperators
- Defined in:
- lib/dslisprb.rb
Class Method Summary collapse
- .block(code) ⇒ Object
- .cond(code) ⇒ Object
- .defmacro(code) ⇒ Object
- .defun(code) ⇒ Object
- .if(code) ⇒ Object
- .lambda(code) ⇒ Object
- .let(code) ⇒ Object
- .quote(code) ⇒ Object
- .set(code) ⇒ Object
Class Method Details
.block(code) ⇒ Object
96 97 98 |
# File 'lib/dslisprb.rb', line 96 def block(code) code[1..-1].map(&ToRuby.method(:to_ruby)).join(";") end |
.cond(code) ⇒ Object
49 50 51 52 53 54 |
# File 'lib/dslisprb.rb', line 49 def cond(code) "(nil.tap { " + code[1..-1].map{ |condition_code| "(break (#{ToRuby.to_ruby condition_code[1]}) if (aux = (#{ToRuby.to_ruby condition_code[0]}); aux != [] and aux != nil) )" }.join(";") + "})" end |
.defmacro(code) ⇒ Object
109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 |
# File 'lib/dslisprb.rb', line 109 def defmacro(code) name = code[1] arguments = code[2] impl = code[3][1] subsl = Kernel.lambda{|_code, rplmap| _code.map{|subcode| if Array === subcode subsl.call(subcode, rplmap) else rplmap[subcode] || subcode end } } CommonLispOperators.define_singleton_method(name) do |_code| rplmap = {} (0..arguments.size-1).each do |i| rplmap[arguments[i]] = _code[i+1] end ToRuby.to_ruby subsl.call(impl, rplmap) end "" end |
.defun(code) ⇒ Object
104 105 106 107 |
# File 'lib/dslisprb.rb', line 104 def defun(code) newcode = [:set, code[1], [:lambda, code[2], code[3]]] ToRuby.to_ruby(newcode) end |
.if(code) ⇒ Object
56 57 58 59 60 61 62 63 64 |
# File 'lib/dslisprb.rb', line 56 def if(code) "(if (aux = (#{ToRuby.to_ruby code[1]}); aux != [] and aux != nil) #{ToRuby.to_ruby code[2]} else #{ToRuby.to_ruby code[3]} end ) " end |
.lambda(code) ⇒ Object
71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 |
# File 'lib/dslisprb.rb', line 71 def lambda(code) arguments = code[1].select{|x| x != :"&optional"}.map{|x| Array === x ? x[0] : x}.map(&ToRuby.method(:name_convert)).map(&:to_s) x_optional = code[1].select{|x| x != :"&optional"}.map{|x| if Array === x ToRuby.to_ruby(x[1]) else "nil" end } @count = (@count || 0) + 1 oldargsvar = "oldargs_#{@count}" "(lambda{|*x| #{oldargsvar} = [ #{arguments.map{|z| "begin; #{z}; rescue; nil; end"}.join(",")} ] # save current bindings #{(0..arguments.size-1).map{|i| "#{arguments[i]} = x[#{i}] || #{x_optional[i]}" }.join(";")} begin aux = #{ToRuby.to_ruby(code[2])} ensure #{(0..arguments.size-1).map{|i| "#{arguments[i]} = #{oldargsvar}[#{i}]" }.join(";")} end aux }.lisp_inner_code(#{code.lisp_inspect.inspect}))" end |
.let(code) ⇒ Object
66 67 68 69 |
# File 'lib/dslisprb.rb', line 66 def let(code) newcode = [[:lambda, code[1].map(&:first), code[2]]] + code[1].map{|x|x[1]} ToRuby.to_ruby(newcode) end |
.quote(code) ⇒ Object
45 46 47 |
# File 'lib/dslisprb.rb', line 45 def quote(code) code[1].inspect end |
.set(code) ⇒ Object
100 101 102 |
# File 'lib/dslisprb.rb', line 100 def set(code) "#{ToRuby.name_convert(code[1])} = #{ToRuby.to_ruby(code[2])}" end |