lisp 1.0.1 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ae19eed30562514f832218c6558c6900f24b73e6
4
- data.tar.gz: d5be24c84e5e618069d70d4df6dcd58eb51c6fb3
3
+ metadata.gz: f7f4f9a7fe02524ebd2dc9df1d606df0285550ad
4
+ data.tar.gz: 6d2cc99951c8c70482840e55735c4f5c7510d4b4
5
5
  SHA512:
6
- metadata.gz: b1b706d317e74122ce7bd634e69b785326d49beb289e899363ecd2d484ebf9b01ae6a710d5776ad6e5f526a60b5468dfaf836c5ae58f1d9f85ce714fc92c2546
7
- data.tar.gz: 6957c2517635ed2a5842cf44bd0fd4fafb4c8225560bba10b4e11ed6840c0160f5aee4bf5782b21130ea8bb685391d63fc703e25735100a35bc0fd6386ad875c
6
+ metadata.gz: c015b086967313e762108778826e94e1d4c4d798904486ad9a4be28759120bb82466c9edd0bf1acdca9bbbcfa5d2a1eaea0abb18a7d962180575823243b319e3
7
+ data.tar.gz: cfc010cb803a93068a14c1b5418c1cce5b36833df0d05011bd5b2cd8fcb58f8cbfeee6b55bb549e2201a5c9ddc0d8b538de0b3fde97d7ee92e2db56676bec3c7
data/lib/lisp.rb CHANGED
@@ -1,24 +1,8 @@
1
- #!/usr/bin/env ruby
2
-
3
1
  require "bundler/setup"
4
2
  require "lisp/version"
5
- require "lisp/scope"
3
+ require "lisp/repl"
6
4
 
7
5
  module Lisp
8
- def self.repl
9
- puts "ctrl-c to exit"
10
- catch(:exit) do
11
- loop do
12
- print "> "
13
- puts begin
14
- eval gets
15
- rescue Exception => e
16
- e.message
17
- end
18
- end
19
- end
20
- end
21
-
22
6
  def self.eval(string)
23
7
  execute(parse(tokenize(string)))
24
8
  end
@@ -54,41 +38,32 @@ module Lisp
54
38
  end
55
39
 
56
40
  def self.execute(exp, scope = global)
57
- case exp
58
- when Array
59
- case exp[0]
60
- when :define
61
- _, var, exp = exp
62
- scope[var] = execute(exp, scope)
63
- when :lambda
64
- _, params, exp = exp
65
- lambda { |*args| execute(exp, Scope.new(params, args, scope)) }
66
- when :if
67
- _, test, conseq, alt = exp
68
- exp = execute(test, scope) ? conseq : alt
69
- execute(exp, scope)
70
- else
71
- func, *args = exp.map { |exp| execute(exp, scope) }
72
- func.call(*args)
73
- end
74
- when Symbol
75
- scope[exp]
41
+ return scope[exp] if exp.is_a? Symbol
42
+ return exp unless exp.is_a? Array
43
+
44
+ case exp[0]
45
+ when :define
46
+ _, var, exp = exp
47
+ scope[var] = execute(exp, scope)
48
+ when :lambda
49
+ _, params, exp = exp
50
+ lambda { |*args| execute(exp, scope.merge(Hash[params.zip(args)])) }
51
+ when :if
52
+ _, test, conseq, alt = exp
53
+ exp = execute(test, scope) ? conseq : alt
54
+ execute(exp, scope)
76
55
  else
77
- exp
56
+ func, *args = exp.map { |exp| execute(exp, scope) }
57
+ func.call(*args)
78
58
  end
79
59
  end
80
60
 
81
61
  def self.global
82
62
  @scope ||= begin
83
- methods = [:==, :"!=", :"<", :"<=", :">", :">=", :+, :-, :*, :/]
84
- methods.inject(Scope.new) do |scope, method|
85
- scope.merge(method => lambda { |*args| args.inject(&method) })
63
+ operators = [:==, :"!=", :"<", :"<=", :">", :">=", :+, :-, :*, :/]
64
+ operators.inject({}) do |scope, operator|
65
+ scope.merge(operator => lambda { |*args| args.inject(&operator) })
86
66
  end
87
67
  end
88
68
  end
89
69
  end
90
-
91
- if __FILE__ == $0
92
- trap("SIGINT") { throw :exit }
93
- Lisp.repl
94
- end
data/lib/lisp/repl.rb ADDED
@@ -0,0 +1,26 @@
1
+ #!/usr/bin/env ruby
2
+ require "coolline"
3
+
4
+ module Lisp
5
+ def self.repl
6
+ trap("SIGINT") { throw :exit }
7
+ puts "ctrl-c to exit"
8
+ catch(:exit) do
9
+ loop do
10
+ puts begin
11
+ eval input.readline
12
+ rescue Exception => e
13
+ e.message
14
+ end
15
+ end
16
+ end
17
+ end
18
+
19
+ def self.input
20
+ Coolline.new
21
+ end
22
+ end
23
+
24
+ if __FILE__ == $0
25
+ Lisp.repl
26
+ end
data/lib/lisp/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Lisp
2
- VERSION = "1.0.1"
2
+ VERSION = "1.0.2"
3
3
  end
data/lisp.gemspec CHANGED
@@ -18,6 +18,7 @@ Gem::Specification.new do |spec|
18
18
  spec.test_files = spec.files.grep(%r{^(test|spec|features)/})
19
19
  spec.require_paths = ["lib"]
20
20
 
21
+ spec.add_dependency "coolline"
21
22
  spec.add_development_dependency "bundler", "~> 1.6"
22
23
  spec.add_development_dependency "rake"
23
24
  spec.add_development_dependency "pry"
data/test/test_lisp.rb CHANGED
@@ -54,12 +54,4 @@ class TestLisp < MiniTest::Unit::TestCase
54
54
  Lisp.eval("(define fact (lambda (n) (if (<= n 1) 1 (* n (fact (- n 1))))))")
55
55
  assert_equal 3628800, Lisp.eval("(fact 10)")
56
56
  end
57
-
58
- def test_repl
59
- assert_output "ctrl-c to exit\n> " do
60
- thread = Thread.new { Lisp.repl }
61
- sleep 1.0/10.0
62
- thread.terminate
63
- end
64
- end
65
57
  end
metadata CHANGED
@@ -1,15 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: lisp
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.1
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - James Moriarty
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-06-09 00:00:00.000000000 Z
11
+ date: 2014-06-20 00:00:00.000000000 Z
12
12
  dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: coolline
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
13
27
  - !ruby/object:Gem::Dependency
14
28
  name: bundler
15
29
  requirement: !ruby/object:Gem::Requirement
@@ -65,7 +79,7 @@ files:
65
79
  - README.md
66
80
  - Rakefile
67
81
  - lib/lisp.rb
68
- - lib/lisp/scope.rb
82
+ - lib/lisp/repl.rb
69
83
  - lib/lisp/version.rb
70
84
  - lisp.gemspec
71
85
  - test/test_lisp.rb
data/lib/lisp/scope.rb DELETED
@@ -1,14 +0,0 @@
1
- module Lisp
2
- class Scope < Hash
3
- attr_accessor :outer
4
-
5
- def initialize(params = [], args = [], outer = nil)
6
- update(Hash[params.zip(args)])
7
- self.outer = outer
8
- end
9
-
10
- def [](name)
11
- super or outer[name]
12
- end
13
- end
14
- end