nydp 0.4.5 → 0.4.6
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/README.md +44 -0
- data/lib/lisp/core-015-documentation.nydp +12 -7
- data/lib/lisp/core-017-builtin-dox.nydp +13 -12
- data/lib/lisp/core-030-syntax.nydp +24 -16
- data/lib/lisp/core-037-list-utils.nydp +0 -11
- data/lib/lisp/core-040-utils.nydp +11 -0
- data/lib/lisp/core-041-string-utils.nydp +1 -1
- data/lib/lisp/core-043-list-utils.nydp +6 -6
- data/lib/lisp/core-080-pretty-print.nydp +5 -0
- data/lib/lisp/core-090-hook.nydp +19 -7
- data/lib/lisp/core-120-settings.nydp +2 -2
- data/lib/lisp/core-130-validations.nydp +51 -0
- data/lib/lisp/core-900-benchmarking.nydp +59 -1
- data/lib/lisp/tests/multi-assign-examples.nydp +6 -0
- data/lib/lisp/tests/settings-examples.nydp +16 -0
- data/lib/lisp/tests/string-tests.nydp +4 -1
- data/lib/lisp/tests/to-integer-examples.nydp +16 -0
- data/lib/lisp/tests/validation-examples.nydp +15 -0
- data/lib/nydp.rb +4 -0
- data/lib/nydp/builtin/date.rb +6 -1
- data/lib/nydp/builtin/inspect.rb +1 -1
- data/lib/nydp/builtin/plus.rb +10 -2
- data/lib/nydp/builtin/random_string.rb +2 -2
- data/lib/nydp/builtin/ruby_wrap.rb +8 -5
- data/lib/nydp/builtin/string_match.rb +2 -2
- data/lib/nydp/builtin/string_pad_left.rb +1 -1
- data/lib/nydp/builtin/string_pad_right.rb +1 -1
- data/lib/nydp/builtin/string_replace.rb +1 -1
- data/lib/nydp/builtin/string_split.rb +1 -2
- data/lib/nydp/builtin/to_integer.rb +23 -0
- data/lib/nydp/builtin/to_string.rb +2 -9
- data/lib/nydp/core.rb +4 -2
- data/lib/nydp/core_ext.rb +13 -1
- data/lib/nydp/date.rb +1 -0
- data/lib/nydp/helper.rb +29 -7
- data/lib/nydp/pair.rb +8 -3
- data/lib/nydp/parser.rb +4 -5
- data/lib/nydp/truth.rb +2 -2
- data/lib/nydp/version.rb +1 -1
- data/lib/nydp/vm.rb +7 -0
- data/spec/embedded_spec.rb +12 -12
- data/spec/foreign_hash_spec.rb +2 -2
- data/spec/hash_non_hash_behaviour_spec.rb +7 -7
- data/spec/hash_spec.rb +2 -2
- data/spec/nydp_spec.rb +14 -2
- data/spec/parser_spec.rb +16 -16
- data/spec/rand_spec.rb +3 -3
- data/spec/spec_helper.rb +10 -1
- metadata +7 -2
@@ -1,3 +1,6 @@
|
|
1
|
+
(def-setting "testing.reset.string" "hello world")
|
2
|
+
(def-setting "testing.reset.fn" to-string)
|
3
|
+
|
1
4
|
(examples-for settings/fn
|
2
5
|
("returns arg if it is a sym"
|
3
6
|
(settings/fn 'foobar)
|
@@ -22,3 +25,16 @@
|
|
22
25
|
("wraps arg in a fn expression if it is a complex expression"
|
23
26
|
(settings/fn '(let foo this that (rfnwith (complex stuff) (%td.tricky#syntax))))
|
24
27
|
(fn (_) (let foo this that (rfnwith (complex stuff) ((percent-syntax || (dot-syntax td tricky#syntax))))))))
|
28
|
+
|
29
|
+
(examples-for reset-setting
|
30
|
+
("restores a setting to its original value"
|
31
|
+
(do (set-setting "testing.reset.string" "goodbye, dear life")
|
32
|
+
(reset-setting "testing.reset.string")
|
33
|
+
(setting "testing.reset.string"))
|
34
|
+
"hello world")
|
35
|
+
|
36
|
+
("restores a setting to its original function value"
|
37
|
+
(do (set-setting "testing.reset.fn" "goodbye, dear life")
|
38
|
+
(reset-setting "testing.reset.fn")
|
39
|
+
(setting "testing.reset.fn"))
|
40
|
+
"testing.reset.fn"))
|
@@ -138,4 +138,7 @@ and args (\"world\" 36 6)"
|
|
138
138
|
(examples-for string-strip
|
139
139
|
("removes leading whitespace" (string-strip " hello!") "hello!" )
|
140
140
|
("removes trailing whitespace" (string-strip "(world) ") "(world)" )
|
141
|
-
("removes leading and trailing whitespace" (string-strip "\n\nme\n\n") "me" )
|
141
|
+
("removes leading and trailing whitespace" (string-strip "\n\nme\n\n") "me" )
|
142
|
+
("ignores leading and trailing whitespace for intenal lines"
|
143
|
+
(string-strip "\n\n me \n\n you \n\n\t them \t\n\n")
|
144
|
+
"me \n\n you \n\n\t them" ))
|
@@ -0,0 +1,16 @@
|
|
1
|
+
(examples-for to-integer
|
2
|
+
("converts a string"
|
3
|
+
(to-integer "1234")
|
4
|
+
1234)
|
5
|
+
|
6
|
+
("converts a date"
|
7
|
+
(to-integer (date 2004 3 12))
|
8
|
+
1079046000)
|
9
|
+
|
10
|
+
("converts a time"
|
11
|
+
(to-integer (time 2004 3 12 18 45))
|
12
|
+
1079113500)
|
13
|
+
|
14
|
+
("returns nonsense for non-integer"
|
15
|
+
(to-integer { foo 'bar })
|
16
|
+
0))
|
@@ -0,0 +1,15 @@
|
|
1
|
+
(validate/def string test-0 (if (< (len string) 6) (mf "length" "should be more than 6")))
|
2
|
+
(validate/def string test-0 (if (> (len string) 10) (mf "length" "should be less than 10")))
|
3
|
+
|
4
|
+
(examples-for validate
|
5
|
+
("returns a message about a string being too short"
|
6
|
+
(to-string:validate "foo" 'test-0)
|
7
|
+
"{\"length\"=>(\"should be more than 6\")}")
|
8
|
+
|
9
|
+
("returns a message about a string being too long"
|
10
|
+
(to-string:validate "foo bar toto titi" 'test-0)
|
11
|
+
"{\"length\"=>(\"should be less than 10\")}")
|
12
|
+
|
13
|
+
("returns an empty hash"
|
14
|
+
(to-string:validate "foo bar" 'test-0)
|
15
|
+
"{}"))
|
data/lib/nydp.rb
CHANGED
data/lib/nydp/builtin/date.rb
CHANGED
@@ -16,7 +16,12 @@ class Nydp::Builtin::Date
|
|
16
16
|
|
17
17
|
# it's a Time object (or any object that responds to #to_date)
|
18
18
|
def builtin_invoke_2 vm, arg
|
19
|
-
|
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)
|
20
25
|
end
|
21
26
|
|
22
27
|
def builtin_invoke_3 vm, a0, a1
|
data/lib/nydp/builtin/inspect.rb
CHANGED
data/lib/nydp/builtin/plus.rb
CHANGED
@@ -10,13 +10,21 @@ class Nydp::Builtin::Plus
|
|
10
10
|
vm.push_arg case args.car
|
11
11
|
when Nydp::Pair
|
12
12
|
sum(args, Nydp::NIL)
|
13
|
-
when String
|
14
|
-
|
13
|
+
when String
|
14
|
+
string_concat("", args)
|
15
15
|
else
|
16
16
|
sum(args.cdr, args.car)
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
|
+
def string_concat init, others
|
21
|
+
while others && !Nydp::NIL.is?(others)
|
22
|
+
init << others.car.to_s
|
23
|
+
others = others.cdr
|
24
|
+
end
|
25
|
+
init
|
26
|
+
end
|
27
|
+
|
20
28
|
def sum args, accum
|
21
29
|
while args && !Nydp::NIL.is?(args)
|
22
30
|
accum += args.car
|
@@ -5,7 +5,7 @@ class Nydp::Builtin::RandomString
|
|
5
5
|
|
6
6
|
def builtin_invoke vm, args
|
7
7
|
length = args.car unless Nydp::NIL.is?(args)
|
8
|
-
s = (0...(length || 10)).
|
9
|
-
vm.push_arg
|
8
|
+
s = (0...(length || 10)).inject("") {|a,i| a << RANDOM_CHARS[rand(RANDOM_CHARS.size)] }
|
9
|
+
vm.push_arg s
|
10
10
|
end
|
11
11
|
end
|
@@ -15,7 +15,8 @@ class Nydp::Builtin::RubyWrap
|
|
15
15
|
when 2 ; ", a0, a1"
|
16
16
|
when 3 ; ", a0, a1, a2"
|
17
17
|
when 4 ; ", a0, a1, a2, a3"
|
18
|
-
|
18
|
+
when 5 ; ", a0, a1, a2, a3, a4"
|
19
|
+
else ; raise "maximum 5 arguments!"
|
19
20
|
end
|
20
21
|
end
|
21
22
|
|
@@ -24,7 +25,8 @@ class Nydp::Builtin::RubyWrap
|
|
24
25
|
gsub(/a0/, "args.car").
|
25
26
|
gsub(/a1/, "args.cdr.car").
|
26
27
|
gsub(/a2/, "args.cdr.cdr.car").
|
27
|
-
gsub(/a3/, "args.cdr.cdr.cdr.car")
|
28
|
+
gsub(/a3/, "args.cdr.cdr.cdr.car").
|
29
|
+
gsub(/a4/, "args.cdr.cdr.cdr.cdr.car")
|
28
30
|
<<CODE
|
29
31
|
class #{name}
|
30
32
|
include Nydp::Builtin::Base, Singleton#{helpers}
|
@@ -63,7 +65,8 @@ CODE
|
|
63
65
|
end
|
64
66
|
|
65
67
|
core_builder = builder ""
|
66
|
-
core_builder.build(:Cons, 2, %{ Nydp::Pair.new(a0, a1) })
|
67
|
-
core_builder.build(:Car , 1, %{ a0.car })
|
68
|
-
core_builder.build(:Cdr , 1, %{ a0.cdr })
|
68
|
+
core_builder.build(:Cons, 2, %{ Nydp::Pair.new(a0, a1) } )
|
69
|
+
core_builder.build(:Car , 1, %{ a0.car } )
|
70
|
+
core_builder.build(:Cdr , 1, %{ a0.cdr } )
|
71
|
+
core_builder.build(:Log , 1, %{ r2n Nydp.logger.info(a0.to_s) } )
|
69
72
|
end
|
@@ -10,8 +10,8 @@ class Nydp::Builtin::StringMatch
|
|
10
10
|
|
11
11
|
if match
|
12
12
|
result = Nydp::Hash.new
|
13
|
-
result[kmatch] =
|
14
|
-
result[kcaptures] = Nydp::Pair.from_list match.captures.map { |cap|
|
13
|
+
result[kmatch] = match.to_s
|
14
|
+
result[kcaptures] = Nydp::Pair.from_list match.captures.map { |cap| cap.to_s }
|
15
15
|
else
|
16
16
|
result = Nydp::NIL
|
17
17
|
end
|
@@ -5,8 +5,7 @@ class Nydp::Builtin::StringSplit
|
|
5
5
|
target = args.car.to_s
|
6
6
|
separator = args.cdr.car.to_s
|
7
7
|
result = target.split separator, -1
|
8
|
-
list = result.map { |s| Nydp::StringAtom.new s }
|
9
8
|
|
10
|
-
vm.push_arg Nydp::Pair.from_list
|
9
|
+
vm.push_arg Nydp::Pair.from_list result
|
11
10
|
end
|
12
11
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Nydp::Builtin
|
2
|
+
class ToInteger
|
3
|
+
include Nydp::Builtin::Base, Singleton
|
4
|
+
|
5
|
+
def builtin_invoke_2 vm, arg
|
6
|
+
arg = n2r arg
|
7
|
+
|
8
|
+
i = if arg.respond_to? :to_i
|
9
|
+
arg.to_i
|
10
|
+
elsif arg.respond_to? :to_time
|
11
|
+
arg.to_time.to_i
|
12
|
+
else
|
13
|
+
arg.to_s.to_i
|
14
|
+
end
|
15
|
+
|
16
|
+
vm.push_arg r2n i
|
17
|
+
end
|
18
|
+
|
19
|
+
def builtin_invoke vm, args
|
20
|
+
builtin_invoke_2 vm, args.car
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -3,14 +3,7 @@ module Nydp::Builtin
|
|
3
3
|
include Nydp::Builtin::Base, Singleton
|
4
4
|
|
5
5
|
def builtin_invoke vm, args
|
6
|
-
|
7
|
-
val = case arg.class
|
8
|
-
when Nydp::StringAtom
|
9
|
-
arg
|
10
|
-
else
|
11
|
-
Nydp::StringAtom.new arg.to_s
|
12
|
-
end
|
13
|
-
vm.push_arg val
|
6
|
+
vm.push_arg args.car.to_s
|
14
7
|
end
|
15
8
|
end
|
16
9
|
|
@@ -20,7 +13,7 @@ module Nydp::Builtin
|
|
20
13
|
def builtin_invoke vm, args
|
21
14
|
arg = args.car
|
22
15
|
val = case arg
|
23
|
-
when
|
16
|
+
when String
|
24
17
|
arg.length
|
25
18
|
else
|
26
19
|
0
|
data/lib/nydp/core.rb
CHANGED
@@ -26,8 +26,9 @@ module Nydp
|
|
26
26
|
|
27
27
|
def setup ns
|
28
28
|
Symbol.mk(:cons , ns).assign(Nydp::Builtin::RubyWrap::Cons.instance)
|
29
|
-
Symbol.mk(:car , ns).assign(Nydp::Builtin::RubyWrap::Car.instance)
|
30
|
-
Symbol.mk(:cdr , ns).assign(Nydp::Builtin::RubyWrap::Cdr.instance)
|
29
|
+
Symbol.mk(:car , ns).assign(Nydp::Builtin::RubyWrap::Car.instance )
|
30
|
+
Symbol.mk(:cdr , ns).assign(Nydp::Builtin::RubyWrap::Cdr.instance )
|
31
|
+
Symbol.mk(:log , ns).assign(Nydp::Builtin::RubyWrap::Log.instance )
|
31
32
|
|
32
33
|
Symbol.mk(:+, ns).assign(Nydp::Builtin::Plus.instance)
|
33
34
|
Symbol.mk(:-, ns).assign(Nydp::Builtin::Minus.instance)
|
@@ -59,6 +60,7 @@ module Nydp
|
|
59
60
|
Symbol.mk("parse-in-string" , ns).assign(Nydp::Builtin::ParseInString.instance)
|
60
61
|
Symbol.mk("random-string" , ns).assign(Nydp::Builtin::RandomString.instance)
|
61
62
|
Symbol.mk("to-string" , ns).assign(Nydp::Builtin::ToString.instance)
|
63
|
+
Symbol.mk("to-integer" , ns).assign(Nydp::Builtin::ToInteger.instance)
|
62
64
|
Symbol.mk("string-length" , ns).assign(Nydp::Builtin::StringLength.instance)
|
63
65
|
Symbol.mk("string-replace" , ns).assign(Nydp::Builtin::StringReplace.instance)
|
64
66
|
Symbol.mk("string-match" , ns).assign(Nydp::Builtin::StringMatch.instance)
|
data/lib/nydp/core_ext.rb
CHANGED
@@ -6,6 +6,15 @@ class Object
|
|
6
6
|
def lexical_reach n ; n ; end
|
7
7
|
end
|
8
8
|
|
9
|
+
class Method
|
10
|
+
include Nydp::Converter
|
11
|
+
def invoke_1 vm ; vm.push_arg call._nydp_wrapper ; end
|
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
|
+
end
|
17
|
+
|
9
18
|
class NilClass
|
10
19
|
def _nydp_wrapper ; Nydp::NIL ; end
|
11
20
|
end
|
@@ -31,7 +40,10 @@ class ::Array
|
|
31
40
|
end
|
32
41
|
|
33
42
|
class ::String
|
34
|
-
def _nydp_wrapper
|
43
|
+
# def _nydp_wrapper ; Nydp::StringAtom.new self ; end
|
44
|
+
def as_method_name ; self.gsub(/-/, '_').to_sym ; end
|
45
|
+
def nydp_type ; :string ; end
|
46
|
+
def to_ruby ; self ; end
|
35
47
|
end
|
36
48
|
|
37
49
|
class ::Hash
|
data/lib/nydp/date.rb
CHANGED
data/lib/nydp/helper.rb
CHANGED
@@ -1,17 +1,39 @@
|
|
1
1
|
module Nydp
|
2
2
|
module AutoWrap
|
3
3
|
# include this and be sure to either override #_nydp_ok? or #_nydp_whitelist
|
4
|
-
# #_nydp_whitelist should return a list of methods which are safe for nydp to invoke
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
def
|
4
|
+
# #_nydp_whitelist should return a list of accessor (zero-arg) methods which are safe for nydp to invoke
|
5
|
+
# #_nydp_procify should return a list of methods that can be exposed to script code.
|
6
|
+
#
|
7
|
+
# class Blub
|
8
|
+
# _nydp_procs << :blubme
|
9
|
+
# def blubme where, when
|
10
|
+
# puts "blubme #{where}, #{when}"
|
11
|
+
# end
|
12
|
+
# end
|
13
|
+
#
|
14
|
+
# in nydp, if blub is an instance of Blub:
|
15
|
+
#
|
16
|
+
# (blub.blubme "here" "now")
|
17
|
+
#
|
18
|
+
# prints
|
19
|
+
#
|
20
|
+
# blubme here, now
|
21
|
+
#
|
22
|
+
def _nydp_wrapper ; self ; end
|
23
|
+
def _nydp_ok? method ; _nydp_whitelist.include? method ; end
|
24
|
+
def _nydp_procify? method ; _nydp_procs.include? method ; end # override to allow returning Method instances for given method name
|
25
|
+
def _nydp_get key ; _nydp_safe_send(key.to_s.as_method_name) ; end
|
26
|
+
def to_ruby ; self ; end
|
27
|
+
def _nydp_safe_send meth, *args
|
28
|
+
return send meth, *args if _nydp_ok?(meth)
|
29
|
+
return method(meth) if _nydp_procify?(meth)
|
30
|
+
end
|
10
31
|
end
|
11
32
|
|
12
33
|
class Struct < ::Struct
|
13
34
|
include AutoWrap
|
14
35
|
def _nydp_whitelist ; members ; end
|
36
|
+
def _nydp_procs ; [] ; end
|
15
37
|
end
|
16
38
|
|
17
39
|
module Converter
|
@@ -61,7 +83,7 @@ module Nydp
|
|
61
83
|
|
62
84
|
def literal? expr
|
63
85
|
case expr
|
64
|
-
when String, Float, Integer, Fixnum, Nydp::Symbol, Nydp::
|
86
|
+
when String, Float, Integer, Fixnum, Nydp::Symbol, Nydp::Truth, Nydp::Nil
|
65
87
|
true
|
66
88
|
else
|
67
89
|
false
|
data/lib/nydp/pair.rb
CHANGED
@@ -39,9 +39,14 @@ class Nydp::Pair
|
|
39
39
|
end
|
40
40
|
|
41
41
|
# returns Array of elements after calling #n2r on each element
|
42
|
-
def to_ruby list=[]
|
43
|
-
list << n2r(car)
|
44
|
-
cdr.is_a?(Nydp::Pair)
|
42
|
+
def to_ruby list=[], pair=self
|
43
|
+
list << n2r(pair.car)
|
44
|
+
while(pair.cdr.is_a?(Nydp::Pair))
|
45
|
+
pair = pair.cdr
|
46
|
+
list << n2r(pair.car)
|
47
|
+
end
|
48
|
+
|
49
|
+
list
|
45
50
|
end
|
46
51
|
|
47
52
|
# returns Array of elements as they are
|
data/lib/nydp/parser.rb
CHANGED
@@ -34,8 +34,7 @@ module Nydp
|
|
34
34
|
when /^(.*),@$/
|
35
35
|
prefix_list $1, Pair.from_list([sym(:"unquote-splicing"), list])
|
36
36
|
else
|
37
|
-
|
38
|
-
Pair.from_list([sym(:"prefix-list"), pfx, list])
|
37
|
+
Pair.from_list([sym(:"prefix-list"), prefix, list])
|
39
38
|
end
|
40
39
|
end
|
41
40
|
|
@@ -111,7 +110,7 @@ module Nydp
|
|
111
110
|
when :symbol
|
112
111
|
parse_symbol token.last
|
113
112
|
when :comment
|
114
|
-
Pair.from_list [sym(:comment),
|
113
|
+
Pair.from_list [sym(:comment), token.last]
|
115
114
|
else
|
116
115
|
token.last
|
117
116
|
end
|
@@ -132,11 +131,11 @@ module Nydp
|
|
132
131
|
fragments = [sym(:"string-pieces")]
|
133
132
|
string_token = token_stream.next_string_fragment(open_delimiter, close_delimiter, INTERPOLATION_SIGN, INTERPOLATION_ESCAPES)
|
134
133
|
raise "unterminated string" if string_token.nil?
|
135
|
-
fragments <<
|
134
|
+
fragments << string_token.string
|
136
135
|
while !(string_token.is_a? StringFragmentCloseToken)
|
137
136
|
fragments << expression(token_stream)
|
138
137
|
string_token = token_stream.next_string_fragment('', close_delimiter, INTERPOLATION_SIGN, INTERPOLATION_ESCAPES)
|
139
|
-
fragments <<
|
138
|
+
fragments << string_token.string
|
140
139
|
end
|
141
140
|
|
142
141
|
if fragments.size == 2
|
data/lib/nydp/truth.rb
CHANGED
@@ -19,8 +19,8 @@ module Nydp
|
|
19
19
|
def car ; self ; end
|
20
20
|
def cdr ; self ; end
|
21
21
|
def size ; 0 ; end
|
22
|
-
def is? other ; self
|
23
|
-
def isnt? other ; self
|
22
|
+
def is? other ; self.equal? other ; end
|
23
|
+
def isnt? other ; !self.equal? other ; end
|
24
24
|
def to_s ; "" ; end
|
25
25
|
def + other ; other ; end
|
26
26
|
def copy ; self ; end
|