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

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