apricot 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.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/.ruby-version +1 -1
- data/.travis.yml +1 -0
- data/Gemfile.lock +229 -11
- data/README.md +46 -29
- data/Rakefile +1 -1
- data/apricot.gemspec +7 -3
- data/benchmarks/factorial.rb +51 -0
- data/benchmarks/interpolate.rb +20 -0
- data/bin/apricot +5 -23
- data/examples/bot.apr +1 -4
- data/examples/cinch-bot.apr +3 -3
- data/examples/sinatra.apr +9 -0
- data/kernel/core.apr +124 -75
- data/kernel/repl.apr +37 -0
- data/lib/apricot.rb +7 -26
- data/lib/apricot/boot.rb +24 -0
- data/lib/apricot/code_loader.rb +108 -0
- data/lib/apricot/compiler.rb +265 -32
- data/lib/apricot/generator.rb +10 -3
- data/lib/apricot/identifier.rb +25 -10
- data/lib/apricot/list.rb +28 -41
- data/lib/apricot/macroexpand.rb +14 -8
- data/lib/apricot/misc.rb +2 -1
- data/lib/apricot/namespace.rb +20 -3
- data/lib/apricot/{parser.rb → reader.rb} +221 -194
- data/lib/apricot/repl.rb +67 -24
- data/lib/apricot/ruby_ext.rb +27 -16
- data/lib/apricot/scopes.rb +159 -0
- data/lib/apricot/seq.rb +43 -1
- data/lib/apricot/special_forms.rb +16 -695
- data/lib/apricot/special_forms/def.rb +32 -0
- data/lib/apricot/special_forms/do.rb +23 -0
- data/lib/apricot/special_forms/dot.rb +112 -0
- data/lib/apricot/special_forms/fn.rb +342 -0
- data/lib/apricot/special_forms/if.rb +31 -0
- data/lib/apricot/special_forms/let.rb +8 -0
- data/lib/apricot/special_forms/loop.rb +10 -0
- data/lib/apricot/special_forms/quote.rb +9 -0
- data/lib/apricot/special_forms/recur.rb +26 -0
- data/lib/apricot/special_forms/try.rb +146 -0
- data/lib/apricot/variables.rb +65 -0
- data/lib/apricot/version.rb +1 -1
- data/spec/compiler_spec.rb +53 -450
- data/spec/fn_spec.rb +206 -0
- data/spec/list_spec.rb +1 -1
- data/spec/reader_spec.rb +349 -0
- data/spec/spec_helper.rb +40 -4
- data/spec/special_forms_spec.rb +203 -0
- metadata +99 -133
- data/lib/apricot/ast.rb +0 -3
- data/lib/apricot/ast/identifier.rb +0 -111
- data/lib/apricot/ast/list.rb +0 -99
- data/lib/apricot/ast/literals.rb +0 -240
- data/lib/apricot/ast/node.rb +0 -45
- data/lib/apricot/ast/scopes.rb +0 -147
- data/lib/apricot/ast/toplevel.rb +0 -66
- data/lib/apricot/ast/variables.rb +0 -64
- data/lib/apricot/printers.rb +0 -12
- data/lib/apricot/stages.rb +0 -60
- data/spec/parser_spec.rb +0 -312
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 0295d0651dd359754c9580022c471cd7ba23c4e6
|
4
|
+
data.tar.gz: fac2f3950287af5573cdd62b2aed0d583da8a31c
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: a3354fab2b0c27a994730be6aaf88220095b8d35638bbfc413a85b5e08c790b71f1c28927c1de4ec6708d11c6de8ec131f4d7b6644d1c3999ed9304a614b1969
|
7
|
+
data.tar.gz: 814994187ebb326df71597fc548d98b1dd7f409bbacc0e43d3435d342de4b5eea44770cca42625cb7392df843b9bfa4b09f0ebd8153b8c1bb43dff2bad4bf0c1
|
data/.gitignore
CHANGED
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
|
1
|
+
rubinius
|
data/.travis.yml
CHANGED
data/Gemfile.lock
CHANGED
@@ -2,25 +2,243 @@ PATH
|
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
4
|
apricot (0.0.1)
|
5
|
+
rubysl (~> 2.0)
|
5
6
|
|
6
7
|
GEM
|
7
8
|
remote: https://rubygems.org/
|
8
9
|
specs:
|
9
|
-
diff-lcs (1.2.
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
rspec
|
16
|
-
|
10
|
+
diff-lcs (1.2.4)
|
11
|
+
ffi2-generators (0.1.1)
|
12
|
+
minitest (4.7.5)
|
13
|
+
psych (2.0.1)
|
14
|
+
racc (1.4.9)
|
15
|
+
rake (10.1.0)
|
16
|
+
rspec (2.14.1)
|
17
|
+
rspec-core (~> 2.14.0)
|
18
|
+
rspec-expectations (~> 2.14.0)
|
19
|
+
rspec-mocks (~> 2.14.0)
|
20
|
+
rspec-core (2.14.5)
|
21
|
+
rspec-expectations (2.14.3)
|
17
22
|
diff-lcs (>= 1.1.3, < 2.0)
|
18
|
-
rspec-mocks (2.
|
23
|
+
rspec-mocks (2.14.3)
|
24
|
+
rubysl (2.0.7)
|
25
|
+
minitest (~> 4.5)
|
26
|
+
psych (~> 2.0)
|
27
|
+
racc (~> 1.4)
|
28
|
+
rubysl-abbrev (~> 2.0)
|
29
|
+
rubysl-base64 (~> 2.0)
|
30
|
+
rubysl-benchmark (~> 2.0)
|
31
|
+
rubysl-bigdecimal (~> 2.0)
|
32
|
+
rubysl-cgi (~> 2.0)
|
33
|
+
rubysl-cgi-session (~> 2.0)
|
34
|
+
rubysl-cmath (~> 2.0)
|
35
|
+
rubysl-complex (~> 2.0)
|
36
|
+
rubysl-continuation (~> 2.0)
|
37
|
+
rubysl-coverage (~> 2.0)
|
38
|
+
rubysl-csv (~> 2.0)
|
39
|
+
rubysl-curses (~> 2.0)
|
40
|
+
rubysl-date (~> 2.0)
|
41
|
+
rubysl-delegate (~> 2.0)
|
42
|
+
rubysl-digest (~> 2.0)
|
43
|
+
rubysl-drb (~> 2.0)
|
44
|
+
rubysl-e2mmap (~> 2.0)
|
45
|
+
rubysl-english (~> 2.0)
|
46
|
+
rubysl-enumerator (~> 2.0)
|
47
|
+
rubysl-erb (~> 2.0)
|
48
|
+
rubysl-etc (~> 2.0)
|
49
|
+
rubysl-expect (~> 2.0)
|
50
|
+
rubysl-fcntl (~> 2.0)
|
51
|
+
rubysl-fiber (~> 2.0)
|
52
|
+
rubysl-fileutils (~> 2.0)
|
53
|
+
rubysl-find (~> 2.0)
|
54
|
+
rubysl-forwardable (~> 2.0)
|
55
|
+
rubysl-getoptlong (~> 2.0)
|
56
|
+
rubysl-gserver (~> 2.0)
|
57
|
+
rubysl-io-console (~> 2.0)
|
58
|
+
rubysl-io-nonblock (~> 2.0)
|
59
|
+
rubysl-io-wait (~> 2.0)
|
60
|
+
rubysl-ipaddr (~> 2.0)
|
61
|
+
rubysl-irb (~> 2.0)
|
62
|
+
rubysl-json (~> 2.0)
|
63
|
+
rubysl-logger (~> 2.0)
|
64
|
+
rubysl-mathn (~> 2.0)
|
65
|
+
rubysl-matrix (~> 2.0)
|
66
|
+
rubysl-mkmf (~> 2.0)
|
67
|
+
rubysl-monitor (~> 2.0)
|
68
|
+
rubysl-mutex_m (~> 2.0)
|
69
|
+
rubysl-net-ftp (~> 2.0)
|
70
|
+
rubysl-net-http (~> 2.0)
|
71
|
+
rubysl-net-imap (~> 2.0)
|
72
|
+
rubysl-net-pop (~> 2.0)
|
73
|
+
rubysl-net-protocol (~> 2.0)
|
74
|
+
rubysl-net-smtp (~> 2.0)
|
75
|
+
rubysl-net-telnet (~> 2.0)
|
76
|
+
rubysl-nkf (~> 2.0)
|
77
|
+
rubysl-observer (~> 2.0)
|
78
|
+
rubysl-open-uri (~> 2.0)
|
79
|
+
rubysl-open3 (~> 2.0)
|
80
|
+
rubysl-openssl (~> 2.0)
|
81
|
+
rubysl-optparse (~> 2.0)
|
82
|
+
rubysl-ostruct (~> 2.0)
|
83
|
+
rubysl-pathname (~> 2.0)
|
84
|
+
rubysl-prettyprint (~> 2.0)
|
85
|
+
rubysl-prime (~> 2.0)
|
86
|
+
rubysl-profile (~> 2.0)
|
87
|
+
rubysl-profiler (~> 2.0)
|
88
|
+
rubysl-pstore (~> 2.0)
|
89
|
+
rubysl-pty (~> 2.0)
|
90
|
+
rubysl-rational (~> 2.0)
|
91
|
+
rubysl-readline (~> 2.0)
|
92
|
+
rubysl-resolv (~> 2.0)
|
93
|
+
rubysl-rexml (~> 2.0)
|
94
|
+
rubysl-rinda (~> 2.0)
|
95
|
+
rubysl-ripper (~> 2.0)
|
96
|
+
rubysl-rss (~> 2.0)
|
97
|
+
rubysl-scanf (~> 2.0)
|
98
|
+
rubysl-securerandom (~> 2.0)
|
99
|
+
rubysl-set (~> 2.0)
|
100
|
+
rubysl-shellwords (~> 2.0)
|
101
|
+
rubysl-singleton (~> 2.0)
|
102
|
+
rubysl-socket (~> 2.0)
|
103
|
+
rubysl-stringio (~> 2.0)
|
104
|
+
rubysl-strscan (~> 2.0)
|
105
|
+
rubysl-syslog (~> 2.0)
|
106
|
+
rubysl-tempfile (~> 2.0)
|
107
|
+
rubysl-test-unit (~> 2.0)
|
108
|
+
rubysl-thread (~> 2.0)
|
109
|
+
rubysl-thwait (~> 2.0)
|
110
|
+
rubysl-time (~> 2.0)
|
111
|
+
rubysl-timeout (~> 2.0)
|
112
|
+
rubysl-tmpdir (~> 2.0)
|
113
|
+
rubysl-tracer (~> 2.0)
|
114
|
+
rubysl-tsort (~> 2.0)
|
115
|
+
rubysl-un (~> 2.0)
|
116
|
+
rubysl-uri (~> 2.0)
|
117
|
+
rubysl-weakref (~> 2.0)
|
118
|
+
rubysl-webrick (~> 2.0)
|
119
|
+
rubysl-xmlrpc (~> 2.0)
|
120
|
+
rubysl-yaml (~> 2.0)
|
121
|
+
rubysl-zlib (~> 2.0)
|
122
|
+
rubysl-abbrev (2.0.2)
|
123
|
+
rubysl-base64 (2.0.0)
|
124
|
+
rubysl-benchmark (2.0.0)
|
125
|
+
rubysl-bigdecimal (2.0.2)
|
126
|
+
rubysl-cgi (2.0.0)
|
127
|
+
rubysl-cgi-session (2.0.0)
|
128
|
+
rubysl-cmath (2.0.0)
|
129
|
+
rubysl-complex (2.0.0)
|
130
|
+
rubysl-continuation (2.0.0)
|
131
|
+
rubysl-coverage (2.0.3)
|
132
|
+
rubysl-csv (2.0.1)
|
133
|
+
rubysl-english (~> 2.0)
|
134
|
+
rubysl-curses (2.0.0)
|
135
|
+
rubysl-date (2.0.5)
|
136
|
+
rubysl-delegate (2.0.0)
|
137
|
+
rubysl-digest (2.0.2)
|
138
|
+
rubysl-drb (2.0.1)
|
139
|
+
rubysl-e2mmap (2.0.0)
|
140
|
+
rubysl-english (2.0.0)
|
141
|
+
rubysl-enumerator (2.0.0)
|
142
|
+
rubysl-erb (2.0.0)
|
143
|
+
rubysl-etc (2.0.3)
|
144
|
+
ffi2-generators (~> 0.1)
|
145
|
+
rubysl-expect (2.0.0)
|
146
|
+
rubysl-fcntl (2.0.4)
|
147
|
+
ffi2-generators (~> 0.1)
|
148
|
+
rubysl-fiber (2.0.0)
|
149
|
+
rubysl-fileutils (2.0.2)
|
150
|
+
rubysl-find (2.0.0)
|
151
|
+
rubysl-forwardable (2.0.0)
|
152
|
+
rubysl-getoptlong (2.0.0)
|
153
|
+
rubysl-gserver (2.0.0)
|
154
|
+
rubysl-socket (~> 2.0)
|
155
|
+
rubysl-thread (~> 2.0)
|
156
|
+
rubysl-io-console (2.0.0)
|
157
|
+
rubysl-io-nonblock (2.0.0)
|
158
|
+
rubysl-io-wait (2.0.0)
|
159
|
+
rubysl-ipaddr (2.0.0)
|
160
|
+
rubysl-irb (2.0.3)
|
161
|
+
rubysl-e2mmap (~> 2.0)
|
162
|
+
rubysl-mathn (~> 2.0)
|
163
|
+
rubysl-readline (~> 2.0)
|
164
|
+
rubysl-thread (~> 2.0)
|
165
|
+
rubysl-tracer (~> 2.0)
|
166
|
+
rubysl-json (2.0.2)
|
167
|
+
rubysl-logger (2.0.0)
|
168
|
+
rubysl-mathn (2.0.0)
|
169
|
+
rubysl-matrix (2.1.0)
|
170
|
+
rubysl-e2mmap (~> 2.0)
|
171
|
+
rubysl-mkmf (2.0.1)
|
172
|
+
rubysl-fileutils (~> 2.0)
|
173
|
+
rubysl-shellwords (~> 2.0)
|
174
|
+
rubysl-monitor (2.0.0)
|
175
|
+
rubysl-mutex_m (2.0.0)
|
176
|
+
rubysl-net-ftp (2.0.1)
|
177
|
+
rubysl-net-http (2.0.4)
|
178
|
+
rubysl-cgi (~> 2.0)
|
179
|
+
rubysl-erb (~> 2.0)
|
180
|
+
rubysl-singleton (~> 2.0)
|
181
|
+
rubysl-net-imap (2.0.1)
|
182
|
+
rubysl-net-pop (2.0.1)
|
183
|
+
rubysl-net-protocol (2.0.1)
|
184
|
+
rubysl-net-smtp (2.0.1)
|
185
|
+
rubysl-net-telnet (2.0.0)
|
186
|
+
rubysl-nkf (2.0.0)
|
187
|
+
rubysl-observer (2.0.0)
|
188
|
+
rubysl-open-uri (2.0.0)
|
189
|
+
rubysl-open3 (2.0.0)
|
190
|
+
rubysl-openssl (2.0.0)
|
191
|
+
rubysl-optparse (2.0.1)
|
192
|
+
rubysl-shellwords (~> 2.0)
|
193
|
+
rubysl-ostruct (2.0.4)
|
194
|
+
rubysl-pathname (2.0.0)
|
195
|
+
rubysl-prettyprint (2.0.1)
|
196
|
+
rubysl-prime (2.0.0)
|
197
|
+
rubysl-profile (2.0.0)
|
198
|
+
rubysl-profiler (2.0.1)
|
199
|
+
rubysl-pstore (2.0.0)
|
200
|
+
rubysl-pty (2.0.1)
|
201
|
+
rubysl-rational (2.0.1)
|
202
|
+
rubysl-readline (2.0.2)
|
203
|
+
rubysl-resolv (2.0.0)
|
204
|
+
rubysl-rexml (2.0.1)
|
205
|
+
rubysl-rinda (2.0.0)
|
206
|
+
rubysl-ripper (2.0.0)
|
207
|
+
rubysl-rss (2.0.0)
|
208
|
+
rubysl-scanf (2.0.0)
|
209
|
+
rubysl-securerandom (2.0.0)
|
210
|
+
rubysl-set (2.0.1)
|
211
|
+
rubysl-shellwords (2.0.0)
|
212
|
+
rubysl-singleton (2.0.0)
|
213
|
+
rubysl-socket (2.0.0)
|
214
|
+
rubysl-stringio (2.0.0)
|
215
|
+
rubysl-strscan (2.0.0)
|
216
|
+
rubysl-syslog (2.0.1)
|
217
|
+
ffi2-generators (~> 0.1)
|
218
|
+
rubysl-tempfile (2.0.0)
|
219
|
+
rubysl-test-unit (2.0.1)
|
220
|
+
minitest (~> 4.7)
|
221
|
+
rubysl-thread (2.0.2)
|
222
|
+
rubysl-thwait (2.0.0)
|
223
|
+
rubysl-time (2.0.2)
|
224
|
+
rubysl-timeout (2.0.0)
|
225
|
+
rubysl-tmpdir (2.0.0)
|
226
|
+
rubysl-tracer (2.0.0)
|
227
|
+
rubysl-tsort (2.0.1)
|
228
|
+
rubysl-un (2.0.0)
|
229
|
+
rubysl-fileutils (~> 2.0)
|
230
|
+
rubysl-optparse (~> 2.0)
|
231
|
+
rubysl-uri (2.0.0)
|
232
|
+
rubysl-weakref (2.0.0)
|
233
|
+
rubysl-webrick (2.0.0)
|
234
|
+
rubysl-xmlrpc (2.0.0)
|
235
|
+
rubysl-yaml (2.0.0)
|
236
|
+
rubysl-zlib (2.0.0)
|
19
237
|
|
20
238
|
PLATFORMS
|
21
239
|
ruby
|
22
240
|
|
23
241
|
DEPENDENCIES
|
24
242
|
apricot!
|
25
|
-
rake (~> 10.0
|
26
|
-
rspec (~> 2.
|
243
|
+
rake (~> 10.1.0)
|
244
|
+
rspec (~> 2.14.0)
|
data/README.md
CHANGED
@@ -1,37 +1,34 @@
|
|
1
|
-
# Apricot [](http://badge.fury.io/rb/apricot) [](http://travis-ci.org/apricot-lang/apricot) [](https://gemnasium.com/apricot-lang/apricot)
|
2
2
|
|
3
|
-
A Clojure-like Lisp on Rubinius.
|
3
|
+
A Clojure-like Lisp on [Rubinius](http://rubini.us/).
|
4
4
|
|
5
5
|
Try to contain your excitement, please.
|
6
6
|
|
7
7
|
|
8
|
-
##
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
mode. We make this easy in the Apricot repository with the `.ruby-version`
|
13
|
-
file which RVM automatically reads to figure out which Ruby to switch to.
|
8
|
+
## Install
|
9
|
+
|
10
|
+
First of all, you're going to need Rubinius. I recommend installing the latest
|
11
|
+
Rubinius with Ruby 1.9-mode default from [RVM](https://rvm.io/).
|
14
12
|
|
15
13
|
``` sh
|
16
14
|
$ rvm install rbx-head --1.9
|
17
|
-
$ rvm use rbx
|
18
|
-
$ gem install
|
19
|
-
$ bundle
|
15
|
+
$ rvm use rbx
|
16
|
+
$ gem install apricot
|
20
17
|
```
|
21
18
|
|
19
|
+
To use Apricot you must be running Rubinius in Ruby 1.9 mode.
|
20
|
+
|
21
|
+
|
22
22
|
## The REPL
|
23
|
-
Apricot provides a nice read-eval-print-loop with line editing, history,
|
24
|
-
tab-completion, and some interesting commands like `!bytecode`. To enter the
|
25
|
-
REPL just run:
|
26
23
|
|
27
|
-
|
28
|
-
|
29
|
-
|
24
|
+
Apricot provides an awesome read-eval-print-loop with line editing, history,
|
25
|
+
tab-completion, and some interesting commands like `!bytecode`. To enter the
|
26
|
+
REPL just run `apricot`.
|
30
27
|
|
31
|
-
Once in the repl you can
|
32
|
-
|
33
|
-
|
34
|
-
|
28
|
+
Once in the repl you can get help with `!help` or use `(doc <name>)` to see
|
29
|
+
the documentation of any function or macro. Play around, read
|
30
|
+
`kernel/core.apr` and try out our functions, and make some of your own.
|
31
|
+
Experiment. Tell us what you think!
|
35
32
|
|
36
33
|
``` clojure
|
37
34
|
apr> (+ 1 2 3)
|
@@ -54,28 +51,48 @@ comp
|
|
54
51
|
=> nil
|
55
52
|
```
|
56
53
|
|
54
|
+
|
57
55
|
## Hello World
|
56
|
+
|
58
57
|
So you want to put your program in a file and not type it into the REPL? Sure:
|
59
58
|
|
60
59
|
``` sh
|
61
60
|
$ cat hello.apr
|
62
|
-
(
|
63
|
-
$
|
61
|
+
(println "Hello, world!")
|
62
|
+
$ apricot hello.apr
|
64
63
|
Hello, world!
|
65
64
|
```
|
66
65
|
|
66
|
+
|
67
|
+
## Development
|
68
|
+
|
69
|
+
If you want to hack on Apricot, first install Rubinius as explained above.
|
70
|
+
When you `cd` to the Apricot git repo, RVM should automatically switch to
|
71
|
+
Rubinius thanks to the `.ruby-version` file. Now install and run Bundler:
|
72
|
+
|
73
|
+
``` sh
|
74
|
+
$ gem install bundler
|
75
|
+
$ bundle
|
76
|
+
```
|
77
|
+
|
78
|
+
You're all set. Run the tests with `rake` and run the bleeding edge REPL with
|
79
|
+
`ruby -Ilib bin/apricot`. Similarily, use `irb -Ilib -rapricot` for an IRB
|
80
|
+
session with Apricot loaded.
|
81
|
+
|
82
|
+
|
67
83
|
## Contact / Bug Reports
|
68
|
-
|
69
|
-
|
70
|
-
[
|
71
|
-
|
84
|
+
|
85
|
+
If you have any questions don't hesitate to email us or visit us in `#apricot`
|
86
|
+
on [freenode](http://freenode.net/) (we are `curtism` and `tsion`). And we'd
|
87
|
+
really appreciate it if you opened bug reports on the GitHub [issue
|
88
|
+
tracker](https://github.com/programble/apricot/issues)!
|
72
89
|
|
73
90
|
|
74
91
|
## License
|
75
92
|
|
76
|
-
Copyright (c) 2012-2013, Curtis McEnroe
|
93
|
+
Copyright (c) 2012-2013, Curtis McEnroe \<programble@gmail.com>
|
77
94
|
|
78
|
-
Copyright (c) 2012-2013, Scott Olson
|
95
|
+
Copyright (c) 2012-2013, Scott Olson \<scott@scott-olson.org>
|
79
96
|
|
80
97
|
Permission to use, copy, modify, and/or distribute this software for any
|
81
98
|
purpose with or without fee is hereby granted, provided that the above
|
data/Rakefile
CHANGED
data/apricot.gemspec
CHANGED
@@ -6,7 +6,7 @@ Gem::Specification.new do |s|
|
|
6
6
|
s.version = Apricot::VERSION
|
7
7
|
s.authors = ["Curtis McEnroe", "Scott Olson"]
|
8
8
|
s.email = ["programble@gmail.com", "scott@scott-olson.org"]
|
9
|
-
s.homepage = "https://github.com/
|
9
|
+
s.homepage = "https://github.com/apricot-lang/apricot"
|
10
10
|
s.license = "ISC"
|
11
11
|
s.summary = "A Clojure-like programming language on Rubinius"
|
12
12
|
s.description = "A compiler for a Clojure-like programming language on the Rubinius VM"
|
@@ -16,7 +16,11 @@ Gem::Specification.new do |s|
|
|
16
16
|
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
17
17
|
s.require_paths = ["lib"]
|
18
18
|
|
19
|
-
s.
|
20
|
-
|
19
|
+
s.add_dependency "rubysl", "~> 2.0"
|
20
|
+
|
21
|
+
s.add_development_dependency "rake", "~> 10.1.0"
|
22
|
+
s.add_development_dependency "rspec", "~> 2.14.0"
|
23
|
+
#s.add_development_dependency "simplecov", "~> 0.7.0"
|
24
|
+
#s.add_development_dependency "rubinius-coverage", "~> 2.0"
|
21
25
|
end
|
22
26
|
|
@@ -0,0 +1,51 @@
|
|
1
|
+
$LOAD_PATH.unshift(File.expand_path('../../lib', __FILE__))
|
2
|
+
require 'apricot'
|
3
|
+
|
4
|
+
begin
|
5
|
+
require 'benchmark/ips'
|
6
|
+
rescue LoadError
|
7
|
+
$stderr.puts "The benchmark-ips gem is not installed."
|
8
|
+
exit 1
|
9
|
+
end
|
10
|
+
|
11
|
+
ruby_loop = lambda do |n|
|
12
|
+
cnt = n
|
13
|
+
acc = 1
|
14
|
+
|
15
|
+
while cnt > 0
|
16
|
+
acc *= cnt
|
17
|
+
cnt -= 1
|
18
|
+
end
|
19
|
+
|
20
|
+
acc
|
21
|
+
end
|
22
|
+
|
23
|
+
apricot_loop = Apricot::Compiler.eval <<CODE
|
24
|
+
(fn [n]
|
25
|
+
(loop [n n acc 1]
|
26
|
+
(if (pos? n)
|
27
|
+
(recur (dec n) (* n acc))
|
28
|
+
acc)))
|
29
|
+
CODE
|
30
|
+
|
31
|
+
ruby_reduce = lambda do |n|
|
32
|
+
(1..n).reduce(1, :*)
|
33
|
+
end
|
34
|
+
|
35
|
+
apricot_reduce_1 = Apricot::Compiler.eval <<CODE
|
36
|
+
(fn [n] (.reduce (Range. 1 n) 1 :*))
|
37
|
+
CODE
|
38
|
+
|
39
|
+
apricot_reduce_2 = Apricot::Compiler.eval <<CODE
|
40
|
+
(fn [n] (reduce * (Range. 1 n)))
|
41
|
+
CODE
|
42
|
+
|
43
|
+
n = 100
|
44
|
+
|
45
|
+
Benchmark.ips do |x|
|
46
|
+
x.report("ruby loop") { ruby_loop.call(n) }
|
47
|
+
x.report("apricot loop") { apricot_loop.call(n) }
|
48
|
+
x.report("ruby reduce") { ruby_reduce.call(n) }
|
49
|
+
x.report("apricot reduce 1") { apricot_reduce_1.call(n) }
|
50
|
+
x.report("apricot reduce 2") { apricot_reduce_2.call(n) }
|
51
|
+
end
|