nendo 0.5.0 → 0.5.1
Sign up to get free protection for your applications and to get access to all the features.
- data/emacs/nendo-mode.el +2 -0
- data/lib/init.nnd +51 -35
- data/lib/init.nndc +3371 -2920
- data/lib/nendo.rb +463 -194
- data/lib/srfi-2.nndc +48 -165
- data/lib/srfi-26.nndc +142 -511
- data/lib/text/html-lite.nndc +23 -1
- data/lib/util/combinations.nnd +290 -0
- data/lib/util/combinations.nndc +7218 -0
- data/lib/util/list.nndc +138 -387
- data/lib/util/match.nnd +672 -0
- data/lib/util/match.nndc +81024 -0
- data/test/match-test.nnd +186 -0
- data/test/nendo-util-test.nnd +5 -7
- data/test/nendo_spec.rb +697 -235
- data/test/syntax_spec.rb +561 -52
- data/test/util-combinations-test.nnd +383 -0
- metadata +9 -4
- data/example/scratch.nnd +0 -119
data/test/nendo_spec.rb
CHANGED
@@ -2,24 +2,24 @@
|
|
2
2
|
# -*- encoding: utf-8 -*-
|
3
3
|
#
|
4
4
|
# nendo_spec.rb - "RSpec file for nendo language"
|
5
|
-
#
|
5
|
+
#
|
6
6
|
# Copyright (c) 2009-2010 Kiyoka Nishiyama <kiyoka@sumibi.org>
|
7
|
-
#
|
7
|
+
#
|
8
8
|
# Redistribution and use in source and binary forms, with or without
|
9
9
|
# modification, are permitted provided that the following conditions
|
10
10
|
# are met:
|
11
|
-
#
|
11
|
+
#
|
12
12
|
# 1. Redistributions of source code must retain the above copyright
|
13
13
|
# notice, this list of conditions and the following disclaimer.
|
14
|
-
#
|
14
|
+
#
|
15
15
|
# 2. Redistributions in binary form must reproduce the above copyright
|
16
16
|
# notice, this list of conditions and the following disclaimer in the
|
17
17
|
# documentation and/or other materials provided with the distribution.
|
18
|
-
#
|
18
|
+
#
|
19
19
|
# 3. Neither the name of the authors nor the names of its contributors
|
20
20
|
# may be used to endorse or promote products derived from this
|
21
21
|
# software without specific prior written permission.
|
22
|
-
#
|
22
|
+
#
|
23
23
|
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
24
24
|
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
25
25
|
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
@@ -31,7 +31,7 @@
|
|
31
31
|
# LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
|
32
32
|
# NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
33
33
|
# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
34
|
-
#
|
34
|
+
#
|
35
35
|
require 'nendo'
|
36
36
|
include Nendo
|
37
37
|
|
@@ -56,7 +56,7 @@ describe Cell, "when initialized as '(100)" do
|
|
56
56
|
before do
|
57
57
|
@cell = Cell.new( 100 )
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
it "should" do
|
61
61
|
@cell.isNull.should_not be_true
|
62
62
|
@cell.length.should == 1
|
@@ -75,7 +75,7 @@ describe Cell, "when initialized as '(100 . 200)" do
|
|
75
75
|
before do
|
76
76
|
@cell = Cell.new( 100, 200 )
|
77
77
|
end
|
78
|
-
|
78
|
+
|
79
79
|
it "should" do
|
80
80
|
@cell.isNull.should_not be_true
|
81
81
|
@cell.isDotted.should be_true
|
@@ -95,7 +95,7 @@ describe Cell, "when initialized as '(cons 100 (cons 200 300)) " do
|
|
95
95
|
before do
|
96
96
|
@cell = Cell.new( 100, Cell.new( 200, 300 ))
|
97
97
|
end
|
98
|
-
|
98
|
+
|
99
99
|
it "should" do
|
100
100
|
@cell.isNull.should_not be_true
|
101
101
|
@cell.isDotted.should_not be_true
|
@@ -534,15 +534,15 @@ describe Nendo, "when use quote and syntax-quote " do
|
|
534
534
|
@nendo.evalStr( " (quote (1 . 2)) " ).should == "(1 . 2)"
|
535
535
|
@nendo.evalStr( " (syntax-quote ())" ).should == "()"
|
536
536
|
@nendo.evalStr( " (syntax-quote 1)" ).should == "1"
|
537
|
-
@nendo.evalStr(
|
537
|
+
@nendo.evalStr( ' (syntax-quote "str") ' ).should == '"str"'
|
538
538
|
@nendo.evalStr( " (syntax-quote (1 . 2)) " ).should == "(1 . 2)"
|
539
|
-
@nendo.evalStr( " (quote quote) " ).should == "
|
540
|
-
@nendo.evalStr( " 'quote " ).should == "
|
541
|
-
@nendo.evalStr( " ''1 " ).should == "
|
542
|
-
@nendo.evalStr( " (quote syntax-quote) " ).should == "
|
543
|
-
@nendo.evalStr( " (syntax-quote '1) " ).should == "
|
544
|
-
@nendo.evalStr( " (syntax-quote (quote 1)) " ).should == "
|
545
|
-
@nendo.evalStr( " (quote (syntax-quote 1)) " ).should == "(
|
539
|
+
@nendo.evalStr( " (quote quote) " ).should == "quote"
|
540
|
+
@nendo.evalStr( " 'quote " ).should == "quote"
|
541
|
+
@nendo.evalStr( " ''1 " ).should == "(quote 1)"
|
542
|
+
@nendo.evalStr( " (quote syntax-quote) " ).should == "quote"
|
543
|
+
@nendo.evalStr( " (syntax-quote '1) " ).should == "(quote 1)"
|
544
|
+
@nendo.evalStr( " (syntax-quote (quote 1)) " ).should == "(quote 1)"
|
545
|
+
@nendo.evalStr( " (quote (syntax-quote 1)) " ).should == "(quote 1)"
|
546
546
|
end
|
547
547
|
end
|
548
548
|
|
@@ -565,9 +565,9 @@ describe Nendo, "when read various list expressions" do
|
|
565
565
|
@nendo.evalStr( " '[a (b) ((c)) (((d)))] " ).should == "(a (b) ((c)) (((d))))"
|
566
566
|
@nendo.evalStr( " '(a [b] ([c]) (([d]))) " ).should == "(a (b) ((c)) (((d))))"
|
567
567
|
@nendo.evalStr( " '[a [b] [[c]] [[[d]]]] " ).should == "(a (b) ((c)) (((d))))"
|
568
|
-
@nendo.evalStr( " '('a)" ).should == "(
|
569
|
-
@nendo.evalStr( " '(''a)" ).should == "(
|
570
|
-
@nendo.evalStr( " '('a 'b 'c)" ).should == "(
|
568
|
+
@nendo.evalStr( " '('a)" ).should == "((quote a))"
|
569
|
+
@nendo.evalStr( " '(''a)" ).should == "((quote (quote a)))"
|
570
|
+
@nendo.evalStr( " '('a 'b 'c)" ).should == "((quote a) (quote b) (quote c))"
|
571
571
|
@nendo.evalStr( ' \'("str") ' ).should == '("str")'
|
572
572
|
@nendo.evalStr( ' \'("str" . 1) ' ).should == '("str" . 1)'
|
573
573
|
@nendo.evalStr( ' \'(1 . "str") ' ).should == '(1 . "str")'
|
@@ -577,13 +577,13 @@ describe Nendo, "when read various list expressions" do
|
|
577
577
|
@nendo.evalStr( " 'symbol " ).should == "symbol"
|
578
578
|
@nendo.evalStr( " 'SYMBOL " ).should == "SYMBOL"
|
579
579
|
@nendo.evalStr( " 'SyMbOl " ).should == "SyMbOl"
|
580
|
-
@nendo.evalStr( " ''a " ).should == "
|
580
|
+
@nendo.evalStr( " ''a " ).should == "(quote a)"
|
581
581
|
@nendo.evalStr( " '1 " ).should == "1"
|
582
|
-
@nendo.evalStr( " ''1 " ).should == "
|
583
|
-
@nendo.evalStr( " '''1 " ).should == "
|
582
|
+
@nendo.evalStr( " ''1 " ).should == "(quote 1)"
|
583
|
+
@nendo.evalStr( " '''1 " ).should == "(quote (quote 1))"
|
584
584
|
@nendo.evalStr( " '1.1 " ).should == "1.1"
|
585
|
-
@nendo.evalStr( " ''1.1 " ).should == "
|
586
|
-
@nendo.evalStr( " '''1.1 " ).should == "
|
585
|
+
@nendo.evalStr( " ''1.1 " ).should == "(quote 1.1)"
|
586
|
+
@nendo.evalStr( " '''1.1 " ).should == "(quote (quote 1.1))"
|
587
587
|
@nendo.evalStr( " '() " ).should == "()"
|
588
588
|
@nendo.evalStr( " '(()) " ).should == "(())"
|
589
589
|
@nendo.evalStr( " '((())) " ).should == "((()))"
|
@@ -594,7 +594,7 @@ describe Nendo, "when read various list expressions" do
|
|
594
594
|
@nendo.evalStr( " '(a . #f) " ).should == "(a . #f)"
|
595
595
|
@nendo.evalStr( " '(a . nil) " ).should == "(a . nil)"
|
596
596
|
@nendo.evalStr( " '(a b c d e . ()) " ).should == "(a b c d e)"
|
597
|
-
@nendo.evalStr( " '(#t #t #f #f nil nil '() '()) " ).should == "(#t #t #f #f nil nil
|
597
|
+
@nendo.evalStr( " '(#t #t #f #f nil nil '() '()) " ).should == "(#t #t #f #f nil nil (quote ()) (quote ()))"
|
598
598
|
end
|
599
599
|
end
|
600
600
|
|
@@ -686,6 +686,10 @@ describe Nendo, "when call evalStr() with built-in functions" do
|
|
686
686
|
@nendo.evalStr( " (list '(a) '((b c))) " ).should == "((a) ((b c)))"
|
687
687
|
@nendo.evalStr( " (list) " ).should == "()"
|
688
688
|
@nendo.evalStr( " (list 1) " ).should == "(1)"
|
689
|
+
@nendo.evalStr( " (reverse '(1)) " ).should == "(1)"
|
690
|
+
@nendo.evalStr( " (reverse '(1 2 3)) " ).should == "(3 2 1)"
|
691
|
+
@nendo.evalStr( " (reverse '(1 2 ())) " ).should == "(() 2 1)"
|
692
|
+
@nendo.evalStr( " (reverse (list 1 2 (cdr '(100)))) " ).should == "(() 2 1)"
|
689
693
|
@nendo.evalStr( " (define !a 10) !a" ).should == "10"
|
690
694
|
@nendo.evalStr( " (define $a 11) $a" ).should == "11"
|
691
695
|
@nendo.evalStr( " (define %a 12) %a" ).should == "12"
|
@@ -865,21 +869,40 @@ describe Nendo, "when call evalStr() with built-in special forms" do
|
|
865
869
|
@nendo.evalStr( " (begin 1) " ).should == "1"
|
866
870
|
@nendo.evalStr( " (begin 1 2) " ).should == "2"
|
867
871
|
@nendo.evalStr( " (begin 1 2 3) " ).should == "3"
|
868
|
-
@nendo.evalStr(
|
869
|
-
|
870
|
-
|
871
|
-
|
872
|
-
|
873
|
-
|
874
|
-
|
872
|
+
@nendo.evalStr( <<EOS
|
873
|
+
(set! x 2)
|
874
|
+
(set! y (begin
|
875
|
+
(set! x (* x 2))
|
876
|
+
(set! x (* x 2))
|
877
|
+
(set! x (* x 2))
|
878
|
+
100))
|
879
|
+
(+ x y)
|
880
|
+
EOS
|
881
|
+
).should == "116"
|
882
|
+
@nendo.evalStr( " (%let () 100) " ).should == "100"
|
883
|
+
@nendo.evalStr( " (%let ((a 11)) a) " ).should == "11"
|
884
|
+
@nendo.evalStr( " (%let ((a 11) (b 22)) (+ a b)) " ).should == "33"
|
885
|
+
@nendo.evalStr( " (%let ((a 22)) (%let ((b 33)) (+ a b))) " ).should == "55"
|
886
|
+
@nendo.evalStr( " (%let ((a 22)(b 33)) (%let ((c 44) (d 55)) (+ a b c d))) " ).should == "154"
|
887
|
+
@nendo.evalStr( " (%let ((a (%let ((b 2)) (+ 100 b)))) a) " ).should == "102"
|
875
888
|
@nendo.evalStr( " (letrec () 100) " ).should == "100"
|
876
889
|
@nendo.evalStr( " (letrec ((a 11)) a) " ).should == "11"
|
877
890
|
@nendo.evalStr( " (letrec ((a 11) (b 22)) (+ a b)) " ).should == "33"
|
878
|
-
@nendo.evalStr( " (letrec ((a 22)) (let ((b 33)) (+ a b))) " ).should == "55"
|
879
|
-
@nendo.evalStr( " (letrec ((a 22)(b 33)) (let ((c 44) (d 55)) (+ a b c d))) " ).should == "154"
|
880
|
-
@nendo.evalStr( " (letrec ((a (let ((b 2)) (+ 100 b)))) a) " ).should == "102"
|
881
|
-
@nendo.evalStr(
|
882
|
-
|
891
|
+
@nendo.evalStr( " (letrec ((a 22)) (%let ((b 33)) (+ a b))) " ).should == "55"
|
892
|
+
@nendo.evalStr( " (letrec ((a 22)(b 33)) (%let ((c 44) (d 55)) (+ a b c d))) " ).should == "154"
|
893
|
+
@nendo.evalStr( " (letrec ((a (%let ((b 2)) (+ 100 b)))) a) " ).should == "102"
|
894
|
+
@nendo.evalStr( <<EOS
|
895
|
+
(letrec ((func1 (lambda (x) 13))
|
896
|
+
(func2 (lambda (x) (* 2 (func1)))))
|
897
|
+
(list (func2) (func1)))
|
898
|
+
EOS
|
899
|
+
).should == "(26 13)"
|
900
|
+
@nendo.evalStr( <<EOS
|
901
|
+
(letrec ((func2 (lambda (x) (* 2 (func1))))
|
902
|
+
(func1 (lambda (x) 7)))
|
903
|
+
(list (func2) (func1)))
|
904
|
+
EOS
|
905
|
+
).should == "(14 7)"
|
883
906
|
@nendo.evalStr( " (if true 't 'f)" ).should == "t"
|
884
907
|
@nendo.evalStr( " (if true '(1) '(2))" ).should == "(1)"
|
885
908
|
@nendo.evalStr( " (if false 't 'f)" ).should == "f"
|
@@ -887,11 +910,18 @@ describe Nendo, "when call evalStr() with built-in special forms" do
|
|
887
910
|
@nendo.evalStr( " (set! x 0) (if true (set! x 1) (set! x 2)) x" ).should == "1"
|
888
911
|
@nendo.evalStr( " (set! x 0) (if false (set! x 1) (set! x 2)) x" ).should == "2"
|
889
912
|
@nendo.evalStr( " (set! func (lambda (arg1) arg1)) (list (func 1) (func 2))" ).should == "(1 2)"
|
890
|
-
@nendo.evalStr( " ((lambda (arg1) arg1)
|
891
|
-
@nendo.evalStr( " ((lambda (arg1) arg1)
|
892
|
-
@nendo.evalStr( " ((
|
893
|
-
@nendo.evalStr( " ((
|
894
|
-
@nendo.evalStr( " (
|
913
|
+
@nendo.evalStr( " ((lambda (arg1) arg1) 3)" ).should == "3"
|
914
|
+
@nendo.evalStr( " ((lambda (arg1) arg1) (+ 1 2 3))" ).should == "6"
|
915
|
+
@nendo.evalStr( " ((lambda (arg1 . arg2) arg1) 1 '(2))" ).should == "1"
|
916
|
+
@nendo.evalStr( " ((lambda (arg1 . arg2) arg2) 1 '(2))" ).should == "((2))"
|
917
|
+
@nendo.evalStr( " ((lambda (arg1 . arg2) arg2) 1 '(2 3))" ).should == "((2 3))"
|
918
|
+
@nendo.evalStr( " ((lambda (arg1 . arg2) arg1) '() '())" ).should == "()"
|
919
|
+
@nendo.evalStr( " ((lambda (arg1 . arg2) arg2) '() '())" ).should == "(())"
|
920
|
+
@nendo.evalStr( " ((lambda (arg1 . arg2) arg1) (cdr '(100)) (cdr '(200)))" ).should == "()"
|
921
|
+
@nendo.evalStr( " ((lambda (arg1 . arg2) arg2) (cdr '(100)) (cdr '(200)))" ).should == "(())"
|
922
|
+
@nendo.evalStr( " ((if #t + *) 3 4)" ).should == "7"
|
923
|
+
@nendo.evalStr( " ((if #f + *) 3 4)" ).should == "12"
|
924
|
+
@nendo.evalStr( " (apply1 + '(1 2))" ).should == "3"
|
895
925
|
@nendo.evalStr( " (apply1 + (range 10 1))" ).should == "55"
|
896
926
|
@nendo.evalStr( " (apply1 cons '(1 2))" ).should == "(1 . 2)"
|
897
927
|
@nendo.evalStr( " (apply1 list '(1 2 3))" ).should == "(1 2 3)"
|
@@ -909,32 +939,55 @@ describe Nendo, "when call evalStr() with built-in special forms (renamed symbol
|
|
909
939
|
@nendo.evalStr( " (/nendo/core/begin 1) " ).should == "1"
|
910
940
|
@nendo.evalStr( " (/nendo/core/begin 1 2) " ).should == "2"
|
911
941
|
@nendo.evalStr( " (/nendo/core/begin 1 2 3) " ).should == "3"
|
912
|
-
@nendo.evalStr(
|
913
|
-
|
914
|
-
|
915
|
-
|
916
|
-
|
917
|
-
|
918
|
-
|
942
|
+
@nendo.evalStr( <<EOS
|
943
|
+
(/nendo/core/set! x 2)
|
944
|
+
(/nendo/core/set! y (/nendo/core/begin
|
945
|
+
(/nendo/core/set! x (* x 2))
|
946
|
+
(/nendo/core/set! x (* x 2))
|
947
|
+
(/nendo/core/set! x (* x 2))
|
948
|
+
100))
|
949
|
+
(+ x y)
|
950
|
+
EOS
|
951
|
+
).should == "116"
|
952
|
+
@nendo.evalStr( " (/nendo/core/%let () 100) " ).should == "100"
|
953
|
+
@nendo.evalStr( " (/nendo/core/%let ((a 11)) a) " ).should == "11"
|
954
|
+
@nendo.evalStr( " (/nendo/core/%let ((a 11) (b 22)) (+ a b)) " ).should == "33"
|
955
|
+
@nendo.evalStr( " (/nendo/core/%let ((a 22)) (let ((b 33)) (+ a b))) " ).should == "55"
|
956
|
+
@nendo.evalStr( " (/nendo/core/%let ((a 22)(b 33)) (let ((c 44) (d 55)) (+ a b c d))) " ).should == "154"
|
957
|
+
@nendo.evalStr( " (/nendo/core/%let ((a (let ((b 2)) (+ 100 b)))) a) " ).should == "102"
|
919
958
|
@nendo.evalStr( " (/nendo/core/letrec () 100) " ).should == "100"
|
920
959
|
@nendo.evalStr( " (/nendo/core/letrec ((a 11)) a) " ).should == "11"
|
921
960
|
@nendo.evalStr( " (/nendo/core/letrec ((a 11) (b 22)) (+ a b)) " ).should == "33"
|
922
961
|
@nendo.evalStr( " (/nendo/core/letrec ((a 22)) (let ((b 33)) (+ a b))) " ).should == "55"
|
923
962
|
@nendo.evalStr( " (/nendo/core/letrec ((a 22)(b 33)) (let ((c 44) (d 55)) (+ a b c d))) " ).should == "154"
|
924
963
|
@nendo.evalStr( " (/nendo/core/letrec ((a (let ((b 2)) (+ 100 b)))) a) " ).should == "102"
|
925
|
-
@nendo.evalStr(
|
926
|
-
|
964
|
+
@nendo.evalStr( <<EOS
|
965
|
+
(/nendo/core/letrec ((func1 (/nendo/core/lambda (x) 13))
|
966
|
+
(func2 (/nendo/core/lambda (x) (* 2 (func1)))))
|
967
|
+
(list (func2) (func1)))
|
968
|
+
EOS
|
969
|
+
).should == "(26 13)"
|
970
|
+
@nendo.evalStr( <<EOS
|
971
|
+
(/nendo/core/letrec ((func2 (/nendo/core/lambda (x) (* 2 (func1))))
|
972
|
+
(func1 (/nendo/core/lambda (x) 7)))
|
973
|
+
(list (func2) (func1)))
|
974
|
+
EOS
|
975
|
+
).should == "(14 7)"
|
927
976
|
@nendo.evalStr( " (/nendo/core/if true 't 'f)" ).should == "t"
|
928
977
|
@nendo.evalStr( " (/nendo/core/if true '(1) '(2))" ).should == "(1)"
|
929
978
|
@nendo.evalStr( " (/nendo/core/if false 't 'f)" ).should == "f"
|
930
979
|
@nendo.evalStr( " (/nendo/core/if false '(1) '(2))" ).should == "(2)"
|
931
980
|
@nendo.evalStr( " (/nendo/core/set! x 0) (/nendo/core/if true (set! x 1) (set! x 2)) x" ).should == "1"
|
932
981
|
@nendo.evalStr( " (/nendo/core/set! x 0) (/nendo/core/if false (set! x 1) (set! x 2)) x" ).should == "2"
|
933
|
-
@nendo.evalStr(
|
934
|
-
|
935
|
-
|
936
|
-
|
937
|
-
|
982
|
+
@nendo.evalStr( <<EOS
|
983
|
+
(/nendo/core/set! func (/nendo/core/lambda (arg1) arg1))
|
984
|
+
(list (func 1) (func 2))
|
985
|
+
EOS
|
986
|
+
).should == "(1 2)"
|
987
|
+
@nendo.evalStr( " ((/nendo/core/lambda (arg1) arg1) 3)" ).should == "3"
|
988
|
+
@nendo.evalStr( " ((/nendo/core/lambda (arg1) arg1) (+ 1 2 3))" ).should == "6"
|
989
|
+
@nendo.evalStr( " ((/nendo/core/if #t + *) 3 4)" ).should == "7"
|
990
|
+
@nendo.evalStr( " ((/nendo/core/if #f + *) 3 4)" ).should == "12"
|
938
991
|
lambda { @nendo.evalStr( " (/nendo/core/error \"My Runtime Error\") " ) }.should raise_error( RuntimeError )
|
939
992
|
end
|
940
993
|
end
|
@@ -946,26 +999,28 @@ describe Nendo, "when call evalStr() with global and lexical scope variable" do
|
|
946
999
|
end
|
947
1000
|
it "should" do
|
948
1001
|
@nendo.evalStr( " (define var 111) " ).should == "111"
|
949
|
-
@nendo.evalStr( " (let ((var 222)) var) " ).should == "222"
|
950
|
-
@nendo.evalStr( " (let ((var 222)) (set! var 333) var) " ).should == "333"
|
951
|
-
@nendo.evalStr( " (let ((var 222)) (set! var 333)) var " ).should == "111"
|
1002
|
+
@nendo.evalStr( " (%let ((var 222)) var) " ).should == "222"
|
1003
|
+
@nendo.evalStr( " (%let ((var 222)) (set! var 333) var) " ).should == "333"
|
1004
|
+
@nendo.evalStr( " (%let ((var 222)) (set! var 333)) var " ).should == "111"
|
952
1005
|
@nendo.evalStr( " (define global1 \"G\") " ).should == '"G"'
|
953
|
-
@nendo.evalStr(
|
954
|
-
|
955
|
-
|
956
|
-
|
957
|
-
|
958
|
-
|
959
|
-
|
960
|
-
|
961
|
-
|
962
|
-
|
963
|
-
|
964
|
-
|
965
|
-
|
966
|
-
|
967
|
-
|
968
|
-
|
1006
|
+
@nendo.evalStr( <<EOS
|
1007
|
+
(%let ((local1 \"L\")
|
1008
|
+
(local2 \"L\"))
|
1009
|
+
(set! global1 (+ global1 \"lobal1\"))
|
1010
|
+
(set! local1 (+ local1 \"ocal1\"))
|
1011
|
+
(set! local2 (+ local2 \"ocal2\"))
|
1012
|
+
(list global1
|
1013
|
+
local1
|
1014
|
+
local2
|
1015
|
+
(%let ((local1 \"A\")
|
1016
|
+
(local2 \"B\"))
|
1017
|
+
(set! local1 (+ local1 \"a\"))
|
1018
|
+
(set! local2 (+ local2 \"b\"))
|
1019
|
+
(list local1 local2
|
1020
|
+
(%let ((local1 \"CCC\"))
|
1021
|
+
(list global1 local1 local2))))))
|
1022
|
+
EOS
|
1023
|
+
).should == '("Global1" "Local1" "Local2" ("Aa" "Bb" ("Global1" "CCC" "Bb")))'
|
969
1024
|
end
|
970
1025
|
end
|
971
1026
|
|
@@ -974,18 +1029,48 @@ describe Nendo, "when call evalStr() with macroexpand-1 function" do
|
|
974
1029
|
@nendo = Nendo::Core.new()
|
975
1030
|
end
|
976
1031
|
it "should" do
|
977
|
-
@nendo.evalStr(
|
978
|
-
|
1032
|
+
@nendo.evalStr( <<EOS
|
1033
|
+
(set! twice (macro (x) (list 'begin x x)))
|
1034
|
+
(macroexpand-1 '(twice (+ 1 1)))
|
1035
|
+
EOS
|
1036
|
+
).should == "(begin (+ 1 1) (+ 1 1))"
|
1037
|
+
@nendo.evalStr( <<EOS
|
1038
|
+
(set! inc (macro (x) (list 'set! x (list '+ x 1))))
|
1039
|
+
(macroexpand-1 '(inc a))
|
1040
|
+
EOS
|
1041
|
+
).should == "(set! a (+ a 1))"
|
979
1042
|
@nendo.evalStr( " (set! a 10) (inc a) " ).should == "11"
|
980
1043
|
@nendo.evalStr( " (set! a 10) (inc a) (inc a)" ).should == "12"
|
981
|
-
@nendo.evalStr(
|
1044
|
+
@nendo.evalStr( <<EOS
|
1045
|
+
(macroexpand-1
|
1046
|
+
'(twice (twice (inc a))))
|
1047
|
+
EOS
|
1048
|
+
).should ==
|
982
1049
|
"(begin (twice (inc a)) (twice (inc a)))"
|
983
|
-
@nendo.evalStr(
|
984
|
-
|
985
|
-
|
986
|
-
|
987
|
-
|
988
|
-
|
1050
|
+
@nendo.evalStr( <<EOS
|
1051
|
+
(macroexpand-1
|
1052
|
+
(macroexpand-1
|
1053
|
+
'(twice (twice (inc a)))))
|
1054
|
+
EOS
|
1055
|
+
).should ==
|
1056
|
+
"(begin (begin (inc a) (inc a)) (twice (inc a)))"
|
1057
|
+
@nendo.evalStr( <<EOS
|
1058
|
+
(macroexpand-1
|
1059
|
+
(macroexpand-1
|
1060
|
+
(macroexpand-1
|
1061
|
+
'(twice (twice (inc a))))))
|
1062
|
+
EOS
|
1063
|
+
).should ==
|
1064
|
+
"(begin (begin (set! a (+ a 1)) (inc a)) (twice (inc a)))"
|
1065
|
+
@nendo.evalStr( <<EOS
|
1066
|
+
(macroexpand-1
|
1067
|
+
(macroexpand-1
|
1068
|
+
(macroexpand-1
|
1069
|
+
(macroexpand-1
|
1070
|
+
'(twice (twice (inc a)))))))
|
1071
|
+
EOS
|
1072
|
+
).should ==
|
1073
|
+
"(begin (begin (set! a (+ a 1)) (set! a (+ a 1))) (twice (inc a)))"
|
989
1074
|
@nendo.evalStr( " (set! a 10) (twice (twice (inc a)))" ).should == "14"
|
990
1075
|
end
|
991
1076
|
end
|
@@ -1004,7 +1089,17 @@ describe Nendo, "when use #xxxx syntax " do
|
|
1004
1089
|
@nendo.evalStr( " #! \n #t" ).should == "#t"
|
1005
1090
|
@nendo.evalStr( " #! \n 100" ).should == "100"
|
1006
1091
|
@nendo.evalStr( " #! 123 \n 100" ).should == "100"
|
1007
|
-
@nendo.evalStr( " '#?=1" ).should == "(debug-print 1 \"(string)\" 1
|
1092
|
+
@nendo.evalStr( " '#?=1" ).should == "(debug-print 1 \"(string)\" 1 (quote 1))"
|
1093
|
+
@nendo.evalStr( " '#?." ).should == '"(string):1"'
|
1094
|
+
@nendo.evalStr( " '#?." ).should == '"(string):1"'
|
1095
|
+
@nendo.evalStr( " (begin #?. (+ 1 1))" ).should == "2"
|
1096
|
+
@nendo.evalStr( <<EOS
|
1097
|
+
(begin
|
1098
|
+
#?.
|
1099
|
+
(+ 1 1)
|
1100
|
+
#?. )
|
1101
|
+
EOS
|
1102
|
+
).should == '"(string):4"'
|
1008
1103
|
@nendo.evalStr( " #b0 " ).should == Integer("0b0").to_s
|
1009
1104
|
@nendo.evalStr( " #b01 " ).should == Integer("0b01").to_s
|
1010
1105
|
@nendo.evalStr( " #b10 " ).should == Integer("0b10").to_s
|
@@ -1080,7 +1175,7 @@ describe Nendo, "when use regexp litteral and library functions " do
|
|
1080
1175
|
@nendo.evalStr( " #/[a-z]/i " ).should == "#/[a-z]/i"
|
1081
1176
|
lambda { @nendo.evalStr( " #/[a-z]/I " ) }.should raise_error(NameError)
|
1082
1177
|
lambda { @nendo.evalStr( " #/[a-z]/a " ) }.should raise_error(NameError)
|
1083
|
-
|
1178
|
+
|
1084
1179
|
@nendo.evalStr( ' (string->regexp "abc") ' ).should == '#/abc/'
|
1085
1180
|
@nendo.evalStr( ' (string->regexp "[a-z]") ' ).should == '#/[a-z]/'
|
1086
1181
|
@nendo.evalStr( ' (string->regexp "[a-zA-Z0-9]+" ) ' ).should == '#/[a-zA-Z0-9]+/'
|
@@ -1136,7 +1231,12 @@ describe Nendo, "when use regexp litteral and library functions " do
|
|
1136
1231
|
@nendo.evalStr( ' (rxmatch->string #/XXX/ "xxx")' ).should == '#f'
|
1137
1232
|
|
1138
1233
|
pending( "JRuby can't compute correctly" ) if defined? JRUBY_VERSION
|
1139
|
-
@nendo.evalStr(
|
1234
|
+
@nendo.evalStr( <<EOS
|
1235
|
+
(define matchdata
|
1236
|
+
(rxmatch #/([あ-ん])([あ-ん])([あ-ん])([あ-ん])([あ-ん])/
|
1237
|
+
"ABC漢字あいうえお漢字ABC"))
|
1238
|
+
EOS
|
1239
|
+
).should == 'あいうえお'
|
1140
1240
|
@nendo.evalStr( ' (rxmatch-start matchdata) ' ).should == '5'
|
1141
1241
|
@nendo.evalStr( ' (rxmatch-end matchdata) ' ).should == '10'
|
1142
1242
|
@nendo.evalStr( ' (rxmatch-substring matchdata) ' ).should == '"あいうえお"'
|
@@ -1168,6 +1268,17 @@ describe Nendo, "when call functions in init.nnd " do
|
|
1168
1268
|
@nendo.evalStr( " (append '() '(2)) " ).should == "(2)"
|
1169
1269
|
@nendo.evalStr( " (append '(1) '(2)) " ).should == "(1 2)"
|
1170
1270
|
@nendo.evalStr( " (append '(1 2) '(3 4)) " ).should == "(1 2 3 4)"
|
1271
|
+
@nendo.evalStr( " (append '(1 2) (cdr '(200))) " ).should == "(1 2)"
|
1272
|
+
@nendo.evalStr( " (append (cdr '(100)) '(10 20)) " ).should == "(10 20)"
|
1273
|
+
@nendo.evalStr( " (define lst '()) " ).should == "()"
|
1274
|
+
@nendo.evalStr( " (push! lst 1) " ).should == "(1)"
|
1275
|
+
@nendo.evalStr( " lst " ).should == "(1)"
|
1276
|
+
@nendo.evalStr( " (push! lst 2) " ).should == "(2 1)"
|
1277
|
+
@nendo.evalStr( " lst " ).should == "(2 1)"
|
1278
|
+
@nendo.evalStr( " (push! lst 3) " ).should == "(3 2 1)"
|
1279
|
+
@nendo.evalStr( " lst " ).should == "(3 2 1)"
|
1280
|
+
@nendo.evalStr( ' (push! lst "str") ' ).should == '("str" 3 2 1)'
|
1281
|
+
@nendo.evalStr( " lst " ).should == '("str" 3 2 1)'
|
1171
1282
|
@nendo.evalStr( " (pair? '()) " ).should == "#f"
|
1172
1283
|
@nendo.evalStr( " (pair? '(1)) " ).should == "#t"
|
1173
1284
|
@nendo.evalStr( " (pair? '(1 2)) " ).should == "#t"
|
@@ -1256,6 +1367,11 @@ describe Nendo, "when call functions in init.nnd " do
|
|
1256
1367
|
@nendo.evalStr( ' (string-append "a") ' ).should == '"a"'
|
1257
1368
|
@nendo.evalStr( ' (string-append "a" "b") ' ).should == '"ab"'
|
1258
1369
|
@nendo.evalStr( ' (string-append "a" "B" "c" "D" "e") ' ).should == '"aBcDe"'
|
1370
|
+
@nendo.evalStr( ' (string=? "ABC" "ABC") ' ).should == '#t'
|
1371
|
+
@nendo.evalStr( ' (string=? "ABC" "ABc") ' ).should == '#f'
|
1372
|
+
@nendo.evalStr( ' (string=? "ABC" "abc") ' ).should == '#f'
|
1373
|
+
@nendo.evalStr( ' (string=? 100 100) ' ).should == '#t'
|
1374
|
+
@nendo.evalStr( ' (string=? (+ "A" "B") "AB") ' ).should == '#t'
|
1259
1375
|
@nendo.evalStr( " (to_i \"22\") " ).should == '22'
|
1260
1376
|
@nendo.evalStr( " (to-i \"22\") " ).should == '22'
|
1261
1377
|
@nendo.evalStr( " (to_i \"10000\") " ).should == '10000'
|
@@ -1289,8 +1405,27 @@ describe Nendo, "when call functions in init.nnd " do
|
|
1289
1405
|
@nendo.evalStr( " (cond (true 1) (true 2)) " ).should == "1"
|
1290
1406
|
@nendo.evalStr( " (cond (false 1) (false 2)) " ).should == "()"
|
1291
1407
|
@nendo.evalStr( " (cond (false 1) (false 2) (else 3)) " ).should == "3"
|
1292
|
-
@nendo.evalStr(
|
1293
|
-
|
1408
|
+
@nendo.evalStr( <<EOS
|
1409
|
+
(cond
|
1410
|
+
((- 10 9)
|
1411
|
+
=>
|
1412
|
+
(lambda (x)
|
1413
|
+
(+ \"<\" (to_s x) \">\")))
|
1414
|
+
(else
|
1415
|
+
2))
|
1416
|
+
EOS
|
1417
|
+
).should == '"<1>"'
|
1418
|
+
@nendo.evalStr( <<EOS
|
1419
|
+
(cond
|
1420
|
+
(true 1)
|
1421
|
+
((- 10 8)
|
1422
|
+
=>
|
1423
|
+
(lambda (x)
|
1424
|
+
(+ \"<\" (to_s x) \">\")))
|
1425
|
+
(else
|
1426
|
+
3))
|
1427
|
+
EOS
|
1428
|
+
).should == "1"
|
1294
1429
|
@nendo.evalStr( " (or) " ).should == "#f"
|
1295
1430
|
@nendo.evalStr( " (or true) " ).should == "#t"
|
1296
1431
|
@nendo.evalStr( " (or false) " ).should == "#f"
|
@@ -1318,8 +1453,27 @@ describe Nendo, "when call functions in init.nnd " do
|
|
1318
1453
|
@nendo.evalStr( " (and true '(2) true) " ).should == "#t"
|
1319
1454
|
@nendo.evalStr( " (and true true '(2)) " ).should == "(2)"
|
1320
1455
|
@nendo.evalStr( " (and true '(2) false) " ).should == "#f"
|
1321
|
-
@nendo.evalStr(
|
1322
|
-
|
1456
|
+
@nendo.evalStr( <<EOS
|
1457
|
+
(define total 0)
|
1458
|
+
(and 1
|
1459
|
+
2
|
1460
|
+
(set! total (+ total 1))
|
1461
|
+
(set! total (+ total 2))
|
1462
|
+
5)
|
1463
|
+
total
|
1464
|
+
EOS
|
1465
|
+
).should == "3"
|
1466
|
+
@nendo.evalStr( <<EOS
|
1467
|
+
(define total 1)
|
1468
|
+
(and 1
|
1469
|
+
2
|
1470
|
+
false
|
1471
|
+
(set! total (+ total 2))
|
1472
|
+
(set! total (+ total 3))
|
1473
|
+
5)
|
1474
|
+
total
|
1475
|
+
EOS
|
1476
|
+
).should == "1"
|
1323
1477
|
@nendo.evalStr( " (apply + 100 '()) " ).should == "100"
|
1324
1478
|
@nendo.evalStr( " (apply + '(1 2)) " ).should == "3"
|
1325
1479
|
@nendo.evalStr( " (apply + 1 2 '(3)) " ).should == "6"
|
@@ -1333,28 +1487,134 @@ describe Nendo, "when call functions in init.nnd " do
|
|
1333
1487
|
@nendo.evalStr( " (apply + (range 11)) " ).should == "55"
|
1334
1488
|
@nendo.evalStr( " (apply + (map (lambda (x) (+ x 1)) (range 10))) " ).should == "55"
|
1335
1489
|
@nendo.evalStr( " (apply + (append (range 11) '(100))) " ).should == "155"
|
1490
|
+
@nendo.evalStr( " (apply cons '(1 2)) " ).should == "(1 . 2)"
|
1491
|
+
@nendo.evalStr( " (apply list '(1 2)) " ).should == "(1 2)"
|
1492
|
+
@nendo.evalStr( " (apply list (list 1 '())) " ).should == "(1 ())"
|
1493
|
+
@nendo.evalStr( " (apply list (list 1 (cdr '(100)))) " ).should == "(1 ())"
|
1336
1494
|
@nendo.evalStr( " (map (lambda (x) 1) '()) " ).should == "()"
|
1337
1495
|
@nendo.evalStr( " (map (lambda (x) 1) (to-list '#())) " ).should == "()"
|
1338
1496
|
@nendo.evalStr( " (map (lambda (x) (* x 2)) '(1 2 3)) " ).should == "(2 4 6)"
|
1339
1497
|
@nendo.evalStr( " (map (lambda (x) (+ x 1)) '(1 2 3)) " ).should == "(2 3 4)"
|
1340
|
-
@nendo.evalStr(
|
1341
|
-
|
1342
|
-
|
1343
|
-
|
1344
|
-
|
1345
|
-
|
1346
|
-
|
1347
|
-
|
1348
|
-
|
1349
|
-
|
1350
|
-
|
1351
|
-
|
1352
|
-
|
1353
|
-
|
1354
|
-
|
1355
|
-
@nendo.evalStr(
|
1498
|
+
@nendo.evalStr( <<EOS
|
1499
|
+
(map
|
1500
|
+
(lambda (a b) (+ a b))
|
1501
|
+
'(1 2 3)
|
1502
|
+
'(10 20 30))
|
1503
|
+
EOS
|
1504
|
+
).should == "(11 22 33)"
|
1505
|
+
@nendo.evalStr( <<EOS
|
1506
|
+
(map
|
1507
|
+
(lambda (a b)
|
1508
|
+
(- b a))
|
1509
|
+
'(1 2 3)
|
1510
|
+
'(10 20 30))
|
1511
|
+
EOS
|
1512
|
+
).should == "(9 18 27)"
|
1513
|
+
@nendo.evalStr( <<EOS
|
1514
|
+
(map
|
1515
|
+
(lambda (a b c)
|
1516
|
+
(+ a b c))
|
1517
|
+
'(1 2 3)
|
1518
|
+
'(10 20 30)
|
1519
|
+
'(100 200 300))
|
1520
|
+
EOS
|
1521
|
+
).should == "(111 222 333)"
|
1522
|
+
@nendo.evalStr( <<EOS
|
1523
|
+
(define _result
|
1524
|
+
(map
|
1525
|
+
(lambda (x)
|
1526
|
+
(* x 2))
|
1527
|
+
(range 10000 1)))
|
1528
|
+
(list
|
1529
|
+
(first _result)
|
1530
|
+
(second _result)
|
1531
|
+
(last-pair _result))
|
1532
|
+
EOS
|
1533
|
+
).should == "(2 4 (20000))"
|
1534
|
+
|
1535
|
+
@nendo.evalStr( <<EOS
|
1536
|
+
(list
|
1537
|
+
(list* 1)
|
1538
|
+
(list* 1 2)
|
1539
|
+
(list* 1 2 3)
|
1540
|
+
(list* 1 2 3 4))
|
1541
|
+
EOS
|
1542
|
+
).should == "(1 (1 . 2) (1 2 . 3) (1 2 3 . 4))"
|
1543
|
+
|
1544
|
+
@nendo.evalStr( <<EOS
|
1545
|
+
(list
|
1546
|
+
(list* '())
|
1547
|
+
(list* 1 '())
|
1548
|
+
(list* 1 2 '())
|
1549
|
+
(list* 1 2 3 '()))
|
1550
|
+
EOS
|
1551
|
+
).should == "(() (1) (1 2) (1 2 3))"
|
1552
|
+
|
1553
|
+
@nendo.evalStr( <<EOS
|
1554
|
+
(list
|
1555
|
+
(list* (cdr '(100)))
|
1556
|
+
(list* 1 (cdr '(100)))
|
1557
|
+
(list* 1 2 (cdr '(100)))
|
1558
|
+
(list* 1 2 3 (cdr '(100))))
|
1559
|
+
EOS
|
1560
|
+
).should == "(() (1) (1 2) (1 2 3))"
|
1561
|
+
|
1562
|
+
@nendo.evalStr( <<EOS
|
1563
|
+
(list
|
1564
|
+
(list* '())
|
1565
|
+
(list* '() '())
|
1566
|
+
(list* '() '() '())
|
1567
|
+
(list* '() '() '() '()))
|
1568
|
+
EOS
|
1569
|
+
).should == "(() (()) (() ()) (() () ()))"
|
1570
|
+
|
1571
|
+
@nendo.evalStr( <<EOS
|
1572
|
+
(define _lst '())
|
1573
|
+
(for-each
|
1574
|
+
(lambda (x)
|
1575
|
+
(set! _lst (cons 1 _lst)))
|
1576
|
+
'())
|
1577
|
+
_lst
|
1578
|
+
EOS
|
1579
|
+
).should == "()"
|
1580
|
+
@nendo.evalStr( <<EOS
|
1581
|
+
(define _lst '())
|
1582
|
+
(for-each
|
1583
|
+
(lambda (x)
|
1584
|
+
(set! _lst (cons (* x 2) _lst)))
|
1585
|
+
'(1 2 3))
|
1586
|
+
_lst
|
1587
|
+
EOS
|
1588
|
+
).should == "(6 4 2)"
|
1589
|
+
@nendo.evalStr( <<EOS
|
1590
|
+
(define _lst '())
|
1591
|
+
(for-each
|
1592
|
+
(lambda (x)
|
1593
|
+
(set! _lst (cons (+ x 1) _lst)))
|
1594
|
+
'(1 2 3))
|
1595
|
+
_lst
|
1596
|
+
EOS
|
1597
|
+
).should == "(4 3 2)"
|
1598
|
+
@nendo.evalStr( <<EOS
|
1599
|
+
(define _lst '())
|
1600
|
+
(for-each
|
1601
|
+
(lambda (a b)
|
1602
|
+
(set! _lst (cons (cons a b) _lst)))
|
1603
|
+
'(1 2 3)
|
1604
|
+
'(10 20 30))
|
1605
|
+
_lst
|
1606
|
+
EOS
|
1607
|
+
).should ==
|
1356
1608
|
"((3 . 30) (2 . 20) (1 . 10))"
|
1357
|
-
@nendo.evalStr(
|
1609
|
+
@nendo.evalStr( <<EOS
|
1610
|
+
(define _cnt 0)
|
1611
|
+
(for-each
|
1612
|
+
(lambda (x)
|
1613
|
+
(set! _cnt (+ _cnt 1)))
|
1614
|
+
(range 10000))
|
1615
|
+
_cnt
|
1616
|
+
EOS
|
1617
|
+
).should == "10000"
|
1358
1618
|
@nendo.evalStr( " (filter (lambda (x) x) '()) " ).should == "()"
|
1359
1619
|
@nendo.evalStr( " (filter (lambda (x) (= x 100)) '(1 2 3)) " ).should == "()"
|
1360
1620
|
@nendo.evalStr( " (filter (lambda (x) (= x 2)) '(1 2 3)) " ).should == "(2)"
|
@@ -1370,26 +1630,42 @@ describe Nendo, "when call functions in init.nnd " do
|
|
1370
1630
|
@nendo.evalStr( " (filter-map (lambda (x) (= x 100)) '(1 2 3)) " ).should == "()"
|
1371
1631
|
@nendo.evalStr( " (filter-map (lambda (x) (= x 2)) '(1 2 3)) " ).should == "(#t)"
|
1372
1632
|
@nendo.evalStr( " (filter-map (lambda (x) (not (= x 2))) '(1 2 3)) " ).should == "(#t #t)"
|
1373
|
-
@nendo.evalStr(
|
1374
|
-
|
1633
|
+
@nendo.evalStr( <<EOS
|
1634
|
+
(filter-map
|
1635
|
+
(lambda (x)
|
1636
|
+
(if (= x 2) (* x 10) false))
|
1637
|
+
'(1 2 3))
|
1638
|
+
EOS
|
1639
|
+
).should == "(20)"
|
1640
|
+
@nendo.evalStr( <<EOS
|
1641
|
+
(filter-map
|
1642
|
+
(lambda (x)
|
1643
|
+
(if (not (= x 2)) (* x 10) false))
|
1644
|
+
'(1 2 3))
|
1645
|
+
EOS
|
1646
|
+
).should == "(10 30)"
|
1375
1647
|
@nendo.evalStr( " (any even? '(1 2 3)) " ).should == "#t"
|
1376
1648
|
@nendo.evalStr( " (any even? '(1 3)) " ).should == "#f"
|
1377
1649
|
@nendo.evalStr( " (any odd? '(1 3)) " ).should == "#t"
|
1378
1650
|
@nendo.evalStr( " (any (lambda (x) x) '(1 2 3)) " ).should == "1"
|
1379
|
-
@nendo.evalStr(
|
1380
|
-
|
1381
|
-
|
1382
|
-
|
1383
|
-
|
1384
|
-
|
1385
|
-
|
1386
|
-
|
1387
|
-
|
1388
|
-
|
1389
|
-
|
1390
|
-
|
1391
|
-
|
1392
|
-
|
1651
|
+
@nendo.evalStr( <<EOS
|
1652
|
+
(let1 result '()
|
1653
|
+
(do
|
1654
|
+
((i 0 (+ i 1)))
|
1655
|
+
((< 10 i) #f)
|
1656
|
+
(set! result (cons i result)))
|
1657
|
+
(reverse result))
|
1658
|
+
EOS
|
1659
|
+
).should == "(0 1 2 3 4 5 6 7 8 9 10)"
|
1660
|
+
@nendo.evalStr( <<EOS
|
1661
|
+
(let1 result '()
|
1662
|
+
(do
|
1663
|
+
((i 0 (+ i 3)))
|
1664
|
+
((< (* 3 10) i) #f)
|
1665
|
+
(set! result (cons i result)))
|
1666
|
+
(reverse result))
|
1667
|
+
EOS
|
1668
|
+
).should == "(0 3 6 9 12 15 18 21 24 27 30)"
|
1393
1669
|
end
|
1394
1670
|
end
|
1395
1671
|
|
@@ -1414,22 +1690,30 @@ describe Nendo, "when use values " do
|
|
1414
1690
|
@nendo.evalStr( " (values-values (values 1 2)) " ).should == "(1 2)"
|
1415
1691
|
@nendo.evalStr( " (values-values (values 1 2 3)) " ).should == "(1 2 3)"
|
1416
1692
|
@nendo.evalStr( " (values-values (values '(a) \"b\" '(\"C\"))) " ).should == '((a) "b" ("C"))'
|
1417
|
-
@nendo.evalStr(
|
1418
|
-
|
1419
|
-
|
1420
|
-
|
1421
|
-
|
1422
|
-
|
1423
|
-
|
1424
|
-
|
1425
|
-
|
1426
|
-
|
1427
|
-
|
1428
|
-
|
1429
|
-
@nendo.evalStr(
|
1430
|
-
|
1431
|
-
|
1432
|
-
|
1693
|
+
@nendo.evalStr( <<EOS
|
1694
|
+
(call-with-values
|
1695
|
+
(lambda () (values 4 5))
|
1696
|
+
(lambda (a b) b))
|
1697
|
+
EOS
|
1698
|
+
).should == "5"
|
1699
|
+
@nendo.evalStr( <<EOS
|
1700
|
+
(call-with-values
|
1701
|
+
(lambda () (values 1 2))
|
1702
|
+
cons)
|
1703
|
+
EOS
|
1704
|
+
).should == "(1 . 2)"
|
1705
|
+
@nendo.evalStr( <<EOS
|
1706
|
+
(call-with-values
|
1707
|
+
(lambda () (values 10))
|
1708
|
+
list)
|
1709
|
+
EOS
|
1710
|
+
).should == "(10)"
|
1711
|
+
@nendo.evalStr( <<EOS
|
1712
|
+
(call-with-values
|
1713
|
+
(lambda () (values))
|
1714
|
+
list)
|
1715
|
+
EOS
|
1716
|
+
).should == "()"
|
1433
1717
|
@nendo.evalStr( " (call-with-values * -) " ).should == "-1"
|
1434
1718
|
@nendo.evalStr( " (receive (a) (values) (list a)) " ).should == "()"
|
1435
1719
|
@nendo.evalStr( " (receive (a) (values 10) (list a)) " ).should == "(10)"
|
@@ -1488,7 +1772,7 @@ describe Nendo, "when use quasiquote macro " do
|
|
1488
1772
|
@nendo.evalStr( " (set! a 3) `(1 2 ,@(list a)) " ).should == "(1 2 3)"
|
1489
1773
|
@nendo.evalStr( " (set! a 3) `(1 ,@(list 2 a)) " ).should == "(1 2 3)"
|
1490
1774
|
@nendo.evalStr( " (set! a 11) `,a " ).should == "11"
|
1491
|
-
@nendo.evalStr( " (set! a 12) ``,a " ).should == "
|
1775
|
+
@nendo.evalStr( " (set! a 12) ``,a " ).should == "(quasiquote (unquote a))"
|
1492
1776
|
@nendo.evalStr( ' (define str "string") str ' ).should == '"string"'
|
1493
1777
|
@nendo.evalStr( ' `(,str) ' ).should == '("string")'
|
1494
1778
|
@nendo.evalStr( ' `("STRING") ' ).should == '("STRING")'
|
@@ -1499,8 +1783,8 @@ describe Nendo, "when use quasiquote macro " do
|
|
1499
1783
|
@nendo.evalStr( ' (caar `(("STRING" ,str))) ' ).should == '"STRING"'
|
1500
1784
|
@nendo.evalStr( ' (string-join `("A" "B" "C" "D")) ' ).should == '"ABCD"'
|
1501
1785
|
@nendo.evalStr( " `(list ,(+ 1 2) 4) " ).should == "(list 3 4)"
|
1502
|
-
@nendo.evalStr( " (let ((name 'a)) `(list ,name ',name)) " ).should == "(list a
|
1503
|
-
@nendo.evalStr( " `(a `(b ,(+ 1 2) ,(foo ,(+ 1 3) d) e) f) " ).should == "(a
|
1786
|
+
@nendo.evalStr( " (let ((name 'a)) `(list ,name ',name)) " ).should == "(list a (quote a))"
|
1787
|
+
@nendo.evalStr( " `(a `(b ,(+ 1 2) ,(foo ,(+ 1 3) d) e) f) " ).should == "(a (quasiquote (b (unquote (+ 1 2)) (unquote (foo 4 d)) e)) f)"
|
1504
1788
|
@nendo.evalStr( " `(( foo ,(- 10 3)) ,@(cdr '(c)) . ,(car '(cons))) " ).should == "((foo 7) . cons)"
|
1505
1789
|
end
|
1506
1790
|
end
|
@@ -1524,24 +1808,34 @@ describe Nendo, "when use macros made by quasiquote. " do
|
|
1524
1808
|
@nendo.evalStr( " (let* ((a 10) (b (* a 2))) (cons a b)) " ).should == "(10 . 20)"
|
1525
1809
|
@nendo.evalStr( " (let* ((a 10) (b (* a 2)) (c (* b 3))) (list a b c)) " ).should == "(10 20 60)"
|
1526
1810
|
@nendo.evalStr( " (begin0 1 2 3) " ).should == "1"
|
1527
|
-
@nendo.evalStr(
|
1811
|
+
@nendo.evalStr( <<EOS
|
1812
|
+
(define a 2)
|
1813
|
+
(begin0 (set! a (* a 2))
|
1814
|
+
(set! a (* a 2))
|
1815
|
+
(set! a (* a 2)))
|
1816
|
+
EOS
|
1817
|
+
).should == "4"
|
1528
1818
|
@nendo.evalStr( " (begin0 100) " ).should == "100"
|
1529
1819
|
@nendo.evalStr( " (begin0) " ).should == "#f"
|
1530
|
-
@nendo.evalStr(
|
1531
|
-
|
1532
|
-
|
1533
|
-
|
1534
|
-
|
1535
|
-
|
1536
|
-
|
1820
|
+
@nendo.evalStr( <<EOS
|
1821
|
+
(receive (a b)
|
1822
|
+
(begin0
|
1823
|
+
(values 1 2)
|
1824
|
+
(values 10 20)
|
1825
|
+
(values 100 200))
|
1826
|
+
(cons a b))
|
1827
|
+
EOS
|
1828
|
+
).should == "(1 . 2)"
|
1537
1829
|
@nendo.evalStr( " (macroexpand '(when #t (print \"1\") (print \"2\"))) " ).should == '(if #t (begin (print "1") (print "2")))'
|
1538
1830
|
@nendo.evalStr( " (macroexpand '(unless #t (print \"1\") (print \"2\"))) " ).should == '(if (not #t) (begin (print "1") (print "2")))'
|
1539
|
-
@nendo.evalStr( " (macroexpand '(if-let1 a #t (print \"T\") (print \"F\"))) " ).should == '(let ((a #t)) (if a (print "T") (print "F")))'
|
1831
|
+
@nendo.evalStr( " (macroexpand '(if-let1 a #t (print \"T\") (print \"F\"))) " ).should == '(%let ((a #t)) (if a (print "T") (print "F")))'
|
1540
1832
|
@nendo.evalStr( " (let1 count 0 (when #t (set! count (+ count 1)) (set! count (+ count 1))) count) " ).should == "2"
|
1541
1833
|
@nendo.evalStr( " (let1 count 0 (when #f (set! count (+ count 1)) (set! count (+ count 1))) count) " ).should == "0"
|
1542
1834
|
@nendo.evalStr( " (let1 count 0 (unless #t (set! count (+ count 1)) (set! count (+ count 1))) count) " ).should == "0"
|
1543
1835
|
@nendo.evalStr( " (let1 count 0 (unless #f (set! count (+ count 1)) (set! count (+ count 1))) count) " ).should == "2"
|
1544
1836
|
@nendo.evalStr( " (if-let1 m (rxmatch #/([0-9]+)/ \"abc100abc\") (rxmatch-substring m 1)) " ).should == '"100"'
|
1837
|
+
@nendo.evalStr( " (macroexpand '#?.) " ).should == '"(string):1"'
|
1838
|
+
@nendo.evalStr( " (macroexpand '(begin 1 2 #?. 4 5)) " ).should == '(begin 1 2 "(string):1" 4 5)'
|
1545
1839
|
end
|
1546
1840
|
end
|
1547
1841
|
|
@@ -1551,11 +1845,51 @@ describe Nendo, "when use define and lambda macro " do
|
|
1551
1845
|
@nendo.loadInitFile
|
1552
1846
|
end
|
1553
1847
|
it "should" do
|
1554
|
-
@nendo.evalStr(
|
1555
|
-
|
1556
|
-
|
1557
|
-
|
1558
|
-
|
1848
|
+
@nendo.evalStr( <<EOS
|
1849
|
+
(macroexpand
|
1850
|
+
'(define (main argv)
|
1851
|
+
(newline)
|
1852
|
+
0))
|
1853
|
+
EOS
|
1854
|
+
).should == "(define main (lambda (argv) (newline) 0))"
|
1855
|
+
@nendo.evalStr( <<EOS
|
1856
|
+
(macroexpand
|
1857
|
+
'(define (main argv)
|
1858
|
+
(define (foo x) x)
|
1859
|
+
(+ 10 20)
|
1860
|
+
0
|
1861
|
+
(foo 111)))
|
1862
|
+
EOS
|
1863
|
+
).should == "(define main (lambda (argv) (letrec ((foo (lambda (x) x))) (+ 10 20) 0 (foo 111))))"
|
1864
|
+
@nendo.evalStr( <<EOS
|
1865
|
+
(macroexpand
|
1866
|
+
'(define (main argv)
|
1867
|
+
(define result '())
|
1868
|
+
(define (foo x) x)
|
1869
|
+
(define val 0)
|
1870
|
+
(define (bar x)
|
1871
|
+
(+ val 10))))
|
1872
|
+
EOS
|
1873
|
+
).should == "(define main (lambda (argv) (letrec ((result (quote ())) (foo (lambda (x) x)) (val 0) (bar (lambda (x) (+ val 10)))))))"
|
1874
|
+
@nendo.evalStr( <<EOS
|
1875
|
+
(define (main argv)
|
1876
|
+
(define (foo x) x)
|
1877
|
+
(+ 10 20)
|
1878
|
+
0
|
1879
|
+
(foo 111))
|
1880
|
+
(main)
|
1881
|
+
EOS
|
1882
|
+
).should == "111"
|
1883
|
+
@nendo.evalStr( <<EOS
|
1884
|
+
(define (main argv)
|
1885
|
+
(define (foo1 x) (+ 1 x))
|
1886
|
+
(define (foo2 x) (+ 2 x))
|
1887
|
+
(*
|
1888
|
+
(foo1 20)
|
1889
|
+
(foo2 30)))
|
1890
|
+
(main '())
|
1891
|
+
EOS
|
1892
|
+
).should == "672"
|
1559
1893
|
@nendo.evalStr( " (macroexpand '(define (main argv) 0)) " ).should == "(define main (lambda (argv) 0))"
|
1560
1894
|
end
|
1561
1895
|
end
|
@@ -1566,15 +1900,27 @@ describe Nendo, "when use macro macro " do
|
|
1566
1900
|
@nendo.loadInitFile
|
1567
1901
|
end
|
1568
1902
|
it "should" do
|
1569
|
-
@nendo.evalStr(
|
1903
|
+
@nendo.evalStr( <<EOS
|
1904
|
+
(define inc!-macro
|
1905
|
+
(macro (x)
|
1906
|
+
(+ x 1)))
|
1907
|
+
EOS
|
1908
|
+
).should match( /Nendo::LispMacro/ )
|
1570
1909
|
@nendo.evalStr( " (inc!-macro 10) " ).should == "11"
|
1571
|
-
@nendo.evalStr(
|
1910
|
+
@nendo.evalStr( <<EOS
|
1911
|
+
(define dec!-macro
|
1912
|
+
(macro (x)
|
1913
|
+
(define (dec! v)
|
1914
|
+
(- v 1))
|
1915
|
+
(dec! x)))
|
1916
|
+
EOS
|
1917
|
+
).should match( /Nendo::LispMacro/ )
|
1572
1918
|
@nendo.evalStr( " (dec!-macro 10) " ).should == "9"
|
1573
1919
|
@nendo.evalStr( " (. (dec!-macro 10) class) " ).should == 'Fixnum'
|
1574
1920
|
end
|
1575
1921
|
end
|
1576
1922
|
|
1577
|
-
describe Nendo, "when use macros
|
1923
|
+
describe Nendo, "when use macros expand some syntax. " do
|
1578
1924
|
before do
|
1579
1925
|
@nendo = Nendo::Core.new()
|
1580
1926
|
@nendo.loadInitFile
|
@@ -1616,8 +1962,8 @@ describe Nendo, "when use dot-operator (.) macro " do
|
|
1616
1962
|
lambda { @nendo.evalStr( " (macroexpand '(. open)) " ) }.should raise_error( ArgumentError )
|
1617
1963
|
lambda { @nendo.evalStr( " (macroexpand '(. open \"aaa\")) " ) }.should raise_error( TypeError )
|
1618
1964
|
@nendo.evalStr( " (macroexpand '(. a size)) " ).should == "(a.size)"
|
1619
|
-
@nendo.evalStr( " (macroexpand '(. (. a size) to_s)) " ).gsub( /[12]0[0-9][0-9][0-9]/, "X0000" ).should == "(let ((__gensym__fb4e25e49e9fb4e46342224606faf2e3eabf1251_X0000 (a.size))) (__gensym__fb4e25e49e9fb4e46342224606faf2e3eabf1251_X0000.to_s))"
|
1620
|
-
@nendo.evalStr( " (macroexpand '(. (. (. a size) to_s) to_i)) " ).gsub( /[12]0[0-9][0-9][0-9]/, "X0000" ).should == "(let ((__gensym__fb4e25e49e9fb4e46342224606faf2e3eabf1251_X0000 (let ((__gensym__fb4e25e49e9fb4e46342224606faf2e3eabf1251_X0000 (a.size))) (__gensym__fb4e25e49e9fb4e46342224606faf2e3eabf1251_X0000.to_s)))) (__gensym__fb4e25e49e9fb4e46342224606faf2e3eabf1251_X0000.to_i))"
|
1965
|
+
@nendo.evalStr( " (macroexpand '(. (. a size) to_s)) " ).gsub( /[12]0[0-9][0-9][0-9]/, "X0000" ).should == "(%let ((__gensym__fb4e25e49e9fb4e46342224606faf2e3eabf1251_X0000 (a.size))) (__gensym__fb4e25e49e9fb4e46342224606faf2e3eabf1251_X0000.to_s))"
|
1966
|
+
@nendo.evalStr( " (macroexpand '(. (. (. a size) to_s) to_i)) " ).gsub( /[12]0[0-9][0-9][0-9]/, "X0000" ).should == "(%let ((__gensym__fb4e25e49e9fb4e46342224606faf2e3eabf1251_X0000 (%let ((__gensym__fb4e25e49e9fb4e46342224606faf2e3eabf1251_X0000 (a.size))) (__gensym__fb4e25e49e9fb4e46342224606faf2e3eabf1251_X0000.to_s)))) (__gensym__fb4e25e49e9fb4e46342224606faf2e3eabf1251_X0000.to_i))"
|
1621
1967
|
lambda { @nendo.evalStr( " (macroexpand '(. (. a size))) " ) }.should raise_error( ArgumentError )
|
1622
1968
|
@nendo.evalStr( " (set! str \"str\") str.size " ).should == "3"
|
1623
1969
|
@nendo.evalStr( " (set! str \"str\") (. str size) " ).should == "3"
|
@@ -1792,17 +2138,52 @@ describe Nendo, "when use hash-table feature " do
|
|
1792
2138
|
@nendo.evalStr( " (hash-table-num-entries h)" ).should == "1"
|
1793
2139
|
@nendo.evalStr( " (hash-table-clear! h)" ).should == "{}"
|
1794
2140
|
@nendo.evalStr( " (hash-table-num-entries h)" ).should == "0"
|
1795
|
-
@nendo.evalStr(
|
1796
|
-
|
1797
|
-
|
2141
|
+
@nendo.evalStr( <<EOS
|
2142
|
+
(set! h (hash-table eq?
|
2143
|
+
'("a" "AAA")
|
2144
|
+
'("b" "BBB")
|
2145
|
+
'("c" "CCC" 100)))
|
2146
|
+
(hash-table-keys h)
|
2147
|
+
EOS
|
2148
|
+
).should == "(\"a\" \"b\" \"c\")"
|
2149
|
+
@nendo.evalStr( <<EOS
|
2150
|
+
(set! h (hash-table eq?
|
2151
|
+
'("a" "AAA")
|
2152
|
+
'("b" "BBB")
|
2153
|
+
'("c" "CCC" 100)))
|
2154
|
+
(hash-table-values h)
|
2155
|
+
EOS
|
2156
|
+
).should == "((\"AAA\") (\"BBB\") (\"CCC\" 100))"
|
2157
|
+
@nendo.evalStr( <<EOS
|
2158
|
+
(set! h (hash-table eq?
|
2159
|
+
'("a" . "AAA")
|
2160
|
+
'("b" . "BBB")
|
2161
|
+
'("c" . "CCC")))
|
2162
|
+
h
|
2163
|
+
EOS
|
2164
|
+
).should == "{\"a\"=>\"AAA\", \"b\"=>\"BBB\", \"c\"=>\"CCC\"}"
|
1798
2165
|
@nendo.evalStr( " (hash-table-keys h)" ).should == '("a" "b" "c")'
|
1799
2166
|
@nendo.evalStr( " (hash-table-values h)" ).should == '("AAA" "BBB" "CCC")'
|
1800
2167
|
@nendo.evalStr( " (hash-table-map h (lambda (a b) (+ a b)))" ).should == '("aAAA" "bBBB" "cCCC")'
|
1801
2168
|
@nendo.evalStr( " (hash-table-for-each h (lambda (a b) (+ a b)))" ).should == '("aAAA" "bBBB" "cCCC")'
|
1802
2169
|
@nendo.evalStr( " (set! h (make-hash-table)) " ).should == "{}"
|
1803
|
-
@nendo.evalStr(
|
2170
|
+
@nendo.evalStr( <<EOS
|
2171
|
+
(set! h (hash-table eq?
|
2172
|
+
'(true . 1)
|
2173
|
+
'(false . 2)
|
2174
|
+
'(nil . 3)))
|
2175
|
+
h
|
2176
|
+
EOS
|
2177
|
+
).should == "{true=>1, false=>2, nil=>3}"
|
1804
2178
|
@nendo.evalStr( " (hash-table-keys h) " ).should == "(#t #f nil)"
|
1805
|
-
@nendo.evalStr(
|
2179
|
+
@nendo.evalStr( <<EOS
|
2180
|
+
(set! h (hash-table eq?
|
2181
|
+
'(1 . true)
|
2182
|
+
'(2 . false)
|
2183
|
+
'(3 . nil)))
|
2184
|
+
h
|
2185
|
+
EOS
|
2186
|
+
).should == "{1=>true, 2=>false, 3=>nil}"
|
1806
2187
|
@nendo.evalStr( " (hash-table-keys h) " ).should == "(1 2 3)"
|
1807
2188
|
end
|
1808
2189
|
end
|
@@ -1858,75 +2239,156 @@ describe Nendo, "tail call optimization " do
|
|
1858
2239
|
@nendo.loadInitFile # to self optimizing. The init.nnd file will be loaded twice, so `filter' can be optimized on second loading phase.
|
1859
2240
|
end
|
1860
2241
|
it "should" do
|
1861
|
-
@nendo.evalStr( " (setup
|
1862
|
-
@nendo.evalStr( " (setup
|
1863
|
-
@nendo.evalStr( " (setup
|
1864
|
-
@nendo.evalStr( " (setup
|
1865
|
-
@nendo.evalStr( " (setup
|
1866
|
-
@nendo.evalStr( " (setup
|
1867
|
-
@nendo.evalStr( " (setup
|
1868
|
-
@nendo.evalStr( " (setup
|
1869
|
-
@nendo.evalStr( " (setup
|
1870
|
-
@nendo.evalStr( " (setup
|
1871
|
-
@nendo.evalStr( " (setup
|
1872
|
-
@nendo.evalStr(
|
1873
|
-
|
1874
|
-
|
1875
|
-
|
1876
|
-
|
1877
|
-
|
1878
|
-
|
1879
|
-
|
1880
|
-
|
1881
|
-
|
1882
|
-
|
1883
|
-
|
1884
|
-
|
1885
|
-
|
1886
|
-
|
1887
|
-
|
1888
|
-
|
1889
|
-
|
1890
|
-
|
1891
|
-
|
1892
|
-
|
1893
|
-
|
1894
|
-
|
1895
|
-
|
1896
|
-
|
1897
|
-
|
1898
|
-
|
1899
|
-
|
1900
|
-
|
1901
|
-
|
1902
|
-
|
1903
|
-
|
1904
|
-
|
1905
|
-
|
1906
|
-
|
1907
|
-
|
2242
|
+
@nendo.evalStr( " (%setup-%tailcall-mark '(print \"abc\")) " ).should == "(%tailcall (print \"abc\"))"
|
2243
|
+
@nendo.evalStr( " (%setup-%tailcall-mark '(begin (print \"abc\") 1 2 3)) " ).should == "(begin (print \"abc\") 1 2 3)"
|
2244
|
+
@nendo.evalStr( " (%setup-%tailcall-mark '(begin 1 2 (print \"abc\") 3)) " ).should == "(begin 1 2 (print \"abc\") 3)"
|
2245
|
+
@nendo.evalStr( " (%setup-%tailcall-mark '(begin 1 2 3 (print \"abc\"))) " ).should == "(begin 1 2 3 (%tailcall (print \"abc\")))"
|
2246
|
+
@nendo.evalStr( " (%setup-%tailcall-mark '(lambda (x) x)) " ).should == "(lambda (x) x)"
|
2247
|
+
@nendo.evalStr( " (%setup-%tailcall-mark '(macro (x) x)) " ).should == "(macro (x) x)"
|
2248
|
+
@nendo.evalStr( " (%setup-%tailcall-mark '(%syntax (x) x)) " ).should == "(%syntax (x) x)"
|
2249
|
+
@nendo.evalStr( " (%setup-%tailcall-mark '(%syntax (a b c) (begin a b c))) " ).should == "(%syntax (a b c) (begin a b c))"
|
2250
|
+
@nendo.evalStr( " (%setup-%tailcall-mark '(lambda (x) (%syntax (y) x))) " ).should == "(lambda (x) (%syntax (y) x))"
|
2251
|
+
@nendo.evalStr( " (%setup-%tailcall-mark '(lambda (x) (syntax-quote x))) " ).should == "(lambda (x) (quote x))"
|
2252
|
+
@nendo.evalStr( " (%setup-%tailcall-mark '(lambda (x) (quote x))) " ).should == "(lambda (x) (quote x))"
|
2253
|
+
@nendo.evalStr( <<EOS
|
2254
|
+
(%setup-%tailcall-mark
|
2255
|
+
'(lambda '(x)
|
2256
|
+
1
|
2257
|
+
2
|
2258
|
+
(print \"abc\")))
|
2259
|
+
EOS
|
2260
|
+
).should == "(lambda (quote (x)) 1 2 (%tailcall (print \"abc\")))"
|
2261
|
+
@nendo.evalStr( <<EOS
|
2262
|
+
(%setup-%tailcall-mark
|
2263
|
+
'(lambda (x)
|
2264
|
+
1
|
2265
|
+
2
|
2266
|
+
(if #t
|
2267
|
+
(begin 1 2 (print "abc"))
|
2268
|
+
(begin 1 2 (print "ABC")))))
|
2269
|
+
EOS
|
2270
|
+
).should == "(lambda (x) 1 2 (if #t (begin 1 2 (%tailcall (print \"abc\"))) (begin 1 2 (%tailcall (print \"ABC\")))))"
|
2271
|
+
@nendo.evalStr( <<EOS
|
2272
|
+
(%setup-%tailcall-mark (macroexpand
|
2273
|
+
'(define (foo) (foo))
|
2274
|
+
))
|
2275
|
+
EOS
|
2276
|
+
).should == "(define foo (lambda () (%tailcall (foo))))"
|
2277
|
+
@nendo.evalStr( <<EOS
|
2278
|
+
(%setup-%tailcall-mark (macroexpand
|
2279
|
+
'(values? (make-values '()))
|
2280
|
+
))
|
2281
|
+
EOS
|
2282
|
+
).should == "(%tailcall (values? (make-values (quote ()))))"
|
2283
|
+
@nendo.evalStr( <<EOS
|
2284
|
+
(%setup-%tailcall-mark (macroexpand
|
2285
|
+
'(cond
|
2286
|
+
(false 1)
|
2287
|
+
(false 2))
|
2288
|
+
))
|
2289
|
+
EOS
|
2290
|
+
).should == "(if #f (begin 1) (if #f (begin 2) ()))"
|
2291
|
+
@nendo.evalStr( <<EOS
|
2292
|
+
(%setup-%tailcall-mark (macroexpand
|
2293
|
+
'(cond
|
2294
|
+
(false 1)
|
2295
|
+
(false 2)
|
2296
|
+
(else 3))
|
2297
|
+
))
|
2298
|
+
EOS
|
2299
|
+
).should == "(if #f (begin 1) (if #f (begin 2) (if #t (begin 3) ())))"
|
2300
|
+
@nendo.evalStr( <<EOS
|
2301
|
+
(%setup-%tailcall-mark (macroexpand
|
2302
|
+
'(and
|
2303
|
+
(foo 1)
|
2304
|
+
(bar 2))
|
2305
|
+
))
|
2306
|
+
EOS
|
2307
|
+
).should == "(if (not (eq? #f (foo 1))) (%tailcall (bar 2)) #f)"
|
2308
|
+
@nendo.evalStr( <<EOS
|
2309
|
+
(%setup-%tailcall-mark (macroexpand
|
2310
|
+
'(or
|
2311
|
+
(foo 1)
|
2312
|
+
(bar 2))
|
2313
|
+
))
|
2314
|
+
EOS
|
2315
|
+
).gsub( /[24]0[0-9][0-9][0-9]/, "X0000" ).should == "(%let ((__gensym__fb4e25e49e9fb4e46342224606faf2e3eabf1251_X0000 (foo 1))) (if __gensym__fb4e25e49e9fb4e46342224606faf2e3eabf1251_X0000 __gensym__fb4e25e49e9fb4e46342224606faf2e3eabf1251_X0000 (%let ((__gensym__fb4e25e49e9fb4e46342224606faf2e3eabf1251_X0000 (bar 2))) (if __gensym__fb4e25e49e9fb4e46342224606faf2e3eabf1251_X0000 __gensym__fb4e25e49e9fb4e46342224606faf2e3eabf1251_X0000 #f))))"
|
2316
|
+
@nendo.evalStr( <<EOS
|
2317
|
+
(%setup-%tailcall-mark (macroexpand
|
2318
|
+
'(let loop ((x 1))
|
2319
|
+
1
|
2320
|
+
2
|
2321
|
+
(loop 100))
|
2322
|
+
))
|
2323
|
+
EOS
|
2324
|
+
).should == "(letrec ((loop (lambda (x) 1 2 (%tailcall (loop 100))))) (%tailcall (loop 1)))"
|
2325
|
+
@nendo.evalStr( "(%setup-%tailcall-mark (macroexpand "+
|
1908
2326
|
" '(let1 aaa 111 aaa)"+
|
1909
|
-
" ))" ).should == "(let ((aaa 111)) aaa)"
|
1910
|
-
@nendo.evalStr(
|
1911
|
-
|
1912
|
-
|
1913
|
-
|
1914
|
-
|
1915
|
-
|
1916
|
-
|
1917
|
-
|
1918
|
-
|
1919
|
-
|
1920
|
-
|
2327
|
+
" ))" ).should == "(%let ((aaa 111)) aaa)"
|
2328
|
+
@nendo.evalStr( <<EOS
|
2329
|
+
(%setup-%tailcall-mark
|
2330
|
+
'(letrec ((func1
|
2331
|
+
(lambda (x)
|
2332
|
+
1
|
2333
|
+
(func2)))
|
2334
|
+
(func2
|
2335
|
+
(lambda (x)
|
2336
|
+
2
|
2337
|
+
(func1))))
|
2338
|
+
(func1 100)))
|
2339
|
+
EOS
|
2340
|
+
).should == "(letrec ((func1 (lambda (x) 1 (%tailcall (func2)))) (func2 (lambda (x) 2 (%tailcall (func1))))) (%tailcall (func1 100)))"
|
1921
2341
|
@nendo.evalStr( "(set-optimize-level 0) " ).should == "0"
|
1922
|
-
lambda { @nendo.evalStr(
|
2342
|
+
lambda { @nendo.evalStr( <<EOS
|
2343
|
+
(filter
|
2344
|
+
(lambda (x) (< x 10))
|
2345
|
+
(range 10000))
|
2346
|
+
EOS
|
2347
|
+
) }.should raise_error(SystemStackError)
|
1923
2348
|
@nendo.evalStr( "(set-optimize-level 1) " ).should == "1"
|
1924
|
-
@nendo.evalStr(
|
1925
|
-
|
1926
|
-
|
1927
|
-
|
1928
|
-
|
1929
|
-
|
2349
|
+
@nendo.evalStr( <<EOS
|
2350
|
+
(apply +
|
2351
|
+
(map
|
2352
|
+
(lambda (x) (* x 2))
|
2353
|
+
(range 10000)))
|
2354
|
+
EOS
|
2355
|
+
).should == "99990000"
|
2356
|
+
@nendo.evalStr( <<EOS
|
2357
|
+
(filter
|
2358
|
+
(lambda (x) (< x 10))
|
2359
|
+
(range 1000))
|
2360
|
+
EOS
|
2361
|
+
).should == "(0 1 2 3 4 5 6 7 8 9)"
|
2362
|
+
@nendo.evalStr( <<EOS
|
2363
|
+
(filter-map
|
2364
|
+
(lambda (x)
|
2365
|
+
(when (< x 10) (- x)))
|
2366
|
+
(range 1000))
|
2367
|
+
EOS
|
2368
|
+
).should == "(0 -1 -2 -3 -4 -5 -6 -7 -8 -9)"
|
2369
|
+
@nendo.evalStr( <<EOS
|
2370
|
+
(define str
|
2371
|
+
(if #t
|
2372
|
+
(car '("a"))
|
2373
|
+
(car '("b"))))
|
2374
|
+
(sprintf "A%sZ" str)
|
2375
|
+
EOS
|
2376
|
+
).should == '"AaZ"'
|
2377
|
+
@nendo.evalStr( <<EOS
|
2378
|
+
(letrec ((str (if #t
|
2379
|
+
(+ "a" "A")
|
2380
|
+
'())))
|
2381
|
+
str.class)
|
2382
|
+
EOS
|
2383
|
+
).should == 'String'
|
2384
|
+
@nendo.evalStr( <<EOS
|
2385
|
+
(letrec ((str
|
2386
|
+
(if #t
|
2387
|
+
(+ \"a\" \"A\")
|
2388
|
+
'())))
|
2389
|
+
(+ str \"...\"))
|
2390
|
+
EOS
|
2391
|
+
).should == '"aA..."'
|
1930
2392
|
end
|
1931
2393
|
end
|
1932
2394
|
|