nydp 0.5.1 → 0.6.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.gitignore +1 -0
- data/README.md +77 -56
- data/lib/lisp/core-000.nydp +1 -1
- data/lib/lisp/core-010-precompile.nydp +49 -29
- data/lib/lisp/core-012-utils.nydp +12 -8
- data/lib/lisp/core-015-documentation.nydp +41 -15
- data/lib/lisp/core-017-builtin-dox.nydp +621 -100
- data/lib/lisp/core-020-utils.nydp +33 -6
- data/lib/lisp/core-025-warnings.nydp +1 -1
- data/lib/lisp/core-030-syntax.nydp +64 -48
- data/lib/lisp/core-035-flow-control.nydp +20 -28
- data/lib/lisp/core-037-list-utils.nydp +84 -21
- data/lib/lisp/core-040-utils.nydp +8 -5
- data/lib/lisp/core-041-string-utils.nydp +17 -11
- data/lib/lisp/core-043-list-utils.nydp +140 -77
- data/lib/lisp/core-045-dox-utils.nydp +1 -0
- data/lib/lisp/core-050-test-runner.nydp +8 -12
- data/lib/lisp/core-070-prefix-list.nydp +19 -15
- data/lib/lisp/core-080-pretty-print.nydp +13 -5
- data/lib/lisp/core-090-hook.nydp +11 -11
- data/lib/lisp/core-100-utils.nydp +51 -66
- data/lib/lisp/core-110-hash-utils.nydp +34 -7
- data/lib/lisp/core-120-settings.nydp +14 -9
- data/lib/lisp/core-130-validations.nydp +28 -13
- data/lib/lisp/core-900-benchmarking.nydp +420 -47
- data/lib/lisp/tests/000-empty-args-examples.nydp +5 -0
- data/lib/lisp/tests/andify-examples.nydp +1 -1
- data/lib/lisp/tests/auto-hash-examples.nydp +6 -1
- data/lib/lisp/tests/best-examples.nydp +1 -1
- data/lib/lisp/tests/boot-tests.nydp +1 -1
- data/lib/lisp/tests/date-examples.nydp +129 -102
- data/lib/lisp/tests/destructuring-examples.nydp +1 -1
- data/lib/lisp/tests/dox-tests.nydp +2 -2
- data/lib/lisp/tests/hash-examples.nydp +58 -33
- data/lib/lisp/tests/list-tests.nydp +137 -1
- data/lib/lisp/tests/pretty-print-tests.nydp +12 -0
- data/lib/lisp/tests/rotate-2d-array-examples.nydp +26 -0
- data/lib/lisp/tests/sort-examples.nydp +5 -5
- data/lib/lisp/tests/string-tests.nydp +16 -5
- data/lib/lisp/tests/syntax-tests.nydp +10 -2
- data/lib/lisp/tests/time-examples.nydp +8 -1
- data/lib/lisp/tests/unparse-tests.nydp +13 -7
- data/lib/nydp/assignment.rb +15 -28
- data/lib/nydp/builtin/abs.rb +4 -3
- data/lib/nydp/builtin/apply.rb +8 -10
- data/lib/nydp/builtin/cdr_set.rb +1 -1
- data/lib/nydp/builtin/comment.rb +1 -3
- data/lib/nydp/builtin/date.rb +11 -28
- data/lib/nydp/builtin/divide.rb +3 -10
- data/lib/nydp/builtin/ensuring.rb +6 -21
- data/lib/nydp/builtin/error.rb +2 -4
- data/lib/nydp/builtin/eval.rb +9 -4
- data/lib/nydp/builtin/greater_than.rb +7 -8
- data/lib/nydp/builtin/handle_error.rb +10 -34
- data/lib/nydp/builtin/hash.rb +24 -45
- data/lib/nydp/builtin/inspect.rb +1 -3
- data/lib/nydp/builtin/is_equal.rb +4 -7
- data/lib/nydp/builtin/less_than.rb +6 -7
- data/lib/nydp/builtin/log.rb +7 -0
- data/lib/nydp/builtin/math_ceiling.rb +1 -3
- data/lib/nydp/builtin/math_floor.rb +1 -3
- data/lib/nydp/builtin/math_power.rb +1 -3
- data/lib/nydp/builtin/math_round.rb +2 -2
- data/lib/nydp/builtin/minus.rb +7 -14
- data/lib/nydp/builtin/parse.rb +5 -5
- data/lib/nydp/builtin/parse_in_string.rb +5 -7
- data/lib/nydp/builtin/plus.rb +14 -31
- data/lib/nydp/builtin/pre_compile.rb +1 -3
- data/lib/nydp/builtin/puts.rb +4 -8
- data/lib/nydp/builtin/quit.rb +1 -1
- data/lib/nydp/builtin/rand.rb +6 -11
- data/lib/nydp/builtin/random_string.rb +2 -4
- data/lib/nydp/builtin/rng.rb +25 -0
- data/lib/nydp/builtin/ruby_wrap.rb +27 -14
- data/lib/nydp/builtin/script_run.rb +1 -3
- data/lib/nydp/builtin/set_intersection.rb +3 -4
- data/lib/nydp/builtin/set_union.rb +3 -4
- data/lib/nydp/builtin/sort.rb +2 -7
- data/lib/nydp/builtin/string_match.rb +5 -13
- data/lib/nydp/builtin/string_replace.rb +2 -7
- data/lib/nydp/builtin/string_split.rb +3 -8
- data/lib/nydp/builtin/sym.rb +2 -9
- data/lib/nydp/builtin/thread_locals.rb +2 -2
- data/lib/nydp/builtin/time.rb +38 -44
- data/lib/nydp/builtin/times.rb +6 -15
- data/lib/nydp/builtin/to_integer.rb +8 -14
- data/lib/nydp/builtin/to_string.rb +2 -13
- data/lib/nydp/builtin/type_of.rb +10 -16
- data/lib/nydp/builtin/vm_info.rb +2 -10
- data/lib/nydp/builtin.rb +15 -37
- data/lib/nydp/compiler.rb +29 -19
- data/lib/nydp/cond.rb +95 -88
- data/lib/nydp/context_symbol.rb +11 -9
- data/lib/nydp/core.rb +74 -73
- data/lib/nydp/core_ext.rb +87 -26
- data/lib/nydp/date.rb +22 -19
- data/lib/nydp/error.rb +2 -3
- data/lib/nydp/function_invocation.rb +76 -289
- data/lib/nydp/helper.rb +18 -9
- data/lib/nydp/interpreted_function.rb +159 -25
- data/lib/nydp/lexical_context.rb +9 -8
- data/lib/nydp/lexical_context_builder.rb +1 -1
- data/lib/nydp/literal.rb +3 -7
- data/lib/nydp/loop.rb +72 -0
- data/lib/nydp/namespace.rb +52 -0
- data/lib/nydp/pair.rb +146 -50
- data/lib/nydp/parser.rb +9 -11
- data/lib/nydp/plugin.rb +88 -19
- data/lib/nydp/runner.rb +141 -23
- data/lib/nydp/symbol.rb +16 -26
- data/lib/nydp/symbol_lookup.rb +3 -2
- data/lib/nydp/tokeniser.rb +1 -1
- data/lib/nydp/truth.rb +2 -37
- data/lib/nydp/version.rb +1 -1
- data/lib/nydp.rb +33 -44
- data/nydp.gemspec +2 -1
- data/spec/date_spec.rb +26 -32
- data/spec/embedded_spec.rb +22 -22
- data/spec/error_spec.rb +12 -16
- data/spec/foreign_hash_spec.rb +21 -36
- data/spec/hash_non_hash_behaviour_spec.rb +12 -29
- data/spec/hash_spec.rb +36 -49
- data/spec/literal_spec.rb +6 -6
- data/spec/nydp_spec.rb +14 -14
- data/spec/pair_spec.rb +8 -8
- data/spec/parser_spec.rb +41 -37
- data/spec/rand_spec.rb +1 -4
- data/spec/spec_helper.rb +3 -3
- data/spec/string_atom_spec.rb +15 -16
- data/spec/symbol_spec.rb +27 -52
- data/spec/thread_local_spec.rb +23 -8
- data/spec/time_spec.rb +4 -10
- data/spec/tokeniser_spec.rb +10 -10
- metadata +25 -13
- data/lib/nydp/builtin/modulo.rb +0 -11
- data/lib/nydp/builtin/regexp.rb +0 -7
- data/lib/nydp/builtin/sqrt.rb +0 -7
- data/lib/nydp/builtin/string_pad_left.rb +0 -7
- data/lib/nydp/builtin/string_pad_right.rb +0 -7
- data/lib/nydp/hash.rb +0 -9
- data/lib/nydp/image_store.rb +0 -21
- data/lib/nydp/vm.rb +0 -129
data/lib/nydp/compiler.rb
CHANGED
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'nydp/cond'
|
2
|
+
require 'nydp/loop'
|
2
3
|
require 'nydp/function_invocation'
|
3
4
|
require 'nydp/interpreted_function'
|
4
5
|
require 'nydp/literal'
|
@@ -7,48 +8,57 @@ module Nydp
|
|
7
8
|
class Compiler
|
8
9
|
extend Helper
|
9
10
|
|
10
|
-
def self.compile expression, bindings
|
11
|
-
compile_expr expression, bindings
|
11
|
+
def self.compile expression, bindings, ns
|
12
|
+
compile_expr expression, bindings, ns
|
12
13
|
rescue StandardError => e
|
13
|
-
raise Nydp::Error.new "failed to compile expression:\n#{expression.
|
14
|
+
raise Nydp::Error.new "failed to compile expression:\n#{expression._nydp_inspect}\n#{e.message}"
|
14
15
|
end
|
15
16
|
|
16
|
-
def self.compile_expr expression, bindings
|
17
|
-
if expression.is_a? Nydp::Symbol
|
18
|
-
|
17
|
+
def self.compile_expr expression, bindings, ns
|
18
|
+
# if expression.is_a? Nydp::Symbol
|
19
|
+
if expression.is_a? ::Symbol
|
20
|
+
SymbolLookup.build expression, bindings, ns
|
19
21
|
elsif literal? expression
|
20
|
-
Literal.build expression, bindings
|
22
|
+
Literal.build expression, bindings, ns
|
21
23
|
elsif expression.is_a? Nydp::Pair
|
22
|
-
|
24
|
+
begin
|
25
|
+
compile_pair expression, bindings, ns
|
26
|
+
rescue => e
|
27
|
+
raise "failed to compile #{expression._nydp_inspect}"
|
28
|
+
end
|
29
|
+
else
|
30
|
+
raise Nydp::Error.new "failed to compile unrecognised expression:\n#{expression._nydp_inspect}\nwhich is a #{expression.class}"
|
23
31
|
end
|
24
32
|
end
|
25
33
|
|
26
34
|
def self.maybe_cons a, b
|
27
|
-
|
35
|
+
(a == nil) ? b : cons(a, b)
|
28
36
|
end
|
29
37
|
|
30
|
-
def self.compile_each expr, bindings
|
31
|
-
if
|
38
|
+
def self.compile_each expr, bindings, ns
|
39
|
+
if expr == nil
|
32
40
|
expr
|
33
41
|
elsif pair?(expr)
|
34
|
-
maybe_cons compile(expr.car, bindings), compile_each(expr.cdr, bindings)
|
42
|
+
maybe_cons compile(expr.car, bindings, ns), compile_each(expr.cdr, bindings, ns)
|
35
43
|
else
|
36
|
-
compile(expr, bindings)
|
44
|
+
compile(expr, bindings, ns)
|
37
45
|
end
|
38
46
|
end
|
39
47
|
|
40
|
-
def self.compile_pair expression, bindings
|
48
|
+
def self.compile_pair expression, bindings, ns
|
41
49
|
key = expression.car
|
42
50
|
if sym?(key, :cond)
|
43
|
-
Cond.build expression.cdr, bindings # todo: replace with function? (cond x (fn () iftrue) (fn () iffalse)) -->> performance issues, creating two closures for every cond invocation
|
51
|
+
Cond.build expression.cdr, bindings, ns # todo: replace with function? (cond x (fn () iftrue) (fn () iffalse)) -->> performance issues, creating two closures for every cond invocation
|
52
|
+
elsif sym?(key, :loop)
|
53
|
+
Loop.build expression.cdr, bindings, ns
|
44
54
|
elsif sym?(key, :quote)
|
45
|
-
Literal.build expression.cadr, bindings
|
55
|
+
Literal.build expression.cadr, bindings, ns
|
46
56
|
elsif sym?(key, :assign)
|
47
|
-
Assignment.build expression.cdr, bindings
|
57
|
+
Assignment.build expression.cdr, bindings, ns
|
48
58
|
elsif sym?(key, :fn)
|
49
|
-
InterpretedFunction.build expression.cadr, expression.cddr, bindings
|
59
|
+
InterpretedFunction.build expression.cadr, expression.cddr, bindings, ns
|
50
60
|
else
|
51
|
-
FunctionInvocation.build expression, bindings
|
61
|
+
FunctionInvocation.build expression, bindings, ns
|
52
62
|
end
|
53
63
|
end
|
54
64
|
end
|
data/lib/nydp/cond.rb
CHANGED
@@ -1,73 +1,69 @@
|
|
1
1
|
module Nydp
|
2
|
-
class ExecuteConditionalInstruction
|
3
|
-
extend Helper
|
4
|
-
|
5
|
-
def initialize when_true, when_false
|
6
|
-
@when_true, @when_false = when_true, when_false
|
7
|
-
end
|
8
|
-
|
9
|
-
def lexical_reach n
|
10
|
-
[@when_true.lexical_reach(n), @when_false.lexical_reach(n)].max
|
11
|
-
end
|
12
|
-
|
13
|
-
def execute vm
|
14
|
-
(Nydp::NIL.is?(vm.args.pop) ? @when_false : @when_true).execute vm
|
15
|
-
end
|
16
|
-
|
17
|
-
def inspect
|
18
|
-
"when_true:#{@when_true.inspect}:when_false:#{@when_false.inspect}"
|
19
|
-
end
|
20
|
-
|
21
|
-
def to_s
|
22
|
-
"#{@when_true.to_s} #{@when_false.to_s}"
|
23
|
-
end
|
24
|
-
end
|
25
|
-
|
26
2
|
class Cond
|
27
3
|
extend Helper
|
28
4
|
include Helper
|
29
5
|
attr_reader :condition, :conditional
|
30
6
|
|
31
7
|
def initialize cond, when_true, when_false
|
32
|
-
@condition, @
|
8
|
+
@condition, @when_true, @when_false = cond, when_true, when_false
|
33
9
|
end
|
34
10
|
|
35
11
|
def lexical_reach n
|
36
|
-
[@condition.lexical_reach(n), @
|
12
|
+
[@condition.lexical_reach(n), @when_true.lexical_reach(n), @when_false.lexical_reach(n)].max
|
37
13
|
end
|
38
14
|
|
39
15
|
def execute vm
|
40
|
-
vm
|
41
|
-
|
16
|
+
if (@condition.execute(vm))
|
17
|
+
@when_true.execute(vm)
|
18
|
+
else
|
19
|
+
@when_false.execute(vm)
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def compile_to_ruby indent, srcs, opts=nil
|
24
|
+
if (!@when_false) || (@when_false.is_a?(Nydp::Literal) && !@when_false.expression)
|
25
|
+
"#{indent}##> #{inspect.split(/\n/).join('\n')}
|
26
|
+
#{indent}if (#{@condition.compile_to_ruby "", srcs})
|
27
|
+
#{@when_true.compile_to_ruby(indent + " ", srcs, cando: true)}
|
28
|
+
#{indent}end"
|
29
|
+
else
|
30
|
+
"#{indent}##> #{inspect.split(/\n/).join('\n')}
|
31
|
+
#{indent}if (#{@condition.compile_to_ruby "", srcs})
|
32
|
+
#{@when_true.compile_to_ruby(indent + " ", srcs, cando: true)}
|
33
|
+
#{indent}else
|
34
|
+
#{@when_false.compile_to_ruby(indent + " ", srcs, cando: true)}
|
35
|
+
#{indent}end"
|
36
|
+
end
|
42
37
|
end
|
43
38
|
|
44
39
|
def inspect
|
45
|
-
"cond
|
40
|
+
"(cond #{condition._nydp_inspect} #{@when_true._nydp_inspect} #{@when_false._nydp_inspect})"
|
46
41
|
end
|
47
42
|
|
48
43
|
def to_s
|
49
|
-
"(cond #{condition.to_s} #{
|
44
|
+
"(cond #{condition.to_s} #{@when_true.to_s} #{@when_false.to_s})"
|
50
45
|
end
|
51
46
|
|
52
|
-
def self.build expressions, bindings
|
47
|
+
def self.build expressions, bindings, ns
|
53
48
|
if expressions.is_a? Nydp::Pair
|
54
|
-
cond = Compiler.compile expressions.car, bindings
|
55
|
-
when_true = Compiler.compile expressions.cdr.car, bindings
|
56
|
-
when_false = Compiler.compile expressions.cdr.cdr.car, bindings
|
49
|
+
cond = Compiler.compile expressions.car, bindings, ns
|
50
|
+
when_true = Compiler.compile expressions.cdr.car, bindings, ns
|
51
|
+
when_false = Compiler.compile expressions.cdr.cdr.car, bindings, ns
|
57
52
|
csig = sig(cond)
|
58
|
-
#
|
59
|
-
|
60
|
-
#
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
53
|
+
xsig = "#{sig(cond)}_#{sig(when_true)}_#{sig(when_false)}"
|
54
|
+
|
55
|
+
# case csig
|
56
|
+
# when "LEX"
|
57
|
+
# Cond_LEX.build(cond, when_true, when_false)
|
58
|
+
# when "SYM"
|
59
|
+
# Cond_SYM.new(cond, when_true, when_false)
|
60
|
+
# else
|
61
|
+
# new(cond, when_true, when_false)
|
62
|
+
# end
|
63
|
+
|
64
|
+
new(cond, when_true, when_false)
|
69
65
|
else
|
70
|
-
raise "can't compile Cond: #{expressions.
|
66
|
+
raise "can't compile Cond: #{expressions._nydp_inspect}"
|
71
67
|
end
|
72
68
|
end
|
73
69
|
end
|
@@ -84,20 +80,26 @@ module Nydp
|
|
84
80
|
[@condition.lexical_reach(n), @when_true.lexical_reach(n), @when_false.lexical_reach(n)].max
|
85
81
|
end
|
86
82
|
|
87
|
-
def inspect ; "cond:#{@condition.
|
83
|
+
def inspect ; "cond:#{@condition._nydp_inspect}:#{@when_true._nydp_inspect}:#{@when_false._nydp_inspect}" ; end
|
88
84
|
def to_s ; "(cond #{@condition.to_s} #{@when_true.to_s} #{@when_false.to_s})" ; end
|
85
|
+
# def compile_to_ruby indent
|
86
|
+
# "((#{@condition.compile_to_ruby "", srcs}) ? (#{@when_true.compile_to_ruby "", srcs}) : (#{@when_false.compile_to_ruby "", srcs}))"
|
87
|
+
# end
|
89
88
|
end
|
90
89
|
|
91
90
|
class Cond_LEX < CondBase
|
92
91
|
def execute vm
|
93
|
-
|
94
|
-
|
92
|
+
if @condition.value vm.current_context
|
93
|
+
@when_true.execute(vm)
|
94
|
+
else
|
95
|
+
@when_false.execute(vm)
|
96
|
+
end
|
95
97
|
end
|
96
98
|
|
97
99
|
def lexical_reach n
|
98
100
|
cr = @condition.lexical_reach(n)
|
99
|
-
ct = @when_true.
|
100
|
-
cf = @when_false.
|
101
|
+
ct = @when_true.lexical_reach(n)
|
102
|
+
cf = @when_false.lexical_reach(n)
|
101
103
|
|
102
104
|
[cr, ct, cf].max
|
103
105
|
end
|
@@ -107,23 +109,27 @@ module Nydp
|
|
107
109
|
fsig = sig(when_false)
|
108
110
|
cond_sig = "#{tsig}_#{fsig}"
|
109
111
|
|
110
|
-
# if (cond == when_true)
|
111
|
-
# OR_LEX.build cond, when_false
|
112
|
-
|
113
112
|
if (cond == when_true) && (fsig == "LIT")
|
114
|
-
OR_LEX_LIT.new cond, nil, when_false
|
113
|
+
OR_LEX_LIT.new cond, nil, when_false.expression
|
115
114
|
elsif (cond == when_true) && (fsig == "LEX")
|
116
115
|
OR_LEX_LEX.new cond, nil, when_false
|
116
|
+
elsif (cond == when_true)
|
117
|
+
OR_LEX_XXX.new cond, nil, when_false
|
117
118
|
else
|
118
119
|
case cond_sig
|
119
120
|
when "LIT_LIT"
|
121
|
+
# puts "building Cond_LEX_LIT_LIT #{[cond, when_true.expression, when_false.expression]}"
|
120
122
|
Nydp::Cond_LEX_LIT_LIT.new(cond, when_true.expression, when_false.expression)
|
121
123
|
when "LEX_LIT"
|
122
124
|
Nydp::Cond_LEX_LEX_LIT.new(cond, when_true, when_false.expression)
|
123
125
|
when "CND_LIT"
|
124
126
|
Nydp::Cond_LEX_CND_LIT.new(cond, when_true, when_false.expression)
|
127
|
+
when "NVB_LEX"
|
128
|
+
Nydp::Cond_LEX_NVB_LEX.new(cond, when_true, when_false)
|
129
|
+
when "NVB_LIT"
|
130
|
+
Nydp::Cond_LEX_NVB_LIT.new(cond, when_true, when_false.expression)
|
125
131
|
else
|
126
|
-
|
132
|
+
new(cond, when_true, when_false)
|
127
133
|
end
|
128
134
|
end
|
129
135
|
end
|
@@ -131,67 +137,68 @@ module Nydp
|
|
131
137
|
|
132
138
|
class OR_LEX_LIT < CondBase
|
133
139
|
def execute vm
|
134
|
-
|
135
|
-
vm.push_arg(!Nydp::NIL.is?(value) ? value : @when_false)
|
140
|
+
@condition.value(vm.current_context) || @when_false
|
136
141
|
end
|
137
142
|
end
|
138
143
|
|
139
144
|
class OR_LEX_LEX < CondBase
|
140
145
|
def execute vm
|
141
|
-
value
|
142
|
-
vm.push_arg(!Nydp::NIL.is?(value) ? value : (@when_false.value vm.current_context))
|
146
|
+
@condition.value(vm.current_context) || (@when_false.value vm.current_context)
|
143
147
|
end
|
144
148
|
end
|
145
149
|
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
# else
|
152
|
-
# @when_false.execute vm
|
153
|
-
# end
|
154
|
-
# end
|
155
|
-
|
156
|
-
# def self.build cond, when_false
|
157
|
-
# case sig(when_false)
|
158
|
-
# when "LIT"
|
159
|
-
# OR_LEX_LIT.new(cond, nil, when_false)
|
160
|
-
# when "LEX"
|
161
|
-
# OR_LEX_LEX.new(cond, nil, when_false)
|
162
|
-
# else
|
163
|
-
# OR_LEX.new(cond, nil, when_false)
|
164
|
-
# end
|
165
|
-
# end
|
166
|
-
# end
|
150
|
+
class OR_LEX_XXX < CondBase
|
151
|
+
def execute vm
|
152
|
+
@condition.value(vm.current_context) || (@when_false.execute vm)
|
153
|
+
end
|
154
|
+
end
|
167
155
|
|
168
156
|
class Cond_LEX_LIT_LIT < CondBase # (def no (arg) (cond arg nil t))
|
169
157
|
def execute vm
|
170
|
-
|
171
|
-
vm.push_arg(falsity ? @when_false : @when_true)
|
158
|
+
(@condition.value vm.current_context) ? @when_true : @when_false
|
172
159
|
end
|
173
160
|
end
|
174
161
|
|
175
162
|
class Cond_LEX_LEX_LIT < CondBase
|
176
163
|
def execute vm
|
177
|
-
|
178
|
-
vm.push_arg(falsity ? @when_false : (@when_true.value vm.current_context))
|
164
|
+
(@condition.value vm.current_context) ? (@when_true.value vm.current_context) : @when_false
|
179
165
|
end
|
180
166
|
end
|
181
167
|
|
182
168
|
class Cond_LEX_CND_LIT < CondBase
|
183
169
|
def execute vm
|
184
|
-
if
|
185
|
-
|
170
|
+
if (@condition.value vm.current_context)
|
171
|
+
@when_true.execute vm
|
172
|
+
else
|
173
|
+
@when_false
|
174
|
+
end
|
175
|
+
end
|
176
|
+
end
|
177
|
+
|
178
|
+
class Cond_LEX_NVB_LEX < CondBase
|
179
|
+
def execute vm
|
180
|
+
if (@condition.value vm.current_context)
|
181
|
+
@when_true.execute vm
|
186
182
|
else
|
183
|
+
@when_false.value(vm.current_context)
|
184
|
+
end
|
185
|
+
end
|
186
|
+
end
|
187
|
+
|
188
|
+
class Cond_LEX_NVB_LIT < CondBase
|
189
|
+
def execute vm
|
190
|
+
if (@condition.value vm.current_context)
|
187
191
|
@when_true.execute vm
|
192
|
+
else
|
193
|
+
@when_false
|
188
194
|
end
|
189
195
|
end
|
190
196
|
end
|
191
197
|
|
192
198
|
class Cond_SYM < CondBase
|
193
199
|
def execute vm
|
194
|
-
|
200
|
+
# puts "Cond_SYM"
|
201
|
+
(@condition.value) ? @when_true.execute(vm) : @when_false.execute(vm)
|
195
202
|
end
|
196
203
|
end
|
197
204
|
end
|
data/lib/nydp/context_symbol.rb
CHANGED
@@ -24,6 +24,7 @@ module Nydp
|
|
24
24
|
"set_index(#{binding_index}, value)"
|
25
25
|
end
|
26
26
|
|
27
|
+
line = __LINE__ + 2
|
27
28
|
code = <<-KLASS
|
28
29
|
def initialize name, lexical_depth
|
29
30
|
@name, @lexical_depth = name, lexical_depth
|
@@ -33,10 +34,14 @@ module Nydp
|
|
33
34
|
@lexical_depth + n
|
34
35
|
end
|
35
36
|
|
37
|
+
def compile_to_ruby indent, srcs, opts=nil
|
38
|
+
"\#{indent}_arg_\#{@name.to_s._nydp_name_to_rb_name}"
|
39
|
+
end
|
40
|
+
|
36
41
|
def value ctx
|
37
|
-
ctx#{getctx}.#{at_index} ||
|
42
|
+
ctx#{getctx}.#{at_index} || nil
|
38
43
|
rescue
|
39
|
-
raise "failed looking up \#{@name.
|
44
|
+
raise "failed looking up \#{@name._nydp_inspect} (\#{@name.class.name}) : lookup expression was ctx#{getctx}.#{at_index}"
|
40
45
|
end
|
41
46
|
|
42
47
|
def assign value, ctx
|
@@ -45,24 +50,21 @@ module Nydp
|
|
45
50
|
raise "problem in \#{self.class.name}#assign, name is \#{@name}, depth is \#{depth}, index is #{binding_index}"
|
46
51
|
end
|
47
52
|
|
48
|
-
def execute vm
|
49
|
-
vm.push_arg value vm.current_context
|
50
|
-
end
|
51
|
-
|
52
53
|
def depth ; #{depth} ; end
|
53
54
|
def inspect ; to_s ; end
|
54
|
-
def to_s ; "[#{depth}##{binding_index}#\#{@lexical_depth}]\#{@name}" ; end
|
55
|
+
# def to_s ; "[#{depth}##{binding_index}#\#{@lexical_depth}]\#{@name}" ; end
|
56
|
+
def to_s ; @name ; end
|
55
57
|
KLASS
|
56
58
|
|
57
59
|
const_set name, Class.new(Nydp::ContextSymbol) {
|
58
|
-
eval code, binding, name.to_s,
|
60
|
+
eval code, binding, "#{name.to_s} : #{__FILE__}", line
|
59
61
|
}
|
60
62
|
end
|
61
63
|
|
62
64
|
def self.build effective_depth, name, binding_index, lexical_depth
|
63
65
|
const_get(:"ContextSymbol_#{effective_depth}_#{binding_index}").new(name, lexical_depth)
|
64
66
|
rescue
|
65
|
-
raise "building ContextSymbol #{[effective_depth, name, binding_index, lexical_depth].
|
67
|
+
raise "building ContextSymbol #{[effective_depth, name, binding_index, lexical_depth]._nydp_inspect}"
|
66
68
|
end
|
67
69
|
end
|
68
70
|
end
|
data/lib/nydp/core.rb
CHANGED
@@ -2,11 +2,9 @@ require 'nydp/plugin'
|
|
2
2
|
|
3
3
|
module Nydp
|
4
4
|
class Core
|
5
|
-
|
5
|
+
include Nydp::PluginHelper
|
6
6
|
|
7
|
-
def
|
8
|
-
File.join File.expand_path(File.dirname(__FILE__)), name
|
9
|
-
end
|
7
|
+
def name ; "Nydp Core" ; end
|
10
8
|
|
11
9
|
def base_path
|
12
10
|
relative_path "../lisp/"
|
@@ -17,81 +15,84 @@ module Nydp
|
|
17
15
|
end
|
18
16
|
|
19
17
|
def loadfiles
|
20
|
-
Dir.glob(relative_path '../lisp/core-*.nydp').sort
|
18
|
+
file_readers Dir.glob(relative_path '../lisp/core-*.nydp').sort
|
21
19
|
end
|
22
20
|
|
23
21
|
def testfiles
|
24
|
-
Dir.glob(relative_path '../lisp/tests/**/*.nydp')
|
22
|
+
file_readers Dir.glob(relative_path '../lisp/tests/**/*.nydp')
|
25
23
|
end
|
26
24
|
|
27
25
|
def setup ns
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
26
|
+
ns.assign(:cons , Nydp::Builtin::RubyWrap::Cons.instance )
|
27
|
+
ns.assign(:car , Nydp::Builtin::RubyWrap::Car.instance )
|
28
|
+
ns.assign(:cdr , Nydp::Builtin::RubyWrap::Cdr.instance )
|
29
|
+
ns.assign(:log , Nydp::Builtin::Log.instance )
|
30
|
+
ns.assign(:ln , Nydp::Builtin::RubyWrap::Ln.instance )
|
31
|
+
ns.assign(:mod , Nydp::Builtin::RubyWrap::Modulo.instance )
|
32
|
+
ns.assign(:sqrt , Nydp::Builtin::RubyWrap::Sqrt.instance )
|
33
|
+
ns.assign(:regexp , Nydp::Builtin::RubyWrap::Regexp.instance )
|
34
|
+
ns.assign("string/pad-left" , Nydp::Builtin::RubyWrap::StringPadLeft.instance )
|
35
|
+
ns.assign("string/pad-right" , Nydp::Builtin::RubyWrap::StringPadRight.instance)
|
36
|
+
ns.assign("string/force-encoding", Nydp::Builtin::RubyWrap::StringForceEncoding.instance)
|
37
|
+
ns.assign("to-list" , Nydp::Builtin::RubyWrap::ToList.instance )
|
38
|
+
ns.assign(:+ , Nydp::Builtin::Plus.instance )
|
39
|
+
ns.assign(:- , Nydp::Builtin::Minus.instance )
|
40
|
+
ns.assign(:* , Nydp::Builtin::Times.instance )
|
41
|
+
ns.assign(:/ , Nydp::Builtin::Divide.instance )
|
42
|
+
ns.assign(:> , Nydp::Builtin::GreaterThan.instance )
|
43
|
+
ns.assign(:< , Nydp::Builtin::LessThan.instance )
|
44
|
+
ns.assign(:eval , Nydp::Builtin::Eval.new(ns) )
|
45
|
+
ns.assign(:false , false )
|
46
|
+
ns.assign(:hash , Nydp::Builtin::Hash.instance )
|
47
|
+
ns.assign(:apply , Nydp::Builtin::Apply.instance )
|
48
|
+
ns.assign(:date , Nydp::Builtin::Date.instance )
|
49
|
+
ns.assign(:error , Nydp::Builtin::Error.instance )
|
50
|
+
ns.assign(:parse , Nydp::Builtin::Parse.instance )
|
51
|
+
ns.assign(:p , Nydp::Builtin::Puts.instance )
|
52
|
+
ns.assign(:PI , Math::PI )
|
53
|
+
ns.assign(:"π" , Math::PI )
|
54
|
+
ns.assign(:rand , Nydp::Builtin::Rand.instance )
|
55
|
+
ns.assign(:rng , Nydp::Builtin::RNG.instance )
|
56
|
+
ns.assign(:sort , Nydp::Builtin::Sort.instance )
|
57
|
+
ns.assign(:abs , Nydp::Builtin::Abs.instance )
|
58
|
+
ns.assign(:sym , Nydp::Builtin::Sym.instance )
|
59
|
+
ns.assign(:ensuring , Nydp::Builtin::Ensuring.instance )
|
60
|
+
ns.assign(:inspect , Nydp::Builtin::Inspect.instance )
|
61
|
+
ns.assign(:comment , Nydp::Builtin::Comment.instance )
|
62
|
+
ns.assign("handle-error" , Nydp::Builtin::HandleError.instance )
|
63
|
+
ns.assign("parse-in-string" , Nydp::Builtin::ParseInString.instance )
|
64
|
+
ns.assign("random-string" , Nydp::Builtin::RandomString.instance )
|
65
|
+
ns.assign("to-string" , Nydp::Builtin::ToString.instance )
|
66
|
+
ns.assign("to-integer" , Nydp::Builtin::ToInteger.instance )
|
67
|
+
ns.assign("string-length" , Nydp::Builtin::StringLength.instance )
|
68
|
+
ns.assign("string-replace" , Nydp::Builtin::StringReplace.instance )
|
69
|
+
ns.assign("string-match" , Nydp::Builtin::StringMatch.instance )
|
70
|
+
ns.assign("string-split" , Nydp::Builtin::StringSplit.instance )
|
71
|
+
ns.assign("time" , Nydp::Builtin::Time.instance )
|
72
|
+
ns.assign("thread-locals" , Nydp::Builtin::ThreadLocals.instance )
|
73
|
+
ns.assign("type-of" , Nydp::Builtin::TypeOf.instance )
|
74
|
+
ns.assign(:"eq?" , Nydp::Builtin::IsEqual.instance )
|
75
|
+
ns.assign(:"cdr-set" , Nydp::Builtin::CdrSet.instance )
|
76
|
+
ns.assign(:"hash-get" , Nydp::Builtin::HashGet.instance )
|
77
|
+
ns.assign(:"hash-set" , Nydp::Builtin::HashSet.instance )
|
78
|
+
ns.assign(:"hash-keys" , Nydp::Builtin::HashKeys.instance )
|
79
|
+
ns.assign(:"hash-key?" , Nydp::Builtin::HashKeyPresent.instance )
|
80
|
+
ns.assign(:"hash-merge" , Nydp::Builtin::HashMerge.instance )
|
81
|
+
ns.assign(:"hash-slice" , Nydp::Builtin::HashSlice.instance )
|
82
|
+
ns.assign(:"hash-to-array" , Nydp::Builtin::HashToArray.instance )
|
83
|
+
ns.assign(:"vm-info" , Nydp::Builtin::VmInfo.instance )
|
84
|
+
ns.assign(:"pre-compile-new-expression", Nydp::Builtin::PreCompile.instance )
|
85
|
+
ns.assign(:"script-run" , Nydp::Builtin::ScriptRun.instance )
|
86
|
+
ns.assign(:"**" , Nydp::Builtin::MathPower.instance )
|
87
|
+
ns.assign(:"⌊" , Nydp::Builtin::MathFloor.instance )
|
88
|
+
ns.assign(:"math-floor" , Nydp::Builtin::MathFloor.instance )
|
89
|
+
ns.assign(:"⌈" , Nydp::Builtin::MathCeiling.instance )
|
90
|
+
ns.assign(:"math-ceiling" , Nydp::Builtin::MathCeiling.instance )
|
91
|
+
ns.assign(:"math-round" , Nydp::Builtin::MathRound.instance )
|
92
|
+
ns.assign(:"⋂" , Nydp::Builtin::SetIntersection.instance )
|
93
|
+
ns.assign(:"set-intersection", Nydp::Builtin::SetIntersection.instance )
|
94
|
+
ns.assign(:"⋃" , Nydp::Builtin::SetUnion.instance )
|
95
|
+
ns.assign(:"set-union" , Nydp::Builtin::SetUnion.instance )
|
95
96
|
end
|
96
97
|
end
|
97
98
|
end
|