missinglisp 0.0.0 → 0.0.1
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/lib/missinglisp.rb +36 -7
- metadata +6 -4
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2d943518d524706f9cac981ad41c1cb031a87016e286c12804d424af0528c121
|
4
|
+
data.tar.gz: bbc3ce8ab2de2fa384444a4b00c1cb3fbe1ea16fbc37470a56cf0e0828746134
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 7f1ab35b50356a81b4a146424a254eec5d9bf0e54ed3d7641ca38d25bacc5e96e75d0ac0522e5a91d013745c242118c28d0ea8922bcd037f210b499d1996b98d
|
7
|
+
data.tar.gz: 474e2c0137ebcab5b129088d9c4cdeaa06abf47f1f17ad173deccb4e86c800956f73f513d2df8b8a41cf7d5ebaf125a0421d54e15fafe1f87a0dd032a0691ccf
|
data/lib/missinglisp.rb
CHANGED
@@ -18,6 +18,7 @@ class Lisp
|
|
18
18
|
|
19
19
|
p: ->(*ls) { p ls },
|
20
20
|
|
21
|
+
t: true,
|
21
22
|
nil: []
|
22
23
|
}
|
23
24
|
end
|
@@ -33,8 +34,11 @@ class Lisp
|
|
33
34
|
elsif exp[0] == :if
|
34
35
|
_, test, e1, e2 = exp
|
35
36
|
test = self.eval(test, env)
|
36
|
-
|
37
|
-
|
37
|
+
truthy = if test.is_a?(Array) then !test.empty? else test end
|
38
|
+
|
39
|
+
if truthy
|
40
|
+
return self.eval(e1, env)
|
41
|
+
end
|
38
42
|
|
39
43
|
return self.eval(e2, env)
|
40
44
|
elsif exp[0] == :define
|
@@ -46,9 +50,25 @@ class Lisp
|
|
46
50
|
return ->(*args) { self.eval(e, env.merge(Hash[params.zip(args)])) }
|
47
51
|
end
|
48
52
|
|
49
|
-
|
50
|
-
|
51
|
-
|
53
|
+
# function application
|
54
|
+
values = exp.map { |c| self.eval(c, env) }
|
55
|
+
values[0].call(*values[1..])
|
56
|
+
end
|
57
|
+
|
58
|
+
# Evaluates list of lisp values e.g. Ldefine_a_1JLp_a_J
|
59
|
+
def eval_stmts(exp, env)
|
60
|
+
if !exp.is_a?(Array)
|
61
|
+
STDERR.puts 'eval_stmts: not a list'
|
62
|
+
exit 1
|
63
|
+
end
|
64
|
+
|
65
|
+
res = nil
|
66
|
+
exp.each do |stmt|
|
67
|
+
# p stmt
|
68
|
+
res = self.eval(stmt, env)
|
69
|
+
end
|
70
|
+
|
71
|
+
res
|
52
72
|
end
|
53
73
|
|
54
74
|
def parse(program)
|
@@ -57,6 +77,15 @@ class Lisp
|
|
57
77
|
end
|
58
78
|
|
59
79
|
def _parse(tokens)
|
80
|
+
stmts = []
|
81
|
+
while !tokens.empty?
|
82
|
+
stmts << parse_stmt(tokens)
|
83
|
+
end
|
84
|
+
|
85
|
+
stmts
|
86
|
+
end
|
87
|
+
|
88
|
+
def parse_stmt(tokens)
|
60
89
|
return if tokens.empty?
|
61
90
|
|
62
91
|
token = tokens.shift
|
@@ -68,7 +97,7 @@ class Lisp
|
|
68
97
|
while tokens.first != :J
|
69
98
|
raise 'unexpected end of input' if tokens.empty?
|
70
99
|
|
71
|
-
list <<
|
100
|
+
list << parse_stmt(tokens)
|
72
101
|
end
|
73
102
|
tokens.shift
|
74
103
|
|
@@ -155,7 +184,7 @@ module Kernel
|
|
155
184
|
def eval_lisp(s)
|
156
185
|
@l ||= Lisp.new
|
157
186
|
@e ||= @l.initial_env
|
158
|
-
@l.
|
187
|
+
@l.eval_stmts(@l.parse(s), @e)
|
159
188
|
end
|
160
189
|
|
161
190
|
def method_missing(m, *args, &block)
|
metadata
CHANGED
@@ -1,14 +1,15 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: missinglisp
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Yajima Soichi
|
8
8
|
bindir: bin
|
9
9
|
cert_chain: []
|
10
|
-
date: 2025-05-
|
10
|
+
date: 2025-05-11 00:00:00.000000000 Z
|
11
11
|
dependencies: []
|
12
|
+
description: Lisp programming using Ruby variable names
|
12
13
|
email: jajima.jp@gmail.com
|
13
14
|
executables: []
|
14
15
|
extensions: []
|
@@ -18,7 +19,8 @@ files:
|
|
18
19
|
homepage: https://github.com/jajimajp/missinglisp
|
19
20
|
licenses:
|
20
21
|
- MIT
|
21
|
-
metadata:
|
22
|
+
metadata:
|
23
|
+
source_code_uri: https://github.com/jajimajp/missinglisp
|
22
24
|
rdoc_options: []
|
23
25
|
require_paths:
|
24
26
|
- lib
|
@@ -26,7 +28,7 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
26
28
|
requirements:
|
27
29
|
- - ">="
|
28
30
|
- !ruby/object:Gem::Version
|
29
|
-
version: '0'
|
31
|
+
version: '3.0'
|
30
32
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
31
33
|
requirements:
|
32
34
|
- - ">="
|