sibilant 0.0.1 → 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
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))