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/core_ext.rb
CHANGED
@@ -1,57 +1,118 @@
|
|
1
1
|
class Object
|
2
|
-
def _nydp_get a ; raise "_nydp_get : not gettable: #{a.
|
3
|
-
def _nydp_set a, v ; raise "_nydp_get : not settable: #{a.
|
4
|
-
def _nydp_keys ; []
|
5
|
-
def _nydp_wrapper
|
6
|
-
def
|
2
|
+
def _nydp_get a ; raise "_nydp_get : not gettable: #{a._nydp_inspect} on #{self.class.name}" ; end
|
3
|
+
def _nydp_set a, v ; raise "_nydp_get : not settable: #{a._nydp_inspect} on #{self.class.name}" ; end
|
4
|
+
def _nydp_keys ; [] ; end
|
5
|
+
def _nydp_wrapper ; self ; end
|
6
|
+
def _nydp_inspect ; inspect ; end
|
7
|
+
def _nydp_to_s ; to_s ; end
|
8
|
+
def _nydp_compact_inspect ; _nydp_inspect ; end
|
9
|
+
def lexical_reach n ; n ; end
|
10
|
+
def to_ruby ; self ; end
|
11
|
+
def compile_to_ruby indent, srcs, opts=nil ; "#{indent}#{inspect}" ; end
|
7
12
|
end
|
8
13
|
|
9
14
|
class Method
|
10
15
|
include Nydp::Converter
|
11
|
-
def
|
12
|
-
def invoke_2 vm, a0 ; vm.push_arg call(n2r(a0))._nydp_wrapper ; end
|
13
|
-
def invoke_3 vm, a0, a1 ; vm.push_arg call(n2r(a0), n2r(a1))._nydp_wrapper ; end
|
14
|
-
def invoke_4 vm, a0, a1, a2 ; vm.push_arg call(n2r(a0), n2r(a1), n2r(a2))._nydp_wrapper ; end
|
15
|
-
def invoke vm, args ; vm.push_arg call(*(args.map { |a| n2r a}))._nydp_wrapper ; end
|
16
|
+
def _nydp_call *args ; (call *(rubify args))._nydp_wrapper ; end
|
16
17
|
end
|
17
18
|
|
18
|
-
class
|
19
|
-
|
19
|
+
class Proc
|
20
|
+
alias _nydp_call call
|
20
21
|
end
|
21
22
|
|
22
|
-
class
|
23
|
-
def
|
23
|
+
class TrueClass
|
24
|
+
def _nydp_inspect ; 't' ; end
|
25
|
+
def assign *_ ; self ; end
|
26
|
+
def nydp_type ; :truth ; end
|
27
|
+
def _nydp_get a ; self ; end
|
28
|
+
def _nydp_set a, v ; self ; end
|
29
|
+
def _nydp_to_s ; "t" ; end
|
30
|
+
def compile_to_ruby indent, srcs, opts=nil ; "#{indent}true" ; end
|
24
31
|
end
|
25
32
|
|
26
|
-
class
|
27
|
-
|
33
|
+
class CantCallNil < NoMethodError
|
34
|
+
end
|
35
|
+
|
36
|
+
class NilClass
|
37
|
+
def car ; self ; end
|
38
|
+
def cdr ; self ; end
|
39
|
+
def size ; 0 ; end
|
40
|
+
def is? other ; self.equal? other ; end
|
41
|
+
def isnt? other ; !self.equal? other ; end
|
42
|
+
def + other ; other ; end
|
43
|
+
def copy ; self ; end
|
44
|
+
def assign *_ ; self ; end
|
45
|
+
def nydp_type ; :nil ; end
|
46
|
+
def _nydp_get a ; self ; end
|
47
|
+
def _nydp_set a, v ; self ; end
|
48
|
+
def & other ; self ; end
|
49
|
+
def | other ; other ; end
|
50
|
+
def _nydp_call *_ ; raise CantCallNil ; end
|
51
|
+
def compile_to_ruby i, s, o=nil ; "#{i}nil" ; end
|
52
|
+
end
|
53
|
+
|
54
|
+
class FalseClass
|
55
|
+
def _nydp_wrapper ; nil ; end
|
28
56
|
end
|
29
57
|
|
30
58
|
class ::Symbol
|
31
|
-
def
|
59
|
+
def _nydp_inspect
|
60
|
+
_ins = to_s
|
61
|
+
_nydp_untidy?(_ins) ? "|#{_ins.gsub(/\|/, '\|')}|" : _ins
|
62
|
+
end
|
63
|
+
|
64
|
+
def nydp_type ; :symbol ; end
|
65
|
+
# def execute vm ; self ; end
|
66
|
+
|
67
|
+
alias :inspect_before_nydp :inspect
|
68
|
+
def inspect
|
69
|
+
if self == :"#="
|
70
|
+
':"#="'
|
71
|
+
else
|
72
|
+
inspect_before_nydp
|
73
|
+
end
|
74
|
+
end
|
75
|
+
|
76
|
+
private
|
77
|
+
|
78
|
+
def _nydp_untidy? s
|
79
|
+
(s == "") || (s == nil) || (s =~ /[\s\|,\(\)"]/)
|
80
|
+
end
|
32
81
|
end
|
33
82
|
|
34
83
|
class ::Date
|
35
|
-
def
|
84
|
+
def _nydp_get key ; _nydp_date.lookup key, self ; end
|
85
|
+
def _nydp_date ; @__nydp_date ||= Nydp::Date.new(self) ; end
|
86
|
+
def nydp_type ; :date ; end
|
36
87
|
end
|
37
88
|
|
38
|
-
class ::
|
39
|
-
|
89
|
+
class ::Time
|
90
|
+
@@wl = Set.new %i{ year month day hour min sec }
|
91
|
+
def _nydp_time_get key ; send(key) if @@wl.include?(key) ; end
|
92
|
+
def _nydp_get key ; _nydp_time_get(key.to_s.to_sym) ; end
|
93
|
+
def nydp_type ; :time ; end
|
40
94
|
end
|
41
95
|
|
42
|
-
class ::
|
43
|
-
def
|
96
|
+
class ::Array
|
97
|
+
def _nydp_wrapper ; Nydp::Pair.from_list map &:_nydp_wrapper ; end
|
98
|
+
def _nydp_inspect ; "[" + map(&:_nydp_inspect).join(" ") + "]" ; end
|
44
99
|
end
|
45
100
|
|
46
101
|
class ::String
|
47
|
-
#
|
102
|
+
# _hex_ord only works for characters whose #ord is < 256, ie #bytes returns a single-element array
|
103
|
+
# this should allow for two-way conversion of names containing the characters in the regexp
|
104
|
+
# even though we don't use two-way conversion anywhere just yet
|
105
|
+
def _nydp_name_to_rb_name ; self.gsub(/[\x00-\x2F\x3A-\x40\x5B-\x60\x7B-\x7F]/) { |chr| "_#{chr._hex_ord}"}.to_sym ; end
|
48
106
|
def as_method_name ; self.gsub(/-/, '_').to_sym ; end
|
49
107
|
def nydp_type ; :string ; end
|
108
|
+
def _hex_ord ; ord.to_s(16).rjust(2, '0') ; end
|
50
109
|
end
|
51
110
|
|
52
111
|
class ::Hash
|
53
112
|
include Nydp::Helper
|
54
|
-
def _nydp_get a ; self[
|
55
|
-
def _nydp_set a, v ; self[
|
56
|
-
def _nydp_keys ; keys
|
113
|
+
def _nydp_get a ; self[a]._nydp_wrapper ; end
|
114
|
+
def _nydp_set a, v ; self[a] = v ; end
|
115
|
+
def _nydp_keys ; keys ; end
|
116
|
+
def _nydp_inspect ; "{" + map { |k,v| [k._nydp_inspect, v._nydp_inspect].join(" ")}.join(" ") + "}" ; end
|
117
|
+
def nydp_type ; :hash ; end
|
57
118
|
end
|
data/lib/nydp/date.rb
CHANGED
@@ -18,19 +18,18 @@ module Nydp
|
|
18
18
|
|
19
19
|
def initialize ruby_date ; @ruby_date = ruby_date ; end
|
20
20
|
|
21
|
-
def to_date
|
22
|
-
def to_s
|
23
|
-
def to_ruby
|
24
|
-
def inspect
|
25
|
-
def
|
26
|
-
def
|
27
|
-
def
|
28
|
-
def
|
29
|
-
def
|
30
|
-
def
|
31
|
-
def
|
32
|
-
def
|
33
|
-
def - other ; r2n(ruby_date - (is_date?(other) ? other.ruby_date : other)) ; end
|
21
|
+
def to_date ; ruby_date ; end
|
22
|
+
def to_s ; ruby_date.to_s ; end
|
23
|
+
def to_ruby ; ruby_date ; end
|
24
|
+
def inspect ; ruby_date.inspect ; end
|
25
|
+
def > other ; is_date?(other) && ruby_date > other ; end
|
26
|
+
def < other ; is_date?(other) && ruby_date < other ; end
|
27
|
+
def == other ; is_date?(other) && ruby_date == other ; end
|
28
|
+
def <=> other ; is_date?(other) && ruby_date <=> other ; end
|
29
|
+
def eql? d ; self == d ; end
|
30
|
+
def hash ; ruby_date.hash ; end
|
31
|
+
def is_date? other ; other.is_a? ::Date ; end
|
32
|
+
def - other ; ruby_date - other ; end
|
34
33
|
def + int ; int.is_a?(Integer) ? r2n(ruby_date + int) : r2n(change(*int.to_ruby)) ; end
|
35
34
|
|
36
35
|
@@pass_through = %i{ monday? tuesday? wednesday? thursday? friday? saturday? sunday? }
|
@@ -39,7 +38,8 @@ module Nydp
|
|
39
38
|
last_year next_year beginning_of_year end_of_year
|
40
39
|
last_month next_month beginning_of_month end_of_month
|
41
40
|
last_week next_week beginning_of_week end_of_week
|
42
|
-
yesterday tomorrow age
|
41
|
+
yesterday tomorrow age past?
|
42
|
+
future?
|
43
43
|
} + @@pass_through
|
44
44
|
|
45
45
|
def year y, m, d, w ; y ; end
|
@@ -47,6 +47,9 @@ module Nydp
|
|
47
47
|
def day y, m, d, w ; d ; end
|
48
48
|
def week_day y, m, d, w ; w ; end
|
49
49
|
|
50
|
+
def future? *_ ; ruby_date > ::Date.today ; end
|
51
|
+
def past? *_ ; ruby_date < ::Date.today ; end
|
52
|
+
|
50
53
|
def last_year y, m, d, w ; ruby_date.prev_year ; end
|
51
54
|
def next_year y, m, d, w ; ruby_date.next_year ; end
|
52
55
|
def beginning_of_year y, m, d, w ; build(y, 1, 1) ; end
|
@@ -76,11 +79,11 @@ module Nydp
|
|
76
79
|
class_eval "def #{n} * ; ruby_date.#{n} ; end"
|
77
80
|
end
|
78
81
|
|
79
|
-
def _nydp_keys ; @@keys.to_a
|
80
|
-
def dispatch key, y, m, d, w ; self.send(key, y, m, d, w) if _nydp_keys.include?(key)
|
81
|
-
def splat date ; [date.year, date.month, date.day, date.wday]
|
82
|
-
def lookup key, date ; r2n(dispatch(key.to_s.gsub(/-/, '_').to_sym, *splat(date)))
|
83
|
-
def _nydp_get key ; lookup key, ruby_date
|
82
|
+
def _nydp_keys ; @@keys.to_a ; end
|
83
|
+
def dispatch key, y, m, d, w ; self.send(key, y, m, d, w) if _nydp_keys.include?(key) ; end
|
84
|
+
def splat date ; [date.year, date.month, date.day, date.wday] ; end
|
85
|
+
def lookup key, date ; r2n(dispatch(key.to_s.gsub(/-/, '_').to_sym, *splat(date))) ; end
|
86
|
+
def _nydp_get key ; lookup key, ruby_date ; end
|
84
87
|
def change amount, attr
|
85
88
|
if attr == :day ; (ruby_date + amount)
|
86
89
|
elsif attr == :week ; (ruby_date + (7 * amount))
|
data/lib/nydp/error.rb
CHANGED
@@ -3,32 +3,77 @@ module Nydp
|
|
3
3
|
end
|
4
4
|
|
5
5
|
module Invocation
|
6
|
-
@@sig_counts = Hash.new { |h,k| h[k] = 0}
|
7
|
-
|
8
|
-
# def self.sig name ; @@sig_counts[name] += 1 ; end
|
9
|
-
|
10
|
-
# def self.whazzup
|
11
|
-
# puts @@sig_counts.to_a.sort_by { |c| c[1] }.map { |c| "#{c[1]}\t#{c[0]}"}
|
12
|
-
# end
|
13
|
-
|
14
6
|
class Base
|
15
7
|
include Helper
|
16
8
|
def initialize expr, source, sig=nil
|
17
9
|
@expr, @source, @sig = expr, source, sig
|
18
10
|
end
|
19
11
|
|
12
|
+
def compile_to_ruby indent, srcs, opts={}
|
13
|
+
ruby = if opts[:cando]
|
14
|
+
compile_do_expr_to_ruby indent, srcs
|
15
|
+
end
|
16
|
+
|
17
|
+
ruby ||= normal_compile_to_ruby indent, srcs
|
18
|
+
end
|
19
|
+
|
20
|
+
def compile_do_expr_to_ruby indent, srcs
|
21
|
+
if @expr.car.is_a?(InterpretedFunction) && !@expr.cdr && @expr.car.can_do?
|
22
|
+
@expr.car.compile_do_expr_to_ruby indent, srcs
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
def normal_compile_to_ruby indent, srcs
|
27
|
+
ra = @expr.map { |e| e.compile_to_ruby "#{indent} ", srcs}.to_a
|
28
|
+
fn_expr = @expr.first.to_s.inspect.gsub("\'", "\\\\'")
|
29
|
+
fn = ra.shift
|
30
|
+
|
31
|
+
src_expr = @expr.inspect.split(/\n/).join('\n')
|
32
|
+
|
33
|
+
if ra.empty?
|
34
|
+
"#{indent} ##> #{src_expr}
|
35
|
+
#{indent} (begin ; #{fn}.
|
36
|
+
#{indent} ##> #{src_expr}
|
37
|
+
#{indent} _nydp_call()
|
38
|
+
#{indent} rescue CantCallNil => e
|
39
|
+
#{indent} (raise 'can\\'t call nil : #{fn_expr}')
|
40
|
+
#{indent} end)"
|
41
|
+
else
|
42
|
+
"#{indent} ##> #{src_expr}
|
43
|
+
#{indent} (begin ; #{fn}.
|
44
|
+
#{indent} ##> #{src_expr}
|
45
|
+
#{indent} _nydp_call(#{ra.join(",\n")})
|
46
|
+
#{indent} rescue CantCallNil => e
|
47
|
+
#{indent} (raise 'can\\'t call nil : #{fn_expr}')
|
48
|
+
#{indent} end)"
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# def compile_to_ruby indent, srcs
|
53
|
+
# ra = @expr.map { |e| e.compile_to_ruby "#{indent} ", srcs}
|
54
|
+
# fn = ra.shift
|
55
|
+
|
56
|
+
# if ra.empty?
|
57
|
+
# "#{indent}#{fn}._nydp_callable(#{@expr.first.to_s.inspect})._nydp_call()"
|
58
|
+
# else
|
59
|
+
# "#{indent}#{fn}._nydp_callable(#{@expr.first.to_s.inspect})._nydp_call(
|
60
|
+
# #{ra.join(",\n")}
|
61
|
+
# #{indent})"
|
62
|
+
# end
|
63
|
+
# end
|
64
|
+
|
20
65
|
def handle e, f, invoker, *args
|
21
66
|
case e
|
22
67
|
when Nydp::Error, InvocationFailed
|
23
68
|
raise
|
24
69
|
else
|
25
70
|
if e.is_a?(NoMethodError) && !f.respond_to?(invoker)
|
26
|
-
raise InvocationFailed.new("#{f.
|
71
|
+
raise InvocationFailed.new("#{f._nydp_inspect} is not a function: args were #{args._nydp_inspect} in #{source._nydp_inspect}")
|
27
72
|
else
|
28
|
-
msg = args.map { |a| " #{a.
|
29
|
-
msg = "failed to execute invocation #{f.
|
30
|
-
msg += "\nsource was #{source.
|
31
|
-
msg += "\nfunction name was #{source.car.
|
73
|
+
msg = args.map { |a| " #{a._nydp_inspect}"}.join("\n")
|
74
|
+
msg = "failed to execute invocation #{f._nydp_inspect}\n#{msg}"
|
75
|
+
msg += "\nsource was #{source._nydp_inspect}"
|
76
|
+
msg += "\nfunction name was #{source.car._nydp_inspect}"
|
32
77
|
raise InvocationFailed.new msg
|
33
78
|
end
|
34
79
|
end
|
@@ -39,253 +84,10 @@ module Nydp
|
|
39
84
|
@expr.map { |x| x.lexical_reach n}.max
|
40
85
|
end
|
41
86
|
|
42
|
-
def inspect ; @expr.map { |x| x.
|
87
|
+
def inspect ; "(" + @expr.map { |x| x._nydp_inspect }.join(' ') + ")" ; end
|
43
88
|
def source ; @source ; end
|
44
89
|
def to_s ; source.to_s ; end
|
45
90
|
end
|
46
|
-
|
47
|
-
class Invocation_1 < Invocation::Base
|
48
|
-
def execute vm
|
49
|
-
# Invocation.sig @sig
|
50
|
-
f = vm.args.pop
|
51
|
-
f.invoke_1 vm
|
52
|
-
rescue StandardError => e
|
53
|
-
handle e, f, :invoke_1
|
54
|
-
end
|
55
|
-
end
|
56
|
-
|
57
|
-
class Invocation_2 < Invocation::Base
|
58
|
-
def execute vm
|
59
|
-
# Invocation.sig @sig
|
60
|
-
arg = vm.args.pop
|
61
|
-
f = vm.args.pop
|
62
|
-
f.invoke_2 vm, arg
|
63
|
-
rescue StandardError => e
|
64
|
-
handle e, f, :invoke_2, arg
|
65
|
-
end
|
66
|
-
end
|
67
|
-
|
68
|
-
class Invocation_3 < Invocation::Base
|
69
|
-
def execute vm
|
70
|
-
# Invocation.sig @sig
|
71
|
-
arg_1 = vm.args.pop
|
72
|
-
arg_0 = vm.args.pop
|
73
|
-
f = vm.args.pop
|
74
|
-
f.invoke_3 vm, arg_0, arg_1
|
75
|
-
rescue StandardError => e
|
76
|
-
handle e, f, :invoke_3, arg_0, arg_1
|
77
|
-
end
|
78
|
-
end
|
79
|
-
|
80
|
-
class Invocation_4 < Invocation::Base
|
81
|
-
def execute vm
|
82
|
-
# Invocation.sig @sig
|
83
|
-
arg_2 = vm.args.pop
|
84
|
-
arg_1 = vm.args.pop
|
85
|
-
arg_0 = vm.args.pop
|
86
|
-
f = vm.args.pop
|
87
|
-
f.invoke_4 vm, arg_0, arg_1, arg_2
|
88
|
-
rescue StandardError => e
|
89
|
-
handle e, f, :invoke_4, arg_0, arg_1, arg_2
|
90
|
-
end
|
91
|
-
end
|
92
|
-
|
93
|
-
class Invocation_N < Invocation::Base
|
94
|
-
def initialize arg_count, expr, source
|
95
|
-
super expr, source
|
96
|
-
@arg_count = arg_count
|
97
|
-
end
|
98
|
-
|
99
|
-
def execute vm
|
100
|
-
# Invocation.sig @sig
|
101
|
-
args = vm.pop_args @arg_count
|
102
|
-
args.car.invoke vm, args.cdr
|
103
|
-
rescue StandardError => e
|
104
|
-
handle e, args.car, :invoke, args.cdr
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
# TODO generate various Invocation_XXX classes on-demand instead of hand_coding them all up front
|
109
|
-
SIGS = Set.new
|
110
|
-
|
111
|
-
class Invocation_LEX < Invocation::Base
|
112
|
-
SIGS << self.name
|
113
|
-
def initialize expr, src
|
114
|
-
super expr, src
|
115
|
-
@sym = expr.car
|
116
|
-
end
|
117
|
-
|
118
|
-
def execute vm
|
119
|
-
# Invocation.sig self.class.name
|
120
|
-
@sym.value(vm.current_context).invoke_1 vm
|
121
|
-
rescue StandardError => e
|
122
|
-
handle e, @sym.value(vm.current_context), :invoke_1
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
class Invocation_SYM < Invocation::Base
|
127
|
-
SIGS << self.name
|
128
|
-
def initialize expr, src
|
129
|
-
super expr, src
|
130
|
-
@sym = expr.car
|
131
|
-
end
|
132
|
-
|
133
|
-
def execute vm
|
134
|
-
# Invocation.sig self.class.name
|
135
|
-
@sym.value.invoke_1 vm
|
136
|
-
rescue StandardError => e
|
137
|
-
handle e, @sym.value, :invoke_1
|
138
|
-
end
|
139
|
-
end
|
140
|
-
|
141
|
-
class Invocation_LEX_LEX < Invocation::Base
|
142
|
-
SIGS << self.name
|
143
|
-
def initialize expr, src
|
144
|
-
super expr, src
|
145
|
-
@lex0 = expr.car
|
146
|
-
@lex1 = expr.cdr.car
|
147
|
-
end
|
148
|
-
|
149
|
-
def execute vm
|
150
|
-
# Invocation.sig self.class.name
|
151
|
-
fn = @lex0.value(vm.current_context)
|
152
|
-
a0 = @lex1.value(vm.current_context)
|
153
|
-
fn.invoke_2 vm, a0
|
154
|
-
rescue StandardError => e
|
155
|
-
handle e, fn, :invoke_2, a0
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
class Invocation_SYM_LEX < Invocation::Base
|
160
|
-
SIGS << self.name
|
161
|
-
def initialize expr, src
|
162
|
-
super expr, src
|
163
|
-
@sym = expr.car
|
164
|
-
@lex = expr.cdr.car
|
165
|
-
end
|
166
|
-
|
167
|
-
def execute vm
|
168
|
-
# Invocation.sig self.class.name
|
169
|
-
a0 = @lex.value(vm.current_context)
|
170
|
-
@sym.value.invoke_2 vm, a0
|
171
|
-
rescue StandardError => e
|
172
|
-
handle e, @sym.value, :invoke_2, a0
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
class Invocation_SYM_LIT < Invocation::Base
|
177
|
-
SIGS << self.name
|
178
|
-
def initialize expr, src
|
179
|
-
super expr, src
|
180
|
-
@sym = expr.car
|
181
|
-
@lit = expr.cdr.car.expression
|
182
|
-
end
|
183
|
-
|
184
|
-
def execute vm
|
185
|
-
# Invocation.sig self.class.name
|
186
|
-
@sym.value.invoke_2 vm, @lit
|
187
|
-
rescue StandardError => e
|
188
|
-
handle e, @sym.value, :invoke_2, @lit
|
189
|
-
end
|
190
|
-
end
|
191
|
-
|
192
|
-
class Invocation_LEX_LEX_LEX < Invocation::Base
|
193
|
-
SIGS << self.name
|
194
|
-
def initialize expr, src
|
195
|
-
super expr, src
|
196
|
-
@lex_0 = expr.car
|
197
|
-
@lex_1 = expr.cdr.car
|
198
|
-
@lex_2 = expr.cdr.cdr.car
|
199
|
-
end
|
200
|
-
|
201
|
-
def execute vm
|
202
|
-
# Invocation.sig self.class.name
|
203
|
-
fn = @lex_0.value(vm.current_context)
|
204
|
-
a0 = @lex_1.value(vm.current_context)
|
205
|
-
a1 = @lex_2.value(vm.current_context)
|
206
|
-
fn.invoke_3 vm, a0, a1
|
207
|
-
rescue StandardError => e
|
208
|
-
handle e, fn, :invoke_3, a0, a1
|
209
|
-
end
|
210
|
-
end
|
211
|
-
|
212
|
-
class Invocation_SYM_LEX_LEX < Invocation::Base
|
213
|
-
SIGS << self.name
|
214
|
-
def initialize expr, src
|
215
|
-
super expr, src
|
216
|
-
@sym = expr.car
|
217
|
-
@lex_0 = expr.cdr.car
|
218
|
-
@lex_1 = expr.cdr.cdr.car
|
219
|
-
end
|
220
|
-
|
221
|
-
def execute vm
|
222
|
-
# Invocation.sig self.class.name
|
223
|
-
a0 = @lex_0.value(vm.current_context)
|
224
|
-
a1 = @lex_1.value(vm.current_context)
|
225
|
-
@sym.value.invoke_3 vm, a0, a1
|
226
|
-
rescue StandardError => e
|
227
|
-
handle e, @sym.value, :invoke_3, a0, a1
|
228
|
-
end
|
229
|
-
end
|
230
|
-
|
231
|
-
class Invocation_SYM_LEX_LEX_LEX < Invocation::Base
|
232
|
-
SIGS << self.name
|
233
|
-
def initialize expr, src
|
234
|
-
super expr, src
|
235
|
-
@sym = expr.car
|
236
|
-
@lex_0 = expr.cdr.car
|
237
|
-
@lex_1 = expr.cdr.cdr.car
|
238
|
-
@lex_2 = expr.cdr.cdr.cdr.car
|
239
|
-
end
|
240
|
-
|
241
|
-
def execute vm
|
242
|
-
# Invocation.sig self.class.name
|
243
|
-
a0 = @lex_0.value(vm.current_context)
|
244
|
-
a1 = @lex_1.value(vm.current_context)
|
245
|
-
a2 = @lex_2.value(vm.current_context)
|
246
|
-
@sym.value.invoke_4 vm, a0, a1, a2
|
247
|
-
rescue StandardError => e
|
248
|
-
handle e, @sym.value, :invoke_4, a0, a1, a2
|
249
|
-
end
|
250
|
-
end
|
251
|
-
|
252
|
-
class Invocation_SYM_LEX_LIT_LEX < Invocation::Base
|
253
|
-
SIGS << self.name
|
254
|
-
def initialize expr, src
|
255
|
-
super expr, src
|
256
|
-
@sym = expr.car
|
257
|
-
@lex_0 = expr.cdr.car
|
258
|
-
@lit_1 = expr.cdr.cdr.car.expression
|
259
|
-
@lex_2 = expr.cdr.cdr.cdr.car
|
260
|
-
end
|
261
|
-
|
262
|
-
def execute vm
|
263
|
-
# Invocation.sig self.class.name
|
264
|
-
a0 = @lex_0.value(vm.current_context)
|
265
|
-
a2 = @lex_2.value(vm.current_context)
|
266
|
-
@sym.value.invoke_4 vm, a0, @lit_1, a2
|
267
|
-
rescue StandardError => e
|
268
|
-
handle e, @sym.value, :invoke_4, a0, @lit_1, a2
|
269
|
-
end
|
270
|
-
end
|
271
|
-
|
272
|
-
class Invocation_SYM_LIT_LEX < Invocation::Base
|
273
|
-
SIGS << self.name
|
274
|
-
def initialize expr, src
|
275
|
-
super expr, src
|
276
|
-
@sym = expr.car
|
277
|
-
@lit_0 = expr.cdr.car.expression
|
278
|
-
@lex_1 = expr.cdr.cdr.car
|
279
|
-
end
|
280
|
-
|
281
|
-
def execute vm
|
282
|
-
# Invocation.sig self.class.name
|
283
|
-
a1 = @lex_1.value(vm.current_context)
|
284
|
-
@sym.value.invoke_3 vm, @lit_0, a1
|
285
|
-
rescue StandardError => e
|
286
|
-
handle e, @sym.value, :invoke_3, @lit_0, a1
|
287
|
-
end
|
288
|
-
end
|
289
91
|
end
|
290
92
|
|
291
93
|
class FunctionInvocation
|
@@ -293,35 +95,26 @@ module Nydp
|
|
293
95
|
attr_accessor :function_instruction, :argument_instructions
|
294
96
|
|
295
97
|
def lexical_reach n
|
296
|
-
function_instruction.
|
98
|
+
function_instruction.lexical_reach(n)
|
297
99
|
end
|
298
100
|
|
299
|
-
def
|
300
|
-
|
301
|
-
|
302
|
-
|
303
|
-
|
101
|
+
def compile_to_ruby indent, srcs, opts=nil
|
102
|
+
ra = argument_instructions.map { |e| e.compile_to_ruby "#{indent} ", srcs, cando: true }.to_a
|
103
|
+
if ra.length == 1
|
104
|
+
"#{indent}#{ra.shift}._nydp_call()"
|
105
|
+
else
|
106
|
+
"#{indent}#{ra.shift}._nydp_call(
|
107
|
+
#{ra.join(",\n")}
|
108
|
+
#{indent})"
|
109
|
+
end
|
110
|
+
end
|
304
111
|
|
305
|
-
|
112
|
+
@@seen = { }
|
306
113
|
|
307
|
-
|
308
|
-
|
309
|
-
return Nydp::Invocation.const_get(cname).new(compiled, expression)
|
310
|
-
end
|
114
|
+
def self.build expression, bindings, ns
|
115
|
+
compiled = Compiler.compile_each(expression, bindings, ns)
|
311
116
|
|
312
|
-
|
313
|
-
when 1
|
314
|
-
Invocation::Invocation_1.new(compiled, expression)
|
315
|
-
when 2
|
316
|
-
Invocation::Invocation_2.new(compiled, expression)
|
317
|
-
when 3
|
318
|
-
Invocation::Invocation_3.new(compiled, expression)
|
319
|
-
when 4
|
320
|
-
Invocation::Invocation_4.new(compiled, expression)
|
321
|
-
else
|
322
|
-
Invocation::Invocation_N.new(expression.size, compiled, expression)
|
323
|
-
end
|
324
|
-
new invocation, compiled, expression, cname
|
117
|
+
Invocation::Base.new(compiled, expression)
|
325
118
|
end
|
326
119
|
|
327
120
|
def initialize function_instruction, argument_instructions, source, sig=nil
|
@@ -329,13 +122,7 @@ module Nydp
|
|
329
122
|
@sig = sig
|
330
123
|
end
|
331
124
|
|
332
|
-
def
|
333
|
-
|
334
|
-
vm.push_ctx_instructions function_instruction
|
335
|
-
vm.push_ctx_instructions argument_instructions
|
336
|
-
end
|
337
|
-
|
338
|
-
def inspect ; @function_instruction.inspect ; end
|
339
|
-
def to_s ; @source.to_s ; end
|
125
|
+
def inspect ; @function_instruction._nydp_inspect ; end
|
126
|
+
def to_s ; @source.to_s ; end
|
340
127
|
end
|
341
128
|
end
|