nendo 0.0.1

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 (5) hide show
  1. data/README +10 -0
  2. data/bin/nendo +17 -0
  3. data/lib/init.nnd +486 -0
  4. data/lib/nendo.rb +1270 -0
  5. metadata +58 -0
data/README ADDED
@@ -0,0 +1,10 @@
1
+
2
+
3
+ Nendo is a dialect of Lisp written in Ruby.
4
+ http://oldtype.sumibi.org/show-page/Nendo
5
+
6
+
7
+ This software is open source, covered by a BSD-style license.
8
+ Please read accompanying file COPYING.
9
+
10
+
data/bin/nendo ADDED
@@ -0,0 +1,17 @@
1
+ #!/usr/local/bin/ruby -W0
2
+ #
3
+ # Nendo: "Principle of Least Surprise (for Rubyist)"
4
+ #
5
+ require 'nendo'
6
+
7
+ def main
8
+ core = Nendo.new()
9
+ core.loadInitFile
10
+ if 0 < ARGV.length
11
+ core.load( ARGV[0] )
12
+ else
13
+ core.repl
14
+ end
15
+ end
16
+
17
+ main
data/lib/init.nnd ADDED
@@ -0,0 +1,486 @@
1
+ ;;-*- mode: nendo; syntax: scheme -*-;;
2
+
3
+ ;; ----------------------------------------
4
+ ;; define
5
+ ;; ----------------------------------------
6
+ (set! define
7
+ (macro (arg . body)
8
+ (if (not (pair? arg))
9
+ (cons 'set!
10
+ (cons arg
11
+ body))
12
+ (cons 'set!
13
+ (cons (car arg)
14
+ (list
15
+ (cons 'lambda
16
+ (cons (cdr arg)
17
+ body))))))))
18
+
19
+ ;; ----------------------------------------
20
+ ;; car and cdr functions
21
+ ;; ----------------------------------------
22
+ (define (caar x) (car (car x)))
23
+ (define (cadr x) (car (cdr x)))
24
+ (define (cdar x) (cdr (car x)))
25
+ (define (cddr x) (cdr (cdr x)))
26
+ (define (caaar x) (car (car (car x))))
27
+ (define (caadr x) (car (car (cdr x))))
28
+ (define (cadar x) (car (cdr (car x))))
29
+ (define (caddr x) (car (cdr (cdr x))))
30
+ (define (cdaar x) (cdr (car (car x))))
31
+ (define (cdadr x) (cdr (car (cdr x))))
32
+ (define (cddar x) (cdr (cdr (car x))))
33
+ (define (cdddr x) (cdr (cdr (cdr x))))
34
+ (define (caaaar x) (car (car (car (car x)))))
35
+ (define (caaadr x) (car (car (car (cdr x)))))
36
+ (define (caadar x) (car (car (cdr (car x)))))
37
+ (define (caaddr x) (car (car (cdr (cdr x)))))
38
+ (define (cadaar x) (car (cdr (car (car x)))))
39
+ (define (cadadr x) (car (cdr (car (cdr x)))))
40
+ (define (caddar x) (car (cdr (cdr (car x)))))
41
+ (define (cadddr x) (car (cdr (cdr (cdr x)))))
42
+ (define (cdaaar x) (cdr (car (car (car x)))))
43
+ (define (cdaadr x) (cdr (car (car (cdr x)))))
44
+ (define (cdadar x) (cdr (car (cdr (car x)))))
45
+ (define (cdaddr x) (cdr (car (cdr (cdr x)))))
46
+ (define (cddaar x) (cdr (cdr (car (car x)))))
47
+ (define (cddadr x) (cdr (cdr (car (cdr x)))))
48
+ (define (cdddar x) (cdr (cdr (cdr (car x)))))
49
+ (define (cddddr x) (cdr (cdr (cdr (cdr x)))))
50
+
51
+
52
+ ;; ----------------------------------------
53
+ ;; List Utility functions
54
+ ;; ----------------------------------------
55
+ (define iota range)
56
+
57
+ (define (append a b)
58
+ (define (append-reverse a b)
59
+ (if (pair? a)
60
+ (append-reverse (cdr a) (cons (car a) b))
61
+ b))
62
+ (append-reverse (reverse a) b))
63
+
64
+ ;; ----------------------------------------
65
+ ;; Utility functions
66
+ ;; ----------------------------------------
67
+ (define (even? n) (= (% n 2) 0))
68
+ (define (odd? n) (not (= (% n 2) 0)))
69
+ (define (zero? n) (= n 0))
70
+ (define (positive? n) (> n 0))
71
+ (define (negative? n) (< n 0))
72
+ (define (abs n) (if (>= n 0) n (- n)))
73
+ (define (max . lst)
74
+ (foldr (lambda (a b) (if (> a b) a b)) (car lst) (cdr lst)))
75
+ (define (min . lst)
76
+ (foldr (lambda (a b) (if (< a b) a b)) (car lst) (cdr lst)))
77
+ (define (succ x) (+ x 1))
78
+ (define (pred x) (- x 1))
79
+ (define (nth n lst)
80
+ (define (nth-iter n index lst)
81
+ (if (null? lst)
82
+ nil
83
+ (if (not (pair? lst))
84
+ (error "Error: nth got improper list.")
85
+ (if (eqv? n index)
86
+ (car lst)
87
+ (nth-iter n (+ index 1) (cdr lst))))))
88
+ (nth-iter n 0 lst))
89
+ (define (first lst) (nth 0 lst))
90
+ (define (second lst) (nth 1 lst))
91
+ (define (third lst) (nth 2 lst))
92
+ (define (fourth lst) (nth 3 lst))
93
+ (define (fifth lst) (nth 4 lst))
94
+ (define (sixth lst) (nth 5 lst))
95
+ (define (seventh lst) (nth 6 lst))
96
+ (define (eighth lst) (nth 7 lst))
97
+ (define (ninth lst) (nth 8 lst))
98
+ (define (tenth lst) (nth 9 lst))
99
+
100
+
101
+ ;; ----------------------------------------
102
+ ;; basic forms
103
+ ;; ----------------------------------------
104
+ (define (macroexpand sexp)
105
+ (let ((newsexp (macroexpand-1 sexp)))
106
+ (if (not (equal? sexp newsexp))
107
+ (macroexpand newsexp)
108
+ newsexp)))
109
+
110
+ (define (feedto)
111
+ (error "=> (feedto) appeared outside cond or case."))
112
+
113
+ (define cond
114
+ (macro lst
115
+ (define (case-block elem . elseblock)
116
+ (let ((condition (if (eq? 'else (car elem))
117
+ true
118
+ (car elem)))
119
+ (body (cdr elem))
120
+ (tmpsym (gensym)))
121
+ ;;(display "CONDITION") (print condition)
122
+ ;;(display "BODY") (print body)
123
+ ;;(display "TMPSYM") (print tmpsym)
124
+ (append
125
+ (if (eq? 'feedto (car body))
126
+ (cons 'if
127
+ (list
128
+ (list 'set! tmpsym condition)
129
+ (list (cadr body) tmpsym)))
130
+ (cons 'if
131
+ (list
132
+ condition
133
+ (cons 'begin body))))
134
+ (if (< 0 (length elseblock))
135
+ elseblock
136
+ '()))))
137
+
138
+ (define (cond-iter lst)
139
+ (if (eq? 0 (length lst))
140
+ '()
141
+ (if (eq? 1 (length lst))
142
+ (case-block (car lst) '())
143
+ (case-block (car lst)
144
+ (cond-iter (cdr lst))))))
145
+
146
+ (cond-iter lst)))
147
+
148
+ (define let1
149
+ (macro (var expr . body)
150
+ (append
151
+ (list 'let (list (list var expr)))
152
+ body)))
153
+
154
+ (define or
155
+ (macro lst
156
+ (define (or-iter lst)
157
+ (cond
158
+ ((eq? 0 (length lst))
159
+ false)
160
+ ((eq? 1 (length lst))
161
+ (let1 sym (gensym)
162
+ (list 'let1 sym (car lst)
163
+ (list 'if sym sym false))))
164
+ (else
165
+ (let1 sym (gensym)
166
+ (list 'let1 sym (car lst)
167
+ (list 'if sym sym (or-iter (cdr lst))))))))
168
+ (or-iter lst)))
169
+
170
+ (define and
171
+ (macro lst
172
+ (define (and-iter lst)
173
+ (cond
174
+ ((eq? 0 (length lst))
175
+ true)
176
+ ((eq? 1 (length lst))
177
+ (car lst))
178
+ (else
179
+ (list 'if (list 'not (list 'eq? 'false (car lst)))
180
+ (and-iter (cdr lst))
181
+ 'false))))
182
+ (and-iter lst)))
183
+
184
+ (define apply
185
+ (macro (proc . args)
186
+ (define (strip-quote lst)
187
+ (if (eq? 'quote (car lst))
188
+ (cadr lst)
189
+ lst))
190
+ (define (apply-iter lst)
191
+ (cond
192
+ ((eq? 0 (length lst))
193
+ '())
194
+ ((eq? 1 (length lst))
195
+ (if (pair? (car lst))
196
+ (strip-quote (car lst))
197
+ (error "not a proper list")))
198
+ (else
199
+ (append (list (car lst)) (apply-iter (cdr lst))))))
200
+ (append (list proc) (apply-iter args))))
201
+
202
+
203
+ ;; The following quasiquote macro is due to Eric S. Tiedemann. ( Imported from TinyScheme )
204
+ ;; Copyright 1988 by Eric S. Tiedemann; all rights reserved.
205
+ ;;
206
+ ;; Subsequently modified for initialize library for nendo: Kiyoka Nishiyama
207
+ (define quasiquote
208
+ (macro (l)
209
+ (define (mcons f l r)
210
+ (if (and (pair? r)
211
+ (eq? (car r) 'quote)
212
+ (eq? (car (cdr r)) (cdr f))
213
+ (pair? l)
214
+ (eq? (car l) 'quote)
215
+ (eq? (car (cdr l)) (car f)))
216
+ (if (or (procedure? f) (number? f) (string? f))
217
+ f
218
+ (list 'quote f))
219
+ (list 'cons l r)))
220
+ (define (mappend f l r)
221
+ (if (or (null? (cdr f))
222
+ (and (pair? r)
223
+ (eq? (car r) 'quote)
224
+ (eq? (car (cdr r)) '())))
225
+ l
226
+ (list 'append l r)))
227
+ (define (foo level form)
228
+ (cond ((not (pair? form))
229
+ (if (or (procedure? form) (number? form) (string? form))
230
+ form
231
+ (list 'quote form))
232
+ )
233
+ ((eq? 'quasiquote (car form))
234
+ (mcons form ''quasiquote (foo (+ level 1) (cdr form))))
235
+ (else (if (zero? level)
236
+ (cond ((eq? (car form) 'unquote) (car (cdr form)))
237
+ ((eq? (car form) 'unquote-splicing)
238
+ (error "Unquote-splicing wasn't in a list:"
239
+ form))
240
+ ((and (pair? (car form))
241
+ (eq? (car (car form)) 'unquote-splicing))
242
+ (mappend form (car (cdr (car form)))
243
+ (foo level (cdr form))))
244
+ (else (mcons form (foo level (car form))
245
+ (foo level (cdr form)))))
246
+ (cond ((eq? (car form) 'unquote)
247
+ (mcons form ''unquote (foo (- level 1)
248
+ (cdr form))))
249
+ ((eq? (car form) 'unquote-splicing)
250
+ (mcons form ''unquote-splicing
251
+ (foo (- level 1) (cdr form))))
252
+ (else (mcons form (foo level (car form))
253
+ (foo level (cdr form)))))))))
254
+ (foo 0 l)))
255
+
256
+ (define unquote
257
+ (macro (lst)
258
+ (error "unquote appeared outside quasiquote")))
259
+
260
+ (define unquote-splicing
261
+ (macro (lst)
262
+ (error "unquote-splicing appeared outside quasiquote")))
263
+
264
+
265
+ (define when
266
+ (macro form
267
+ `(if ,(car form) (begin ,@(cdr form)))))
268
+
269
+ (define unless
270
+ (macro form
271
+ `(if (not ,(car form)) (begin ,@(cdr form)))))
272
+
273
+ (define while
274
+ (macro form
275
+ (let1 sym (gensym)
276
+ `(begin
277
+ (define ,sym
278
+ (lambda ()
279
+ (if ,(car form)
280
+ (begin ,@(cdr form)
281
+ (,sym)))))
282
+ (,sym)))))
283
+
284
+ (define until
285
+ (macro form
286
+ `(while (not ,(car form))
287
+ ,@(cdr form))))
288
+
289
+
290
+ ;; ----------------------------------------
291
+ ;; List utilities imported from TinyScheme
292
+ ;; ----------------------------------------
293
+ ;; generic-member
294
+ (define (generic-member cmp obj lst)
295
+ (cond
296
+ ((null? lst) false)
297
+ ((cmp obj (car lst)) lst)
298
+ (else (generic-member cmp obj (cdr lst)))))
299
+
300
+ (define (memq obj lst)
301
+ (generic-member eq? obj lst))
302
+ (define (memv obj lst)
303
+ (generic-member eqv? obj lst))
304
+ (define (member obj lst)
305
+ (generic-member equal? obj lst))
306
+
307
+ ;; generic-assoc
308
+ (define (generic-assoc cmp obj alst)
309
+ (cond
310
+ ((null? alst) false)
311
+ ((cmp obj (caar alst)) (car alst))
312
+ (else (generic-assoc cmp obj (cdr alst)))))
313
+
314
+ (define (assq obj alst)
315
+ (generic-assoc eq? obj alst))
316
+ (define (assv obj alst)
317
+ (generic-assoc eqv? obj alst))
318
+ (define (assoc obj alst)
319
+ (generic-assoc equal? obj alst))
320
+
321
+ (define (acons x y z) (cons (cons x y) z))
322
+
323
+ (define (assq-ref obj alst)
324
+ (cond ((assq obj alst) => cdr)
325
+ (else nil)))
326
+ (define (assv-ref obj alst)
327
+ (cond ((assv obj alst) => cdr)
328
+ (else nil)))
329
+ (define (assoc-ref obj alst)
330
+ (cond ((assoc obj alst) => cdr)
331
+ (else nil)))
332
+
333
+
334
+ ;; ----------------------------------------
335
+ ;; Higher-order functions
336
+ ;; ----------------------------------------
337
+ (define (map pred lst)
338
+ (if (null? lst)
339
+ '()
340
+ (cons
341
+ (pred (car lst))
342
+ (map pred (cdr lst)))))
343
+ (define for-each map)
344
+
345
+ (define (filter pred lst)
346
+ (if (null? lst)
347
+ '()
348
+ (let1 result (pred (car lst))
349
+ (if result
350
+ (cons
351
+ result
352
+ (filter pred (cdr lst)))
353
+ (filter pred (cdr lst))))))
354
+
355
+ (define (filter-map pred lst)
356
+ (if (null? lst)
357
+ '()
358
+ (if (pred (car lst))
359
+ (cons
360
+ (car lst)
361
+ (filter-map pred (cdr lst)))
362
+ (filter-map pred (cdr lst)))))
363
+
364
+
365
+ ;; ----------------------------------------
366
+ ;; other forms
367
+ ;; ----------------------------------------
368
+ (define case
369
+ (macro (cond-exp . body)
370
+ (define (case-block val . elem)
371
+ (let1 block (car elem)
372
+ (let ((cond-vals (car block))
373
+ (body (cdr block)))
374
+ (let1 v
375
+ (if (eq? 'else cond-vals)
376
+ cond-vals
377
+ (cons 'or
378
+ (map
379
+ (lambda (x)
380
+ `(eqv? ,x ,val))
381
+ cond-vals)))
382
+ `((,v
383
+ ,@body))))))
384
+
385
+ (define (case-iter val lst)
386
+ (cond
387
+ ((eq? 0 (length lst))
388
+ '())
389
+ ((eq? 1 (length lst))
390
+ (case-block val (car lst)))
391
+ (else
392
+ (append (case-block val (car lst))
393
+ (case-iter val (cdr lst))))))
394
+
395
+ (let1 sym (gensym)
396
+ `(let1 ,sym ,cond-exp
397
+ (cond
398
+ ,@(case-iter sym body))))))
399
+
400
+
401
+ (define let*
402
+ (macro (exps . body)
403
+ (define (let*-expand rest body)
404
+ (case (length rest)
405
+ ((0)
406
+ '())
407
+ ((1)
408
+ `(let (,(car rest))
409
+ ,@body))
410
+ (else
411
+ `(let (,(car rest))
412
+ ,(let*-expand (cdr rest) body)))))
413
+
414
+ (let*-expand exps body)))
415
+
416
+
417
+ ;; ----------------------------------------
418
+ ;; for Ruby interop
419
+ ;; ----------------------------------------
420
+ ;; dot_operator
421
+ (define dot-operator
422
+ (macro lst
423
+ (define (dot-operator-iter lst)
424
+ (cond
425
+ ((null? lst)
426
+ '())
427
+ ((pair? lst)
428
+ (if (eq? 'dot-operator (car lst))
429
+ (intern
430
+ (string-join
431
+ (map
432
+ (lambda (x)
433
+ (if (pair? x)
434
+ (to-s (dot-operator-iter x))
435
+ (if (symbol? x)
436
+ (to-s x)
437
+ (error (sprintf "dot-operator requires symbol, but got %s" x)))))
438
+ (cdr lst))
439
+ "."))
440
+ (error "dot-operator requires symbol or (. symbol symbol) form.")))
441
+ (else
442
+ lst)))
443
+
444
+ (cond
445
+ ((eq? 0 (length lst))
446
+ (error ". operator requires argument"))
447
+ ((and (eq? 1 (length lst))
448
+ (symbol? (car lst)))
449
+ (intern (+ "." (to-s (car lst)))))
450
+ (else
451
+ ((dot-operator-iter
452
+ (cons 'dot-operator lst)))))))
453
+
454
+ (define (with-open filename pred . lst)
455
+ (let1 len (length lst)
456
+ (let1 f (cond
457
+ ((= 0 len)
458
+ (.open filename))
459
+ ((< 0 len)
460
+ (.open filename (car lst)))
461
+ (else
462
+ (error "with-open requires 2 or 3 arguments.")))
463
+ (let1 result (pred f)
464
+ (f.close)
465
+ result))))
466
+
467
+
468
+ ;; ----------------------------------------
469
+ ;; List library functions
470
+ ;; ----------------------------------------
471
+ (define (last-pair x)
472
+ (if (pair? (cdr x))
473
+ (last-pair (cdr x))
474
+ x))
475
+
476
+
477
+ ;; ----------------------------------------
478
+ ;; Utility function for testing
479
+ ;; ----------------------------------------
480
+ ;; pass through the argument value as return value.
481
+ (define (pass x) x)
482
+
483
+ ;; ruby's p like function.
484
+ (define (p x)
485
+ (printf "%s\n" x)
486
+ x)