nendo 0.3.1 → 0.3.2
Sign up to get free protection for your applications and to get access to all the features.
- data/bin/nendo +83 -14
- data/emacs/nendo-mode.el +7 -0
- data/example/cgi/dekamoji.cgi +74 -55
- data/example/fact.nnd +2 -5
- data/example/fizzbuzz1.nnd +5 -3
- data/example/nqueen.nnd +71 -0
- data/example/scratch.nnd +1 -2
- data/lib/debug/syslog.nnd +1 -1
- data/lib/debug/syslog.nndc +9 -0
- data/lib/init.nnd +248 -16
- data/lib/init.nndc +7194 -4456
- data/lib/nendo.rb +220 -50
- data/lib/text/html-lite.nndc +74 -57
- data/lib/text/tree.nndc +9 -0
- metadata +6 -12
data/lib/init.nnd
CHANGED
@@ -2,7 +2,7 @@
|
|
2
2
|
;;;
|
3
3
|
;;; init.nnd - Nendo's init file.
|
4
4
|
;;;
|
5
|
-
;;; Copyright (c)
|
5
|
+
;;; Copyright (c) 2009-2010 Kiyoka Nishiyama <kiyoka@sumibi.org>
|
6
6
|
;;;
|
7
7
|
;;; Redistribution and use in source and binary forms, with or without
|
8
8
|
;;; modification, are permitted provided that the following conditions
|
@@ -57,6 +57,12 @@
|
|
57
57
|
body)))))))))
|
58
58
|
|
59
59
|
|
60
|
+
;; debug-print macro is predefined as NOP.
|
61
|
+
;; for self debugging of init.nnd.
|
62
|
+
(define debug-print
|
63
|
+
(macro (_form sourcefile lineno sourcesexp)
|
64
|
+
_form))
|
65
|
+
|
60
66
|
;; ----------------------------------------
|
61
67
|
;; car and cdr functions
|
62
68
|
;; ----------------------------------------
|
@@ -106,6 +112,7 @@
|
|
106
112
|
;; ----------------------------------------
|
107
113
|
;; Utility functions
|
108
114
|
;; ----------------------------------------
|
115
|
+
(define (vector . lst) (to-arr lst))
|
109
116
|
(define (list? arg)
|
110
117
|
(if (pair? arg)
|
111
118
|
(list? (cdr arg))
|
@@ -241,7 +248,6 @@
|
|
241
248
|
(apply1 proc (append (reverse (cdr lol)) (car lol))))
|
242
249
|
(reverse args))))
|
243
250
|
|
244
|
-
|
245
251
|
;; The following quasiquote macro is due to Eric S. Tiedemann. ( Imported from TinyScheme )
|
246
252
|
;; Copyright 1988 by Eric S. Tiedemann; all rights reserved.
|
247
253
|
;;
|
@@ -259,8 +265,11 @@
|
|
259
265
|
(if (or (procedure? f) (number? f) (string? f))
|
260
266
|
f
|
261
267
|
(list 'quote f))
|
262
|
-
(
|
263
|
-
|
268
|
+
(if (eqv? l vector)
|
269
|
+
(apply l (eval r))
|
270
|
+
(list 'cons l r)
|
271
|
+
))))
|
272
|
+
|
264
273
|
(mappend
|
265
274
|
(lambda (f l r)
|
266
275
|
(if (or (null? (cdr f))
|
@@ -364,6 +373,37 @@
|
|
364
373
|
;; ----------------------------------------
|
365
374
|
;; List utilities imported from TinyScheme
|
366
375
|
;; ----------------------------------------
|
376
|
+
;;
|
377
|
+
;; (do ((var init inc) ...) (endtest result ...) body ...)
|
378
|
+
;;
|
379
|
+
(define do
|
380
|
+
(macro do-macro
|
381
|
+
(apply (lambda (vars endtest . body)
|
382
|
+
(let ((do-loop (gensym)))
|
383
|
+
`(letrec ((,do-loop
|
384
|
+
(lambda ,(map (lambda (x)
|
385
|
+
(if (pair? x) (car x) x))
|
386
|
+
`,vars)
|
387
|
+
(if ,(car endtest)
|
388
|
+
(begin ,@(cdr endtest))
|
389
|
+
(begin
|
390
|
+
,@body
|
391
|
+
(,do-loop
|
392
|
+
,@(map (lambda (x)
|
393
|
+
(cond
|
394
|
+
((not (pair? x)) x)
|
395
|
+
((< (length x) 3) (car x))
|
396
|
+
(else (car (cdr (cdr x))))))
|
397
|
+
`,vars)))))))
|
398
|
+
(,do-loop
|
399
|
+
,@(map (lambda (x)
|
400
|
+
(if (and (pair? x) (cdr x))
|
401
|
+
(car (cdr x))
|
402
|
+
'()))
|
403
|
+
`,vars)))))
|
404
|
+
do-macro)))
|
405
|
+
|
406
|
+
|
367
407
|
;; generic-member
|
368
408
|
(define (generic-member cmp obj lst)
|
369
409
|
(cond
|
@@ -408,13 +448,52 @@
|
|
408
448
|
;; ----------------------------------------
|
409
449
|
;; Higher-order functions
|
410
450
|
;; ----------------------------------------
|
411
|
-
|
412
|
-
|
413
|
-
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
|
451
|
+
;; List utilities imported from TinyScheme by Kiyoka Nishiyama
|
452
|
+
;; and Fixed bugs in `map' and `for-each'.
|
453
|
+
(define (foldr f x lst)
|
454
|
+
(if (null? lst)
|
455
|
+
x
|
456
|
+
(foldr f (f x (car lst)) (cdr lst))))
|
457
|
+
|
458
|
+
(define (unzip1-with-cdr . lists)
|
459
|
+
(unzip1-with-cdr-iterative lists '() '()))
|
460
|
+
|
461
|
+
(define (unzip1-with-cdr-iterative lists cars cdrs)
|
462
|
+
(if (null? lists)
|
463
|
+
(cons cars cdrs)
|
464
|
+
(let ((car1 (caar lists))
|
465
|
+
(cdr1 (cdar lists)))
|
466
|
+
(unzip1-with-cdr-iterative
|
467
|
+
(cdr lists)
|
468
|
+
(append cars (list car1))
|
469
|
+
(append cdrs (list cdr1))))))
|
470
|
+
|
471
|
+
|
472
|
+
(define (map proc . lists)
|
473
|
+
(if (null? lists)
|
474
|
+
(apply proc)
|
475
|
+
(if (null? (car lists))
|
476
|
+
'()
|
477
|
+
(let1 unz (apply unzip1-with-cdr lists)
|
478
|
+
(let ((cars (car unz))
|
479
|
+
(cdrs (cdr unz)))
|
480
|
+
(cons (apply proc cars)
|
481
|
+
(if (null? cdrs)
|
482
|
+
'()
|
483
|
+
(apply map (cons proc cdrs)))))))))
|
484
|
+
|
485
|
+
(define (for-each proc . lists)
|
486
|
+
(if (null? lists)
|
487
|
+
(apply proc)
|
488
|
+
(if (null? (car lists))
|
489
|
+
#t
|
490
|
+
(let1 unz (apply unzip1-with-cdr lists)
|
491
|
+
(let ((cars (car unz))
|
492
|
+
(cdrs (cdr unz)))
|
493
|
+
(apply proc cars)
|
494
|
+
(if (null? cdrs)
|
495
|
+
'()
|
496
|
+
(apply map (cons proc cdrs))))))))
|
418
497
|
|
419
498
|
(define (filter pred lst)
|
420
499
|
(if (null? lst)
|
@@ -454,14 +533,18 @@
|
|
454
533
|
(let ((defs
|
455
534
|
(filter
|
456
535
|
(lambda (x)
|
457
|
-
(
|
458
|
-
|
536
|
+
(if (pair? x)
|
537
|
+
(and (eq? 'define (car x))
|
538
|
+
(symbol? (cadr x)))
|
539
|
+
#f))
|
459
540
|
body))
|
460
541
|
(rest
|
461
542
|
(filter
|
462
543
|
(lambda (x)
|
463
|
-
(
|
464
|
-
|
544
|
+
(if (pair? x)
|
545
|
+
(not (and (eq? 'define (car x))
|
546
|
+
(symbol? (cadr x))))
|
547
|
+
#f))
|
465
548
|
body)))
|
466
549
|
(if (< 0 (length defs))
|
467
550
|
`(lambda
|
@@ -533,6 +616,17 @@
|
|
533
616
|
(let*-expand exps body))))
|
534
617
|
|
535
618
|
|
619
|
+
(define begin0
|
620
|
+
(macro body
|
621
|
+
(if (null? body)
|
622
|
+
'(begin
|
623
|
+
#f)
|
624
|
+
(let1 result (gensym)
|
625
|
+
`(receive ,result ,(car body)
|
626
|
+
,@(cdr body)
|
627
|
+
(apply values ,result))))))
|
628
|
+
|
629
|
+
|
536
630
|
;; ----------------------------------------
|
537
631
|
;; values
|
538
632
|
;; ----------------------------------------
|
@@ -703,6 +797,7 @@
|
|
703
797
|
(error "Error: alist->hash-table expects alist.")
|
704
798
|
(apply hash-table alist)))
|
705
799
|
|
800
|
+
|
706
801
|
;; ----------------------------------------
|
707
802
|
;; Ruby interop librarys
|
708
803
|
;; ----------------------------------------
|
@@ -723,6 +818,60 @@
|
|
723
818
|
(errorf "Error: can't load library file [%s]\n" path )))))
|
724
819
|
|
725
820
|
|
821
|
+
|
822
|
+
;; ----------------------------------------
|
823
|
+
;; Vector Library
|
824
|
+
;; ----------------------------------------
|
825
|
+
(define (vector? v)
|
826
|
+
(v.is_a? Array))
|
827
|
+
|
828
|
+
(define (make-vector k . rest)
|
829
|
+
(if (null? rest)
|
830
|
+
(Array.new k)
|
831
|
+
(Array.new k (car rest))))
|
832
|
+
|
833
|
+
(define (vector-length v)
|
834
|
+
(v.size))
|
835
|
+
|
836
|
+
(define (vector-copy v)
|
837
|
+
(v.clone))
|
838
|
+
|
839
|
+
(define (vector-ref v index . fallback)
|
840
|
+
(if (and (<= 0 index) (< index v.size))
|
841
|
+
(v.fetch index)
|
842
|
+
(if (null? fallback)
|
843
|
+
(errorf "Error: vector-ref index value is overflow: %s\n" index)
|
844
|
+
(car fallback))))
|
845
|
+
|
846
|
+
;;
|
847
|
+
;; ported from tinyscheme-1.39 by Kiyoka Nishiyama
|
848
|
+
;;
|
849
|
+
(define (vector-equal? x y)
|
850
|
+
(and (vector? x) (vector? y) (= (vector-length x) (vector-length y))
|
851
|
+
(let ((n (vector-length x)))
|
852
|
+
(let loop ((i 0))
|
853
|
+
(if (= i n)
|
854
|
+
#t
|
855
|
+
(and (equal? (vector-ref x i) (vector-ref y i))
|
856
|
+
(loop (succ i))))))))
|
857
|
+
|
858
|
+
(define (list->vector x)
|
859
|
+
(apply vector x))
|
860
|
+
|
861
|
+
(define (vector-fill! v e)
|
862
|
+
(let ((n (vector-length v)))
|
863
|
+
(let loop ((i 0))
|
864
|
+
(if (= i n)
|
865
|
+
v
|
866
|
+
(begin (vector-set! v i e) (loop (succ i)))))))
|
867
|
+
|
868
|
+
(define (vector->list v)
|
869
|
+
(let loop ((n (pred (vector-length v))) (l '()))
|
870
|
+
(if (= n -1)
|
871
|
+
l
|
872
|
+
(loop (pred n) (cons (vector-ref v n) l)))))
|
873
|
+
|
874
|
+
|
726
875
|
;; ----------------------------------------
|
727
876
|
;; Utility function for testing and debugging
|
728
877
|
;; ----------------------------------------
|
@@ -782,9 +931,92 @@
|
|
782
931
|
(newline))
|
783
932
|
|
784
933
|
|
934
|
+
|
935
|
+
;; ----------------------------------------
|
936
|
+
;; global variables bind checker
|
937
|
+
;; ----------------------------------------
|
938
|
+
(define (global-defined? sym)
|
939
|
+
(find
|
940
|
+
(lambda (x)
|
941
|
+
(eq? sym x))
|
942
|
+
(global-variables)))
|
943
|
+
|
944
|
+
|
945
|
+
;; ----------------------------------------
|
946
|
+
;; Nendo compiler utility
|
947
|
+
;; ----------------------------------------
|
948
|
+
(define (compiled-code-string compiled-code filename)
|
949
|
+
(define (compiled-body-string string-list filename)
|
950
|
+
(+
|
951
|
+
(string-join
|
952
|
+
string-list
|
953
|
+
"\n#--------------------\n")
|
954
|
+
(string-join
|
955
|
+
`("\n\n"
|
956
|
+
"# -------------------------------------------------------"
|
957
|
+
"# [EOF]"
|
958
|
+
"# -------------------------------------------------------")
|
959
|
+
"\n")))
|
960
|
+
|
961
|
+
(let ((str-list (assv-ref filename compiled-code))
|
962
|
+
(script-flag (and (global-defined? 'main)
|
963
|
+
(procedure? main))))
|
964
|
+
(values
|
965
|
+
script-flag
|
966
|
+
(compiled-body-string str-list filename))))
|
967
|
+
|
968
|
+
|
969
|
+
(define (print-compiled-code src . rest)
|
970
|
+
(define (print-to-file f)
|
971
|
+
(receive (script-flag str)
|
972
|
+
(compiled-code-string (get-compiled-code) src)
|
973
|
+
(cond (script-flag
|
974
|
+
(f.puts (string-join
|
975
|
+
`(
|
976
|
+
"#!/usr/local/bin/ruby"
|
977
|
+
"# -*- encoding: utf-8 -*-"
|
978
|
+
"#"
|
979
|
+
"# This file is nendo's compiled script file. "
|
980
|
+
"# generated \"nendo -c src\" command. "
|
981
|
+
"#"
|
982
|
+
""
|
983
|
+
"require 'rubygems'"
|
984
|
+
"require 'nendo'"
|
985
|
+
""
|
986
|
+
"core = Nendo.new()"
|
987
|
+
"core.loadInitFile()"
|
988
|
+
"core.setArgv( ARGV )"
|
989
|
+
"core.load_compiled_code_from_string( " ,(write-to-string str) " ) "
|
990
|
+
"core.replStr( \"(if (and (global-defined? 'main) (procedure? main)) (main *argv*) #f) \" )"
|
991
|
+
"")
|
992
|
+
"\n")))
|
993
|
+
(else
|
994
|
+
(f.puts (+ (string-join
|
995
|
+
'(
|
996
|
+
"#"
|
997
|
+
"# This file is nendo's compiled library file. "
|
998
|
+
"# generated \"nendo -c src\" command. "
|
999
|
+
"# ")
|
1000
|
+
"\n")
|
1001
|
+
"\n"
|
1002
|
+
str))))))
|
1003
|
+
|
1004
|
+
(when (not (File.exist? src))
|
1005
|
+
(errorf "Error: file [%s] not found." src)
|
1006
|
+
(exit 1))
|
1007
|
+
(clean-compiled-code)
|
1008
|
+
(load src)
|
1009
|
+
(if (null? rest)
|
1010
|
+
(print-to-file STDOUT)
|
1011
|
+
(with-open (car rest)
|
1012
|
+
(lambda (f)
|
1013
|
+
(print-to-file f))
|
1014
|
+
"w")))
|
1015
|
+
|
1016
|
+
|
785
1017
|
;; ----------------------------------------
|
786
1018
|
;; global variables
|
787
1019
|
;; ----------------------------------------
|
788
1020
|
(define *nendo-version*
|
789
|
-
"0.3.
|
1021
|
+
"0.3.2" ;;NENDO-VERSION
|
790
1022
|
)
|