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
@@ -1,103 +1,130 @@
|
|
1
1
|
(examples-for date
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
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
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
2
|
+
("creates a single date" (to-string (date 1965 6 8)) "1965-06-08" )
|
3
|
+
("navigates to next day" (let d (date 2004 3 11) (to-string d.tomorrow)) "2004-03-12" )
|
4
|
+
("navigates to previous day" (let d (date 2006 6 22) (to-string d.yesterday)) "2006-06-21" )
|
5
|
+
("navigates to previous year" (let d (date 1971 12 18) (to-string d.last-year)) "1970-12-18" )
|
6
|
+
("navigates to next year" (let d (date 1974 1 11) (to-string d.next-year)) "1975-01-11" )
|
7
|
+
("navigates to previous month" (let d (date 1971 12 18) (to-string d.last-month)) "1971-11-18" )
|
8
|
+
("navigates to next month" (let d (date 1974 1 11) (to-string d.next-month)) "1974-02-11" )
|
9
|
+
("jumps a year to previous month" (let d (date 1974 1 11) (to-string d.last-month)) "1973-12-11" )
|
10
|
+
("navigates to previous week" (let d (date 2008 2 16) (to-string d.last-week)) "2008-02-09" )
|
11
|
+
("navigates to next week" (let d (date 1972 11 13) (to-string d.next-week)) "1972-11-20" )
|
12
|
+
("navigates to year start" (let d (date 1972 11 13) (to-string d.beginning-of-year)) "1972-01-01" )
|
13
|
+
("navigates to year end" (let d (date 1972 11 13) (to-string d.end-of-year)) "1972-12-31" )
|
14
|
+
("navigates to month start" (let d (date 1971 11 18) (to-string d.beginning-of-month)) "1971-11-01" )
|
15
|
+
("navigates to month end" (let d (date 1971 11 18) (to-string d.end-of-month)) "1971-11-30" )
|
16
|
+
("navigates to week start" (let d (date 2015 11 6) (to-string d.beginning-of-week)) "2015-11-02" )
|
17
|
+
("navigates to week start from sun" (let d (date 2015 11 1) (to-string d.beginning-of-week)) "2015-10-26" )
|
18
|
+
("navigates to week end from sun" (let d (date 2015 11 1) (to-string d.end-of-week)) "2015-11-01" )
|
19
|
+
("navigates to week end" (let d (date 2015 11 6) (to-string d.end-of-week)) "2015-11-08" )
|
20
|
+
|
21
|
+
("works with apply" (to-string (apply date '(2006 6 21))) "2006-06-21")
|
22
|
+
("works with apply again" (to-string (apply date 2006 6 21 nil)) "2006-06-21")
|
23
|
+
|
24
|
+
("parses string" (let d (date "2004-03-12") (list d.year d.month d.day)) (2004 3 12))
|
25
|
+
|
26
|
+
("can act as hash key"
|
27
|
+
(with (h {} d (date 2015 11 8))
|
28
|
+
(hash-set h d "on this day")
|
29
|
+
(to-string (hash-get h (date 2015 11 8))))
|
30
|
+
"on this day")
|
31
|
+
|
32
|
+
("equals itself" (eq? (date 2004 3 12) (date 2004 3 12)) t )
|
33
|
+
("does not equal another" (eq? (date 2004 3 12) (date 2006 6 21)) nil)
|
34
|
+
("does not equal nil" (eq? (date 2004 3 12) nil ) nil)
|
35
|
+
("nil does not equal a date" (eq? nil (date 2004 3 12) ) nil)
|
36
|
+
|
37
|
+
("returns its year" (let d (date 1999 12 31) d.year) 1999)
|
38
|
+
("returns its month" (let d (date 1999 12 31) d.month) 12 )
|
39
|
+
("returns its day" (let d (date 1999 12 31) d.day) 31 )
|
40
|
+
("returns its week-day" (let d (date 1999 12 31) d.week-day) 5 )
|
41
|
+
("recognises not monday" (let d (date 2015 11 1) d.monday? ) nil )
|
42
|
+
("recognises monday" (let d (date 2015 11 2) d.monday? ) t )
|
43
|
+
("recognises tuesday" (let d (date 2015 11 3) d.tuesday? ) t )
|
44
|
+
("recognises wednesday" (let d (date 2015 11 4) d.wednesday?) t )
|
45
|
+
("recognises thursday" (let d (date 2015 11 5) d.thursday? ) t )
|
46
|
+
("recognises friday" (let d (date 2015 11 6) d.friday? ) t )
|
47
|
+
("recognises not friday" (let d (date 2015 11 7) d.friday? ) nil )
|
48
|
+
("recognises saturday" (let d (date 2015 11 7) d.saturday? ) t )
|
49
|
+
("recognises sunday" (let d (date 2015 11 8) d.sunday? ) t )
|
50
|
+
("adds days" (let d (date 2015 11 8) (to-string (+ d 1))) "2015-11-09")
|
51
|
+
("adds more days" (let d (date 2015 11 8) (to-string (+ d 10))) "2015-11-18")
|
52
|
+
("subtracts a day" (let d (date 2015 11 18) (to-string (- d 1))) "2015-11-17")
|
53
|
+
("subtracts more days" (let d (date 2015 11 18) (to-string (- d 5))) "2015-11-13")
|
54
|
+
|
55
|
+
("advances by -2 weeks" (let d (date 1965 6 8) (to-string (+ d '(-2 week)))) "1965-05-25")
|
56
|
+
("advances by -1 week" (let d (date 1965 6 8) (to-string (+ d '(-1 week)))) "1965-06-01")
|
57
|
+
("advances by 1 week" (let d (date 1965 6 8) (to-string (+ d '( 1 week)))) "1965-06-15")
|
58
|
+
("advances by 2 weeks" (let d (date 1965 6 8) (to-string (+ d '( 2 week)))) "1965-06-22")
|
59
|
+
|
60
|
+
("advances by -2 weeks" (let d (date 1965 6 8) (to-string (+ d '(-2 week)))) "1965-05-25")
|
61
|
+
("advances by -1 week" (let d (date 1965 6 8) (to-string (+ d '(-1 week)))) "1965-06-01")
|
62
|
+
("advances by 1 week" (let d (date 1965 6 8) (to-string (+ d '( 1 week)))) "1965-06-15")
|
63
|
+
("advances by 2 weeks" (let d (date 1965 6 8) (to-string (+ d '( 2 week)))) "1965-06-22")
|
64
|
+
|
65
|
+
("advances by -2 days" (let d (date 1965 6 8) (to-string (+ d '(-2 day)))) "1965-06-06")
|
66
|
+
("advances by -1 day" (let d (date 1965 6 8) (to-string (+ d '(-1 day)))) "1965-06-07")
|
67
|
+
("advances by 1 day" (let d (date 1965 6 8) (to-string (+ d '( 1 day)))) "1965-06-09")
|
68
|
+
("advances by 2 days" (let d (date 1965 6 8) (to-string (+ d '( 2 day)))) "1965-06-10")
|
69
|
+
|
70
|
+
("advances by -2 months" (let d (date 1965 6 8) (to-string (+ d '(-2 month)))) "1965-04-08")
|
71
|
+
("advances by -1 month" (let d (date 1965 6 8) (to-string (+ d '(-1 month)))) "1965-05-08")
|
72
|
+
("advances by 1 month" (let d (date 1965 6 8) (to-string (+ d '( 1 month)))) "1965-07-08")
|
73
|
+
("advances by 2 months" (let d (date 1965 6 8) (to-string (+ d '( 2 month)))) "1965-08-08")
|
74
|
+
|
75
|
+
("advances by -2 years" (let d (date 1965 6 8) (to-string (+ d '(-2 year)))) "1963-06-08")
|
76
|
+
("advances by -1 year" (let d (date 1965 6 8) (to-string (+ d '(-1 year)))) "1964-06-08")
|
77
|
+
("advances by 1 year" (let d (date 1965 6 8) (to-string (+ d '( 1 year)))) "1966-06-08")
|
78
|
+
("advances by 2 years" (let d (date 1965 6 8) (to-string (+ d '( 2 year)))) "1967-06-08")
|
79
|
+
|
80
|
+
("adapts for leap years" (let d (date 2019 12 31) (to-string (+ d '( 2 month)))) "2020-02-29")
|
81
|
+
("jumps one year" (let d (date 2019 12 31) (to-string (+ d '( 1 year) ))) "2020-12-31")
|
82
|
+
("jumps to 28 feb a year later" (let d (date 2019 12 31) (to-string (+ d '(14 month)))) "2021-02-28")
|
83
|
+
("jumps to end of june" (let d (date 2019 12 31) (to-string (+ d '( 6 month)))) "2020-06-30")
|
84
|
+
("jumps to end of july" (let d (date 2019 12 31) (to-string (+ d '( 7 month)))) "2020-07-31")
|
85
|
+
("jumps from end feb to end feb" (let d (date 2020 02 29) (to-string (+ d '(12 month)))) "2021-02-28")
|
86
|
+
|
87
|
+
("finds anniversary before a given date in previous year"
|
88
|
+
(to-string (anniversary/previous (date 2019 6 21) (date 1949 10 3)))
|
89
|
+
"2018-10-03")
|
90
|
+
|
91
|
+
("finds anniversary before a given date in same year"
|
92
|
+
(to-string (anniversary/previous (date 2019 11 20) (date 1949 10 3)))
|
93
|
+
"2019-10-03")
|
94
|
+
|
95
|
+
("finds anniversary after a given date in same year"
|
96
|
+
(to-string (anniversary/next (date 2019 6 21) (date 1949 10 3)))
|
97
|
+
"2019-10-03")
|
98
|
+
|
99
|
+
|
100
|
+
("finds anniversary after a given date in following year"
|
101
|
+
(to-string (anniversary/next (date 2019 11 20) (date 1949 10 3)))
|
102
|
+
"2020-10-03"))
|
103
|
+
|
104
|
+
(examples-for future?
|
105
|
+
("is true for a future date"
|
106
|
+
(let d (+ (today) 10)
|
107
|
+
d.future?)
|
108
|
+
t)
|
109
|
+
("is false for a past date"
|
110
|
+
(let d (- (today) 10)
|
111
|
+
d.future?)
|
112
|
+
nil)
|
113
|
+
("is false for today"
|
114
|
+
(let d (today)
|
115
|
+
d.future?)
|
116
|
+
nil))
|
117
|
+
|
118
|
+
(examples-for past?
|
119
|
+
("is true for a past date"
|
120
|
+
(let d (- (today) 10)
|
121
|
+
d.past?)
|
122
|
+
t)
|
123
|
+
("is false for a future date"
|
124
|
+
(let d (+ (today) 10)
|
125
|
+
d.past?)
|
126
|
+
nil)
|
127
|
+
("is false for today"
|
128
|
+
(let d (today)
|
129
|
+
d.past?)
|
130
|
+
nil))
|
@@ -76,7 +76,7 @@
|
|
76
76
|
("warns about arg names shadowing macro names"
|
77
77
|
(do (without-hooks 'warnings/new
|
78
78
|
λ(on-err nil
|
79
|
-
(
|
79
|
+
(apply macs.fun '((aif (and or) . when)
|
80
80
|
ignore))))
|
81
81
|
warnings/list)
|
82
82
|
((arg-shadows-macro "arg " when " shadows macro " when " in arg list " (aif (and or) . when) " and body " (ignore) )
|
@@ -1,5 +1,5 @@
|
|
1
1
|
(mac this-is-a-well-documented-macro (a b c)
|
2
|
-
; documentation for
|
2
|
+
; documentation for this mac!
|
3
3
|
`(foo ,a ,b ,c))
|
4
4
|
|
5
5
|
(mac this-is-an-undocumented-macro (a b c)
|
@@ -23,7 +23,7 @@
|
|
23
23
|
|
24
24
|
("finds documentation for a documented macro"
|
25
25
|
(hash-get (car:dox-lookup 'this-is-a-well-documented-macro) 'texts)
|
26
|
-
("documentation for
|
26
|
+
("documentation for this mac!"))
|
27
27
|
|
28
28
|
("finds arg names for a documented macro"
|
29
29
|
(hash-get (car:dox-lookup 'this-is-a-well-documented-macro) 'args)
|
@@ -27,6 +27,24 @@
|
|
27
27
|
(" t for a hash" (hash? {a 1 b 2}) t )
|
28
28
|
("nil for a symbol" (hash? 'foo) nil))
|
29
29
|
|
30
|
+
(examples-for hash-to-array
|
31
|
+
("returns empty list for empty hash"
|
32
|
+
(hash-to-array {})
|
33
|
+
())
|
34
|
+
|
35
|
+
("returns one-element list for single-element hash"
|
36
|
+
(hash-to-array { a 1})
|
37
|
+
((a 1)))
|
38
|
+
|
39
|
+
("returns a list of two-element lists"
|
40
|
+
(hash-to-array { a 1 b 2 c 3 })
|
41
|
+
((a 1) (b 2) (c 3))))
|
42
|
+
|
43
|
+
(examples-for map-hash
|
44
|
+
("converts a hash to a list of objects"
|
45
|
+
(to-string:map-hash (fn (k v) { name k price v }) { a 1 b 2 c 3 })
|
46
|
+
"({:name=>:a, :price=>1} {:name=>:b, :price=>2} {:name=>:c, :price=>3})"))
|
47
|
+
|
30
48
|
(examples-for hash-slice
|
31
49
|
("returns a new hash containing only the specified keys"
|
32
50
|
(let h (hash-slice { a 1 b 2 c 3 d 4 } '(a b e f))
|
@@ -45,39 +63,40 @@
|
|
45
63
|
((a "b" 3 b) 99 2 "foo" 98)))
|
46
64
|
|
47
65
|
(examples-for hash-keys
|
48
|
-
("returns nil for a number" (hash-keys 1)
|
49
|
-
("returns nil for nil" (hash-keys nil)
|
50
|
-
("returns nil for a string" (hash-keys "hello")
|
51
|
-
("returns nil for a symbol" (hash-keys 'lipstick)
|
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
|
-
|
66
|
+
("returns nil for a number" (hash-keys 1) nil)
|
67
|
+
("returns nil for nil" (hash-keys nil) nil)
|
68
|
+
("returns nil for a string" (hash-keys "hello") nil)
|
69
|
+
("returns nil for a symbol" (hash-keys 'lipstick) nil)
|
70
|
+
("returns nil for a date" (hash-keys (date 2015 11 18)) nil)
|
71
|
+
|
72
|
+
;; ("returns date operations"
|
73
|
+
;; (sort:hash-keys (date 2015 11 18))
|
74
|
+
;; (age
|
75
|
+
;; beginning_of_month
|
76
|
+
;; beginning_of_week
|
77
|
+
;; beginning_of_year
|
78
|
+
;; day
|
79
|
+
;; end_of_month
|
80
|
+
;; end_of_week
|
81
|
+
;; end_of_year
|
82
|
+
;; friday?
|
83
|
+
;; last_month
|
84
|
+
;; last_week
|
85
|
+
;; last_year
|
86
|
+
;; monday?
|
87
|
+
;; month
|
88
|
+
;; next_month
|
89
|
+
;; next_week
|
90
|
+
;; next_year
|
91
|
+
;; saturday?
|
92
|
+
;; sunday?
|
93
|
+
;; thursday?
|
94
|
+
;; tomorrow
|
95
|
+
;; tuesday?
|
96
|
+
;; wednesday?
|
97
|
+
;; week_day
|
98
|
+
;; year
|
99
|
+
;; yesterday))
|
81
100
|
|
82
101
|
("returns keys of a given hash"
|
83
102
|
(hash-keys {a 1 b 2 c { x 99 y 98 z 97 }})
|
@@ -127,3 +146,9 @@
|
|
127
146
|
(let hsh { (joinstr " " zi chi) 10 "yesterday" 11 }
|
128
147
|
(list "hello world" (hash-get hsh "hello world") "yesterday" (hash-get hsh "yesterday"))))
|
129
148
|
("hello world" 10 "yesterday" 11)))
|
149
|
+
|
150
|
+
(examples-for hash-transform-values
|
151
|
+
("returns a new hash with the same keys as the given hash, where each corresponding value is transformed by the given transform function"
|
152
|
+
(let h { a 1 b 2 c 3 d 4 }
|
153
|
+
(to-list (hash-transform-values λkvi(* v v) h)))
|
154
|
+
((a 1) (b 4) (c 9) (d 16))))
|
@@ -224,6 +224,121 @@
|
|
224
224
|
(list/fill '(a b c) λ(++ idx) 10))
|
225
225
|
(a b c 1 2 3 4 5 6 7)))
|
226
226
|
|
227
|
+
(examples-for list/index-of
|
228
|
+
("returns nil if thing is not found in an empty list"
|
229
|
+
(list/index-of 5 '())
|
230
|
+
nil)
|
231
|
+
|
232
|
+
("returns nil if thing is not found"
|
233
|
+
(list/index-of 5 '(1 2 3 4))
|
234
|
+
nil)
|
235
|
+
|
236
|
+
("returns 0 if thing is first in the list"
|
237
|
+
(list/index-of 'a '(a b c d a b c d))
|
238
|
+
0)
|
239
|
+
|
240
|
+
("returns 1 if thing is second in the list"
|
241
|
+
(list/index-of 'b '(a b c d a b c d))
|
242
|
+
1)
|
243
|
+
|
244
|
+
("returns 2 if thing is third in the list"
|
245
|
+
(list/index-of 'c '(a b c d a b c d))
|
246
|
+
2))
|
247
|
+
|
248
|
+
(examples-for list/around-thing
|
249
|
+
("returns nil,nil if item is not in the empty list"
|
250
|
+
(list/around-thing 6 '())
|
251
|
+
(nil nil))
|
252
|
+
|
253
|
+
("returns nil,nil if item is not in the list"
|
254
|
+
(list/around-thing 6 '(1 2 3 4 5))
|
255
|
+
(nil nil))
|
256
|
+
|
257
|
+
("returns nil,next if item is at the start of the list"
|
258
|
+
(list/around-thing 1 '(1 2 3 4 5))
|
259
|
+
(nil 2))
|
260
|
+
|
261
|
+
("returns prev,nil if item is at the end of the list"
|
262
|
+
(list/around-thing 5 '(1 2 3 4 5))
|
263
|
+
(4 nil))
|
264
|
+
|
265
|
+
("returns nil,nil if item is the only element of the list"
|
266
|
+
(list/around-thing 42 '(42))
|
267
|
+
(nil nil))
|
268
|
+
|
269
|
+
("returns prev,next if item is the second element of a longer list list"
|
270
|
+
(list/around-thing 2 '(1 2 3 4 5))
|
271
|
+
(1 3))
|
272
|
+
|
273
|
+
("returns prev,next if item is the second-last element of a longer list list"
|
274
|
+
(list/around-thing 4 '(1 2 3 4 5))
|
275
|
+
(3 5))
|
276
|
+
|
277
|
+
("returns prev,next if item is anywhere in the middle of a longer list list"
|
278
|
+
(list/around-thing 3 '(1 2 3 4 5))
|
279
|
+
(2 4)))
|
280
|
+
|
281
|
+
(examples-for list/around
|
282
|
+
("returns nil,nil if index is nil"
|
283
|
+
(list/around nil '(a b c d e))
|
284
|
+
(nil nil))
|
285
|
+
|
286
|
+
("returns nil,nil if index is nil and list is empty"
|
287
|
+
(list/around nil '())
|
288
|
+
(nil nil))
|
289
|
+
|
290
|
+
("returns nil,nil if index is negative"
|
291
|
+
(list/around -1 '(a b c d e))
|
292
|
+
(nil nil))
|
293
|
+
|
294
|
+
("returns nil,nil if index is negative and list is empty"
|
295
|
+
(list/around -1 '())
|
296
|
+
(nil nil))
|
297
|
+
|
298
|
+
("returns nil,nil if index is out of range"
|
299
|
+
(list/around 10 '(a b c d e))
|
300
|
+
(nil nil))
|
301
|
+
|
302
|
+
("returns nil,nil if index is out of range and list is empty"
|
303
|
+
(list/around 10 '())
|
304
|
+
(nil nil))
|
305
|
+
|
306
|
+
("returns nil,nil if index is even slightly out of range"
|
307
|
+
(list/around 5 '(a b c d e))
|
308
|
+
(nil nil))
|
309
|
+
|
310
|
+
("returns nil,next if index is zero"
|
311
|
+
(list/around 0 '(a b c d e))
|
312
|
+
(nil b))
|
313
|
+
|
314
|
+
("returns nil,nil if index is zero and list is empty"
|
315
|
+
(list/around 0 '())
|
316
|
+
(nil nil))
|
317
|
+
|
318
|
+
("returns nil,nil if index is one and list is empty"
|
319
|
+
(list/around 1 '())
|
320
|
+
(nil nil))
|
321
|
+
|
322
|
+
("returns prev,nil index is at the end of the list"
|
323
|
+
(list/around 4 '(a b c d e))
|
324
|
+
(d nil))
|
325
|
+
|
326
|
+
("returns nil,nil if index is 0 and list has only one item"
|
327
|
+
(list/around 0 '(xxx))
|
328
|
+
(nil nil))
|
329
|
+
|
330
|
+
("returns prev,next if index is 1"
|
331
|
+
(list/around 1 '(a b c d e))
|
332
|
+
(a c))
|
333
|
+
|
334
|
+
("returns prev,next if index corresponds to the second-last element of a longer list"
|
335
|
+
(list/around 3 '(a b c d e))
|
336
|
+
(c e))
|
337
|
+
|
338
|
+
("returns prev,next if index is anywhere in the middle of a longer list"
|
339
|
+
(list/around 2 '(a b c d e))
|
340
|
+
(b d)))
|
341
|
+
|
227
342
|
(examples-for list/last
|
228
343
|
("returns the thing if it's nil"
|
229
344
|
(list/last nil)
|
@@ -233,14 +348,35 @@
|
|
233
348
|
(list/last 42)
|
234
349
|
42)
|
235
350
|
|
351
|
+
("is not tricked when the last item is itself a list"
|
352
|
+
(list/last '(1 2 3 (a b c)))
|
353
|
+
(a b c))
|
354
|
+
|
355
|
+
;; (1 2 3 . (a b c)) is equivalent to '(1 2 3 a b c)
|
356
|
+
("is not tricked by tricky syntax"
|
357
|
+
(list/last '(1 2 3 . (a b c)))
|
358
|
+
c)
|
359
|
+
|
360
|
+
("is not tricked when the last list-item is a list but there is also a last-cdr"
|
361
|
+
(list/last '(1 2 3 (a b c) . foo))
|
362
|
+
foo)
|
363
|
+
|
236
364
|
("returns the cdr if it's not a pair"
|
237
365
|
(list/last '(x . y))
|
238
366
|
y)
|
239
367
|
|
368
|
+
("returns the cdr if it's not a pair"
|
369
|
+
(list/last '(x nil . y))
|
370
|
+
y)
|
371
|
+
|
372
|
+
("dot nil is not real"
|
373
|
+
(list/last '(x q . nil))
|
374
|
+
q)
|
375
|
+
|
240
376
|
("returns the last item in the list"
|
241
377
|
(list/last '(x y z))
|
242
378
|
z)
|
243
379
|
|
244
380
|
("returns nil if it's the last item in the list"
|
245
|
-
(list/last '(x y z nil))
|
381
|
+
(list/last '(x nil y z nil))
|
246
382
|
nil))
|
@@ -285,6 +285,18 @@ toto")
|
|
285
285
|
(pp '(percent-syntax || (dot-syntax x y)))
|
286
286
|
"%x.y")
|
287
287
|
|
288
|
+
("percent-syntax with args"
|
289
|
+
(pp '(%tr.klakla
|
290
|
+
(%td:otherkla:joinstr ", " (map &firstname ppl))
|
291
|
+
(%td:otherkla:joinstr ", " (map &email ppl))))
|
292
|
+
"(%tr.klakla
|
293
|
+
(%td:otherkla:joinstr
|
294
|
+
\", \"
|
295
|
+
(map &firstname ppl))
|
296
|
+
(%td:otherkla:joinstr
|
297
|
+
\", \"
|
298
|
+
(map &email ppl)))")
|
299
|
+
|
288
300
|
("brace list"
|
289
301
|
(pp '(let hello {a 1 b "two" c 'three d ,four e (sub invocation) f {sub brace list here} }))
|
290
302
|
"(let hello { a 1
|
@@ -0,0 +1,26 @@
|
|
1
|
+
(examples-for rotate-2d-array
|
2
|
+
("returns nothing for nothing"
|
3
|
+
(rotate-2d-array nil)
|
4
|
+
nil)
|
5
|
+
|
6
|
+
("returns transformed array"
|
7
|
+
(rotate-2d-array
|
8
|
+
'((a b c d)
|
9
|
+
(1 2 3 4)
|
10
|
+
(w x y z)
|
11
|
+
(one two three four)
|
12
|
+
(un deux trois quatre)))
|
13
|
+
((a 1 w one un)
|
14
|
+
(b 2 x two deux)
|
15
|
+
(c 3 y three trois)
|
16
|
+
(d 4 z four quatre)))
|
17
|
+
|
18
|
+
("first given list determines number of lists"
|
19
|
+
(rotate-2d-array
|
20
|
+
'((a b)
|
21
|
+
(1 2 3 4)
|
22
|
+
(w x y z)
|
23
|
+
(one two three four)
|
24
|
+
(un deux trois quatre)))
|
25
|
+
((a 1 w one un)
|
26
|
+
(b 2 x two deux))))
|
@@ -16,8 +16,8 @@
|
|
16
16
|
(let hh (list { a 1 b 2 } { a 7 b 9 } { a 3 b 1 } { a 2 b 8 })
|
17
17
|
(pp (sort-by &a hh)))
|
18
18
|
"({ a 1 b 2 } { a 2 b 8 }
|
19
|
-
|
20
|
-
|
19
|
+
{ a 3 b 1 }
|
20
|
+
{ a 7 b 9 })")
|
21
21
|
|
22
22
|
("sorts a list of strings according to their length"
|
23
23
|
(sort-by len
|
@@ -30,9 +30,9 @@
|
|
30
30
|
("max" "min" "sport" "short" "very song" "very long")))
|
31
31
|
|
32
32
|
(examples-for safe-sort-by
|
33
|
-
("sorts a list of hashes by a specified key"
|
33
|
+
("sorts a list of hashes by a specified key function, with default sort value if key function returns nil"
|
34
34
|
(let hh (list { a 1 b 2 } { b 9 } { a 3 b 1 } { a nil b 8 })
|
35
35
|
(pp (safe-sort-by &a 99 hh)))
|
36
36
|
"({ a 1 b 2 } { a 3 b 1 }
|
37
|
-
|
38
|
-
|
37
|
+
{ a nil b 8 }
|
38
|
+
{ b 9 })"))
|
@@ -13,12 +13,23 @@
|
|
13
13
|
|
14
14
|
("reports errors"
|
15
15
|
(on-err errors
|
16
|
-
(let s "hello \~|u|, \~x + \~y is \~(+
|
16
|
+
(let s "hello \~|u|, \~x + \~y is \~(+ 2 y), thank heavens!"
|
17
17
|
(string/eval-with-args s '(a b c) "world" 36 6)))
|
18
|
-
("error evaluating \"hello \~|u|, \~x + \~y is \~(+
|
19
|
-
with arg names (a b c)
|
20
|
-
|
21
|
-
|
18
|
+
("error evaluating \"hello \~|u|, \~x + \~y is \~(+ 2 y), thank heavens!\"
|
19
|
+
with arg names (a b c)\nand args (\"world\" 36 6)"
|
20
|
+
|
21
|
+
"Called builtin/apply
|
22
|
+
with args
|
23
|
+
NydpGenerated_2F5C2EF513C87E2349A55BCB331F83CC856076BBB89CDFAAA1817D62AFEEF0DB.rb:15
|
24
|
+
(fn (a b c) (string-pieces \"hello \" u \", \" x \" + \" y \" is \" (+ 2 y) \", thank heavens!\"))
|
25
|
+
(\"world\" 36 6)"
|
26
|
+
|
27
|
+
"Called builtin/+
|
28
|
+
with args
|
29
|
+
2
|
30
|
+
nil"
|
31
|
+
|
32
|
+
"nil can't be coerced into Integer")))
|
22
33
|
|
23
34
|
(examples-for string/pad-left
|
24
35
|
("does not change a string whose length is greater than the given length"
|
@@ -72,8 +83,22 @@ and args (\"world\" 36 6)"
|
|
72
83
|
(string-replace "and" "or" "a and b and c and d")
|
73
84
|
"a or b or c or d")
|
74
85
|
|
86
|
+
("replaces with hash lookup"
|
87
|
+
(string-replace
|
88
|
+
"['<>&\"]"
|
89
|
+
{ "'" "'"
|
90
|
+
"<" "<"
|
91
|
+
">" ">"
|
92
|
+
"\"" """ }
|
93
|
+
"it's >such< a \"lovely\" day")
|
94
|
+
"it's >such< a "lovely" day")
|
95
|
+
|
75
96
|
("replace with regexp"
|
76
97
|
(string-replace "and|or" "x" "a and b or c and d")
|
98
|
+
"a x b x c x d")
|
99
|
+
|
100
|
+
("replace with literal regexp"
|
101
|
+
(string-replace (regexp "and|or") "x" "a and b or c and d")
|
77
102
|
"a x b x c x d"))
|
78
103
|
|
79
104
|
(examples-for string-truncate
|