Module: JSE::Functors::Builtin
- Defined in:
- lib/jse/functors/builtin.rb
Constant Summary collapse
- BUILTIN_FUNCTORS =
{ "$quote" => method(:quote), "$eq" => method(:eq), "$cond" => method(:cond), "$head" => method(:head), "$tail" => method(:tail), "$atom?" => method(:atomp), "$cons" => method(:cons), }.freeze
Class Method Summary collapse
- .atomp(env, *args) ⇒ Object
- .cond(env, *args) ⇒ Object
- .cons(env, *args) ⇒ Object
- .eq(env, *args) ⇒ Object
- .head(env, *args) ⇒ Object
- .quote(env, *args) ⇒ Object
- .tail(env, *args) ⇒ Object
Class Method Details
.atomp(env, *args) ⇒ Object
43 44 45 46 47 |
# File 'lib/jse/functors/builtin.rb', line 43 def self.atomp(env, *args) val = args[0].respond_to?(:apply) ? env.eval(args[0]) : args[0] val.nil? || val.is_a?(Integer) || val.is_a?(Float) || val == true || val == false || val.is_a?(String) end |
.cond(env, *args) ⇒ Object
14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
# File 'lib/jse/functors/builtin.rb', line 14 def self.cond(env, *args) i = 0 while i < args.length - 1 test = args[i].respond_to?(:apply) ? env.eval(args[i]) : args[i] if test return args[i + 1].respond_to?(:apply) ? env.eval(args[i + 1]) : args[i + 1] end i += 2 end # Odd number of args: last is default if args.length.odd? env.eval(args.last) end end |
.cons(env, *args) ⇒ Object
49 50 51 52 53 54 |
# File 'lib/jse/functors/builtin.rb', line 49 def self.cons(env, *args) elem = args[0].respond_to?(:apply) ? env.eval(args[0]) : args[0] lst = args[1].respond_to?(:apply) ? env.eval(args[1]) : args[1] raise "$cons second argument must be a list" unless lst.is_a?(Array) [elem] + lst end |
.eq(env, *args) ⇒ Object
8 9 10 11 12 |
# File 'lib/jse/functors/builtin.rb', line 8 def self.eq(env, *args) a = args[0].respond_to?(:apply) ? env.eval(args[0]) : args[0] b = args[1].respond_to?(:apply) ? env.eval(args[1]) : args[1] a == b end |
.head(env, *args) ⇒ Object
29 30 31 32 33 34 |
# File 'lib/jse/functors/builtin.rb', line 29 def self.head(env, *args) lst = args[0].respond_to?(:apply) ? env.eval(args[0]) : args[0] raise "$head requires a list" unless lst.is_a?(Array) raise "$head: list is empty" if lst.empty? lst.first end |
.quote(env, *args) ⇒ Object
4 5 6 |
# File 'lib/jse/functors/builtin.rb', line 4 def self.quote(env, *args) args[0] end |
.tail(env, *args) ⇒ Object
36 37 38 39 40 41 |
# File 'lib/jse/functors/builtin.rb', line 36 def self.tail(env, *args) lst = args[0].respond_to?(:apply) ? env.eval(args[0]) : args[0] raise "$tail requires a list" unless lst.is_a?(Array) raise "$tail: list is empty" if lst.empty? lst[1..] end |