300 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
			
		
		
	
	
			300 lines
		
	
	
		
			5.4 KiB
		
	
	
	
		
			Plaintext
		
	
	
% Missing core words:
 | 
						|
% bind
 | 
						|
% break
 | 
						|
% catch
 | 
						|
% catch-error
 | 
						|
% echo
 | 
						|
% eput
 | 
						|
% resetinterpreter
 | 
						|
% throw
 | 
						|
% tokenformat
 | 
						|
% tokensize
 | 
						|
% type
 | 
						|
 | 
						|
"Literals" print
 | 
						|
 | 
						|
[] [] test
 | 
						|
[-10] [-10] test
 | 
						|
[10] [+10] test
 | 
						|
[10.5] [10.5] test
 | 
						|
[10.5] [+10.5] test
 | 
						|
[-10.5] [-10.5] test
 | 
						|
[1000000.0] [10e5] test
 | 
						|
[1000000.0] [+10e5] test
 | 
						|
[-1000000.0] [-10e5] test
 | 
						|
[1050000.0] [10.5e5] test
 | 
						|
[1050000.0] [+10.5e5] test
 | 
						|
[-1050000.0] [-10.5e5] test
 | 
						|
[(1,2)][(1,2)] test
 | 
						|
[(1,2,3)][(1,2,3)] test
 | 
						|
["Hello"] ["Hello"] test
 | 
						|
 | 
						|
[1] [{useregs} length] test
 | 
						|
 | 
						|
"Stack shuffling" print
 | 
						|
 | 
						|
[1] [1 2 pop] test
 | 
						|
[1 2 ] [1 2 3 8 2 pops] test
 | 
						|
[2 1] [1 2 exch] test
 | 
						|
["a""b""c""d""d"] ["a""b""c""d" 0 index] test
 | 
						|
["a""b""c""d""a"] ["a""b""c""d" 3 index] test
 | 
						|
[0 2 3 1][0 1 2 3 3 -1 roll] test
 | 
						|
[0 3 1 2][0 1 2 3 3 1 roll] test
 | 
						|
[0 1 2 3][0 1 2 3 3 0 roll] test
 | 
						|
[3 0 1 2][0 1 2 3 4 1 roll] test
 | 
						|
[1 2 3 0][0 1 2 3 4 -1 roll] test
 | 
						|
["a" "b" "c" ["g"]] ["a" "b" "c" ["d" "e" "f" cleartomark "g"]] test
 | 
						|
["d" "e" "f" "g" 4] ["d" "e" "f" "g" counttomark] test
 | 
						|
 | 
						|
"Arrays" print
 | 
						|
 | 
						|
[[1 2 "X"]] [1 2 "X" 3 array] test
 | 
						|
[-10] [[1 2 -10] 2 get] test
 | 
						|
[-10] [[1 2 -10] -1 get] test
 | 
						|
[[1 2 4]] [[1 2 -10] dup 2 4 put] test
 | 
						|
[[1 "X" -10]] [[1 2 -10] dup -2 "X" put] test
 | 
						|
[["a" "b" "c" "d"]] [["a" "b"] ["c" "d"] arrayappend] test
 | 
						|
[["a" "b" 100]] [["a" "b"] 100 append] test
 | 
						|
[{"a" "b" 100}] [{"a" "b"} 100 append] test
 | 
						|
[["a" "b" "c"]] [["a" "b" "c" "d" "e"] 2 pop-back] test
 | 
						|
[{"a" "b" "c"}] [{"a" "b" "c" "d" "e"} 2 pop-back] test
 | 
						|
[["a" "b" "c" "d" "e"]] [["a" "b" "c" "d" "e"] 0 pop-back] test
 | 
						|
[{"a" "b" "c" "d" "e"}] [{"a" "b" "c" "d" "e"} 0 pop-back] test
 | 
						|
[["a" "b" "c" "d"]] [["a" "b" "c" "d" "e"] pop-back] test
 | 
						|
[{"a" "b" "c" "d"}] [{"a" "b" "c" "d" "e"} pop-back] test
 | 
						|
[["c" "d" "e"]] [["a" "b" "c" "d" "e"] 2 pop-front] test
 | 
						|
[{"c" "d" "e"}] [{"a" "b" "c" "d" "e"} 2 pop-front] test
 | 
						|
[["a" "b" "c" "d" "e"]] [["a" "b" "c" "d" "e"] 0 pop-front] test
 | 
						|
[{"a" "b" "c" "d" "e"}] [{"a" "b" "c" "d" "e"} 0 pop-front] test
 | 
						|
[["b" "c" "d" "e"]] [["a" "b" "c" "d" "e"] pop-front] test
 | 
						|
[{"b" "c" "d" "e"}] [{"a" "b" "c" "d" "e"} pop-front] test
 | 
						|
["Boo" 1 2 3] ["Boo" [1 2 3] aload] test
 | 
						|
[4] [["a" "b" "c" "d"] length] test
 | 
						|
[[3 2 1 2 2]] [[1 2 3] [5 1 0 1 1] array-get] test
 | 
						|
[[1 2 4 5 6]] [[1 2 3 4 5 6] 2 arrayremove] test
 | 
						|
[[1 2 3 4 6]] [[1 2 3 4 5 6] -2 arrayremove] test
 | 
						|
[[1 "hallo" 2 3 4]] [[1 ["hallo" 2] 3 [4] []] flatten] test
 | 
						|
[[1 2 [3]]] [[1 [2 [3]]] flatten] test
 | 
						|
[[16.2 33.5 49.0 64.3 80.5]] [[80.5 64.3 49.0 33.5 16.2] reverse] test
 | 
						|
[[ 3 4 5 1 2 3 4 5 1 2 ]] [[ 1 2 3 4 5 ] -3 7 slice] test
 | 
						|
[[ "c" "d" "e" ]] [[ "a" "b" "c" "d" "e" "f" "g" ] 3 2 subarray] test
 | 
						|
 | 
						|
[
 | 
						|
 [2 1 6] %A(rray)
 | 
						|
 [2 0 1] %P(ermutation)
 | 
						|
 1
 | 
						|
]
 | 
						|
[
 | 
						|
 [ 2 1 6 ]
 | 
						|
 dup
 | 
						|
 sort-number-permutation
 | 
						|
 dup
 | 
						|
 2 %index of the first element in p
 | 
						|
 get %get the first element of P
 | 
						|
] test
 | 
						|
 | 
						|
"Dictionaries" print
 | 
						|
 | 
						|
[3 4] [
 | 
						|
 /x 4 def
 | 
						|
 dict begin
 | 
						|
 /x 3 def
 | 
						|
 x
 | 
						|
 end
 | 
						|
 x
 | 
						|
] test
 | 
						|
 | 
						|
[3 4] [
 | 
						|
 /x 4 def
 | 
						|
 dict begin
 | 
						|
 /x 3 def
 | 
						|
 currentdict /x get
 | 
						|
 end
 | 
						|
 currentdict /x get
 | 
						|
] test
 | 
						|
 | 
						|
dict begin
 | 
						|
/squared {dup mul} def
 | 
						|
[25] [5 squared] test
 | 
						|
[{dup mul}] [/squared load] test
 | 
						|
end
 | 
						|
 | 
						|
[3 4] [
 | 
						|
 /x 4 def
 | 
						|
 dict begin
 | 
						|
 /x 3 def
 | 
						|
 x
 | 
						|
 /x undef
 | 
						|
 x
 | 
						|
 end
 | 
						|
] test
 | 
						|
 | 
						|
dict begin
 | 
						|
 | 
						|
/mydict dict def
 | 
						|
mydict /total 0 put
 | 
						|
[1] [mydict /total known] test
 | 
						|
[0] [mydict /badname known] test
 | 
						|
 | 
						|
end
 | 
						|
 | 
						|
dict begin
 | 
						|
 /myBlack (0.0,0.0,0.0) def
 | 
						|
 | 
						|
 [1] [currentdict /myBlack known] test
 | 
						|
 [0] [currentdict /myWhite known] test
 | 
						|
end
 | 
						|
 | 
						|
dict begin
 | 
						|
 /bing 5 def
 | 
						|
 /bong "OH HAI" def
 | 
						|
 | 
						|
 dict begin
 | 
						|
 /bong 10 def
 | 
						|
 | 
						|
 [1 "OH HAI"] [/bing where exch /bong get] test
 | 
						|
 | 
						|
 end
 | 
						|
end
 | 
						|
 | 
						|
[3 3] [
 | 
						|
 /d dict def
 | 
						|
 d /x 3 put
 | 
						|
 d /x get
 | 
						|
 d copy /x 100 put
 | 
						|
 d /x get
 | 
						|
] test
 | 
						|
 | 
						|
[5] [
 | 
						|
 dict begin
 | 
						|
 /a 1 def
 | 
						|
 /b 2 def
 | 
						|
 /c 3 def
 | 
						|
 /d 4 def
 | 
						|
 /e 5 def
 | 
						|
 currentdict keys length
 | 
						|
 end
 | 
						|
] test
 | 
						|
 | 
						|
[/a 10 /b 20 /c 30] dictfromarray begin
 | 
						|
 [10] [a] test
 | 
						|
 [20] [b] test
 | 
						|
 [30] [c] test
 | 
						|
end
 | 
						|
 | 
						|
dict dup
 | 
						|
[/a 10 /b 20 /c 30] exch dictfromarray begin
 | 
						|
 [10] [a] test
 | 
						|
 [20] [b] test
 | 
						|
 [30] [c] test
 | 
						|
end
 | 
						|
 | 
						|
% Ensure original was mutated too!
 | 
						|
begin
 | 
						|
 [10] [a] test
 | 
						|
 [20] [b] test
 | 
						|
 [30] [c] test
 | 
						|
end
 | 
						|
 | 
						|
"Pathnames" print
 | 
						|
["Barak"] [
 | 
						|
 dict dup begin
 | 
						|
 dict dup /name exch def
 | 
						|
 begin
 | 
						|
 /first "Barak" def
 | 
						|
 /last "Obama" def
 | 
						|
 end
 | 
						|
 end
 | 
						|
 .name.first
 | 
						|
] test
 | 
						|
 | 
						|
"Control flow" print
 | 
						|
 | 
						|
["Yes"] [1 {"Yes"} if] test
 | 
						|
[] [0 {"Yes"} if] test
 | 
						|
 | 
						|
["Yes"] [1 {"Yes"} {"No"} ifelse] test
 | 
						|
["No"] [0 {"Yes"} {"No"} ifelse] test
 | 
						|
 | 
						|
[1 2 4 8 16] [1 {dup 2 mul dup 16 ge {exit} if} loop] test
 | 
						|
 | 
						|
[["A" "A" "A" "A" "A" "A" "A" "A"]] [["A"] 3 {dup arrayappend} repeat] test
 | 
						|
 | 
						|
[2 6 10 14 18 22 26 30 34 38] [1 2 19 {2 mul} for] test
 | 
						|
[2 6 10 14 18 22 26 30 34] [1 2 19 {2 mul} forx] test
 | 
						|
 | 
						|
[2 6 10 14] [1 2 7 {2 mul} for] test
 | 
						|
[3 7 11 15] [[1 2 7 {2 mul} for] {1 add} forall] test
 | 
						|
[[3 7 11 15]] [[1 2 7 {2 mul} for] {1 add} map] test
 | 
						|
 | 
						|
[ 10.1 9 8 7 6 5 4 3 2 ]
 | 
						|
[
 | 
						|
 [ 1.1 2 3 4 5 6 7 8 9 ]
 | 
						|
 [ 9 7 5 3 1 -1 -3 -5 -7 ]
 | 
						|
 { add } twoforall
 | 
						|
] test
 | 
						|
 | 
						|
[ -7.9 -5 -2 1 4 7 10 13 16 ]
 | 
						|
[
 | 
						|
 [ 1.1 2 3 4 5 6 7 8 9 ]
 | 
						|
 [ 9 7 5 3 1 -1 -3 -5 -7 ]
 | 
						|
 { sub } twoforall
 | 
						|
] test
 | 
						|
 | 
						|
[[10.1 9 8 7 6 5 4 3 2]]
 | 
						|
[
 | 
						|
 [ 1.1 2 3 4 5 6 7 8 9 ]
 | 
						|
 [ 9 7 5 3 1 -1 -3 -5 -7 ]
 | 
						|
 { add } twomap
 | 
						|
] test
 | 
						|
 | 
						|
[/x] [/x /y 0 ifpop] test
 | 
						|
[/y] [/x /y 1 ifpop] test
 | 
						|
 | 
						|
"Registers" print
 | 
						|
[2 1] [1 2 {usereg !b !a ;b ;a} exec] test
 | 
						|
 | 
						|
[100] [
 | 
						|
 {
 | 
						|
 usereg
 | 
						|
 {dup mul} !squared
 | 
						|
 10 !x
 | 
						|
 | 
						|
 :x :squared
 | 
						|
 } exec
 | 
						|
] test
 | 
						|
 | 
						|
% Ghetto closures
 | 
						|
[6] [
 | 
						|
    /closure-test {
 | 
						|
        usereg
 | 
						|
 | 
						|
        5 !x
 | 
						|
 | 
						|
        {:x 1 add !x} exec
 | 
						|
 | 
						|
        :x
 | 
						|
    } def
 | 
						|
    closure-test
 | 
						|
] test
 | 
						|
 | 
						|
[8] [
 | 
						|
    /closure-test {
 | 
						|
        usereg
 | 
						|
 | 
						|
        5 !x
 | 
						|
 | 
						|
        {:x 1 add !x}
 | 
						|
 | 
						|
        7 !x
 | 
						|
 | 
						|
        exec
 | 
						|
 | 
						|
        :x
 | 
						|
    } def
 | 
						|
    closure-test
 | 
						|
] test
 | 
						|
 | 
						|
"Make sure nothing is left on the stack after the test" print
 | 
						|
count [exch] [0] test
 |