nydp 0.5.1 → 0.6.0
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/.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
|
@@ -18,4 +18,11 @@
|
|
|
18
18
|
|
|
19
19
|
("returns its year" (&year (date (time 1999 12 31 13 29 52))) 1999)
|
|
20
20
|
("returns its month" (&month (date (time 1999 12 31 13 29 52))) 12)
|
|
21
|
-
("returns its day" (&day (date (time 1999 12 31 13 29 52))) 31)
|
|
21
|
+
("returns its day" (&day (date (time 1999 12 31 13 29 52))) 31)
|
|
22
|
+
|
|
23
|
+
("returns its year" (&year (time 1999 12 31 13 29 52)) 1999)
|
|
24
|
+
("returns its month" (&month (time 1999 12 31 13 29 52)) 12)
|
|
25
|
+
("returns its day" (&day (time 1999 12 31 13 29 52)) 31)
|
|
26
|
+
("returns its hour" (&hour (time 1999 12 31 13 29 52)) 13)
|
|
27
|
+
("returns its minute" (&min (time 1999 12 31 13 29 52)) 29)
|
|
28
|
+
("returns its second" (&sec (time 1999 12 31 13 29 52)) 52))
|
|
@@ -1,8 +1,14 @@
|
|
|
1
1
|
(examples-for to-string
|
|
2
|
-
("unquote" (to-string '(unquote a))
|
|
3
|
-
("quote" (to-string '(quote a))
|
|
4
|
-
("quasiquote" (to-string '(quasiquote a))
|
|
5
|
-
("unquote-splicing" (to-string '(unquote-splicing a))
|
|
6
|
-
("
|
|
7
|
-
("
|
|
8
|
-
("
|
|
2
|
+
("unquote" (to-string '(unquote a)) ",a" )
|
|
3
|
+
("quote" (to-string '(quote a)) "'a" )
|
|
4
|
+
("quasiquote" (to-string '(quasiquote a)) "`a" )
|
|
5
|
+
("unquote-splicing" (to-string '(unquote-splicing a)) ",@a" )
|
|
6
|
+
("percent-syntax" (to-string '(percent-syntax || a)) "%a" )
|
|
7
|
+
("colon-syntax" (to-string '(colon-syntax a b c)) "a:b:c" )
|
|
8
|
+
("dot-syntax" (to-string '(dot-syntax a b c)) "a.b.c" )
|
|
9
|
+
("brace-list" (to-string '(brace-list a)) "{ a }" )
|
|
10
|
+
("brace-list" (to-string '(brace-list a b)) "{ a b }" )
|
|
11
|
+
("brace-list" (to-string '(brace-list a b c d)) "{ a b c d }" )
|
|
12
|
+
("prefix-list"
|
|
13
|
+
(to-string '((prefix-list "%a.item" (href path)) anchor))
|
|
14
|
+
"(%a.item(href path) anchor)"))
|
data/lib/nydp/assignment.rb
CHANGED
|
@@ -1,35 +1,16 @@
|
|
|
1
1
|
module Nydp
|
|
2
|
-
class AssignmentInstruction
|
|
3
|
-
attr_accessor :name
|
|
4
|
-
|
|
5
|
-
def initialize name
|
|
6
|
-
@name = name
|
|
7
|
-
end
|
|
8
|
-
|
|
9
|
-
def execute vm
|
|
10
|
-
@name.assign vm.peek_arg, vm.current_context
|
|
11
|
-
rescue
|
|
12
|
-
raise "assigning #{@name.inspect}"
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def to_s
|
|
16
|
-
"#assign #{@name}"
|
|
17
|
-
end
|
|
18
|
-
end
|
|
19
|
-
|
|
20
2
|
class Assignment
|
|
21
3
|
include Helper
|
|
22
4
|
|
|
23
|
-
def self.build args, bindings
|
|
24
|
-
name = Compiler.compile args.car, bindings
|
|
25
|
-
raise "can't assign to #{name.
|
|
5
|
+
def self.build args, bindings, ns
|
|
6
|
+
name = Compiler.compile args.car, bindings, ns
|
|
7
|
+
raise "can't assign to #{name._nydp_inspect} : expression was #{args}" unless name.respond_to?(:assign)
|
|
26
8
|
value_expr = args.cdr.car
|
|
27
|
-
Assignment.new name, Compiler.compile(value_expr, bindings),
|
|
9
|
+
Assignment.new name, Compiler.compile(value_expr, bindings, ns), args
|
|
28
10
|
end
|
|
29
11
|
|
|
30
|
-
def initialize name, value,
|
|
31
|
-
@name, @value, @
|
|
32
|
-
@instructions = cons(value, cons(AssignmentInstruction.new(name)))
|
|
12
|
+
def initialize name, value, src
|
|
13
|
+
@name, @value, @src = name, value, src
|
|
33
14
|
end
|
|
34
15
|
|
|
35
16
|
def lexical_reach n
|
|
@@ -37,15 +18,21 @@ module Nydp
|
|
|
37
18
|
end
|
|
38
19
|
|
|
39
20
|
def to_s
|
|
40
|
-
"(assign #{@
|
|
21
|
+
"(assign #{@src.car} #{@src.cdr.car})"
|
|
22
|
+
end
|
|
23
|
+
|
|
24
|
+
def compile_to_ruby indent, srcs, opts=nil
|
|
25
|
+
"#{indent}##> #{to_s.split(/\n/).join('\n')}\n" +
|
|
26
|
+
"#{indent}(#{@name.compile_to_ruby "", srcs} =\n" +
|
|
27
|
+
"#{indent}#{@value.compile_to_ruby indent, srcs})"
|
|
41
28
|
end
|
|
42
29
|
|
|
43
30
|
def inspect; to_s ; end
|
|
44
31
|
|
|
45
32
|
def execute vm
|
|
46
|
-
|
|
33
|
+
@name.assign @value.execute(vm), vm.current_context
|
|
47
34
|
rescue
|
|
48
|
-
raise "assigning #{@value.
|
|
35
|
+
raise "assigning #{@value._nydp_inspect} to #{@name._nydp_inspect}"
|
|
49
36
|
end
|
|
50
37
|
end
|
|
51
38
|
end
|
data/lib/nydp/builtin/abs.rb
CHANGED
data/lib/nydp/builtin/apply.rb
CHANGED
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
class Nydp::Builtin::Apply
|
|
2
2
|
include Nydp::Helper, Nydp::Builtin::Base, Singleton
|
|
3
3
|
|
|
4
|
-
def
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
4
|
+
def builtin_call arg, *args
|
|
5
|
+
# original_args = args.dup
|
|
6
|
+
cc = args.pop
|
|
7
|
+
cc = [] if cc == nil
|
|
8
|
+
dd = cc.to_a
|
|
9
|
+
aa = args.concat(dd)
|
|
9
10
|
|
|
10
|
-
|
|
11
|
-
raise "Apply: expected a list : got #{args.inspect}" unless pair? args
|
|
12
|
-
raise "Apply: improper list : cdr is ruby nil" if args.cdr.nil?
|
|
13
|
-
return args.car if Nydp::NIL.is? args.cdr
|
|
14
|
-
cons args.car, apply_args(args.cdr)
|
|
11
|
+
arg.call(*aa)._nydp_wrapper
|
|
15
12
|
end
|
|
13
|
+
|
|
16
14
|
end
|
data/lib/nydp/builtin/cdr_set.rb
CHANGED
data/lib/nydp/builtin/comment.rb
CHANGED
data/lib/nydp/builtin/date.rb
CHANGED
|
@@ -1,34 +1,17 @@
|
|
|
1
1
|
class Nydp::Builtin::Date
|
|
2
2
|
include Nydp::Helper, Nydp::Builtin::Base, Singleton
|
|
3
3
|
|
|
4
|
-
def
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
4
|
+
def builtin_call y=:unset, m=:unset, d=:unset
|
|
5
|
+
if y == :unset
|
|
6
|
+
Date.today
|
|
7
|
+
elsif m == :unset
|
|
8
|
+
if y.respond_to?(:to_date)
|
|
9
|
+
y.to_date
|
|
10
|
+
elsif y.is_a?(String)
|
|
11
|
+
::Date.parse(y)
|
|
12
|
+
end
|
|
13
|
+
else
|
|
14
|
+
Date.new(y,m,d)
|
|
10
15
|
end
|
|
11
16
|
end
|
|
12
|
-
|
|
13
|
-
def builtin_invoke_1 vm
|
|
14
|
-
vm.push_arg(Nydp::Date.new Date.today)
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
# it's a Time object (or any object that responds to #to_date)
|
|
18
|
-
def builtin_invoke_2 vm, arg
|
|
19
|
-
arg = if arg.respond_to?(:to_date)
|
|
20
|
-
arg.to_date
|
|
21
|
-
elsif arg.is_a?(String)
|
|
22
|
-
::Date.parse(arg)
|
|
23
|
-
end
|
|
24
|
-
vm.push_arg(Nydp::Date.new arg)
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def builtin_invoke_3 vm, a0, a1
|
|
28
|
-
raise Nydp::Error.new "Date, got 2 args (#{a0} #{a1}), expected 0 or 1 or 3 args"
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
def builtin_invoke_4 vm, y, m, d
|
|
32
|
-
vm.push_arg(Nydp::Date.new Date.new(y,m,d))
|
|
33
|
-
end
|
|
34
17
|
end
|
data/lib/nydp/builtin/divide.rb
CHANGED
|
@@ -1,17 +1,10 @@
|
|
|
1
1
|
class Nydp::Builtin::Divide
|
|
2
2
|
include Nydp::Builtin::Base, Singleton
|
|
3
3
|
|
|
4
|
-
def
|
|
5
|
-
vm.push_arg divide(args.cdr, args.car)
|
|
6
|
-
end
|
|
4
|
+
def name ; "/" ; end
|
|
7
5
|
|
|
8
|
-
def
|
|
9
|
-
|
|
10
|
-
accum
|
|
11
|
-
else
|
|
12
|
-
divide(args.cdr, (accum / args.car))
|
|
13
|
-
end
|
|
6
|
+
def builtin_call *args
|
|
7
|
+
(args.reduce &:/)._nydp_wrapper
|
|
14
8
|
end
|
|
15
9
|
|
|
16
|
-
def name ; "/" ; end
|
|
17
10
|
end
|
|
@@ -1,28 +1,13 @@
|
|
|
1
|
-
require "nydp/vm"
|
|
1
|
+
# require "nydp/vm"
|
|
2
2
|
|
|
3
3
|
class Nydp::Builtin::Ensuring
|
|
4
4
|
include Nydp::Helper, Nydp::Builtin::Base, Singleton
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
@protection = protection
|
|
12
|
-
end
|
|
13
|
-
|
|
14
|
-
def execute vm
|
|
15
|
-
protection.invoke vm, Nydp::NIL
|
|
6
|
+
def builtin_call ensureme, tricky
|
|
7
|
+
begin
|
|
8
|
+
tricky.call
|
|
9
|
+
ensure
|
|
10
|
+
ensureme.call
|
|
16
11
|
end
|
|
17
12
|
end
|
|
18
|
-
|
|
19
|
-
def builtin_invoke vm, args
|
|
20
|
-
fn_ensure = args.car
|
|
21
|
-
fn_tricky = args.cdr.car
|
|
22
|
-
|
|
23
|
-
protection_instructions = Nydp::Pair.from_list [InvokeProtection.new(fn_ensure), Nydp::PopArg]
|
|
24
|
-
vm.push_ctx_instructions protection_instructions
|
|
25
|
-
|
|
26
|
-
fn_tricky.invoke vm, Nydp::NIL
|
|
27
|
-
end
|
|
28
13
|
end
|
data/lib/nydp/builtin/error.rb
CHANGED
|
@@ -1,9 +1,7 @@
|
|
|
1
1
|
class Nydp::Builtin::Error
|
|
2
2
|
include Nydp::Builtin::Base, Singleton
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
def builtin_invoke vm, args
|
|
7
|
-
raise Nydp::Error.new(args.to_a.map(&:to_s).join("\n"), vm.last_error)
|
|
4
|
+
def builtin_call *args
|
|
5
|
+
raise Nydp::Error.new(args.map(&:to_s).join("\n"))
|
|
8
6
|
end
|
|
9
7
|
end
|
data/lib/nydp/builtin/eval.rb
CHANGED
|
@@ -1,8 +1,13 @@
|
|
|
1
1
|
class Nydp::Builtin::Eval
|
|
2
|
-
include Nydp::Builtin::Base
|
|
2
|
+
include Nydp::Builtin::Base
|
|
3
3
|
|
|
4
|
-
def
|
|
5
|
-
|
|
6
|
-
|
|
4
|
+
def initialize ns
|
|
5
|
+
@ns = ns
|
|
6
|
+
super()
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
def builtin_call *args
|
|
10
|
+
evaluator = Nydp::Evaluator.new @ns, "<eval>"
|
|
11
|
+
evaluator.evaluate args.first
|
|
7
12
|
end
|
|
8
13
|
end
|
|
@@ -1,14 +1,13 @@
|
|
|
1
1
|
class Nydp::Builtin::GreaterThan
|
|
2
2
|
include Nydp::Builtin::Base, Singleton
|
|
3
3
|
|
|
4
|
-
def
|
|
5
|
-
vm.push_arg(greater_than(args.car, args.cdr) || Nydp::NIL)
|
|
6
|
-
end
|
|
4
|
+
def name ; ">" ; end
|
|
7
5
|
|
|
8
|
-
def
|
|
9
|
-
|
|
10
|
-
|
|
6
|
+
def builtin_call arg, *args
|
|
7
|
+
while !args.empty?
|
|
8
|
+
return nil unless args.first && arg > args.first
|
|
9
|
+
arg = args.shift
|
|
10
|
+
end
|
|
11
|
+
return arg
|
|
11
12
|
end
|
|
12
|
-
|
|
13
|
-
def name ; ">" ; end
|
|
14
13
|
end
|
|
@@ -1,46 +1,22 @@
|
|
|
1
|
-
require "nydp/vm"
|
|
1
|
+
# require "nydp/vm"
|
|
2
2
|
|
|
3
3
|
class Nydp::Builtin::HandleError
|
|
4
4
|
include Nydp::Helper, Nydp::Builtin::Base, Singleton
|
|
5
5
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
def initialize handler, vm_arg_array_size
|
|
12
|
-
@handler, @vm_arg_array_size = handler, vm_arg_array_size
|
|
13
|
-
end
|
|
14
|
-
|
|
15
|
-
def execute vm
|
|
16
|
-
e = vm.last_error = vm.unhandled_error
|
|
17
|
-
vm.unhandled_error = nil
|
|
18
|
-
return unless e
|
|
19
|
-
|
|
20
|
-
vm.args = vm.args[0...vm_arg_array_size]
|
|
21
|
-
|
|
6
|
+
def builtin_call handler, tricky
|
|
7
|
+
begin
|
|
8
|
+
res = tricky.call
|
|
9
|
+
rescue Exception => e
|
|
10
|
+
o = e
|
|
22
11
|
msgs = []
|
|
12
|
+
traces = []
|
|
23
13
|
while e
|
|
24
14
|
msgs << e.message
|
|
15
|
+
traces << Nydp.enhance_backtrace(e.backtrace)
|
|
25
16
|
e = e.cause
|
|
26
17
|
end
|
|
27
|
-
|
|
28
|
-
handler.invoke_2 vm, r2n(msgs)
|
|
18
|
+
res = handler.call msgs._nydp_wrapper, traces._nydp_wrapper
|
|
29
19
|
end
|
|
30
|
-
|
|
31
|
-
def to_s
|
|
32
|
-
"(on-err: #{handler})"
|
|
33
|
-
end
|
|
34
|
-
end
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
def builtin_invoke vm, args
|
|
38
|
-
fn_handle = args.car
|
|
39
|
-
fn_tricky = args.cdr.car
|
|
40
|
-
|
|
41
|
-
catcher_instructions = Nydp::Pair.from_list [CatchError.new(fn_handle, vm.args.size)]
|
|
42
|
-
vm.push_ctx_instructions catcher_instructions
|
|
43
|
-
|
|
44
|
-
fn_tricky.invoke vm, Nydp::NIL
|
|
20
|
+
res._nydp_wrapper
|
|
45
21
|
end
|
|
46
22
|
end
|
data/lib/nydp/builtin/hash.rb
CHANGED
|
@@ -1,81 +1,60 @@
|
|
|
1
|
-
require "nydp/hash"
|
|
2
|
-
|
|
3
1
|
class Nydp::Builtin::Hash
|
|
4
2
|
include Nydp::Helper, Nydp::Builtin::Base, Singleton
|
|
5
3
|
|
|
6
|
-
def
|
|
7
|
-
vm.push_arg(build_hash Nydp::Hash.new, args)
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def build_hash h, args
|
|
11
|
-
return h if Nydp::NIL.is? args
|
|
12
|
-
k = args.car
|
|
13
|
-
rest = args.cdr
|
|
14
|
-
v = rest.car
|
|
15
|
-
h[k] = v
|
|
16
|
-
build_hash h, rest.cdr
|
|
17
|
-
end
|
|
4
|
+
def builtin_call *args ; Hash[*args] ; end
|
|
18
5
|
end
|
|
19
6
|
|
|
20
7
|
class Nydp::Builtin::HashGet
|
|
21
8
|
include Nydp::Helper, Nydp::Builtin::Base, Singleton
|
|
22
|
-
def
|
|
23
|
-
|
|
9
|
+
def builtin_call hsh=nil, k=nil, *args
|
|
10
|
+
hsh._nydp_get(k)._nydp_wrapper
|
|
24
11
|
end
|
|
25
12
|
end
|
|
26
13
|
|
|
27
14
|
class Nydp::Builtin::HashSet
|
|
28
15
|
include Nydp::Helper, Nydp::Builtin::Base, Singleton
|
|
29
|
-
def
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
vm.push_arg value
|
|
16
|
+
def builtin_call hsh, k, v=nil
|
|
17
|
+
hsh._nydp_set(k, v)
|
|
18
|
+
v
|
|
33
19
|
end
|
|
34
20
|
end
|
|
35
21
|
|
|
36
22
|
class Nydp::Builtin::HashKeys
|
|
37
23
|
include Nydp::Helper, Nydp::Builtin::Base, Singleton
|
|
38
|
-
def
|
|
39
|
-
|
|
24
|
+
def builtin_call h
|
|
25
|
+
h._nydp_keys._nydp_wrapper
|
|
40
26
|
end
|
|
41
27
|
end
|
|
42
28
|
|
|
43
29
|
class Nydp::Builtin::HashKeyPresent
|
|
44
30
|
include Nydp::Helper, Nydp::Builtin::Base, Singleton
|
|
45
|
-
def builtin_invoke vm, args
|
|
46
|
-
hash = args.car
|
|
47
|
-
key = args.cdr.car
|
|
48
|
-
truth = case hash
|
|
49
|
-
when Nydp::Hash
|
|
50
|
-
hash.key? key
|
|
51
|
-
else
|
|
52
|
-
hash.key? n2r key
|
|
53
|
-
end
|
|
54
|
-
vm.push_arg(truth ? Nydp::T : Nydp::NIL)
|
|
55
|
-
end
|
|
56
31
|
def name ; "hash-key?" ; end
|
|
32
|
+
|
|
33
|
+
def builtin_call h, k
|
|
34
|
+
h.key?(k) || nil
|
|
35
|
+
end
|
|
57
36
|
end
|
|
58
37
|
|
|
59
38
|
class Nydp::Builtin::HashMerge
|
|
60
39
|
include Nydp::Helper, Nydp::Builtin::Base, Singleton
|
|
61
40
|
|
|
62
|
-
def
|
|
63
|
-
|
|
64
|
-
hash_1 = args.cdr.car
|
|
65
|
-
|
|
66
|
-
vm.push_arg hash_0.merge hash_1
|
|
41
|
+
def builtin_call a0, a1
|
|
42
|
+
(a0.merge a1)._nydp_wrapper
|
|
67
43
|
end
|
|
68
44
|
end
|
|
69
45
|
|
|
70
46
|
class Nydp::Builtin::HashSlice
|
|
71
47
|
include Nydp::Helper, Nydp::Builtin::Base, Singleton
|
|
72
48
|
|
|
73
|
-
def
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
49
|
+
def builtin_call h, slice
|
|
50
|
+
h.slice(*slice.to_a)
|
|
51
|
+
end
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
class Nydp::Builtin::HashToArray
|
|
55
|
+
include Nydp::Helper, Nydp::Builtin::Base, Singleton
|
|
56
|
+
|
|
57
|
+
def builtin_call h
|
|
58
|
+
h.to_a._nydp_wrapper
|
|
80
59
|
end
|
|
81
60
|
end
|
data/lib/nydp/builtin/inspect.rb
CHANGED
|
@@ -1,14 +1,11 @@
|
|
|
1
1
|
class Nydp::Builtin::IsEqual
|
|
2
2
|
include Nydp::Builtin::Base, Singleton
|
|
3
3
|
|
|
4
|
-
def builtin_invoke_1 vm ; raise "#{name} : requires at least two args" ; end
|
|
5
|
-
def builtin_invoke_2 vm, arg ; raise "#{name} : requires at least two args, got one: (#{arg})" ; end
|
|
6
|
-
|
|
7
|
-
def builtin_invoke_3 vm, a0, a1 ; vm.push_arg ((a0 == a1) ? Nydp::T : Nydp::NIL) ; end
|
|
8
|
-
def builtin_invoke_4 vm, a0, a1, a2 ; vm.push_arg (eq?([a0, a1, a2]) ? Nydp::T : Nydp::NIL) ; end
|
|
9
|
-
def builtin_invoke vm, args ; vm.push_arg (eq?(args.to_a) ? Nydp::T : Nydp::NIL) ; end
|
|
10
|
-
|
|
11
4
|
def _eq? arg, args ; args.all? { |a| a == arg } ; end
|
|
12
5
|
def eq? args ; _eq? args.first, args[1..-1] ; end
|
|
13
6
|
def name ; "eq?" ; end
|
|
7
|
+
|
|
8
|
+
def builtin_call *args
|
|
9
|
+
eq?(args) || nil
|
|
10
|
+
end
|
|
14
11
|
end
|
|
@@ -1,13 +1,12 @@
|
|
|
1
1
|
class Nydp::Builtin::LessThan
|
|
2
2
|
include Nydp::Builtin::Base, Singleton
|
|
3
3
|
|
|
4
|
-
def
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
return arg
|
|
10
|
-
(arg < args.car) && less_than(args.car, args.cdr)
|
|
4
|
+
def builtin_call arg, *args
|
|
5
|
+
while !args.empty?
|
|
6
|
+
return nil unless args.first && (arg < args.first)
|
|
7
|
+
arg = args.shift
|
|
8
|
+
end
|
|
9
|
+
return arg
|
|
11
10
|
end
|
|
12
11
|
|
|
13
12
|
def name ; "<" ; end
|
data/lib/nydp/builtin/minus.rb
CHANGED
|
@@ -1,22 +1,15 @@
|
|
|
1
1
|
class Nydp::Builtin::Minus
|
|
2
2
|
include Nydp::Builtin::Base, Singleton
|
|
3
3
|
|
|
4
|
-
def
|
|
5
|
-
def invoke_2 vm, a ; vm.push_arg -a ; end
|
|
6
|
-
def invoke_3 vm, a0, a1 ; vm.push_arg(a0 - a1) ; end
|
|
7
|
-
def invoke_4 vm, a0, a1, a2 ; vm.push_arg(a0 - a1 - a2) ; end
|
|
8
|
-
|
|
9
|
-
def builtin_invoke vm, args
|
|
10
|
-
vm.push_arg diff(args.cdr, args.car)
|
|
11
|
-
end
|
|
4
|
+
def name ; "-" ; end
|
|
12
5
|
|
|
13
|
-
def
|
|
14
|
-
if
|
|
15
|
-
|
|
6
|
+
def builtin_call *args
|
|
7
|
+
if args.length == 1
|
|
8
|
+
- args.first
|
|
9
|
+
elsif args.first
|
|
10
|
+
args.reduce(&:-)
|
|
16
11
|
else
|
|
17
|
-
|
|
12
|
+
0
|
|
18
13
|
end
|
|
19
14
|
end
|
|
20
|
-
|
|
21
|
-
def name ; "-" ; end
|
|
22
15
|
end
|
data/lib/nydp/builtin/parse.rb
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
class Nydp::Builtin::Parse
|
|
2
2
|
include Nydp::Builtin::Base, Singleton
|
|
3
3
|
|
|
4
|
-
def
|
|
5
|
-
parser = Nydp.new_parser
|
|
6
|
-
tokens = Nydp.new_tokeniser Nydp::StringReader.new
|
|
4
|
+
def builtin_call arg
|
|
5
|
+
parser = Nydp.new_parser
|
|
6
|
+
tokens = Nydp.new_tokeniser Nydp::StringReader.new "parse", arg.to_s
|
|
7
7
|
exprs = []
|
|
8
8
|
while !tokens.finished
|
|
9
9
|
expr = parser.expression(tokens)
|
|
10
|
-
exprs << expr unless expr == nil
|
|
10
|
+
exprs << expr unless expr == nil && tokens.finished
|
|
11
11
|
end
|
|
12
|
-
|
|
12
|
+
Nydp::Pair.from_list exprs
|
|
13
13
|
end
|
|
14
14
|
end
|
|
@@ -1,14 +1,12 @@
|
|
|
1
1
|
class Nydp::Builtin::ParseInString
|
|
2
2
|
include Nydp::Builtin::Base, Singleton
|
|
3
3
|
|
|
4
|
-
def
|
|
5
|
-
parser = Nydp.new_parser
|
|
6
|
-
|
|
7
|
-
tokens
|
|
8
|
-
expr = parser.embedded(tokens)
|
|
9
|
-
vm.push_arg expr
|
|
4
|
+
def builtin_call arg
|
|
5
|
+
parser = Nydp.new_parser
|
|
6
|
+
tokens = Nydp.new_tokeniser Nydp::StringReader.new "parse-in-string", arg.to_s
|
|
7
|
+
parser.embedded(tokens)
|
|
10
8
|
rescue StandardError => e
|
|
11
|
-
new_msg = "parse error: #{e.message.
|
|
9
|
+
new_msg = "parse error: #{e.message._nydp_inspect} in\n#{Nydp.indent_text arg.to_s}"
|
|
12
10
|
raise Nydp::Error.new new_msg
|
|
13
11
|
end
|
|
14
12
|
end
|