lisp 1.0.1 → 1.0.2

Sign up to get free protection for your applications and to get access to all the features.
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