nydp 0.4.1 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (118) hide show
  1. checksums.yaml +5 -5
  2. data/README.md +44 -0
  3. data/lib/lisp/core-010-precompile.nydp +13 -16
  4. data/lib/lisp/core-012-utils.nydp +21 -6
  5. data/lib/lisp/core-015-documentation.nydp +58 -24
  6. data/lib/lisp/core-017-builtin-dox.nydp +49 -42
  7. data/lib/lisp/core-020-utils.nydp +5 -5
  8. data/lib/lisp/core-030-syntax.nydp +191 -96
  9. data/lib/lisp/core-035-flow-control.nydp +41 -14
  10. data/lib/lisp/core-037-list-utils.nydp +36 -14
  11. data/lib/lisp/core-039-module.nydp +24 -0
  12. data/lib/lisp/core-040-utils.nydp +51 -23
  13. data/lib/lisp/core-041-string-utils.nydp +37 -9
  14. data/lib/lisp/core-042-date-utils.nydp +21 -1
  15. data/lib/lisp/core-043-list-utils.nydp +99 -73
  16. data/lib/lisp/core-045-dox-utils.nydp +5 -0
  17. data/lib/lisp/core-070-prefix-list.nydp +1 -1
  18. data/lib/lisp/core-080-pretty-print.nydp +57 -17
  19. data/lib/lisp/core-090-hook.nydp +35 -1
  20. data/lib/lisp/core-100-utils.nydp +110 -15
  21. data/lib/lisp/core-110-hash-utils.nydp +61 -0
  22. data/lib/lisp/core-120-settings.nydp +46 -0
  23. data/lib/lisp/core-130-validations.nydp +51 -0
  24. data/lib/lisp/{core-060-benchmarking.nydp → core-900-benchmarking.nydp} +107 -19
  25. data/lib/lisp/tests/accum-examples.nydp +28 -1
  26. data/lib/lisp/tests/aif-examples.nydp +8 -3
  27. data/lib/lisp/tests/andify-examples.nydp +7 -0
  28. data/lib/lisp/tests/at-syntax-examples.nydp +17 -0
  29. data/lib/lisp/tests/best-examples.nydp +9 -0
  30. data/lib/lisp/tests/builtin-tests.nydp +19 -0
  31. data/lib/lisp/tests/case-examples.nydp +14 -0
  32. data/lib/lisp/tests/cdr-set-examples.nydp +6 -0
  33. data/lib/lisp/tests/date-examples.nydp +56 -1
  34. data/lib/lisp/tests/destructuring-examples.nydp +46 -14
  35. data/lib/lisp/tests/detect-examples.nydp +12 -0
  36. data/lib/lisp/tests/dp-examples.nydp +24 -0
  37. data/lib/lisp/tests/each-tests.nydp +5 -0
  38. data/lib/lisp/tests/empty-examples.nydp +1 -1
  39. data/lib/lisp/tests/error-tests.nydp +4 -4
  40. data/lib/lisp/tests/explain-mac-examples.nydp +1 -1
  41. data/lib/lisp/tests/filter-forms-examples.nydp +15 -0
  42. data/lib/lisp/tests/foundation-test.nydp +12 -0
  43. data/lib/lisp/tests/hash-examples.nydp +26 -2
  44. data/lib/lisp/tests/list-grep-examples.nydp +40 -0
  45. data/lib/lisp/tests/list-tests.nydp +58 -1
  46. data/lib/lisp/tests/map-hash-examples.nydp +11 -0
  47. data/lib/lisp/tests/module-examples.nydp +10 -0
  48. data/lib/lisp/tests/multi-assign-examples.nydp +6 -0
  49. data/lib/lisp/tests/parser-tests.nydp +25 -0
  50. data/lib/lisp/tests/pretty-print-tests.nydp +17 -14
  51. data/lib/lisp/tests/set-difference-examples.nydp +8 -0
  52. data/lib/lisp/tests/set-intersection-examples.nydp +16 -0
  53. data/lib/lisp/tests/set-union-examples.nydp +8 -0
  54. data/lib/lisp/tests/settings-examples.nydp +40 -0
  55. data/lib/lisp/tests/sort-examples.nydp +8 -0
  56. data/lib/lisp/tests/string-tests.nydp +65 -1
  57. data/lib/lisp/tests/syntax-tests.nydp +5 -1
  58. data/lib/lisp/tests/to-integer-examples.nydp +16 -0
  59. data/lib/lisp/tests/validation-examples.nydp +15 -0
  60. data/lib/lisp/tests/zap-examples.nydp +12 -0
  61. data/lib/nydp.rb +13 -7
  62. data/lib/nydp/assignment.rb +10 -3
  63. data/lib/nydp/builtin.rb +1 -1
  64. data/lib/nydp/builtin/abs.rb +8 -0
  65. data/lib/nydp/builtin/cdr_set.rb +1 -6
  66. data/lib/nydp/builtin/date.rb +15 -1
  67. data/lib/nydp/builtin/error.rb +1 -1
  68. data/lib/nydp/builtin/handle_error.rb +1 -1
  69. data/lib/nydp/builtin/hash.rb +27 -45
  70. data/lib/nydp/builtin/inspect.rb +1 -1
  71. data/lib/nydp/builtin/plus.rb +10 -2
  72. data/lib/nydp/builtin/random_string.rb +2 -2
  73. data/lib/nydp/builtin/{car.rb → regexp.rb} +2 -2
  74. data/lib/nydp/builtin/ruby_wrap.rb +72 -0
  75. data/lib/nydp/builtin/string_match.rb +2 -2
  76. data/lib/nydp/builtin/string_pad_left.rb +7 -0
  77. data/lib/nydp/builtin/string_pad_right.rb +7 -0
  78. data/lib/nydp/builtin/string_replace.rb +1 -1
  79. data/lib/nydp/builtin/string_split.rb +4 -3
  80. data/lib/nydp/builtin/to_integer.rb +23 -0
  81. data/lib/nydp/builtin/to_string.rb +2 -9
  82. data/lib/nydp/builtin/type_of.rb +9 -6
  83. data/lib/nydp/closure.rb +0 -3
  84. data/lib/nydp/cond.rb +23 -1
  85. data/lib/nydp/context_symbol.rb +14 -6
  86. data/lib/nydp/core.rb +36 -28
  87. data/lib/nydp/core_ext.rb +54 -0
  88. data/lib/nydp/date.rb +37 -31
  89. data/lib/nydp/function_invocation.rb +34 -26
  90. data/lib/nydp/hash.rb +5 -6
  91. data/lib/nydp/helper.rb +41 -25
  92. data/lib/nydp/interpreted_function.rb +68 -40
  93. data/lib/nydp/literal.rb +1 -1
  94. data/lib/nydp/pair.rb +22 -5
  95. data/lib/nydp/parser.rb +11 -7
  96. data/lib/nydp/string_atom.rb +16 -22
  97. data/lib/nydp/symbol.rb +40 -27
  98. data/lib/nydp/symbol_lookup.rb +7 -7
  99. data/lib/nydp/tokeniser.rb +2 -2
  100. data/lib/nydp/truth.rb +17 -10
  101. data/lib/nydp/version.rb +1 -1
  102. data/lib/nydp/vm.rb +7 -2
  103. data/nydp.gemspec +2 -4
  104. data/spec/date_spec.rb +115 -22
  105. data/spec/embedded_spec.rb +12 -12
  106. data/spec/foreign_hash_spec.rb +14 -2
  107. data/spec/hash_non_hash_behaviour_spec.rb +7 -7
  108. data/spec/hash_spec.rb +24 -2
  109. data/spec/nydp_spec.rb +14 -2
  110. data/spec/pair_spec.rb +3 -1
  111. data/spec/parser_spec.rb +31 -20
  112. data/spec/rand_spec.rb +3 -3
  113. data/spec/spec_helper.rb +13 -1
  114. data/spec/symbol_spec.rb +31 -0
  115. data/spec/time_spec.rb +1 -1
  116. metadata +31 -38
  117. data/lib/nydp/builtin/cdr.rb +0 -7
  118. data/lib/nydp/builtin/cons.rb +0 -9
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
- SHA1:
3
- metadata.gz: 858b22d67ba13ec86efe8a00fd10b5fa813aee8c
4
- data.tar.gz: 24876cc3c6e1389f656640d3548574d7241b3725
2
+ SHA256:
3
+ metadata.gz: '0389044de6d7b6230da9315bc8dde967e1ddf8ed77df2b8ef4106ce9bfc3e93a'
4
+ data.tar.gz: 133567982e2fbb734ea429e98197e4b7d5bc49c2130f64ec630c095adcd1f250
5
5
  SHA512:
6
- metadata.gz: 2c0094a86976f2272a70b9c5ea8b76e36face05f089ad9c7a0d51c3de251081230ce85d37e11f9ccaf23cd3d0433a655464d9193dfba37f1e1526fd929e03a13
7
- data.tar.gz: 9eb38db6a571768e8da0bdddbd6420e7627f492748aa64aac0e8e48e08c9af416da84c5be0b8e3828559d1988de250f9f72eaa3d25166f5001c7a1896a9d8203
6
+ metadata.gz: 2516bbc0473796915710786bb8b43ac339df657438e5a35d8f8d38cb5a7b46c1663b09a8cea266369b168530b63a1f249daf882d2712cd8558febb167bc648ef
7
+ data.tar.gz: 2548a1e1259f053ff25bc490d13f44579720be5f0ea7954915917092a04d0619f0b014221f55ed6b1f86f5046f5a6a7244348ff4805a2282ece150c3993be71f
data/README.md CHANGED
@@ -55,6 +55,22 @@ answer = Nydp.apply_function ns, :question, :life, ["The Universe", and_also(eve
55
55
 
56
56
  You can maintain multiple `ns` instances without mutual interference. In other words, assigning global variables while one `ns` is in scope will not affect the values of variables in any other `ns` (unless you've specifically arranged it to be so by duplicating namespaces or some such sorcery).
57
57
 
58
+
59
+ #### Facing the Truth
60
+
61
+ In conditional statements, nil is false, anything else is true
62
+
63
+ ```lisp
64
+ (if) ;; same as (if nil)
65
+ (if a) ;; same as a
66
+ (if a b) ;; same as (if a b nil)
67
+ (if a b c) ;; if a is nil, return c, otherwise return b
68
+ (if a b c d) ;; same as (if a b (if c d))
69
+ (if a b c d e) ;; same as (if a b (if c d e))
70
+
71
+ ;; and so on
72
+ ```
73
+
58
74
  ## Different from Arc :
59
75
 
60
76
  #### 1. Macro-expansion runs in lisp
@@ -151,8 +167,36 @@ nydp > (map &lastname german-composers) ; ampersand-syntax creates a function
151
167
 
152
168
  As with all other syntax, you can of course override the `ampersand-syntax` macro to handle your special needs.
153
169
 
170
+ You can combine special syntaxes ("%td" comes from nydp-html gem)
171
+
172
+ ```lisp
173
+
174
+ nydp > (map %td:&lastname german-composers)
175
+
176
+ "<td>Bach</td><td>Beethoven</td><td>Wagner</td><td>Mozart</td>"
177
+
178
+ ```
179
+
180
+ So, @%td@ expands to @(percent-syntax || td)@, @&lastname@ to @(ampersand-syntax || lastname)@, and the whole @%td:&lastname@
181
+ to @(colon-syntax (percent-syntax || td) (ampersand-syntax || lastname))@. Luckily for you, there's a fine @colon-syntax@ macro
182
+ that knows how to build a function out of these bits and pieces.
183
+
184
+
154
185
  Look for `SYMBOL_OPERATORS` in [parser.rb](lib/nydp/parser.rb) to see which syntax is recognised and in which order. The order of these definitions defines special-syntax-operator precedence.
155
186
 
187
+ Any character that is not special syntax will be recognised as part of a symbol. At time of writing, this includes the plus sign, hyphen, and slash.
188
+
189
+ ```lisp
190
+
191
+ ;; nonsense code illustrating the use of certain
192
+ ;; characters as function and variable names
193
+ (def //-+ (x y z)
194
+ (let -*- (x y)
195
+ (if z (//-+ x y -*-) -*-)))
196
+
197
+ ```
198
+
199
+
156
200
  #### 3. Special list syntax
157
201
 
158
202
  The parser detects alternative list delimiters
@@ -1,17 +1,15 @@
1
- (assign mac-expand (fn (names macfn expr)
2
- (cond macfn
3
- (pre-compile-with names
4
- (apply macfn (cdr expr)))
5
- expr)))
1
+ (assign mac-expand
2
+ (fn (names macfn expr)
3
+ (cond macfn
4
+ (handle-error
5
+ (fn (errors)
6
+ (error "expanding" (inspect expr) "with" (inspect macfn)))
7
+ (fn ()
8
+ (pre-compile-with names (apply macfn (cdr expr)))))
9
+ expr)))
6
10
 
7
11
  (assign macs (hash))
8
12
 
9
- (assign pre-compile-expr
10
- (fn (names expr)
11
- (mac-expand names
12
- (hash-get names (car expr))
13
- expr)))
14
-
15
13
  (assign pre-compile-each
16
14
  (fn (names args)
17
15
  (cond args
@@ -33,7 +31,10 @@
33
31
  (cond (eq? (car arg) 'quote)
34
32
  arg
35
33
  (pre-compile-each names
36
- (pre-compile-expr names arg)))
34
+ (mac-expand names
35
+ (hash-get names
36
+ (car arg))
37
+ arg)))
37
38
  arg)))
38
39
 
39
40
  (assign pre-compile-debug
@@ -136,7 +137,3 @@
136
137
 
137
138
  (hash-set macs 'quasiquote
138
139
  (fn (arg) (qq-quasiquote arg 0)))
139
-
140
- (hash-set macs 'do
141
- (fn args
142
- `((fn nil ,@args))))
@@ -8,16 +8,31 @@
8
8
  (car args))
9
9
  nil)))
10
10
 
11
- (def map (f things)
12
- ; transforms the list 'things by applying 'f to each item
13
- ; returns the resulting list
11
+ (def map-helper-0 (f things lc)
14
12
  (if (pair? things)
15
- (cons (f (car things)) (map f (cdr things)))
13
+ (map-helper-0 f (cdr things) (cdr-set lc (cons (f (car things)))))
16
14
  things
17
- (f things)))
15
+ (cdr-set lc (f things))))
16
+
17
+ (def map-helper-1 (f things acc)
18
+ (map-helper-0 f things acc)
19
+ (cdr acc))
20
+
21
+ ;; transforms the list 'things by applying 'f to each item, returns the resulting list
22
+ ;; conceptually, does the following:
23
+ ;;
24
+ ;; (if (pair? things)
25
+ ;; (cons (f (car things)) (map f (cdr things)))
26
+ ;; things
27
+ ;; (f things))
28
+ ;;
29
+ ;; however the actual version is more complicated to allow for TCO ("modulo-cons" issue)
30
+ (def map (f things)
31
+ (map-helper-1 f things (cons)))
18
32
 
33
+ ;; push 'v onto the value for 'k in 'h
34
+ ;; the hash-values of h will all be lists, in reverse order of consing
19
35
  (def hash-cons (h k v)
20
- ; push 'v onto the value for 'k in 'h
21
36
  (hash-set h k (cons v (hash-get h k))))
22
37
 
23
38
  (def rev (things last-cdr)
@@ -19,6 +19,12 @@
19
19
  acc)))
20
20
  form))
21
21
 
22
+ (hash-set macs 'do
23
+ (fn forms
24
+ (if (no (cdr forms))
25
+ (car forms)
26
+ `((fn nil ,@forms)))))
27
+
22
28
  ((fn (this-chapter-name chapters chapter-new chapter-build chapter-add-to-chapter)
23
29
  (assign chapters (hash))
24
30
 
@@ -64,7 +70,7 @@
64
70
  (assign this-script nil)
65
71
  (assign this-plugin "Nydp Core")
66
72
 
67
- ((fn (dox examples chapters dox-new dox-build)
73
+ ((fn (dox examples chapters types types-chapters dox-new dox-build)
68
74
  (def dox-build (hsh name what texts args src chapters)
69
75
  (hash-set hsh 'name name )
70
76
  (hash-set hsh 'what what )
@@ -78,26 +84,38 @@
78
84
 
79
85
  (def dox-new (item)
80
86
  (hash-cons dox (hash-get item 'name) item)
81
- (dox-add-to-chapters item (hash-get item 'chapters)))
87
+ (hash-cons types (hash-get item 'what) item)
88
+ (dox-add-to-chapters item (hash-get item 'what) (hash-get item 'chapters) (hash)))
82
89
 
83
90
  (def dox-add-doc (name what texts args src chapters more)
84
91
  (cond (no (privately))
85
92
  (dox-new (dox-build (if more more (hash)) name what texts args src chapters))))
86
93
 
87
- (def dox-add-to-chapters (item chapters)
94
+ (def dox-add-to-chapters (item type chapters already)
88
95
  (cond chapters
89
- (do (chapter-add-item item (car chapters))
90
- (dox-add-to-chapters item (cdr chapters)))
96
+ (cond (no (hash-get already (car chapters)))
97
+ (do (hash-set already (car chapters) t)
98
+ (chapter-add-item item (car chapters))
99
+ (hash-cons types-chapters (inspect (cons type (car chapters))) item)
100
+ (dox-add-to-chapters item type (cdr chapters) already))
101
+ item)
91
102
  item))
92
103
 
93
104
  (def dox-add-examples (name example-exprs)
94
105
  (hash-cons examples name example-exprs))
95
106
 
96
- (def dox-lookup (sym) (hash-get dox sym))
107
+ (def dox-lookup (name) (hash-get dox name))
97
108
 
98
109
  (def dox? (sym) (hash-key? dox sym))
99
110
 
100
111
  (def dox-names () (hash-keys dox))
112
+ (def dox-types () (hash-keys types))
113
+ (def dox-items-by-type (type) (hash-get types type))
114
+
115
+ (def get-types-chapters () types-chapters)
116
+
117
+ (def dox-items-by-type-and-chapter (dox-type chapter)
118
+ (hash-get types-chapters (inspect (cons dox-type chapter))))
101
119
 
102
120
  (def dox-get-attr (name attr)
103
121
  (cond (dox? name)
@@ -108,7 +126,7 @@
108
126
  (def dox-examples (name) (hash-get examples name ))
109
127
  (def dox-args (name) (dox-get-attr name 'args ))
110
128
  (def dox-example-names () (hash-keys examples )))
111
- (hash) (hash) (hash) nil)
129
+ (hash) (hash) (hash) (hash) (hash) nil)
112
130
 
113
131
  (def plugin-start (name) (assign this-plugin name) (chapter-end))
114
132
  (def plugin-end (name) (assign this-plugin nil ) (chapter-end))
@@ -125,9 +143,9 @@
125
143
  (cond (eq? event 'script-end)
126
144
  (script-end name))))))
127
145
 
146
+ ;; if the car of 'form is a key of 'hsh, add the cdr of 'form to the value of the key in 'hsh
147
+ ;; otherwise add the form to the list whose key is nil
128
148
  (def filter-form (hsh form)
129
- ; if the car of 'form is a key of 'hsh, add the cdr of 'form to the value of the key in 'hsh
130
- ; otherwise add the form to the list whose key is nil
131
149
  (cond (cond (pair? form)
132
150
  (hash-key? hsh (car form)))
133
151
  (hash-cons hsh (car form) (cdr form))
@@ -146,31 +164,43 @@
146
164
  (def rev-values (hsh)
147
165
  (rev-value-keys (hash-keys hsh) hsh (hash)))
148
166
 
167
+ ;; group forms by their first element, if the first element
168
+ ;; is already a key in hsh, collect all other elements under key nil
149
169
  (def filter-forms (hsh forms)
150
- ; group forms by their first element, if the first element
151
- ; is already a key in hsh, collect all other elements under key nil
152
170
  (cond forms
153
171
  (filter-forms (filter-form hsh (car forms)) (cdr forms))
154
172
  (rev-values hsh)))
155
173
 
156
- (def build-def-hash (hsh)
157
- (hash-set hsh 'comment nil)
158
- (hash-set hsh 'chapter nil)
159
- hsh)
174
+ (def filter-remove (key forms keyforms otherforms)
175
+ (cond forms
176
+ (cond (cond (pair? forms) (cond (pair? (car forms)) (eq? key (caar forms))))
177
+ (filter-remove key (cdr forms) (cons (car forms) keyforms) otherforms)
178
+ (filter-remove key (cdr forms) keyforms (cons (car forms) otherforms)))
179
+ (list (rev keyforms) (rev otherforms))))
160
180
 
181
+ (assign DEF-FORMS '(comment chapter))
182
+
183
+ (def build-def-hash ()
184
+ ((fn (h)
185
+ (map (fn (k) (hash-set h k nil)) DEF-FORMS)
186
+ h)
187
+ (hash)))
188
+
189
+ (def dox-build-def-name (name) name)
190
+
191
+ ;; used internally by 'mac
161
192
  (def define-mac-expr (name args body-forms)
162
- ; used internally by 'mac
163
193
  `(do (hash-set macs ',name (fun ,args ,@(hash-get body-forms nil)))
164
- (dox-add-doc ',name
194
+ (dox-add-doc ',(dox-build-def-name name)
165
195
  'mac
166
- ',(map car (hash-get body-forms 'comment))
196
+ ',(+ (fetch-and-clear-comments) (map car (hash-get body-forms 'comment)))
167
197
  ',args
168
198
  '(mac ,name ,args ,@(hash-get body-forms nil))
169
199
  ',(map car (hash-get body-forms 'chapter)))))
170
200
 
171
201
  (hash-set macs 'mac
172
202
  (fn (name args . body)
173
- (define-mac-expr name args (filter-forms (build-def-hash (hash)) body))))
203
+ (define-mac-expr name args (filter-forms (build-def-hash) body))))
174
204
 
175
205
  (dox-add-doc 'mac
176
206
  'mac
@@ -186,22 +216,26 @@
186
216
  '`((fn nil ,@args))
187
217
  '(nydp-core))
188
218
 
219
+ ;; override later to use '= instead of 'assign, giving us hash-assignment and other goodies for free
189
220
  (mac def-assign args `(assign ,@args))
190
221
 
222
+ ;; used internally by 'def
191
223
  (def define-def-expr (name args body-forms)
192
- ; used internally by 'def
193
- `(do (def-assign ,name (fun ,args ,@(filter-comments (hash-get body-forms nil))))
194
- (dox-add-doc ',name
224
+ `(do (def-assign ,name
225
+ ((fn (self-name)
226
+ (fun ,args ,@(filter-comments (hash-get body-forms nil))))
227
+ ',name))
228
+ (dox-add-doc ',(dox-build-def-name name)
195
229
  'def
196
230
  ',(+ (fetch-and-clear-comments) (map car (hash-get body-forms 'comment)))
197
231
  ',args
198
232
  '(def ,name ,args ,@(hash-get body-forms nil))
199
233
  ',(map car (hash-get body-forms 'chapter)))))
200
234
 
235
+ ;; define a new function in the global namespace
201
236
  (mac def (name args . body)
202
- ; define a new function in the global namespace
203
237
  (chapter nydp-core)
204
- (define-def-expr name args (filter-forms (build-def-hash (hash)) body)))
238
+ (define-def-expr name args (filter-forms (build-def-hash) body)))
205
239
 
206
240
  (mac comment (txt)
207
241
  (assign comments (cons txt comments))
@@ -1,6 +1,7 @@
1
1
  (dox-add-doc 'cons 'def '("with args a and b, returns a new cons cell, (a . b)") '(a b) nil '(list-manipulation))
2
2
  (dox-add-doc 'car 'def '("with args a, where a is a cons cell (x . y), return x." "Commonly used to get the first element of a list") '(a) nil '(list-manipulation))
3
3
  (dox-add-doc 'cdr 'def '("with args a, where a is a cons cell (x . y), return y." "Commonly used to get contents of a list, excluding the first element") '(a) nil '(list-manipulation))
4
+ (dox-add-doc 'log 'def '("write arg to Nydp.logger ; be sure to assign Nydp.logger first!") '(arg) nil '(nydp-core))
4
5
  (dox-add-doc '+ 'def '("with rest-args things, return the sum of the elements of things." "Will also increment dates and concatenate strings and lists") 'things nil '(math))
5
6
  (dox-add-doc '- 'def '("return the result of subtracting all other args from the first arg." "(- a b c d) is equivalent to (- a (+ b c d))") 'things nil '(math))
6
7
  (dox-add-doc '* 'def '("with rest-args things, return the product of the elements of things.") 'things nil '(math))
@@ -35,21 +36,22 @@
35
36
  (dox-add-doc 'pair? 'def '("t if arg is a cons cell or (equivalently) the start of a list") '(arg) nil '(nydp-core))
36
37
  (dox-add-doc 'hash? 'def '("t if arg is a hash") '(arg) nil '(nydp-core))
37
38
  (dox-add-doc 'sym? 'def '("t if arg is a symbol, nil otherwise") '(arg) nil '(nydp-core))
38
- (dox-add-doc 'ensuring 'def '("execute 'tricky-f, then 'ensure-f afterwards"
39
- "'ensure-f will always be executed, even if there is an error in 'tricky-f"
40
- "returns the return value of 'tricky-f") '(ensure-f tricky-f) nil '(flow-control))
39
+ (dox-add-doc 'ensuring 'def '("execute 'try-f, then 'ensure-f afterwards"
40
+ "'ensure-f will always be executed, even if there is an error in 'try-f"
41
+ "returns the return value of 'try-f. Similar to try/finally in java, or begin/ensure in ruby.") '(ensure-f try-f) nil '(flow-control))
41
42
  (dox-add-doc 'inspect 'def '("return a string representing 'arg, potentially (but not always) in a way that can be parsed back in to get the original object") '(arg) nil '(nydp-core))
42
43
  (dox-add-doc 'comment 'def '("does nothing at all." "Intercepted inside 'def and 'mac and used for documentation") '(arg) nil '(nydp-core))
43
44
  (dox-add-doc 'parse-in-string 'def '("parse the given string assuming a string-open delimiter has already been encountered") '(str) nil '(nydp-core))
44
45
  (dox-add-doc 'rand 'def '("return a random number ; with no args, between 0 and 1"
45
46
  "with 1 arg, an integer less than arg"
46
- "with two args, an integer >= arg 0 and < arg 1") 'args nil '(math))
47
- (dox-add-doc 'random-string 'def '("return a random string of length 'len (default 10)") '(len) nil '(string-manipulation))
48
- (dox-add-doc 'to-string 'def '("return a human-readable string representation of 'arg") '(arg) nil '(string-manipulation))
49
- (dox-add-doc 'string-length 'def '("return the length of 'arg") '(arg) nil '(string-manipulation))
50
- (dox-add-doc 'string-replace 'def '("replace 'pattern with 'insert in 'str") '(pattern insert str) nil '(string-manipulation))
51
- (dox-add-doc 'string-split 'def '("split 'str delimited by 'delim") '(str delim) nil '(string-manipulation))
52
- (dox-add-doc 'string-match 'def '("if 'str matches 'pattern, return hash with keys 'match and 'captures ; otherwise nil") '(str pattern) nil '(string-manipulation))
47
+ "with two args, an integer >= arg 0 and < arg 1") 'args nil '(math))
48
+ (dox-add-doc 'random-string 'def '("return a random string of length 'len (default 10)") '(len) nil '(string-manipulation))
49
+ (dox-add-doc 'regexp 'def '("return a regular expression compiled from the given string") '(str) nil '(string-manipulation))
50
+ (dox-add-doc 'to-string 'def '("return a human-readable string representation of 'arg") '(arg) nil '(string-manipulation))
51
+ (dox-add-doc 'string-length 'def '("return the length of 'arg") '(arg) nil '(string-manipulation))
52
+ (dox-add-doc 'string-replace 'def '("replace 'pattern with 'replacement in 'str") '(pattern replacement str) nil '(string-manipulation))
53
+ (dox-add-doc 'string-split 'def '("split 'str delimited by 'delim") '(str delim) nil '(string-manipulation))
54
+ (dox-add-doc 'string-match 'def '("if 'str matches 'pattern, return hash with keys 'match and 'captures ; otherwise nil") '(str pattern) nil '(string-manipulation))
53
55
  (dox-add-doc 'time 'def '("with no args, return the current time."
54
56
  "With one arg, if 'arg-0 is a number, return the current time plus 'arg-0 seconds."
55
57
  "With one arg, if 'arg-0 is a date, return the time at the beginning of the given date."
@@ -57,37 +59,42 @@
57
59
  "With two args, 'arg-0 must be a time."
58
60
  "If 'arg-1 is a number, return 'arg-0 plus 'arg-1 seconds as a time object."
59
61
  "If 'arg-1 is a time, return the number of seconds between the two (- 'arg-0 arg-1)."
60
- "Otherwise, expect 3, 4, 5, or 6 args, to construct a time from"
62
+ "Otherwise, expect 3 or more args, to construct a time from"
61
63
  "year, month, date, hours, minutes, seconds, milliseconds, reading arguments in that order,"
62
- "where hours, minutes, seconds, and milliseconds are optional") 'args nil '(date-time))
63
- (dox-add-doc 'thread-locals 'def '("return a hash bound to the current thread") nil nil '(nydp-core))
64
- (dox-add-doc 'type-of 'def '("return a symbol for the type of 'arg") '(arg) nil '(nydp-core))
65
- (dox-add-doc 'eq? 'def '("return 't if 'arg-0 and 'arg-1 are equal, nil otherwise") '(arg-0 arg-1) nil '(nydp-core))
66
- (dox-add-doc 'cdr-set 'def '("set the cdr of the given 'cell to 'arg, returns 'cell") '(cell arg) nil '(list-manipulation))
67
- (dox-add-doc 'hash-get 'def '("return the value stored by 'key in 'hsh") '(hsh key) nil '(hash-manipulation))
68
- (dox-add-doc 'hash-set 'def '("store 'val under 'key in 'hsh, return 'val") '(hsh key val) nil '(hash-manipulation))
69
- (dox-add-doc 'hash-keys 'def '("return the list of keys in 'hsh") '(hsh) nil '(hash-manipulation))
70
- (dox-add-doc 'hash-key? 'def '("return 't if 'key is a key of 'hsh") '(hsh key) nil '(hash-manipulation))
71
- (dox-add-doc 'hash-merge 'def '("return a new hash containing keys and values from 'h0 and 'h1, where values of 'h1 override values of 'h0") '(h0 h1) nil '(hash-manipulation))
72
- (dox-add-doc 'vm-info 'def '("return some information about the state of the current thread") nil nil '(nydp-core))
73
- (dox-add-doc 'pre-compile 'def '("transform parsed forms before the compile and eval stages") '(arg) nil '(nydp-compilation))
74
- (dox-add-doc 'script-run 'def '("announces the start of a plugin load or a script load."
75
- "'event may be one of '(script-start script-end plugin-start plugin-end)"
76
- "'name is the name of the script or plugin concerned") '(event name) nil '(nydp-core))
64
+ "where hours, minutes, seconds, and milliseconds are optional") 'args nil '(date-time))
65
+ (dox-add-doc 'thread-locals 'def '("return a hash bound to the current thread") nil nil '(nydp-core))
66
+ (dox-add-doc 'type-of 'def '("return a symbol for the type of 'arg") '(arg) nil '(nydp-core))
67
+ (dox-add-doc 'eq? 'def '("return 't if 'arg-0 and 'arg-1 are equal, nil otherwise") '(arg-0 arg-1) nil '(nydp-core))
68
+ (dox-add-doc 'cdr-set 'def '("set the cdr of the given 'cell to 'arg, returns 'cell") '(cell arg) nil '(list-manipulation))
69
+ (dox-add-doc 'hash-get 'def '("return the value stored by 'key in 'hsh") '(hsh key) nil '(hash-manipulation))
70
+ (dox-add-doc 'hash-set 'def '("store 'val under 'key in 'hsh, return 'val") '(hsh key val) nil '(hash-manipulation))
71
+ (dox-add-doc 'hash-keys 'def '("return the list of keys in 'hsh") '(hsh) nil '(hash-manipulation))
72
+ (dox-add-doc 'hash-key? 'def '("return 't if 'key is a key of 'hsh") '(hsh key) nil '(hash-manipulation))
73
+ (dox-add-doc 'hash-merge 'def '("return a new hash containing keys and values from 'h0 and 'h1, where values of 'h1 override values of 'h0") '(h0 h1) nil '(hash-manipulation))
74
+ (dox-add-doc 'vm-info 'def '("return some information about the state of the current thread") nil nil '(nydp-core))
75
+ (dox-add-doc 'pre-compile 'def '("transform parsed forms before the compile and eval stages") '(arg) nil '(nydp-compilation))
76
+ (dox-add-doc 'script-run 'def '("announces the start of a plugin load or a script load."
77
+ "'event may be one of '(script-start script-end plugin-start plugin-end)"
78
+ "'name is the name of the script or plugin concerned") '(event name) nil '(nydp-core))
77
79
 
78
- (dox-add-doc 'chapter-end 'def '("Announce the end of a chapter. Called by 'plugin-start, 'plugin-end, 'script-start, 'script-end") nil nil '(nydp/documentation))
79
- (dox-add-doc 'chapter-start 'def '("Announce the start of a chapter. Creates a new chapter if the named chapter does not already exist") '(chapter-name description) nil '(nydp/documentation))
80
- (dox-add-doc 'chapter-names 'def '("Get the names of all the chapters nydp knows about") nil nil '(nydp/documentation))
81
- (dox-add-doc 'chapter-current 'def '("Get the name of the chapter in progress right now - this is normally the last value sent to 'chapter-start") nil nil '(nydp/documentation))
82
- (dox-add-doc 'chapter-delete 'def '("Remove the named chapter") '(name) nil '(nydp/documentation))
83
- (dox-add-doc 'chapter-find 'def '("Get the named chapter") '(name) nil '(nydp/documentation))
84
- (dox-add-doc 'set-intersection 'def '("return the intersection of the given lists") 'args nil '(list-manipulation))
85
- (dox-add-doc 'set-union 'def '("return the union of the given lists") 'args nil '(list-manipulation))
86
- (dox-add-doc 'dox-add-doc 'def '("Store the provided documentation item."
87
- "'name is the name of the item"
88
- "'what is the type of the item ('def or 'mac or 'thingy ... this is user-definable, not related to 'type-of)"
89
- "'texts is a list of strings to store for this item"
90
- "'args is the args if the item has the notion of args"
91
- "'src the source code of the item if any"
92
- "'chapters the chapters to which the item should be added, if any") '(name what texts args src chapters) nil '(nydp/documentation))
93
- (dox-add-doc 'dox-add-examples 'def '("Add the given examples to the dox for the named item") '(name example-exprs) nil '(nydp/documentation))
80
+ (dox-add-doc 'chapter-end 'def '("Announce the end of a chapter. Called by 'plugin-start, 'plugin-end, 'script-start, 'script-end") nil nil '(nydp/documentation))
81
+ (dox-add-doc 'chapter-start 'def '("Announce the start of a chapter. Creates a new chapter if the named chapter does not already exist") '(chapter-name description) nil '(nydp/documentation))
82
+ (dox-add-doc 'chapter-names 'def '("Get the names of all the chapters nydp knows about") nil nil '(nydp/documentation))
83
+ (dox-add-doc 'chapter-current 'def '("Get the name of the chapter in progress right now - this is normally the last value sent to 'chapter-start") nil nil '(nydp/documentation))
84
+ (dox-add-doc 'chapter-delete 'def '("Remove the named chapter") '(name) nil '(nydp/documentation))
85
+ (dox-add-doc 'chapter-find 'def '("Get the named chapter") '(name) nil '(nydp/documentation))
86
+ (dox-add-doc 'set-intersection 'def '("return the intersection of the given lists") 'args nil '(list-manipulation))
87
+ (dox-add-doc ''def '("return the intersection of the given lists") 'args nil '(list-manipulation))
88
+ (dox-add-doc 'set-union 'def '("return the union of the given lists") 'args nil '(list-manipulation))
89
+ (dox-add-doc '⋃ 'def '("return the union of the given lists") 'args nil '(list-manipulation))
90
+ (dox-add-doc 'dox-add-doc 'def '("Store the provided documentation item."
91
+ "'name is the name of the item"
92
+ "'what is the type of the item ('def or 'mac or 'thingy ... this is user-definable, not related to 'type-of)"
93
+ "'texts is a list of strings to store for this item"
94
+ "'args is the args if the item has the notion of args"
95
+ "'src the source code of the item if any"
96
+ "'chapters the chapters to which the item should be added, if any") '(name what texts args src chapters) nil '(nydp/documentation))
97
+ (dox-add-doc 'dox-add-examples 'def '("Add the given examples to the dox for the named item") '(name example-exprs) nil '(nydp/documentation))
98
+ (dox-add-doc 'dox-types 'def '("Get the list of types of documented items") nil nil '(nydp/documentation))
99
+ (dox-add-doc 'dox-lookup 'def '("Get the documentation for the given item") '(name) nil '(nydp/documentation))
100
+ (dox-add-doc 'dox-items-by-type 'def '("Get the list of dox items of a given type") '(type) nil '(nydp/documentation))
@@ -1,4 +1,4 @@
1
- (assign script-name "core-012-utils.nydp")
1
+ (assign script-name "core-020-utils.nydp")
2
2
 
3
3
  (dox-add-doc 'if
4
4
  'mac
@@ -43,12 +43,12 @@
43
43
  '(hash-set h k (cons v (hash-get h k)))
44
44
  '(hash-manipulation))
45
45
 
46
+ ;; equivalent to (join-str "~prefix~joint~(car things)" joint (cdr things)) - except
47
+ ;; 'string-pieces hasn't been defined yet, and if it were, it would be defined in terms of
48
+ ;; 'join-str, so it would be circular.
49
+ ;; see 'joinstr for a more powerful and easier-to-use implementation of the same idea
46
50
  (def join-str (prefix joint things)
47
51
  (chapter string-manipulation)
48
- ; equivalent to (join-str "~prefix~joint~(car things)" joint (cdr things)) - except
49
- ; 'string-pieces hasn't been defined yet, and if it were, it would be defined in terms of
50
- ; 'join-str, so it would be circular.
51
- ; see 'joinstr for a more powerful and easier-to-use implementation of the same idea
52
52
  (if things
53
53
  (join-str (+ (to-string prefix)
54
54
  joint