rubylisp 0.2.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 +4 -4
- data/README.md +129 -2
- data/bin/rubylisp +87 -12
- data/lib/rubylisp/atom.rb +25 -6
- data/lib/rubylisp/boolean.rb +9 -6
- data/lib/rubylisp/builtins.rb +19 -18
- data/lib/rubylisp/character.rb +14 -275
- data/lib/rubylisp/class_object.rb +56 -0
- data/lib/rubylisp/cons_cell.rb +56 -25
- data/lib/rubylisp/debug.rb +15 -19
- data/lib/rubylisp/environment.rb +27 -0
- data/lib/rubylisp/environment_frame.rb +31 -6
- data/lib/rubylisp/eof_object.rb +26 -0
- data/lib/rubylisp/exception.rb +61 -61
- data/lib/rubylisp/ext.rb +32 -6
- data/lib/rubylisp/ffi_new.rb +2 -1
- data/lib/rubylisp/ffi_send.rb +15 -5
- data/lib/rubylisp/frame.rb +5 -164
- data/lib/rubylisp/function.rb +4 -3
- data/lib/rubylisp/macro.rb +13 -8
- data/lib/rubylisp/{object.rb → native_object.rb} +0 -15
- data/lib/rubylisp/number.rb +5 -0
- data/lib/rubylisp/parser.rb +81 -52
- data/lib/rubylisp/port.rb +27 -0
- data/lib/rubylisp/prim_alist.rb +115 -0
- data/lib/rubylisp/prim_assignment.rb +61 -0
- data/lib/rubylisp/prim_character.rb +273 -0
- data/lib/rubylisp/{ffi_class.rb → prim_class_object.rb} +16 -69
- data/lib/rubylisp/prim_environment.rb +203 -0
- data/lib/rubylisp/prim_equivalence.rb +93 -0
- data/lib/rubylisp/prim_frame.rb +166 -0
- data/lib/rubylisp/prim_io.rb +266 -0
- data/lib/rubylisp/prim_list_support.rb +496 -0
- data/lib/rubylisp/{logical.rb → prim_logical.rb} +9 -14
- data/lib/rubylisp/prim_math.rb +397 -0
- data/lib/rubylisp/prim_native_object.rb +21 -0
- data/lib/rubylisp/prim_relational.rb +42 -0
- data/lib/rubylisp/{special_forms.rb → prim_special_forms.rb} +98 -85
- data/lib/rubylisp/prim_string.rb +792 -0
- data/lib/rubylisp/prim_system.rb +55 -0
- data/lib/rubylisp/prim_type_checks.rb +58 -0
- data/lib/rubylisp/prim_vector.rb +497 -0
- data/lib/rubylisp/primitive.rb +51 -6
- data/lib/rubylisp/string.rb +4 -803
- data/lib/rubylisp/symbol.rb +0 -1
- data/lib/rubylisp/tokenizer.rb +161 -137
- data/lib/rubylisp/vector.rb +10 -31
- data/lib/rubylisp.rb +1 -0
- metadata +46 -17
- data/lib/rubylisp/alist.rb +0 -230
- data/lib/rubylisp/assignment.rb +0 -65
- data/lib/rubylisp/equivalence.rb +0 -118
- data/lib/rubylisp/io.rb +0 -74
- data/lib/rubylisp/list_support.rb +0 -526
- data/lib/rubylisp/math.rb +0 -405
- data/lib/rubylisp/relational.rb +0 -46
- data/lib/rubylisp/system.rb +0 -20
- data/lib/rubylisp/testing.rb +0 -136
- data/lib/rubylisp/type_checks.rb +0 -60
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bb5f9ceceb5366ea22a1684c23f1f891baff4ee9
|
4
|
+
data.tar.gz: 4dcf3352fe2c53178012846dd428a55e25e6ff5e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 8b6a30a4b7811e1c08bd49710de04c17ac2cce55a0bd9cd375e5f71c58c386c7c0a70c1335c79cb40d55fc558e06812568b48990b178f39fb0b0264451f5db30
|
7
|
+
data.tar.gz: 8cd9f89766f14601094794fa31404629e5780ce5072ad95abfd346b4733152c7962fa68c17234e475247458e7d65a93985ab7a6fe4bd61ff769c1df60c9293c2
|
data/README.md
CHANGED
@@ -43,13 +43,75 @@ Or install it yourself as:
|
|
43
43
|
4. Push to the branch (git push origin my-new-feature)
|
44
44
|
5. Create new Pull Request
|
45
45
|
|
46
|
-
##
|
46
|
+
## The rubylisp command ##
|
47
|
+
|
48
|
+
Installing the rubylisp gem installs the `rubylisp` command
|
49
|
+
|
50
|
+
>:rubylisp help
|
51
|
+
NAME:
|
52
|
+
|
53
|
+
rubylisp
|
54
|
+
|
55
|
+
DESCRIPTION:
|
56
|
+
|
57
|
+
A large sub/super-set of MIT/GNU-Scheme implemented in pure Ruby.
|
58
|
+
|
59
|
+
COMMANDS:
|
60
|
+
|
61
|
+
help Display global or [command] help documentation
|
62
|
+
repl Rubylisp REPL
|
63
|
+
test Runs tests
|
64
|
+
|
65
|
+
GLOBAL OPTIONS:
|
66
|
+
|
67
|
+
-h, --help
|
68
|
+
Display help documentation
|
69
|
+
|
70
|
+
-v, --version
|
71
|
+
Display version information
|
72
|
+
|
73
|
+
-t, --trace
|
74
|
+
Display backtrace when an error occurs
|
75
|
+
|
76
|
+
>:
|
77
|
+
|
78
|
+
|
79
|
+
### REPL ###
|
47
80
|
|
48
81
|
RubyLisp includes a very basic REPL that, as expected, lets you type
|
49
82
|
in snippets (it does not support multiline snippets) of Lisp code,
|
50
83
|
evaluates them, and prints the result.
|
51
84
|
|
52
|
-
>:
|
85
|
+
>:rubylisp help repl
|
86
|
+
|
87
|
+
NAME:
|
88
|
+
|
89
|
+
repl
|
90
|
+
|
91
|
+
SYNOPSIS:
|
92
|
+
|
93
|
+
rubylisp repl [options]
|
94
|
+
|
95
|
+
DESCRIPTION:
|
96
|
+
|
97
|
+
Rubylisp REPL
|
98
|
+
|
99
|
+
EXAMPLES:
|
100
|
+
|
101
|
+
# Simply run the REPL
|
102
|
+
rubylisp repl
|
103
|
+
|
104
|
+
# Run the REPL, loading a file first
|
105
|
+
rubylisp repl --file code.lsp
|
106
|
+
|
107
|
+
OPTIONS:
|
108
|
+
|
109
|
+
-f, --file LISPFILE
|
110
|
+
The name of the lisp file to load
|
111
|
+
|
112
|
+
|
113
|
+
|
114
|
+
>: rubylisp repl
|
53
115
|
|
54
116
|
RubyLisp REPL
|
55
117
|
> 4
|
@@ -61,6 +123,71 @@ evaluates them, and prints the result.
|
|
61
123
|
> (fib 4)
|
62
124
|
24
|
63
125
|
|
126
|
+
The repl uses readline for editing and history. History is saved in ~/.rubylisp_history. Evaling `(quit)` will exit the repl.
|
127
|
+
|
128
|
+
### Test runner ###
|
129
|
+
|
130
|
+
The `rubylisp` command also contains a test runner.
|
131
|
+
|
132
|
+
>:ruby -Ilib bin/rubylisp help test
|
133
|
+
|
134
|
+
NAME:
|
135
|
+
|
136
|
+
test
|
137
|
+
|
138
|
+
SYNOPSIS:
|
139
|
+
|
140
|
+
rubylisp test [options]
|
141
|
+
|
142
|
+
DESCRIPTION:
|
143
|
+
|
144
|
+
Runs tests
|
145
|
+
|
146
|
+
EXAMPLES:
|
147
|
+
|
148
|
+
# Run the tests in tests/list_tests.lsp with verbose output
|
149
|
+
rubylisp test -v -f tests/list_tests.lsp
|
150
|
+
|
151
|
+
# Quietly run all tests in the directory tests
|
152
|
+
rubylisp test -q -d tests
|
153
|
+
|
154
|
+
OPTIONS:
|
155
|
+
|
156
|
+
-f, --file TESTFILE
|
157
|
+
The name of the test file to run
|
158
|
+
|
159
|
+
-d, --dir TESTDIR
|
160
|
+
The name of a directory of test files, all of which will be run
|
161
|
+
|
162
|
+
--verbose
|
163
|
+
Verbose test output: all context & it labels, and each assertion and it's result.
|
164
|
+
|
165
|
+
--terse
|
166
|
+
terse test output (the default): + for passes, - for failures, and ! for errors
|
167
|
+
|
168
|
+
--quiet
|
169
|
+
Only output a summary
|
170
|
+
|
171
|
+
>:rubylisp test -d lisptest --terse
|
172
|
+
|
173
|
+
|
174
|
+
Running lisp tests
|
175
|
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
176
|
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
177
|
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
178
|
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
179
|
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
180
|
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
181
|
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
182
|
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
183
|
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
184
|
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
185
|
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
186
|
+
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
|
187
|
+
++++++++++++++++++++++++++++
|
188
|
+
Ran 928 lisp tests in 7.0789 seconds
|
189
|
+
928 passes, 0 failures, 0 errors
|
190
|
+
|
64
191
|
## Integrating
|
65
192
|
|
66
193
|
|
data/bin/rubylisp
CHANGED
@@ -1,24 +1,99 @@
|
|
1
1
|
#!/usr/bin/env ruby
|
2
2
|
|
3
3
|
require 'rubylisp'
|
4
|
+
require 'rubygems'
|
5
|
+
require 'commander/import'
|
4
6
|
require 'readline'
|
7
|
+
require 'readline/history/restore'
|
5
8
|
|
6
9
|
Lisp::Initializer.register_builtins
|
7
10
|
Lisp::Debug.interactive = true
|
8
11
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
12
|
+
program :version, '0.0.1'
|
13
|
+
program :description, 'A large sub/super-set of MIT/GNU-Scheme implemented in pure Ruby.'
|
14
|
+
|
15
|
+
# Smarter Readline to prevent empty and dups
|
16
|
+
# 1. Read a line and append to history
|
17
|
+
# 2. Quick Break on nil
|
18
|
+
# 3. Remove from history if empty or dup
|
19
|
+
|
20
|
+
def readline_with_hist_management
|
21
|
+
line = Readline.readline('> ', true)
|
22
|
+
return nil if line.nil?
|
23
|
+
if line =~ /^\s*$/ or Readline::HISTORY.to_a[-2] == line
|
24
|
+
Readline::HISTORY.pop
|
25
|
+
end
|
26
|
+
line
|
27
|
+
end
|
28
|
+
|
29
|
+
command :repl do |c|
|
30
|
+
c.syntax = 'rubylisp repl [options]'
|
31
|
+
c.summary = 'Rubylisp REPL'
|
32
|
+
c.description = c.summary
|
33
|
+
c.example 'Simply run the REPL', 'rubylisp repl'
|
34
|
+
c.example 'Run the REPL, loading a file first', 'rubylisp repl --file code.lsp'
|
35
|
+
c.option '-f', '--file LISPFILE', String, 'The name of the lisp file to load'
|
36
|
+
c.action do |args, options|
|
37
|
+
history_path = File.join(Dir.home, '.rubylisp_history')
|
38
|
+
unless File.exist?(history_path)
|
39
|
+
File.open(history_path, "w") {|f| }
|
40
|
+
end
|
41
|
+
Readline::History::Restore.new(history_path)
|
42
|
+
|
43
|
+
options.default :file => ""
|
44
|
+
puts 'RubyLisp REPL'
|
45
|
+
puts 'Copyright 2014-2015 David R. Astels'
|
46
|
+
puts
|
47
|
+
parser = Lisp::Parser.new
|
48
|
+
parser.process_file(options.file) if options.file != ""
|
49
|
+
while line = readline_with_hist_management
|
50
|
+
begin
|
51
|
+
puts parser.parse_and_eval(line).print_string
|
52
|
+
rescue Exception => ex
|
53
|
+
exit if ex.to_s == "exit"
|
54
|
+
puts "ERROR: #{ex}"
|
55
|
+
# puts ex.backtrace
|
56
|
+
end
|
57
|
+
end
|
21
58
|
end
|
22
59
|
end
|
23
60
|
|
61
|
+
command :test do |c|
|
62
|
+
c.syntax = 'rubylisp test [options]'
|
63
|
+
c.summary = 'Runs tests'
|
64
|
+
c.description = c.summary
|
65
|
+
c.example 'Run the tests in tests/list_tests.lsp with verbose output', 'rubylisp test -v -f tests/list_tests.lsp'
|
66
|
+
c.example 'Quietly run all tests in the directory tests', 'rubylisp test -q -d tests'
|
67
|
+
c.option '-f', '--file TESTFILE', String, 'The name of the test file to run'
|
68
|
+
c.option '-d', '--dir TESTDIR', String, 'The name of a directory of test files, all of which will be run'
|
69
|
+
c.option '--verbose', "Verbose test output: all context & it labels, and each assertion and it's result."
|
70
|
+
c.option '--terse', 'terse test output (the default): + for passes, - for failures, and ! for errors'
|
71
|
+
c.option '--quiet', 'Only output a summary'
|
72
|
+
c.action do |args, options|
|
73
|
+
options.default :file => "",
|
74
|
+
:dir => "",
|
75
|
+
:verbose => false,
|
76
|
+
:quiet => false
|
77
|
+
rubylisp_home = ENV['RUBYLISP_HOME'] || "."
|
78
|
+
cmd, arg = if options.file != ""
|
79
|
+
["run-test", File.join(rubylisp_home, options.file)]
|
80
|
+
elsif options.dir != ""
|
81
|
+
["run-all-tests", File.join(rubylisp_home, options.dir)]
|
82
|
+
else
|
83
|
+
puts "Either a file or directory must be specified"
|
84
|
+
exit
|
85
|
+
end
|
86
|
+
verbosity = if options.verbose
|
87
|
+
"'verbose"
|
88
|
+
elsif options.quiet
|
89
|
+
"'quiet"
|
90
|
+
else
|
91
|
+
""
|
92
|
+
end
|
93
|
+
test_command = "(#{cmd} \"#{arg}\" #{verbosity})"
|
94
|
+
parser = Lisp::Parser.new
|
95
|
+
parser.process_file("#{rubylisp_home}/lisp/testing.lsp")
|
96
|
+
parser.parse_and_eval(test_command).value
|
97
|
+
end
|
98
|
+
end
|
24
99
|
|
data/lib/rubylisp/atom.rb
CHANGED
@@ -68,15 +68,23 @@ module Lisp
|
|
68
68
|
false
|
69
69
|
end
|
70
70
|
|
71
|
-
def
|
71
|
+
def frame?
|
72
72
|
false
|
73
73
|
end
|
74
74
|
|
75
|
-
def
|
75
|
+
def vector?
|
76
76
|
false
|
77
77
|
end
|
78
78
|
|
79
|
-
def
|
79
|
+
def port?
|
80
|
+
false
|
81
|
+
end
|
82
|
+
|
83
|
+
def eof_object?
|
84
|
+
false
|
85
|
+
end
|
86
|
+
|
87
|
+
def environment?
|
80
88
|
false
|
81
89
|
end
|
82
90
|
|
@@ -88,10 +96,16 @@ module Lisp
|
|
88
96
|
self.class.new(self.value)
|
89
97
|
end
|
90
98
|
|
99
|
+
def eqv?(sexpr)
|
100
|
+
self == sexpr
|
101
|
+
end
|
102
|
+
|
91
103
|
def eq?(sexpr)
|
92
|
-
|
93
|
-
|
94
|
-
|
104
|
+
eqv?(sexpr)
|
105
|
+
end
|
106
|
+
|
107
|
+
def equal?(sexpr)
|
108
|
+
eq?(sexpr)
|
95
109
|
end
|
96
110
|
|
97
111
|
def type
|
@@ -133,6 +147,11 @@ module Lisp
|
|
133
147
|
def set!(v)
|
134
148
|
end
|
135
149
|
|
150
|
+
def to_s
|
151
|
+
@value.to_s
|
152
|
+
end
|
153
|
+
|
154
|
+
|
136
155
|
def print_string
|
137
156
|
self.to_s
|
138
157
|
end
|
data/lib/rubylisp/boolean.rb
CHANGED
@@ -2,11 +2,11 @@ module Lisp
|
|
2
2
|
|
3
3
|
class Boolean < Atom
|
4
4
|
def self.TRUE
|
5
|
-
@true_constant ||= Boolean.new(true)
|
5
|
+
@true_constant ||= Lisp::Boolean.new(true)
|
6
6
|
end
|
7
7
|
|
8
8
|
def self.FALSE
|
9
|
-
@false_constant ||= Boolean.new(false)
|
9
|
+
@false_constant ||= Lisp::Boolean.new(false)
|
10
10
|
end
|
11
11
|
|
12
12
|
def self.with_value(b)
|
@@ -26,8 +26,11 @@ module Lisp
|
|
26
26
|
end
|
27
27
|
|
28
28
|
def to_s
|
29
|
-
|
30
|
-
|
29
|
+
if @value
|
30
|
+
"#t"
|
31
|
+
else
|
32
|
+
"#f"
|
33
|
+
end
|
31
34
|
end
|
32
35
|
|
33
36
|
def true?
|
@@ -44,6 +47,6 @@ module Lisp
|
|
44
47
|
|
45
48
|
end
|
46
49
|
|
47
|
-
TRUE = Boolean.TRUE
|
48
|
-
FALSE = Boolean.FALSE
|
50
|
+
TRUE = Lisp::Boolean.TRUE
|
51
|
+
FALSE = Lisp::Boolean.FALSE
|
49
52
|
end
|
data/lib/rubylisp/builtins.rb
CHANGED
@@ -7,26 +7,27 @@ module Lisp
|
|
7
7
|
end
|
8
8
|
|
9
9
|
def self.register_builtins
|
10
|
-
Lisp::
|
11
|
-
Lisp::
|
12
|
-
Lisp::
|
13
|
-
Lisp::
|
14
|
-
Lisp::
|
15
|
-
Lisp::
|
16
|
-
Lisp::
|
17
|
-
Lisp::
|
18
|
-
Lisp::
|
19
|
-
Lisp::
|
20
|
-
Lisp::
|
21
|
-
Lisp::
|
22
|
-
Lisp::
|
23
|
-
Lisp::
|
24
|
-
Lisp::
|
25
|
-
Lisp::
|
26
|
-
Lisp::
|
27
|
-
Lisp::Vector.register
|
10
|
+
Lisp::PrimEquivalence.register
|
11
|
+
Lisp::PrimMath.register
|
12
|
+
Lisp::PrimLogical.register
|
13
|
+
Lisp::PrimSpecialForms.register
|
14
|
+
Lisp::PrimListSupport.register
|
15
|
+
Lisp::PrimRelational.register
|
16
|
+
Lisp::PrimTypeChecks.register
|
17
|
+
Lisp::PrimAssignment.register
|
18
|
+
Lisp::PrimIo.register
|
19
|
+
Lisp::PrimAlist.register
|
20
|
+
Lisp::PrimFrame.register
|
21
|
+
Lisp::PrimCharacter.register
|
22
|
+
Lisp::PrimString.register
|
23
|
+
Lisp::PrimNativeObject.register
|
24
|
+
Lisp::PrimClassObject.register
|
25
|
+
Lisp::PrimSystem.register
|
26
|
+
Lisp::PrimVector.register
|
28
27
|
Lisp::Debug.register
|
28
|
+
Lisp::PrimEnvironment.register
|
29
29
|
end
|
30
|
+
|
30
31
|
end
|
31
32
|
|
32
33
|
end
|