lisp 1.4.0 → 1.4.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 +4 -4
- data/.travis +8 -0
- data/.travis.yml +10 -0
- data/Gemfile +1 -1
- data/README.md +10 -14
- data/bin/{lisp-rb → lisp-repl} +0 -0
- data/lib/lisp.rb +3 -3
- data/lib/lisp/ext/proc.rb +9 -0
- data/lib/lisp/repl.rb +3 -0
- data/lib/lisp/version.rb +1 -1
- data/lisp.gemspec +1 -0
- data/test/test_lisp.rb +25 -1
- metadata +21 -6
- data/test/support/codeclimate.rb +0 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 38d7b0804909b38cc12ccd8c10ee47e5386d7e2d
|
4
|
+
data.tar.gz: f7aca5e50f7d1c9959e6e8994c63de59f86d3c11
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3746975bc6337ab8dac411fa08e04295031c3e29a869aee9b3dcc3928f76eb750964a049d991401ec16ebd97ecf6f8f099ded84f9845396bfdd25dcc84e609bd
|
7
|
+
data.tar.gz: 7004c064a67d1713ea8780ff153ff5864ae18281439f5c0f796507b7dda3357023583038d54795987b8b39123f2779434818c5f8618c3aa17029e9feb2145a35
|
data/.travis
ADDED
data/.travis.yml
ADDED
data/Gemfile
CHANGED
data/README.md
CHANGED
@@ -1,25 +1,21 @@
|
|
1
1
|
lisp
|
2
2
|
====
|
3
3
|
|
4
|
-
[](https://codeclimate.com/github/jamesmoriarty/lisp-rb) [](https://codeclimate.com/github/jamesmoriarty/lisp-rb/coverage)
|
4
|
+
[](https://codeclimate.com/github/jamesmoriarty/lisp-rb) [](https://codeclimate.com/github/jamesmoriarty/lisp-rb/coverage) [](https://travis-ci.org/jamesmoriarty/lisp)
|
5
5
|
|
6
6
|
Lisp Interpreter in the Ruby Programming Language - 70 LOC. Inspired by [Lis.py](http://norvig.com/lispy.html).
|
7
7
|
|
8
8
|
```
|
9
|
-
$ lisp-
|
9
|
+
$ lisp-repl
|
10
10
|
ctrl-c to exit
|
11
|
-
> (
|
12
|
-
|
13
|
-
> (
|
14
|
-
|
15
|
-
>
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
> (define fact (lambda (n) (if (<= n 1) 1 (* n (fact (- n 1))))))
|
20
|
-
#<Proc:0x007f9a4cc4acf0@./lisp.rb:63 (lambda)>
|
21
|
-
> (fact 10)
|
22
|
-
3628800.0
|
11
|
+
> (begin
|
12
|
+
(> (define incf
|
13
|
+
((> (lambda (x)
|
14
|
+
(((> (set! x (+ x 1))))
|
15
|
+
(> (define one 1)
|
16
|
+
(> (incf one))
|
17
|
+
2
|
18
|
+
>
|
23
19
|
```
|
24
20
|
|
25
21
|
Install
|
data/bin/{lisp-rb → lisp-repl}
RENAMED
File without changes
|
data/lib/lisp.rb
CHANGED
@@ -39,8 +39,8 @@ module Lisp
|
|
39
39
|
end
|
40
40
|
|
41
41
|
def self.execute expression, scope = global
|
42
|
-
return scope
|
43
|
-
return expression
|
42
|
+
return scope.fetch(expression) { |var| raise "#{var} is undefined" } if expression.is_a? Symbol
|
43
|
+
return expression unless expression.is_a? Array
|
44
44
|
|
45
45
|
case expression[0]
|
46
46
|
when :define
|
@@ -58,7 +58,7 @@ module Lisp
|
|
58
58
|
if scope.has_key?(var) then scope[var] = execute expression, scope else raise "#{var} is undefined" end
|
59
59
|
when :begin
|
60
60
|
_, *expression = expression
|
61
|
-
expression.map { |expression| execute expression }.last
|
61
|
+
expression.map { |expression| execute expression, scope }.last
|
62
62
|
else
|
63
63
|
function, *args = expression.map { |expression| execute expression, scope }
|
64
64
|
function.call *args
|
data/lib/lisp/repl.rb
CHANGED
data/lib/lisp/version.rb
CHANGED
data/lisp.gemspec
CHANGED
data/test/test_lisp.rb
CHANGED
@@ -72,6 +72,15 @@ class TestLisp < MiniTest::Unit::TestCase
|
|
72
72
|
eos
|
73
73
|
end
|
74
74
|
|
75
|
+
def test_lambda_no_args
|
76
|
+
assert_equal 42, Lisp.eval(<<-eos)
|
77
|
+
(begin
|
78
|
+
(define test
|
79
|
+
(lambda () 42))
|
80
|
+
(test))
|
81
|
+
eos
|
82
|
+
end
|
83
|
+
|
75
84
|
def test_lambda_call_self
|
76
85
|
assert_equal 3628800, Lisp.eval(<<-eos)
|
77
86
|
(begin
|
@@ -93,6 +102,21 @@ class TestLisp < MiniTest::Unit::TestCase
|
|
93
102
|
eos
|
94
103
|
end
|
95
104
|
|
105
|
+
def test_nested_begin
|
106
|
+
assert_raises(RuntimeError, "one is undefined") do
|
107
|
+
Lisp.eval(<<-eos)
|
108
|
+
(begin
|
109
|
+
(define test
|
110
|
+
(lambda ()
|
111
|
+
(begin
|
112
|
+
(define one 1)
|
113
|
+
(+ one 1))))
|
114
|
+
(test)
|
115
|
+
(+ 2 one))
|
116
|
+
eos
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
96
120
|
def test_program
|
97
121
|
assert_equal 2, Lisp.eval(<<-eos)
|
98
122
|
(begin
|
@@ -112,7 +136,7 @@ class TestLisp < MiniTest::Unit::TestCase
|
|
112
136
|
Process.kill("INT", pid)
|
113
137
|
thread.join
|
114
138
|
end
|
115
|
-
|
139
|
+
|
116
140
|
assert_output("ctrl-c to exit\n") do
|
117
141
|
subject.run
|
118
142
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: lisp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.4.
|
4
|
+
version: 1.4.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:
|
11
|
+
date: 2017-02-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: coolline
|
@@ -66,25 +66,41 @@ dependencies:
|
|
66
66
|
- - '>='
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '0'
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: minitest
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - '>'
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: '5'
|
76
|
+
type: :development
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - '>'
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: '5'
|
69
83
|
description: ''
|
70
84
|
email:
|
71
85
|
- jamespaulmoriarty@gmail.com
|
72
86
|
executables:
|
73
|
-
- lisp-
|
87
|
+
- lisp-repl
|
74
88
|
extensions: []
|
75
89
|
extra_rdoc_files: []
|
76
90
|
files:
|
77
91
|
- .gitignore
|
92
|
+
- .travis
|
93
|
+
- .travis.yml
|
78
94
|
- Gemfile
|
79
95
|
- LICENSE.txt
|
80
96
|
- README.md
|
81
97
|
- Rakefile
|
82
|
-
- bin/lisp-
|
98
|
+
- bin/lisp-repl
|
83
99
|
- lib/lisp.rb
|
100
|
+
- lib/lisp/ext/proc.rb
|
84
101
|
- lib/lisp/repl.rb
|
85
102
|
- lib/lisp/version.rb
|
86
103
|
- lisp.gemspec
|
87
|
-
- test/support/codeclimate.rb
|
88
104
|
- test/support/simplecov.rb
|
89
105
|
- test/test_lisp.rb
|
90
106
|
homepage: ''
|
@@ -112,6 +128,5 @@ signing_key:
|
|
112
128
|
specification_version: 4
|
113
129
|
summary: Lisp Interpreter in Ruby.
|
114
130
|
test_files:
|
115
|
-
- test/support/codeclimate.rb
|
116
131
|
- test/support/simplecov.rb
|
117
132
|
- test/test_lisp.rb
|
data/test/support/codeclimate.rb
DELETED