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.
Files changed (47) hide show
  1. data/README.md +8 -4
  2. data/js/sibilant/.gitignore +4 -0
  3. data/js/sibilant/.travis.yml +6 -0
  4. data/js/sibilant/LICENSE +20 -0
  5. data/js/sibilant/README.md +70 -0
  6. data/js/sibilant/bin/sibilant +3 -0
  7. data/js/sibilant/cli-help +79 -0
  8. data/js/sibilant/include/functional.sibilant +57 -0
  9. data/js/sibilant/include/macros.sibilant +374 -0
  10. data/js/sibilant/include/node.sibilant +2 -0
  11. data/js/sibilant/lib/browser.js +685 -0
  12. data/js/sibilant/lib/cli.js +153 -0
  13. data/js/sibilant/lib/options.js +232 -0
  14. data/js/sibilant/lib/repl.js +78 -0
  15. data/js/sibilant/lib/sibilant.js +688 -0
  16. data/js/sibilant/misc/sibilant-mode.el +129 -0
  17. data/js/sibilant/package.json +19 -0
  18. data/js/sibilant/package.sibilant +16 -0
  19. data/js/sibilant/public/index.html +502 -0
  20. data/js/sibilant/public/javascripts/browser.js +685 -0
  21. data/js/sibilant/public/javascripts/jquery-ui.js +392 -0
  22. data/js/sibilant/public/javascripts/jquery.js +154 -0
  23. data/js/sibilant/public/javascripts/macros.sibilant +374 -0
  24. data/js/sibilant/public/javascripts/sibilant.info.sibilant +77 -0
  25. data/js/sibilant/public/sass/_mixins.sass +98 -0
  26. data/js/sibilant/public/sass/sibilant.sass +156 -0
  27. data/js/sibilant/public/stylesheets/Anonymous_Pro-webfont.eot +0 -0
  28. data/js/sibilant/public/stylesheets/Anonymous_Pro-webfont.svg +241 -0
  29. data/js/sibilant/public/stylesheets/Anonymous_Pro-webfont.ttf +0 -0
  30. data/js/sibilant/public/stylesheets/Anonymous_Pro-webfont.woff +0 -0
  31. data/js/sibilant/public/stylesheets/sibilant.css +166 -0
  32. data/js/sibilant/src/browser.sibilant +45 -0
  33. data/js/sibilant/src/cli.sibilant +93 -0
  34. data/js/sibilant/src/core.sibilant +338 -0
  35. data/js/sibilant/src/options.sibilant +65 -0
  36. data/js/sibilant/src/repl.sibilant +59 -0
  37. data/js/sibilant/src/sibilant.sibilant +78 -0
  38. data/js/sibilant/test/defvar.sibilant +5 -0
  39. data/js/sibilant/test/includeFile1.sibilant +1 -0
  40. data/js/sibilant/test/includeFile2.sibilant +1 -0
  41. data/js/sibilant/test/node.sibilant +10 -0
  42. data/js/sibilant/test/slice.sibilant +3 -0
  43. data/js/sibilant/test/test.sibilant +464 -0
  44. data/js/sibilant/test/testHelper.sibilant +80 -0
  45. data/lib/sibilant/version.rb +1 -1
  46. data/sibilant.gemspec +3 -1
  47. 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,5 @@
1
+ (defun alert-hello (planet-name)
2
+ (defvar message (concat "hello " planet-name))
3
+ message)
4
+
5
+ (defvar foo (concat "hi " "there"))
@@ -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
+ }))")
@@ -0,0 +1,3 @@
1
+ (defvar sliced (slice '(1 2 3 4)))
2
+
3
+ (defvar other (slice '(1 2 3 4) 0 2))