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.
Files changed (3) hide show
  1. checksums.yaml +4 -4
  2. data/lib/missinglisp.rb +36 -7
  3. metadata +6 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 42f4de8720dddb978bf21be93ef48d8aab819a588ac139245dcbafd541251e32
4
- data.tar.gz: e370720f4a3f0eadda1afa9f38fb371eb68be30b886e8274241786d0549dbda0
3
+ metadata.gz: 2d943518d524706f9cac981ad41c1cb031a87016e286c12804d424af0528c121
4
+ data.tar.gz: bbc3ce8ab2de2fa384444a4b00c1cb3fbe1ea16fbc37470a56cf0e0828746134
5
5
  SHA512:
6
- metadata.gz: e15a0228df6251a9615609bafdf2f182193ac01b71ef840640e14690571d3309eefe791fa1a76cfdc20db972dbc674de9fb45a413782560ba5bbf1e2d1912e50
7
- data.tar.gz: ca39b773ab93ad1e52a0867810faa28537761da5a7840988e9e8cf77f9cd17e1d8983147d3e320eb23748914e51878ae20f4e713742dcabb9971b5401d88908b
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
- return self.eval(e1, env) if test.is_a?(Array) && !test.empty?
37
- return self.eval(e1, env) unless test.is_a?(Array) || !test
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
- args = exp[1..].map { |c| self.eval(c, env) }
50
- env[exp.first]
51
- .call(*args)
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 << _parse(tokens)
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.eval(@l.parse(s), @e)
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.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 00:00:00.000000000 Z
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
  - - ">="