nydp 0.5.0 → 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 +30 -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 +88 -24
- 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
@@ -9,11 +9,12 @@
|
|
9
9
|
|
10
10
|
("dislikes no-prefix"
|
11
11
|
(on-err (joinstr "\n" errors)
|
12
|
-
(pre-compile
|
12
|
+
(pre-compile (car (parse "(:foo 1 2 3)"))))
|
13
13
|
"expanding
|
14
14
|
(colon-syntax || foo)
|
15
15
|
with
|
16
|
-
|
16
|
+
NydpGenerated_D5FEA04F6E33706A6789A4F7BD15E937C3CFFAF5C16B89D54087F38BD4E594D1.rb:24
|
17
|
+
(fn names ((orf (hash-get colon-syntax-overrides (car names)) default-colon-syntax) names))
|
17
18
|
Irregular ': syntax: got (|| foo) : not prefix-syntax : in :foo"))
|
18
19
|
|
19
20
|
(examples-for prefix-list
|
@@ -36,3 +37,10 @@ Irregular ': syntax: got (|| foo) : not prefix-syntax : in :foo"))
|
|
36
37
|
("with two args, to be sure"
|
37
38
|
(λpq(+ p (* p q)) 3 5)
|
38
39
|
18))
|
40
|
+
|
41
|
+
(examples-for tilde-prefix-expansion
|
42
|
+
("tilde expands to to-string"
|
43
|
+
(with (a (to-string (date "2004-03-12"))
|
44
|
+
b ~(date "2004-03-12"))
|
45
|
+
(list a b))
|
46
|
+
("2004-03-12" "2004-03-12")))
|
@@ -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
|