shen-ruby 0.12.1 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/HISTORY.md +5 -0
  3. data/README.md +8 -12
  4. data/Rakefile +4 -9
  5. data/bin/shen_test_suite.rb +0 -1
  6. data/bin/srrepl +2 -4
  7. data/lib/shen_ruby/shen.rb +98 -0
  8. data/lib/shen_ruby/version.rb +1 -1
  9. data/shen-ruby.gemspec +3 -3
  10. data/shen/README.txt +9 -13
  11. data/shen/release/BSD +24 -0
  12. data/shen/release/klambda/core.kl +157 -0
  13. data/shen/release/klambda/declarations.kl +109 -0
  14. data/shen/release/klambda/load.kl +59 -0
  15. data/shen/release/klambda/macros.kl +91 -0
  16. data/shen/release/klambda/prolog.kl +228 -0
  17. data/shen/release/klambda/reader.kl +198 -0
  18. data/shen/release/klambda/sequent.kl +142 -0
  19. data/shen/release/klambda/sys.kl +253 -0
  20. data/shen/release/klambda/t-star.kl +123 -0
  21. data/shen/release/klambda/toplevel.kl +110 -0
  22. data/shen/release/klambda/track.kl +79 -0
  23. data/shen/release/{k_lambda → klambda}/types.kl +41 -63
  24. data/shen/release/klambda/writer.kl +81 -0
  25. data/shen/release/klambda/yacc.kl +87 -0
  26. data/shen/release/license.pdf +0 -0
  27. data/shen/release/test_programs/Chap13/problems.txt +26 -26
  28. data/shen/release/test_programs/README.shen +52 -52
  29. data/shen/release/test_programs/TinyLispFunctions.txt +15 -15
  30. data/shen/release/test_programs/TinyTypes.shen +55 -55
  31. data/shen/release/test_programs/binary.shen +24 -24
  32. data/shen/release/test_programs/bubble_version_1.shen +28 -28
  33. data/shen/release/test_programs/bubble_version_2.shen +22 -22
  34. data/shen/release/test_programs/calculator.shen +21 -21
  35. data/shen/release/test_programs/cartprod.shen +23 -23
  36. data/shen/release/test_programs/change.shen +25 -25
  37. data/shen/release/test_programs/classes-defaults.shen +94 -94
  38. data/shen/release/test_programs/classes-inheritance.shen +100 -100
  39. data/shen/release/test_programs/classes-typed.shen +74 -74
  40. data/shen/release/test_programs/classes-untyped.shen +46 -46
  41. data/shen/release/test_programs/depth_.shen +14 -14
  42. data/shen/release/test_programs/einstein.shen +34 -34
  43. data/shen/release/test_programs/fruit_machine.shen +46 -46
  44. data/shen/release/test_programs/interpreter.shen +217 -217
  45. data/shen/release/test_programs/metaprog.shen +85 -85
  46. data/shen/release/test_programs/minim.shen +192 -192
  47. data/shen/release/test_programs/mutual.shen +11 -11
  48. data/shen/release/test_programs/n_queens.shen +45 -45
  49. data/shen/release/test_programs/newton_version_1.shen +33 -33
  50. data/shen/release/test_programs/newton_version_2.shen +24 -24
  51. data/shen/release/test_programs/parse.prl +14 -14
  52. data/shen/release/test_programs/parser.shen +51 -51
  53. data/shen/release/test_programs/powerset.shen +10 -10
  54. data/shen/release/test_programs/prime.shen +10 -10
  55. data/shen/release/test_programs/prolog.shen +78 -78
  56. data/shen/release/test_programs/proof_assistant.shen +80 -80
  57. data/shen/release/test_programs/proplog_version_1.shen +25 -25
  58. data/shen/release/test_programs/proplog_version_2.shen +27 -27
  59. data/shen/release/test_programs/qmachine.shen +66 -66
  60. data/shen/release/test_programs/red-black.shen +54 -54
  61. data/shen/release/test_programs/search.shen +55 -55
  62. data/shen/release/test_programs/semantic_net.shen +44 -44
  63. data/shen/release/test_programs/spreadsheet.shen +34 -34
  64. data/shen/release/test_programs/stack.shen +27 -27
  65. data/shen/release/test_programs/streams.shen +20 -20
  66. data/shen/release/test_programs/strings.shen +57 -57
  67. data/shen/release/test_programs/structures-typed.shen +71 -71
  68. data/shen/release/test_programs/structures-untyped.shen +41 -41
  69. data/shen/release/test_programs/tests.shen +232 -232
  70. data/shen/release/test_programs/types.shen +11 -11
  71. data/shen/release/test_programs/whist.shen +239 -239
  72. data/shen/release/test_programs/yacc.shen +132 -132
  73. metadata +21 -35
  74. data/shen/lib/shen_ruby/shen.rb +0 -160
  75. data/shen/license.txt +0 -34
  76. data/shen/release/benchmarks/N_queens.shen +0 -45
  77. data/shen/release/benchmarks/README.shen +0 -14
  78. data/shen/release/benchmarks/benchmarks.shen +0 -52
  79. data/shen/release/benchmarks/bigprog +0 -2173
  80. data/shen/release/benchmarks/einstein.shen +0 -33
  81. data/shen/release/benchmarks/heatwave.gif +0 -0
  82. data/shen/release/benchmarks/interpreter.shen +0 -219
  83. data/shen/release/benchmarks/jnk.shen +0 -194
  84. data/shen/release/benchmarks/picture.jpg +0 -0
  85. data/shen/release/benchmarks/plato.jpg +0 -0
  86. data/shen/release/benchmarks/powerset.shen +0 -10
  87. data/shen/release/benchmarks/prime.shen +0 -10
  88. data/shen/release/benchmarks/short.shen +0 -129
  89. data/shen/release/benchmarks/text.txt +0 -68
  90. data/shen/release/k_lambda/core.kl +0 -181
  91. data/shen/release/k_lambda/declarations.kl +0 -131
  92. data/shen/release/k_lambda/load.kl +0 -84
  93. data/shen/release/k_lambda/macros.kl +0 -112
  94. data/shen/release/k_lambda/prolog.kl +0 -252
  95. data/shen/release/k_lambda/reader.kl +0 -222
  96. data/shen/release/k_lambda/sequent.kl +0 -166
  97. data/shen/release/k_lambda/sys.kl +0 -271
  98. data/shen/release/k_lambda/t-star.kl +0 -139
  99. data/shen/release/k_lambda/toplevel.kl +0 -135
  100. data/shen/release/k_lambda/track.kl +0 -103
  101. data/shen/release/k_lambda/writer.kl +0 -105
  102. data/shen/release/k_lambda/yacc.kl +0 -113
@@ -1,56 +1,56 @@
1
- (define breadth-first
2
- {state --> (state --> (list state)) --> (state --> boolean) --> boolean}
3
- Start F Test -> (b* F Test (F Start)))
4
-
5
- (define b*
6
- {(state --> (list state)) --> (state --> boolean) --> (list state) --> boolean}
7
- F Test States -> true where (some Test States)
8
- F Test States -> (let NewStates (mapcan F States)
9
- (if (empty? NewStates)
10
- false
11
- (b* F Test NewStates))))
12
-
13
- (define some
14
- {(A --> boolean) --> (list A) --> boolean}
15
- Test [] -> false
16
- Test [X|Y] -> (or (Test X) (some Test Y)))
17
-
18
- (define depth
19
- {state --> (state --> (list state)) --> (state --> boolean) --> boolean}
20
- Start _ Test -> true where (Test Start)
21
- Start F Test -> (d* F Test (F Start)))
22
-
23
- (define d*
24
- {(state --> (list state)) --> (state --> boolean) --> (list state) --> boolean}
25
- _ Test [State | _] -> true where (Test State)
26
- F Test [State | States] <- (fail-if (= false) (d* F Test (F State)))
27
- F Test [_ | States] -> (d* F Test States)
28
- _ _ _ -> false)
29
-
30
- (define hill
31
- {(state --> number) --> state --> (state --> (list state)) --> (state --> boolean) --> boolean}
32
- _ Start _ Test -> true where (Test Start)
33
- E Start F Test -> (h* E F Test (order_states E (F Start))))
34
-
35
- (define h*
36
- {(state --> number) --> (state --> (list state)) --> (state --> boolean) --> (list state) --> boolean}
37
- _ _ Test [State | _] -> true where (Test State)
38
- E F Test [State | States]
39
- <- (fail-if (/. X (= X false)) (h* E F Test (order_states E (F State))))
40
- E F Test [_ | States] -> (h* E F Test States)
41
- _ _ _ _ -> false)
42
-
43
- (define order_states
44
- {(state --> number) --> (list state) --> (list state)}
45
- E States -> (sort (/. S1 (/. S2 (> (E S1) (E S2)))) States))
46
-
47
- (define sort
48
- {(A --> (A --> boolean)) --> (list A) --> (list A)}
49
- R X -> (fix (/. Y (sort* R Y)) X))
50
-
51
- (define sort*
52
- {(A --> A --> boolean) --> (list A) --> (list A)}
53
- _ [] -> []
54
- _ [X] -> [X]
55
- R [X Y | Z] -> [Y | (sort* R [X | Z])] where (R Y X)
1
+ (define breadth-first
2
+ {state --> (state --> (list state)) --> (state --> boolean) --> boolean}
3
+ Start F Test -> (b* F Test (F Start)))
4
+
5
+ (define b*
6
+ {(state --> (list state)) --> (state --> boolean) --> (list state) --> boolean}
7
+ F Test States -> true where (some Test States)
8
+ F Test States -> (let NewStates (mapcan F States)
9
+ (if (empty? NewStates)
10
+ false
11
+ (b* F Test NewStates))))
12
+
13
+ (define some
14
+ {(A --> boolean) --> (list A) --> boolean}
15
+ Test [] -> false
16
+ Test [X|Y] -> (or (Test X) (some Test Y)))
17
+
18
+ (define depth
19
+ {state --> (state --> (list state)) --> (state --> boolean) --> boolean}
20
+ Start _ Test -> true where (Test Start)
21
+ Start F Test -> (d* F Test (F Start)))
22
+
23
+ (define d*
24
+ {(state --> (list state)) --> (state --> boolean) --> (list state) --> boolean}
25
+ _ Test [State | _] -> true where (Test State)
26
+ F Test [State | States] <- (fail-if (= false) (d* F Test (F State)))
27
+ F Test [_ | States] -> (d* F Test States)
28
+ _ _ _ -> false)
29
+
30
+ (define hill
31
+ {(state --> number) --> state --> (state --> (list state)) --> (state --> boolean) --> boolean}
32
+ _ Start _ Test -> true where (Test Start)
33
+ E Start F Test -> (h* E F Test (order_states E (F Start))))
34
+
35
+ (define h*
36
+ {(state --> number) --> (state --> (list state)) --> (state --> boolean) --> (list state) --> boolean}
37
+ _ _ Test [State | _] -> true where (Test State)
38
+ E F Test [State | States]
39
+ <- (fail-if (/. X (= X false)) (h* E F Test (order_states E (F State))))
40
+ E F Test [_ | States] -> (h* E F Test States)
41
+ _ _ _ _ -> false)
42
+
43
+ (define order_states
44
+ {(state --> number) --> (list state) --> (list state)}
45
+ E States -> (sort (/. S1 (/. S2 (> (E S1) (E S2)))) States))
46
+
47
+ (define sort
48
+ {(A --> (A --> boolean)) --> (list A) --> (list A)}
49
+ R X -> (fix (/. Y (sort* R Y)) X))
50
+
51
+ (define sort*
52
+ {(A --> A --> boolean) --> (list A) --> (list A)}
53
+ _ [] -> []
54
+ _ [X] -> [X]
55
+ R [X Y | Z] -> [Y | (sort* R [X | Z])] where (R Y X)
56
56
  R [X Y | Z] -> [X | (sort* R [Y | Z])])
@@ -1,44 +1,44 @@
1
- (define query
2
- [is Object Concept] -> (if (belongs? Object Concept) yes no))
3
-
4
- (define belongs?
5
- Object Concept -> (element? Concept (fix spread-activation [Object])))
6
-
7
- (define spread-activation
8
- [] -> []
9
- [Vertex | Vertices] -> (union (accessible-from Vertex)
10
- (spread-activation Vertices)))
11
-
12
- (define accessible-from
13
- Vertex -> [Vertex | (union (is_links Vertex) (type_links Vertex))])
14
-
15
- (define is_links
16
- Vertex -> (get-prop Vertex is_a []))
17
-
18
- (define type_links
19
- Vertex -> (get-prop Vertex type_of []))
20
-
21
- (define assert
22
- [Object is_a Type] -> (put Object is_a [Type | (is_links Object)])
23
- [Type1 type_of Type2] -> (put Type1 type_of [Type2 | (type_links Type1)]))
24
-
25
- (define get-prop
26
- Ob Pointer Default -> (trap-error (get Ob Pointer) (/. E Default)))
27
-
28
- (define clear
29
- Ob -> (put Ob is_a (put Ob type_of [])))
30
-
31
-
32
-
33
-
34
-
35
-
36
-
37
-
38
-
39
-
40
-
41
-
42
-
43
-
44
-
1
+ (define query
2
+ [is Object Concept] -> (if (belongs? Object Concept) yes no))
3
+
4
+ (define belongs?
5
+ Object Concept -> (element? Concept (fix spread-activation [Object])))
6
+
7
+ (define spread-activation
8
+ [] -> []
9
+ [Vertex | Vertices] -> (union (accessible-from Vertex)
10
+ (spread-activation Vertices)))
11
+
12
+ (define accessible-from
13
+ Vertex -> [Vertex | (union (is_links Vertex) (type_links Vertex))])
14
+
15
+ (define is_links
16
+ Vertex -> (get-prop Vertex is_a []))
17
+
18
+ (define type_links
19
+ Vertex -> (get-prop Vertex type_of []))
20
+
21
+ (define assert
22
+ [Object is_a Type] -> (put Object is_a [Type | (is_links Object)])
23
+ [Type1 type_of Type2] -> (put Type1 type_of [Type2 | (type_links Type1)]))
24
+
25
+ (define get-prop
26
+ Ob Pointer Default -> (trap-error (get Ob Pointer) (/. E Default)))
27
+
28
+ (define clear
29
+ Ob -> (put Ob is_a (put Ob type_of [])))
30
+
31
+
32
+
33
+
34
+
35
+
36
+
37
+
38
+
39
+
40
+
41
+
42
+
43
+
44
+
@@ -1,35 +1,35 @@
1
- (define assess-spreadsheet
2
- Spreadsheet -> (map (/. Row (assign-fixed-values Row Spreadsheet))
3
- Spreadsheet))
4
-
5
- (define assign-fixed-values
6
- [Index | Cells] Spreadsheet
7
- -> [Index | (map (/. Cell (assign-cell-value Cell Spreadsheet)) Cells)])
8
-
9
- (define assign-cell-value
10
- [Attribute Value] _ -> [Attribute Value] where (fixed-value? Value)
11
- [Attribute Value] Spreadsheet -> [Attribute (Value Spreadsheet)])
12
-
13
- (define fixed-value?
14
- \* number?, symbol? and string? are system functions - see appendix A *\
15
- Value -> (or (number? Value) (or (symbol? Value) (string? Value))))
16
-
17
- (define get'
18
- \* spreads the spreadsheet! *\
19
- Index Attribute Spreadsheet
20
- -> (get-row Index Attribute Spreadsheet Spreadsheet))
21
-
22
- (define get-row
23
- \* looks for the right row using the index *\
24
- Index Attribute [[Index | Cells] | _] Spreadsheet
25
- -> (get-cell Attribute Cells Spreadsheet)
26
- Index Attribute [_ | Rows] Spreadsheet
27
- -> (get-row Index Attribute Rows Spreadsheet)
28
- Index _ _ _ -> (error "Index ~A not found" Index))
29
-
30
- (define get-cell
31
- Attribute [[Attribute Value] | _] Spreadsheet
32
- -> (if (fixed-value? Value) Value (Value Spreadsheet))
33
- Attribute [_ | Cells] Spreadsheet
34
- -> (get-cell Attribute Cells Spreadsheet)
1
+ (define assess-spreadsheet
2
+ Spreadsheet -> (map (/. Row (assign-fixed-values Row Spreadsheet))
3
+ Spreadsheet))
4
+
5
+ (define assign-fixed-values
6
+ [Index | Cells] Spreadsheet
7
+ -> [Index | (map (/. Cell (assign-cell-value Cell Spreadsheet)) Cells)])
8
+
9
+ (define assign-cell-value
10
+ [Attribute Value] _ -> [Attribute Value] where (fixed-value? Value)
11
+ [Attribute Value] Spreadsheet -> [Attribute (Value Spreadsheet)])
12
+
13
+ (define fixed-value?
14
+ \* number?, symbol? and string? are system functions - see appendix A *\
15
+ Value -> (or (number? Value) (or (symbol? Value) (string? Value))))
16
+
17
+ (define get'
18
+ \* spreads the spreadsheet! *\
19
+ Index Attribute Spreadsheet
20
+ -> (get-row Index Attribute Spreadsheet Spreadsheet))
21
+
22
+ (define get-row
23
+ \* looks for the right row using the index *\
24
+ Index Attribute [[Index | Cells] | _] Spreadsheet
25
+ -> (get-cell Attribute Cells Spreadsheet)
26
+ Index Attribute [_ | Rows] Spreadsheet
27
+ -> (get-row Index Attribute Rows Spreadsheet)
28
+ Index _ _ _ -> (error "Index ~A not found" Index))
29
+
30
+ (define get-cell
31
+ Attribute [[Attribute Value] | _] Spreadsheet
32
+ -> (if (fixed-value? Value) Value (Value Spreadsheet))
33
+ Attribute [_ | Cells] Spreadsheet
34
+ -> (get-cell Attribute Cells Spreadsheet)
35
35
  Attribute _ _ -> (error "Attribute ~A not found" Attribute))
@@ -1,27 +1,27 @@
1
- (declare empty-stack [A --> [stack B]])
2
-
3
- (declare push [A --> [stack A] --> [stack A]])
4
-
5
- (declare top [[stack A] --> A])
6
-
7
- (declare pop [[stack A] --> [stack A]])
8
-
9
- (define empty-stack
10
- _ -> (/. X (if (or (= X pop) (= X top))
11
- (error "this stack is empty~%")
12
- (error "~A is not an operation on stacks.~%" X))))
13
-
14
- (define push
15
- X S -> (/. Y (if (= Y pop)
16
- S
17
- (if (= Y top)
18
- X
19
- (error "~A is not an operation on stacks.~%" Y)))))
20
-
21
- (define top
22
- S -> (S top))
23
-
24
- (define pop
25
- S -> (S pop))
26
-
27
-
1
+ (declare empty-stack [A --> [stack B]])
2
+
3
+ (declare push [A --> [stack A] --> [stack A]])
4
+
5
+ (declare top [[stack A] --> A])
6
+
7
+ (declare pop [[stack A] --> [stack A]])
8
+
9
+ (define empty-stack
10
+ _ -> (/. X (if (or (= X pop) (= X top))
11
+ (error "this stack is empty~%")
12
+ (error "~A is not an operation on stacks.~%" X))))
13
+
14
+ (define push
15
+ X S -> (/. Y (if (= Y pop)
16
+ S
17
+ (if (= Y top)
18
+ X
19
+ (error "~A is not an operation on stacks.~%" Y)))))
20
+
21
+ (define top
22
+ S -> (S top))
23
+
24
+ (define pop
25
+ S -> (S pop))
26
+
27
+
@@ -1,20 +1,20 @@
1
- (datatype progression
2
-
3
- X : (A * (A --> A) * (A --> boolean));
4
- ======================================
5
- X : (progression A);)
6
-
7
- (define delay
8
- {(progression A) --> (progression A)}
9
- (@p X F E) -> (if (not (E X))
10
- (@p (F X) F E)
11
- (error "progression exhausted!~%")))
12
-
13
- (define force
14
- {(progression A) --> A}
15
- (@p X F E) -> X)
16
-
17
- (define end?
18
- {(progression A) --> boolean}
19
- (@p X _ E) -> (E X))
20
-
1
+ (datatype progression
2
+
3
+ X : (A * (A --> A) * (A --> boolean));
4
+ ======================================
5
+ X : (progression A);)
6
+
7
+ (define delay
8
+ {(progression A) --> (progression A)}
9
+ (@p X F E) -> (if (not (E X))
10
+ (@p (F X) F E)
11
+ (error "progression exhausted!~%")))
12
+
13
+ (define force
14
+ {(progression A) --> A}
15
+ (@p X F E) -> X)
16
+
17
+ (define end?
18
+ {(progression A) --> boolean}
19
+ (@p X _ E) -> (E X))
20
+
@@ -1,58 +1,58 @@
1
- \* Replace the first occurrence of a string Rem by Rep *\
2
- (define subst-string
3
- {string --> string --> string --> string}
4
- _ _ "" -> ""
5
- Rep (@s S Ss) (@s S Ss') <- (fail-if (= "failed!") (subst-string' Rep Ss Ss'))
6
- Rep Rem (@s S Ss) -> (@s S (subst-string Rep Rem Ss)))
7
-
8
- (define subst-string'
9
- {string --> string --> string --> string}
10
- Rep "" Ss -> (@s Rep Ss)
11
- Rep (@s S Ss) (@s S Ss') -> (subst-string' Rep Ss Ss')
12
- _ _ _ -> "failed!")
13
-
14
- (define rwilli
15
- {string --> string}
16
- "" -> ""
17
- (@s "Willi" Ss) -> (rwilli Ss)
18
- (@s _ Ss) -> (rwilli Ss))
19
-
20
-
21
- \* Length of a string. *\
22
- (define strlen
23
- {string --> number}
24
- "" -> 0
25
- (@s _ S) -> (+ 1 (strlen S)))
26
-
27
- \* Trim characters from the front of a string. *\
28
- (define trim-string-left
29
- {(list string) --> string --> string}
30
- _ "" -> ""
31
- Trim (@s S Ss) -> (@s S Ss) where (not (element? S Trim))
32
- Trim (@s _ Ss) -> (trim-string-left Trim Ss))
33
-
34
- \* Trim characters from the end of a string. *\
35
- (define trim-string-right
36
- {(list string) --> string --> string}
37
- Trim S -> (reverse-string (trim-string-left Trim (reverse-string S))))
38
-
39
- \* Trim characters from the front and end of a string *\
40
- (define trim-string
41
- {(list string) --> string --> string}
42
- Trim S -> (reverse-string (trim-string-left Trim (reverse-string (trim-string-left Trim S)))))
43
-
44
- \* Reverse a string. *\
45
- (define reverse-string
46
- {string --> string}
47
- "" -> ""
48
- (@s S Ss) -> (@s (reverse-string Ss) S))
49
-
50
- \* A string of digits? *\
51
- (define alldigits?
52
- {string --> boolean}
53
- "" -> true
54
- (@s S Ss) -> (and (digit? S) (alldigits? Ss)))
55
-
56
- (define digit?
57
- {string --> boolean}
1
+ \* Replace the first occurrence of a string Rem by Rep *\
2
+ (define subst-string
3
+ {string --> string --> string --> string}
4
+ _ _ "" -> ""
5
+ Rep (@s S Ss) (@s S Ss') <- (fail-if (= "failed!") (subst-string' Rep Ss Ss'))
6
+ Rep Rem (@s S Ss) -> (@s S (subst-string Rep Rem Ss)))
7
+
8
+ (define subst-string'
9
+ {string --> string --> string --> string}
10
+ Rep "" Ss -> (@s Rep Ss)
11
+ Rep (@s S Ss) (@s S Ss') -> (subst-string' Rep Ss Ss')
12
+ _ _ _ -> "failed!")
13
+
14
+ (define rwilli
15
+ {string --> string}
16
+ "" -> ""
17
+ (@s "Willi" Ss) -> (rwilli Ss)
18
+ (@s _ Ss) -> (rwilli Ss))
19
+
20
+
21
+ \* Length of a string. *\
22
+ (define strlen
23
+ {string --> number}
24
+ "" -> 0
25
+ (@s _ S) -> (+ 1 (strlen S)))
26
+
27
+ \* Trim characters from the front of a string. *\
28
+ (define trim-string-left
29
+ {(list string) --> string --> string}
30
+ _ "" -> ""
31
+ Trim (@s S Ss) -> (@s S Ss) where (not (element? S Trim))
32
+ Trim (@s _ Ss) -> (trim-string-left Trim Ss))
33
+
34
+ \* Trim characters from the end of a string. *\
35
+ (define trim-string-right
36
+ {(list string) --> string --> string}
37
+ Trim S -> (reverse-string (trim-string-left Trim (reverse-string S))))
38
+
39
+ \* Trim characters from the front and end of a string *\
40
+ (define trim-string
41
+ {(list string) --> string --> string}
42
+ Trim S -> (reverse-string (trim-string-left Trim (reverse-string (trim-string-left Trim S)))))
43
+
44
+ \* Reverse a string. *\
45
+ (define reverse-string
46
+ {string --> string}
47
+ "" -> ""
48
+ (@s S Ss) -> (@s (reverse-string Ss) S))
49
+
50
+ \* A string of digits? *\
51
+ (define alldigits?
52
+ {string --> boolean}
53
+ "" -> true
54
+ (@s S Ss) -> (and (digit? S) (alldigits? Ss)))
55
+
56
+ (define digit?
57
+ {string --> boolean}
58
58
  S -> (element? S ["0" "1" "2" "3" "4" "5" "6" "7" "8" "9"]))