Class: Lisp::PrimSystem

Inherits:
Object show all
Defined in:
lib/rubylisp/prim_system.rb

Class Method Summary collapse

Class Method Details

.error_impl(args, env) ⇒ Object



29
30
31
32
# File 'lib/rubylisp/prim_system.rb', line 29

def self.error_impl(args, env)
  #puts "error #{args.car.print_string}"
  Lisp::Debug.process_error(args.car.to_s, env)
end

.on_error_impl(args, env) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
# File 'lib/rubylisp/prim_system.rb', line 35

def self.on_error_impl(args, env)
  #puts "on-error ===> #{args.car.body.print_string}"
  begin
    result = args.car.evaluate(env)
  rescue => e
    handler = args.cadr.evaluate(env)
    return Lisp::Debug.process_error("on-error needs a function as it's second argument", env) unless handler.function?
    #puts "ERROR: #{e}"
    err_string = Lisp::String.with_value("#{e}")
    handler.apply_to(Lisp::ConsCell.array_to_list([err_string]), env)
  else
    if args.length == 3
      handler = args.caddr.evaluate(env)
      return Lisp::Debug.process_error("on-error needs a function as it's third argument", env) unless handler.function?
      handler.apply_to(nil, env)
    end
  end
end

.registerObject



5
6
7
8
9
10
11
# File 'lib/rubylisp/prim_system.rb', line 5

def self.register
  Primitive.register("sleep", "1") {|args, env| Lisp::PrimSystem.sleep_impl(args, env) }
  Primitive.register("time", "1", "", true)  {|args, env| Lisp::PrimSystem.time_impl(args, env) }
  Primitive.register("quit", "0")  {|args, env| exit() }
  Primitive.register("error", "1")  {|args, env| Lisp::PrimSystem.error_impl(args, env) }
  Primitive.register("on-error", "2|3", "", true)  {|args, env| Lisp::PrimSystem.on_error_impl(args, env) }
end

.sleep_impl(args, env) ⇒ Object



14
15
16
17
18
# File 'lib/rubylisp/prim_system.rb', line 14

def self.sleep_impl(args, env)
  arg = args.car
  return Lisp::Debug.process_error("sleep needs a numeric argument", env) unless arg.number?
  sleep(arg.value)
end

.time_impl(args, env) ⇒ Object



21
22
23
24
25
26
# File 'lib/rubylisp/prim_system.rb', line 21

def self.time_impl(args, env)
  start_time = Time.now
  args.car.evaluate(env)
  end_time = Time.now
  Lisp::Number.with_value(end_time - start_time)
end