shen-ruby 0.12.1 → 0.13.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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"]))