sibilant 0.0.1 → 0.0.2
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.
- data/README.md +8 -4
- data/js/sibilant/.gitignore +4 -0
- data/js/sibilant/.travis.yml +6 -0
- data/js/sibilant/LICENSE +20 -0
- data/js/sibilant/README.md +70 -0
- data/js/sibilant/bin/sibilant +3 -0
- data/js/sibilant/cli-help +79 -0
- data/js/sibilant/include/functional.sibilant +57 -0
- data/js/sibilant/include/macros.sibilant +374 -0
- data/js/sibilant/include/node.sibilant +2 -0
- data/js/sibilant/lib/browser.js +685 -0
- data/js/sibilant/lib/cli.js +153 -0
- data/js/sibilant/lib/options.js +232 -0
- data/js/sibilant/lib/repl.js +78 -0
- data/js/sibilant/lib/sibilant.js +688 -0
- data/js/sibilant/misc/sibilant-mode.el +129 -0
- data/js/sibilant/package.json +19 -0
- data/js/sibilant/package.sibilant +16 -0
- data/js/sibilant/public/index.html +502 -0
- data/js/sibilant/public/javascripts/browser.js +685 -0
- data/js/sibilant/public/javascripts/jquery-ui.js +392 -0
- data/js/sibilant/public/javascripts/jquery.js +154 -0
- data/js/sibilant/public/javascripts/macros.sibilant +374 -0
- data/js/sibilant/public/javascripts/sibilant.info.sibilant +77 -0
- data/js/sibilant/public/sass/_mixins.sass +98 -0
- data/js/sibilant/public/sass/sibilant.sass +156 -0
- data/js/sibilant/public/stylesheets/Anonymous_Pro-webfont.eot +0 -0
- data/js/sibilant/public/stylesheets/Anonymous_Pro-webfont.svg +241 -0
- data/js/sibilant/public/stylesheets/Anonymous_Pro-webfont.ttf +0 -0
- data/js/sibilant/public/stylesheets/Anonymous_Pro-webfont.woff +0 -0
- data/js/sibilant/public/stylesheets/sibilant.css +166 -0
- data/js/sibilant/src/browser.sibilant +45 -0
- data/js/sibilant/src/cli.sibilant +93 -0
- data/js/sibilant/src/core.sibilant +338 -0
- data/js/sibilant/src/options.sibilant +65 -0
- data/js/sibilant/src/repl.sibilant +59 -0
- data/js/sibilant/src/sibilant.sibilant +78 -0
- data/js/sibilant/test/defvar.sibilant +5 -0
- data/js/sibilant/test/includeFile1.sibilant +1 -0
- data/js/sibilant/test/includeFile2.sibilant +1 -0
- data/js/sibilant/test/node.sibilant +10 -0
- data/js/sibilant/test/slice.sibilant +3 -0
- data/js/sibilant/test/test.sibilant +464 -0
- data/js/sibilant/test/testHelper.sibilant +80 -0
- data/lib/sibilant/version.rb +1 -1
- data/sibilant.gemspec +3 -1
- metadata +44 -1
@@ -0,0 +1,338 @@
|
|
1
|
+
(set sibilant 'tokens {})
|
2
|
+
|
3
|
+
(set sibilant.tokens
|
4
|
+
'regex "(\\/(\\\\\\\/|[^\\/\\n])+\\/[glim]*)"
|
5
|
+
'comment "(;.*)"
|
6
|
+
'string "(\"(([^\"]|(\\\\\"))*[^\\\\])?\")"
|
7
|
+
'number "(-?[0-9][0-9.,]*)"
|
8
|
+
'literal "(-?[*.$a-zA-Z][*.a-zA-Z0-9-]*(\\?|!)?)"
|
9
|
+
'special "([&']?)"
|
10
|
+
'other-char "([><=!\\+\\/\\*-]+)"
|
11
|
+
'open-paren "(\\()"
|
12
|
+
'special-open-paren "('?\\()"
|
13
|
+
'close-paren "(\\))"
|
14
|
+
'alternative-parens "\\{|\\[|\\}|\\]"
|
15
|
+
'special-literal (concat sibilant.tokens.special
|
16
|
+
sibilant.tokens.literal))
|
17
|
+
|
18
|
+
(set sibilant 'token-precedence
|
19
|
+
'( regex comment string number special-literal other-char
|
20
|
+
special-open-paren close-paren alternative-parens))
|
21
|
+
|
22
|
+
(defvar tokenize
|
23
|
+
(setf sibilant.tokenize
|
24
|
+
(lambda (string)
|
25
|
+
(defvar tokens []
|
26
|
+
parse-stack [tokens]
|
27
|
+
specials [])
|
28
|
+
|
29
|
+
(defun accept-token (token)
|
30
|
+
(send (get parse-stack 0) push token))
|
31
|
+
|
32
|
+
(defun increase-nesting ()
|
33
|
+
(defvar new-arr [])
|
34
|
+
(accept-token new-arr)
|
35
|
+
(parse-stack.unshift new-arr))
|
36
|
+
|
37
|
+
(defun decrease-nesting ()
|
38
|
+
(specials.shift)
|
39
|
+
(parse-stack.shift)
|
40
|
+
(when (zero? parse-stack.length)
|
41
|
+
(throw (concat "unbalanced parens:\n"
|
42
|
+
(call inspect parse-stack)))))
|
43
|
+
|
44
|
+
(defun handle-token (token)
|
45
|
+
(defvar special (first token)
|
46
|
+
token token)
|
47
|
+
|
48
|
+
(if (= special "'")
|
49
|
+
(progn
|
50
|
+
(setf token (token.slice 1))
|
51
|
+
(increase-nesting)
|
52
|
+
(accept-token 'quote))
|
53
|
+
(setf special false))
|
54
|
+
|
55
|
+
(specials.unshift (as-boolean special))
|
56
|
+
|
57
|
+
(switch token
|
58
|
+
("(" (increase-nesting))
|
59
|
+
(("]" "}" ")") (decrease-nesting))
|
60
|
+
|
61
|
+
("{" (increase-nesting) (accept-token 'hash))
|
62
|
+
("[" (increase-nesting) (accept-token 'list))
|
63
|
+
|
64
|
+
(default
|
65
|
+
(if (token.match (regex (concat "^" sibilant.tokens.number "$")))
|
66
|
+
(accept-token (parse-float (token.replace (regex "," 'g) "")))
|
67
|
+
(accept-token token))))
|
68
|
+
|
69
|
+
(when (and (!= token "(")
|
70
|
+
(specials.shift))
|
71
|
+
(decrease-nesting)))
|
72
|
+
|
73
|
+
|
74
|
+
|
75
|
+
(defvar ordered-regexen (map sibilant.token-precedence
|
76
|
+
(lambda (x) (get sibilant.tokens x)))
|
77
|
+
master-regex (regex (join "|" ordered-regexen) 'g))
|
78
|
+
|
79
|
+
(chain string
|
80
|
+
(match master-regex)
|
81
|
+
(for-each handle-token))
|
82
|
+
|
83
|
+
(when (> parse-stack.length 1)
|
84
|
+
(error "unexpected EOF, probably missing a )\n"
|
85
|
+
(call inspect (first parse-stack))))
|
86
|
+
tokens)))
|
87
|
+
|
88
|
+
(defun indent (&rest args)
|
89
|
+
(concat
|
90
|
+
(chain (compact args)
|
91
|
+
(join "\n")
|
92
|
+
(replace /^/ "\n")
|
93
|
+
(replace /\n/g "\n "))
|
94
|
+
"\n"))
|
95
|
+
|
96
|
+
(defun construct-hash (array-of-arrays)
|
97
|
+
(inject {} array-of-arrays
|
98
|
+
(lambda (object item)
|
99
|
+
(set object (first item) (get object (second item)))
|
100
|
+
object)))
|
101
|
+
|
102
|
+
(defvar macros (hash))
|
103
|
+
(set sibilant 'macros macros)
|
104
|
+
|
105
|
+
(set macros 'return
|
106
|
+
(lambda (token)
|
107
|
+
(defvar default-return (concat "return " (translate token)))
|
108
|
+
|
109
|
+
(if (list? token)
|
110
|
+
(switch (first token)
|
111
|
+
('(return throw progn) (translate token))
|
112
|
+
('delete
|
113
|
+
(defvar delete-macro (get macros 'delete))
|
114
|
+
(if (< token.length 3) default-return
|
115
|
+
(concat (apply delete-macro (token.slice 1 -1))
|
116
|
+
"\nreturn "
|
117
|
+
(delete-macro (last token)))))
|
118
|
+
('setf
|
119
|
+
(if (< token.length 4) default-return
|
120
|
+
(concat (apply macros.setf
|
121
|
+
(token.slice 1 (- token.length 2)))
|
122
|
+
"\nreturn "
|
123
|
+
(apply macros.setf (token.slice -2)))))
|
124
|
+
('set
|
125
|
+
(if (< token.length 5) default-return
|
126
|
+
(progn
|
127
|
+
(defvar obj (second token)
|
128
|
+
non-return-part (token.slice 2 (- token.length 2))
|
129
|
+
return-part (token.slice -2))
|
130
|
+
(non-return-part.unshift obj)
|
131
|
+
(return-part.unshift obj)
|
132
|
+
(concat (apply macros.set non-return-part)
|
133
|
+
"\nreturn "
|
134
|
+
(apply macros.set return-part)))))
|
135
|
+
(default default-return))
|
136
|
+
default-return)))
|
137
|
+
|
138
|
+
(defun as-statement (string)
|
139
|
+
(chain string (to-string) (replace /;*\s*$/ ";")))
|
140
|
+
|
141
|
+
(defun macros.statement (&rest args)
|
142
|
+
(concat (apply macros.call args) ";\n"))
|
143
|
+
|
144
|
+
(defun macros.progn (&rest body)
|
145
|
+
(defvar last-index (-math.max 0 (- body.length 1)))
|
146
|
+
|
147
|
+
(set body last-index ['return (get body last-index)])
|
148
|
+
|
149
|
+
(join "\n"
|
150
|
+
(map body (lambda (arg)
|
151
|
+
(concat (as-statement (translate arg)))))))
|
152
|
+
|
153
|
+
(defun macros.call (fn-name &rest args)
|
154
|
+
(concat (translate fn-name)
|
155
|
+
"(" (join ", " (map args translate)) ")"))
|
156
|
+
|
157
|
+
(defun macros.defun (fn-name &rest args-and-body)
|
158
|
+
(defvar fn-name-tr (translate fn-name)
|
159
|
+
start (if (match? /\./ fn-name-tr) "" "var "))
|
160
|
+
(concat start fn-name-tr " = "
|
161
|
+
(apply macros.lambda args-and-body)
|
162
|
+
";\n"))
|
163
|
+
|
164
|
+
(defun macros.defmacro (name &rest args-and-body)
|
165
|
+
(defvar js (apply macros.lambda args-and-body)
|
166
|
+
name (translate name))
|
167
|
+
(try (set macros name (eval js))
|
168
|
+
(error (concat "error in parsing macro "
|
169
|
+
name ":\n" (indent js))))
|
170
|
+
undefined)
|
171
|
+
|
172
|
+
(defun macros.concat (&rest args)
|
173
|
+
(concat "(" (join " + " (map args translate)) ")"))
|
174
|
+
|
175
|
+
(defun transform-args (arglist)
|
176
|
+
(defvar last undefined
|
177
|
+
args [])
|
178
|
+
(each (arg) arglist
|
179
|
+
(if (= (first arg) "&") (setf last (arg.slice 1))
|
180
|
+
(progn
|
181
|
+
(args.push [ (or last 'required) arg ])
|
182
|
+
(setf last null))))
|
183
|
+
|
184
|
+
(when last
|
185
|
+
(error (concat "unexpected argument modifier: " last)))
|
186
|
+
|
187
|
+
args)
|
188
|
+
|
189
|
+
|
190
|
+
(defun macros.reverse (arr)
|
191
|
+
(defvar reversed [])
|
192
|
+
(each (item) arr (reversed.unshift item))
|
193
|
+
reversed)
|
194
|
+
|
195
|
+
(defvar reverse macros.reverse)
|
196
|
+
|
197
|
+
(defun build-args-string (args rest)
|
198
|
+
(defvar args-string ""
|
199
|
+
optional-count 0)
|
200
|
+
|
201
|
+
(each (arg option-index) args
|
202
|
+
(when (= (first arg) 'optional)
|
203
|
+
(setf
|
204
|
+
args-string
|
205
|
+
(concat
|
206
|
+
args-string
|
207
|
+
"if (arguments.length < "
|
208
|
+
(- args.length optional-count) ")"
|
209
|
+
" // if " (translate (second arg)) " is missing"
|
210
|
+
(indent
|
211
|
+
(concat "var "
|
212
|
+
(chain
|
213
|
+
(map (args.slice (+ option-index 1))
|
214
|
+
(lambda (arg arg-index)
|
215
|
+
(concat (translate (second arg)) " = "
|
216
|
+
(translate (second (get args
|
217
|
+
(+ option-index
|
218
|
+
arg-index)))))))
|
219
|
+
(reverse)
|
220
|
+
(concat (concat (translate (second arg)) " = undefined"))
|
221
|
+
(join ", "))
|
222
|
+
";"))))
|
223
|
+
(incr optional-count)))
|
224
|
+
|
225
|
+
(if (defined? rest)
|
226
|
+
(concat args-string
|
227
|
+
"var " (translate (second rest))
|
228
|
+
" = Array.prototype.slice.call(arguments, "
|
229
|
+
args.length ");\n")
|
230
|
+
args-string))
|
231
|
+
|
232
|
+
(defun build-comment-string (args)
|
233
|
+
(if (empty? args) ""
|
234
|
+
(concat "// "
|
235
|
+
(join " "
|
236
|
+
(map args
|
237
|
+
(lambda (arg)
|
238
|
+
(concat (translate (second arg)) ":" (first arg))))))))
|
239
|
+
|
240
|
+
;; brain 'splode
|
241
|
+
(defun macros.lambda (arglist &rest body)
|
242
|
+
(defvar args (transform-args arglist)
|
243
|
+
rest (first (select args
|
244
|
+
(lambda (arg)
|
245
|
+
(= 'rest (first arg)))))
|
246
|
+
doc-string undefined)
|
247
|
+
|
248
|
+
(set body (- body.length 1)
|
249
|
+
[ 'return (get body (- body.length 1)) ])
|
250
|
+
|
251
|
+
(when (and (= (typeof (first body)) 'string)
|
252
|
+
(send (first body) match /^".*"$/))
|
253
|
+
(setf doc-string
|
254
|
+
(concat "/* " (eval (body.shift)) " */\n")))
|
255
|
+
|
256
|
+
(defvar no-rest-args (if rest (args.slice 0 -1) args)
|
257
|
+
args-string (build-args-string no-rest-args rest)
|
258
|
+
comment-string (build-comment-string args))
|
259
|
+
|
260
|
+
(concat "(function("
|
261
|
+
(join ", " (map args (lambda (arg) (translate (second arg)))))
|
262
|
+
") {"
|
263
|
+
(indent comment-string doc-string args-string
|
264
|
+
(join "\n"
|
265
|
+
(map body
|
266
|
+
(lambda (stmt)
|
267
|
+
(defvar tstmt (translate stmt))
|
268
|
+
(concat tstmt
|
269
|
+
(if (= (last tstmt) ";") "" ";"))))))
|
270
|
+
"})"))
|
271
|
+
|
272
|
+
|
273
|
+
(defun macros.quote (item)
|
274
|
+
(if (= "Array" item.constructor.name)
|
275
|
+
(concat "[ " (join ", " (map item macros.quote)) " ]")
|
276
|
+
(if (= 'number (typeof item)) item
|
277
|
+
(concat "\"" (literal item) "\""))))
|
278
|
+
|
279
|
+
(defun macros.hash (&rest pairs)
|
280
|
+
(when (odd? pairs.length)
|
281
|
+
(error (concat
|
282
|
+
"odd number of key-value pairs in hash: "
|
283
|
+
(call inspect pairs))))
|
284
|
+
(defvar pair-strings
|
285
|
+
(bulk-map pairs (lambda (key value)
|
286
|
+
(concat (translate key) ": "
|
287
|
+
(translate value)))))
|
288
|
+
(if (>= 1 pair-strings.length)
|
289
|
+
(concat "{ " (join ", " pair-strings) " }")
|
290
|
+
(concat "{" (indent (join ",\n" pair-strings)) "}")))
|
291
|
+
|
292
|
+
|
293
|
+
(defun literal (string)
|
294
|
+
(inject (chain string
|
295
|
+
(replace /\*/g "_")
|
296
|
+
(replace /\?$/ "__QUERY")
|
297
|
+
(replace /!$/ "__BANG"))
|
298
|
+
(string.match /-(.)/g)
|
299
|
+
(lambda (return-string match)
|
300
|
+
(return-string.replace match
|
301
|
+
(send (second match) to-upper-case)))))
|
302
|
+
|
303
|
+
|
304
|
+
(defun translate (token hint)
|
305
|
+
(defvar hint hint)
|
306
|
+
(when (and hint (undefined? (get macros hint)))
|
307
|
+
(setf hint undefined))
|
308
|
+
|
309
|
+
(when (defined? token)
|
310
|
+
(when (string? token) (setf token (token.trim)))
|
311
|
+
(try
|
312
|
+
(if (list? token)
|
313
|
+
(if (defined? (get macros (translate (first token))))
|
314
|
+
(apply (get macros (translate (first token))) (token.slice 1))
|
315
|
+
(apply (get macros (or hint 'call)) token))
|
316
|
+
(if (and (string? token)
|
317
|
+
(token.match (regex (concat "^" sibilant.tokens.literal "$"))))
|
318
|
+
(literal token)
|
319
|
+
(if (and (string? token) (token.match (regex "^;")))
|
320
|
+
(token.replace (regex "^;+") "//")
|
321
|
+
(if (and (string? token) (= "\"" (first token) (last token)))
|
322
|
+
(chain token (split "\n") (join "\\n\" +\n\""))
|
323
|
+
token))))
|
324
|
+
(error (concat e.stack "\n"
|
325
|
+
"Encountered when attempting to process:\n"
|
326
|
+
(indent (call inspect token)))))))
|
327
|
+
|
328
|
+
|
329
|
+
(set sibilant 'translate translate)
|
330
|
+
|
331
|
+
(defun translate-all (contents)
|
332
|
+
(defvar buffer "")
|
333
|
+
(each (token) (tokenize contents)
|
334
|
+
(defvar line (translate token 'statement))
|
335
|
+
(when line (setf buffer (concat buffer line "\n"))))
|
336
|
+
buffer)
|
337
|
+
|
338
|
+
(set sibilant 'translate-all translate-all)
|
@@ -0,0 +1,65 @@
|
|
1
|
+
(include "../include/functional")
|
2
|
+
|
3
|
+
(defun extract-options (config &optional args)
|
4
|
+
(defvar args (or args (process.argv.slice 2))
|
5
|
+
default-label 'unlabeled
|
6
|
+
current-label default-label
|
7
|
+
after-break false
|
8
|
+
config (or config {})
|
9
|
+
unlabeled [])
|
10
|
+
|
11
|
+
(defun label? (item) (and (string? item) (send /^-/ test item)))
|
12
|
+
|
13
|
+
(defun synonym-lookup (item)
|
14
|
+
(defvar config-entry (get config item))
|
15
|
+
(if (string? config-entry)
|
16
|
+
(synonym-lookup config-entry)
|
17
|
+
item))
|
18
|
+
|
19
|
+
(defun takes-args? (item)
|
20
|
+
(!= false (get config (label-for item))))
|
21
|
+
|
22
|
+
(setf default-label (synonym-lookup default-label)
|
23
|
+
current-label default-label)
|
24
|
+
|
25
|
+
(defun label-for (item)
|
26
|
+
(synonym-lookup (item.replace /^-+/ "")))
|
27
|
+
|
28
|
+
(defun add-value (hash key value)
|
29
|
+
(defvar current-value (get hash key))
|
30
|
+
(when (undefined? current-value)
|
31
|
+
(setf current-value [])
|
32
|
+
(set hash key current-value))
|
33
|
+
(when (!= true value)
|
34
|
+
(current-value.push value)))
|
35
|
+
|
36
|
+
(defun reset-label ()
|
37
|
+
(setf current-label default-label))
|
38
|
+
|
39
|
+
(inject {} args
|
40
|
+
(lambda (return-hash item index)
|
41
|
+
(if (= "--" item) (setf after-break true)
|
42
|
+
(if after-break
|
43
|
+
(add-value return-hash 'after-break item)
|
44
|
+
(if (label? item)
|
45
|
+
(progn
|
46
|
+
(setf current-label (label-for item))
|
47
|
+
(add-value return-hash current-label true)
|
48
|
+
(when (not (takes-args? item)) (reset-label)))
|
49
|
+
(progn
|
50
|
+
(add-value return-hash current-label item)
|
51
|
+
(reset-label)))))
|
52
|
+
return-hash)))
|
53
|
+
|
54
|
+
(defun process-options (&optional config)
|
55
|
+
(defvar options (extract-options config))
|
56
|
+
(when config
|
57
|
+
(defun handle-pair (key value)
|
58
|
+
(defvar handle (get config key))
|
59
|
+
(when (string? handle) (handle-pair handle value))
|
60
|
+
(when (function? handle) (handle value options)))
|
61
|
+
(each (key) (keys options) (handle-pair key (get options key))))
|
62
|
+
|
63
|
+
options)
|
64
|
+
|
65
|
+
(set module 'exports process-options)
|
@@ -0,0 +1,59 @@
|
|
1
|
+
(defvar input (process.open-stdin)
|
2
|
+
output process.stdout
|
3
|
+
vm (require 'vm)
|
4
|
+
readline (send (require 'readline) create-interface input output)
|
5
|
+
sibilant (require "./sibilant")
|
6
|
+
context undefined
|
7
|
+
cmd-buffer ""
|
8
|
+
util (require 'util))
|
9
|
+
|
10
|
+
(defun create-context ()
|
11
|
+
(defvar context (vm.create-context))
|
12
|
+
(set module 'filename (concat (process.cwd) "/exec"))
|
13
|
+
(set context
|
14
|
+
'module module
|
15
|
+
'require require)
|
16
|
+
(each-key key global (set context key (get global key)))
|
17
|
+
context)
|
18
|
+
|
19
|
+
(setf context (create-context))
|
20
|
+
|
21
|
+
(defun display-prompt ()
|
22
|
+
(readline.set-prompt
|
23
|
+
(concat (if (> cmd-buffer.length 10)
|
24
|
+
(concat "..." (cmd-buffer.slice -10))
|
25
|
+
(if (> cmd-buffer.length 0) cmd-buffer "sibilant"))
|
26
|
+
"> "))
|
27
|
+
(readline.prompt))
|
28
|
+
|
29
|
+
(readline.on 'line
|
30
|
+
(lambda (cmd)
|
31
|
+
(defvar js-line "")
|
32
|
+
|
33
|
+
(try
|
34
|
+
(progn
|
35
|
+
(setf cmd-buffer (concat cmd-buffer cmd))
|
36
|
+
(each (stmt) (sibilant.tokenize cmd-buffer)
|
37
|
+
(setf js-line (concat js-line
|
38
|
+
(sibilant.translate stmt 'statement))))
|
39
|
+
(defvar result (vm.run-in-context js-line context "sibilant-repl"))
|
40
|
+
(set readline.history 0 cmd-buffer)
|
41
|
+
(when (defined? result)
|
42
|
+
(output.write (concat "result: "
|
43
|
+
(util.inspect result) "\n")))
|
44
|
+
(set context "_" result)
|
45
|
+
(setf cmd-buffer ""))
|
46
|
+
(progn
|
47
|
+
(if (e.message.match /unexpected EOF/)
|
48
|
+
(progn
|
49
|
+
(setf cmd-buffer (concat cmd-buffer " "))
|
50
|
+
(readline.history.shift))
|
51
|
+
(progn
|
52
|
+
(set readline.history 0 cmd-buffer)
|
53
|
+
(output.write (concat e.stack "\n"))
|
54
|
+
(setf cmd-buffer "")))))
|
55
|
+
(display-prompt)))
|
56
|
+
|
57
|
+
(readline.on 'close input.destroy)
|
58
|
+
|
59
|
+
(display-prompt)
|
@@ -0,0 +1,78 @@
|
|
1
|
+
(defvar sibilant exports
|
2
|
+
util (require 'util)
|
3
|
+
path (require 'path)
|
4
|
+
fs (require 'fs)
|
5
|
+
error (lambda (str) (throw str))
|
6
|
+
inspect util.inspect)
|
7
|
+
|
8
|
+
(include "../include/functional")
|
9
|
+
|
10
|
+
(defun sibilant.package-info ()
|
11
|
+
(defvar fs (require 'fs))
|
12
|
+
(JSON.parse (fs.read-file-sync
|
13
|
+
(concat **dirname "/../package.json"))))
|
14
|
+
|
15
|
+
(defun sibilant.version-string ()
|
16
|
+
(defvar package (sibilant.package-info)
|
17
|
+
path (require 'path))
|
18
|
+
(concat package.name " version " package.version
|
19
|
+
"\n(at " (path.join **dirname "..") ")"))
|
20
|
+
|
21
|
+
(defun sibilant.strip-shebang (data)
|
22
|
+
(data.replace /^#!.*\n/ ""))
|
23
|
+
|
24
|
+
(set sibilant
|
25
|
+
'file 'eval.sibilant
|
26
|
+
'dir (process.cwd))
|
27
|
+
|
28
|
+
(defun with-dir-and-file (dir file fn)
|
29
|
+
(defvar before { dir sibilant.dir
|
30
|
+
file sibilant.file })
|
31
|
+
(set sibilant
|
32
|
+
'dir dir
|
33
|
+
'file file)
|
34
|
+
|
35
|
+
(defvar retval (fn))
|
36
|
+
|
37
|
+
(set sibilant
|
38
|
+
'dir before.dir
|
39
|
+
'file before.file)
|
40
|
+
|
41
|
+
retval)
|
42
|
+
|
43
|
+
|
44
|
+
(defun sibilant.translate-file (file-name)
|
45
|
+
(with-dir-and-file (path.dirname file-name)
|
46
|
+
file-name
|
47
|
+
(thunk
|
48
|
+
(sibilant.translate-all
|
49
|
+
(sibilant.strip-shebang
|
50
|
+
(fs.read-file-sync file-name "utf8"))))))
|
51
|
+
|
52
|
+
|
53
|
+
(defun sibilant.version ()
|
54
|
+
(get (sibilant.package-info) 'version))
|
55
|
+
|
56
|
+
(set require.extensions ".sibilant"
|
57
|
+
(lambda (module filename)
|
58
|
+
(defvar content (sibilant.translate-file filename))
|
59
|
+
(module.*compile content filename)))
|
60
|
+
|
61
|
+
(defun sibilant.include (file)
|
62
|
+
(when (not (file.match (regex ".sibilant$")))
|
63
|
+
(setf file (concat file ".sibilant")))
|
64
|
+
|
65
|
+
(when (file.match (regex "^\.\.?/"))
|
66
|
+
(setf file (concat sibilant.dir "/" file)))
|
67
|
+
|
68
|
+
(defvar resolved (require.resolve file))
|
69
|
+
|
70
|
+
(sibilant.translate-file resolved))
|
71
|
+
|
72
|
+
|
73
|
+
(include "../src/core")
|
74
|
+
|
75
|
+
(defun macros.include (file)
|
76
|
+
(sibilant.include (eval (translate file))))
|
77
|
+
|
78
|
+
(sibilant.include (path.normalize (concat **dirname "/../include/macros")))
|
@@ -0,0 +1 @@
|
|
1
|
+
1
|
@@ -0,0 +1 @@
|
|
1
|
+
2
|
@@ -0,0 +1,10 @@
|
|
1
|
+
#!/usr/bin/env sibilant -x
|
2
|
+
(include "./testHelper.sibilant")
|
3
|
+
|
4
|
+
(sibilant.include "sibilant/include/node")
|
5
|
+
|
6
|
+
(assert-translation "(on thing event (arg1 arg2) (concat arg1 arg2))"
|
7
|
+
"thing.on(\"event\", (function(arg1, arg2) {
|
8
|
+
// arg1:required arg2:required
|
9
|
+
return (arg1 + arg2);
|
10
|
+
}))")
|