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,11 +1,11 @@
1
- (if-without-checking "switch on the typechecker first!~%")
2
-
3
- (datatype fruit
4
-
5
- if (element? Fruit [cherry pear orange pineapple lemon])
6
- _____________
7
- Fruit : fruit;)
8
-
9
-
10
-
11
-
1
+ (if-without-checking "switch on the typechecker first!~%")
2
+
3
+ (datatype fruit
4
+
5
+ if (element? Fruit [cherry pear orange pineapple lemon])
6
+ _____________
7
+ Fruit : fruit;)
8
+
9
+
10
+
11
+
@@ -1,240 +1,240 @@
1
- (synonyms
2
- card (rank * suit)
3
- cscore number
4
- pscore number )
5
-
6
- (datatype rank
7
-
8
- if (element? Rank [2 3 4 5 6 7 8 9 10 11 12 13 14])
9
- ___________________________________________________
10
- Rank : rank;
11
-
12
- Rank : rank;
13
- ___________
14
- Rank : number;)
15
-
16
- (datatype suit
17
-
18
- if (element? Suit [c d h s])
19
- ____________________________
20
- Suit : suit;)
21
-
22
- (datatype lead
23
-
24
- if (element? L [player computer])
25
- _________________________________
26
- L : lead;)
27
-
28
- (define whist
29
- {lead --> string}
30
- Lead -> (whist-loop (deal-whist 13 (deck _) (@p [] [])) 0 0 Lead))
31
-
32
- (define deck
33
- {A --> (list card)}
34
- _ -> (cartprod [2 3 4 5 6 7 8 9 10 11 12 13 14] [c d h s]))
35
-
36
- (define cartprod
37
- {(list A) --> (list B) --> (list (A * B))}
38
- [] _ -> []
39
- [X | Y] Z -> (append (map (/. W (@p X W)) Z) (cartprod Y Z)))
40
-
41
- (define deal-whist
42
- {number --> (list card) --> ((list card) * (list card)) --> ((list card) * (list card))}
43
- 0 _ (@p Computer Player) -> (@p Computer Player)
44
- N Deck (@p Computer Player)
45
- -> (let CCard (deal-card Deck)
46
- Deck-1 (remove CCard Deck)
47
- PCard (deal-card Deck-1)
48
- Deck-2 (remove PCard Deck-1)
49
- (deal-whist (- N 1) Deck-2 (@p [CCard | Computer] [PCard | Player]))))
50
-
51
- (define deal-card
52
- {(list card) --> card}
53
- Cards -> (nth (+ (random (length Cards)) 1) Cards))
54
-
55
- (define random
56
- {A --> A}
57
- X -> X)
58
-
59
- (define whist-loop
60
- {((list card) * (list card)) --> cscore --> pscore --> lead --> string}
61
- Hands Cscore Pscore _
62
- -> (if (> Cscore Pscore)
63
- (output "~%Computer tricks: ~A, Player tricks: ~A; ~%Computer wins!~%"
64
- Cscore Pscore)
65
- (output "~%Computer tricks: ~A, Player tricks: ~A; ~%You win!~%"
66
- Cscore Pscore))
67
- where (game-over? Hands)
68
- (@p Computer Player) Cscore Pscore computer
69
- -> (let Ccard (computer-shows (play-computer-lead Computer))
70
- Pcard (determine-legal (play-player Player) Ccard Player)
71
- Winner (return-winner (determine-winner Ccard Pcard computer))
72
- Computer-1 (remove Ccard Computer)
73
- Player-1 (remove Pcard Player)
74
- (if (= Winner computer)
75
- (whist-loop (@p Computer-1 Player-1)
76
- (+ 1 Cscore)
77
- Pscore
78
- computer)
79
- (whist-loop (@p Computer-1 Player-1)
80
- Cscore
81
- (+ Pscore 1)
82
- player)))
83
- (@p Computer Player) Cscore Pscore player
84
- -> (let Pcard (play-player Player)
85
- Ccard (computer-shows (play-computer-follow Computer Pcard))
86
- Winner (return-winner (determine-winner Ccard Pcard player))
87
- Computer-1 (remove Ccard Computer)
88
- Player-1 (remove Pcard Player)
89
- (if (= Winner computer)
90
- (whist-loop (@p Computer-1 Player-1)
91
- (+ 1 Cscore)
92
- Pscore
93
- computer)
94
- (whist-loop (@p Computer-1 Player-1)
95
- Cscore
96
- (+ Pscore 1)
97
- player))))
98
-
99
- (define determine-legal
100
- {card --> card --> (list card) --> card}
101
- Pcard Ccard Player -> Pcard where (legal? Pcard Ccard Player)
102
- _ Ccard Player -> (do (output "You must follow suit!" [])
103
- (determine-legal (play-player Player)
104
- Ccard
105
- Player)))
106
-
107
- (define legal?
108
- {card --> card --> (list card) --> boolean}
109
- (@p _ Suit) (@p _ Suit) _ -> true
110
- _ (@p _ Suit) Player -> (void-of-suit? Suit Player))
111
-
112
- (define void-of-suit?
113
- {suit --> (list card) --> boolean}
114
- Suit Player -> (empty? (same-suit Player Suit)))
115
-
116
- (define same-suit
117
- {(list card) --> suit --> (list card)}
118
- [] _ -> []
119
- [(@p Rank Suit) | Cards] Suit -> [(@p Rank Suit) | (same-suit Cards Suit)]
120
- [_ | Cards] Suit -> (same-suit Cards Suit))
121
-
122
- (define determine-winner
123
- {card --> card --> lead --> lead}
124
- (@p Rank1 Suit) (@p Rank2 Suit) _ -> (if (> Rank1 Rank2) computer player)
125
- _ _ Lead -> Lead)
126
-
127
- (define return-winner
128
- {lead --> lead}
129
- computer -> (do (output "~%Computer wins the trick.~%____________________________________________~%" [])
130
- computer)
131
- player -> (do (output "~%Player wins the trick.~%____________________________________________~%" [])
132
- player))
133
-
134
- (define game-over?
135
- {((list card) * (list card)) --> boolean}
136
- (@p [] []) -> true
137
- _ -> false)
138
-
139
- (define play-computer-lead
140
- {(list card) --> card}
141
- Cards -> (select-highest Cards))
142
-
143
- (define computer-shows
144
- {card --> card}
145
- (@p Rank Suit) -> (do (output "~%Computer plays the ~A of ~A~%"
146
- (map-rank Rank) (map-suit Suit))
147
- (@p Rank Suit)))
148
-
149
- (define map-rank
150
- {rank --> string}
151
- 14 -> "ace"
152
- 13 -> "king"
153
- 12 -> "queen"
154
- 11 -> "jack"
155
- N -> (make-string "~A" N))
156
-
157
- (define map-suit
158
- {suit --> string}
159
- c -> "c#5;"
160
- d -> "c#4;"
161
- h -> "c#3;"
162
- s -> "c#6;")
163
-
164
- (define select-highest
165
- {(list card) --> card}
166
- [Card | Cards] -> (select-highest-help Card Cards))
167
-
168
- (define select-highest-help
169
- {card --> (list card) --> card}
170
- Card [] -> Card
171
- Card1 [Card2 | Cards]
172
- -> (select-highest-help Card2 Cards) where (higher? Card2 Card1)
173
- Card [_ | Cards] -> (select-highest-help Card Cards))
174
-
175
- (define higher?
176
- {card --> card --> boolean}
177
- (@p Rank1 _) (@p Rank2 _) -> (> Rank1 Rank2))
178
-
179
- (define play-computer-follow
180
- {(list card) --> card --> card}
181
- Cards (@p Rank Suit)
182
- -> (let FollowSuit (sort lower? (same-suit Cards Suit))
183
- (if (empty? FollowSuit)
184
- (select-lowest Cards)
185
- (let Ccard (select-higher (@p Rank Suit) FollowSuit)
186
- (if (= (determine-winner Ccard (@p Rank Suit) player) computer)
187
- Ccard
188
- (head FollowSuit))))))
189
-
190
- (define sort
191
- {(A --> A --> boolean) --> (list A) --> (list A)}
192
- R X -> (fix (/. Y (sort-help R Y)) X))
193
-
194
- (define sort-help
195
- {(A --> A --> boolean) --> (list A) --> (list A)}
196
- _ [] -> []
197
- _ [X] -> [X]
198
- R [X Y | Z] -> [Y | (sort-help R [X | Z])] where (R Y X)
199
- R [X | Y] -> [X | (sort-help R Y)])
200
-
201
- (define select-higher
202
- {card --> (list card) --> card}
203
- _ [Card] -> Card
204
- Card1 [Card2 | _] -> Card2 where (higher? Card2 Card1)
205
- Card [_ | Cards] -> (select-higher Card Cards))
206
-
207
- (define select-lowest
208
- {(list card) --> card}
209
- [Card | Cards] -> (select-lowest-help Card Cards))
210
-
211
- (define select-lowest-help
212
- {card --> (list card) --> card}
213
- Card [] -> Card
214
- Card1 [Card2 | Cards]
215
- -> (select-lowest-help Card2 Cards) where (lower? Card2 Card1)
216
- Card [_ | Cards] -> (select-lowest-help Card Cards))
217
-
218
- (define lower?
219
- {card --> card --> boolean}
220
- (@p Rank1 _) (@p Rank2 _) -> (< Rank1 Rank2))
221
-
222
- (define play-player
223
- {(list card) --> card}
224
- Cards -> (do (output "~%Your hand is ~%~%")
225
- (show-cards 1 Cards)
226
- (let N (input+ number)
227
- (if (in-range? N Cards)
228
- (nth N Cards)
229
- (play-player Cards)))))
230
-
231
- (define show-cards
232
- {number --> (list card) --> string}
233
- _ [] -> (output "~%~%Choose a Card: ")
234
- N [(@p Rank Suit) | Cards]
235
- -> (do (output "~%~A. ~A of ~A" N (map-rank Rank) (map-suit Suit))
236
- (show-cards (+ N 1) Cards)))
237
-
238
- (define in-range?
239
- {number --> (list card) --> boolean}
1
+ (synonyms
2
+ card (rank * suit)
3
+ cscore number
4
+ pscore number )
5
+
6
+ (datatype rank
7
+
8
+ if (element? Rank [2 3 4 5 6 7 8 9 10 11 12 13 14])
9
+ ___________________________________________________
10
+ Rank : rank;
11
+
12
+ Rank : rank;
13
+ ___________
14
+ Rank : number;)
15
+
16
+ (datatype suit
17
+
18
+ if (element? Suit [c d h s])
19
+ ____________________________
20
+ Suit : suit;)
21
+
22
+ (datatype lead
23
+
24
+ if (element? L [player computer])
25
+ _________________________________
26
+ L : lead;)
27
+
28
+ (define whist
29
+ {lead --> string}
30
+ Lead -> (whist-loop (deal-whist 13 (deck _) (@p [] [])) 0 0 Lead))
31
+
32
+ (define deck
33
+ {A --> (list card)}
34
+ _ -> (cartprod [2 3 4 5 6 7 8 9 10 11 12 13 14] [c d h s]))
35
+
36
+ (define cartprod
37
+ {(list A) --> (list B) --> (list (A * B))}
38
+ [] _ -> []
39
+ [X | Y] Z -> (append (map (/. W (@p X W)) Z) (cartprod Y Z)))
40
+
41
+ (define deal-whist
42
+ {number --> (list card) --> ((list card) * (list card)) --> ((list card) * (list card))}
43
+ 0 _ (@p Computer Player) -> (@p Computer Player)
44
+ N Deck (@p Computer Player)
45
+ -> (let CCard (deal-card Deck)
46
+ Deck-1 (remove CCard Deck)
47
+ PCard (deal-card Deck-1)
48
+ Deck-2 (remove PCard Deck-1)
49
+ (deal-whist (- N 1) Deck-2 (@p [CCard | Computer] [PCard | Player]))))
50
+
51
+ (define deal-card
52
+ {(list card) --> card}
53
+ Cards -> (nth (+ (random (length Cards)) 1) Cards))
54
+
55
+ (define random
56
+ {A --> A}
57
+ X -> X)
58
+
59
+ (define whist-loop
60
+ {((list card) * (list card)) --> cscore --> pscore --> lead --> string}
61
+ Hands Cscore Pscore _
62
+ -> (if (> Cscore Pscore)
63
+ (output "~%Computer tricks: ~A, Player tricks: ~A; ~%Computer wins!~%"
64
+ Cscore Pscore)
65
+ (output "~%Computer tricks: ~A, Player tricks: ~A; ~%You win!~%"
66
+ Cscore Pscore))
67
+ where (game-over? Hands)
68
+ (@p Computer Player) Cscore Pscore computer
69
+ -> (let Ccard (computer-shows (play-computer-lead Computer))
70
+ Pcard (determine-legal (play-player Player) Ccard Player)
71
+ Winner (return-winner (determine-winner Ccard Pcard computer))
72
+ Computer-1 (remove Ccard Computer)
73
+ Player-1 (remove Pcard Player)
74
+ (if (= Winner computer)
75
+ (whist-loop (@p Computer-1 Player-1)
76
+ (+ 1 Cscore)
77
+ Pscore
78
+ computer)
79
+ (whist-loop (@p Computer-1 Player-1)
80
+ Cscore
81
+ (+ Pscore 1)
82
+ player)))
83
+ (@p Computer Player) Cscore Pscore player
84
+ -> (let Pcard (play-player Player)
85
+ Ccard (computer-shows (play-computer-follow Computer Pcard))
86
+ Winner (return-winner (determine-winner Ccard Pcard player))
87
+ Computer-1 (remove Ccard Computer)
88
+ Player-1 (remove Pcard Player)
89
+ (if (= Winner computer)
90
+ (whist-loop (@p Computer-1 Player-1)
91
+ (+ 1 Cscore)
92
+ Pscore
93
+ computer)
94
+ (whist-loop (@p Computer-1 Player-1)
95
+ Cscore
96
+ (+ Pscore 1)
97
+ player))))
98
+
99
+ (define determine-legal
100
+ {card --> card --> (list card) --> card}
101
+ Pcard Ccard Player -> Pcard where (legal? Pcard Ccard Player)
102
+ _ Ccard Player -> (do (output "You must follow suit!" [])
103
+ (determine-legal (play-player Player)
104
+ Ccard
105
+ Player)))
106
+
107
+ (define legal?
108
+ {card --> card --> (list card) --> boolean}
109
+ (@p _ Suit) (@p _ Suit) _ -> true
110
+ _ (@p _ Suit) Player -> (void-of-suit? Suit Player))
111
+
112
+ (define void-of-suit?
113
+ {suit --> (list card) --> boolean}
114
+ Suit Player -> (empty? (same-suit Player Suit)))
115
+
116
+ (define same-suit
117
+ {(list card) --> suit --> (list card)}
118
+ [] _ -> []
119
+ [(@p Rank Suit) | Cards] Suit -> [(@p Rank Suit) | (same-suit Cards Suit)]
120
+ [_ | Cards] Suit -> (same-suit Cards Suit))
121
+
122
+ (define determine-winner
123
+ {card --> card --> lead --> lead}
124
+ (@p Rank1 Suit) (@p Rank2 Suit) _ -> (if (> Rank1 Rank2) computer player)
125
+ _ _ Lead -> Lead)
126
+
127
+ (define return-winner
128
+ {lead --> lead}
129
+ computer -> (do (output "~%Computer wins the trick.~%____________________________________________~%" [])
130
+ computer)
131
+ player -> (do (output "~%Player wins the trick.~%____________________________________________~%" [])
132
+ player))
133
+
134
+ (define game-over?
135
+ {((list card) * (list card)) --> boolean}
136
+ (@p [] []) -> true
137
+ _ -> false)
138
+
139
+ (define play-computer-lead
140
+ {(list card) --> card}
141
+ Cards -> (select-highest Cards))
142
+
143
+ (define computer-shows
144
+ {card --> card}
145
+ (@p Rank Suit) -> (do (output "~%Computer plays the ~A of ~A~%"
146
+ (map-rank Rank) (map-suit Suit))
147
+ (@p Rank Suit)))
148
+
149
+ (define map-rank
150
+ {rank --> string}
151
+ 14 -> "ace"
152
+ 13 -> "king"
153
+ 12 -> "queen"
154
+ 11 -> "jack"
155
+ N -> (make-string "~A" N))
156
+
157
+ (define map-suit
158
+ {suit --> string}
159
+ c -> "c#5;"
160
+ d -> "c#4;"
161
+ h -> "c#3;"
162
+ s -> "c#6;")
163
+
164
+ (define select-highest
165
+ {(list card) --> card}
166
+ [Card | Cards] -> (select-highest-help Card Cards))
167
+
168
+ (define select-highest-help
169
+ {card --> (list card) --> card}
170
+ Card [] -> Card
171
+ Card1 [Card2 | Cards]
172
+ -> (select-highest-help Card2 Cards) where (higher? Card2 Card1)
173
+ Card [_ | Cards] -> (select-highest-help Card Cards))
174
+
175
+ (define higher?
176
+ {card --> card --> boolean}
177
+ (@p Rank1 _) (@p Rank2 _) -> (> Rank1 Rank2))
178
+
179
+ (define play-computer-follow
180
+ {(list card) --> card --> card}
181
+ Cards (@p Rank Suit)
182
+ -> (let FollowSuit (sort lower? (same-suit Cards Suit))
183
+ (if (empty? FollowSuit)
184
+ (select-lowest Cards)
185
+ (let Ccard (select-higher (@p Rank Suit) FollowSuit)
186
+ (if (= (determine-winner Ccard (@p Rank Suit) player) computer)
187
+ Ccard
188
+ (head FollowSuit))))))
189
+
190
+ (define sort
191
+ {(A --> A --> boolean) --> (list A) --> (list A)}
192
+ R X -> (fix (/. Y (sort-help R Y)) X))
193
+
194
+ (define sort-help
195
+ {(A --> A --> boolean) --> (list A) --> (list A)}
196
+ _ [] -> []
197
+ _ [X] -> [X]
198
+ R [X Y | Z] -> [Y | (sort-help R [X | Z])] where (R Y X)
199
+ R [X | Y] -> [X | (sort-help R Y)])
200
+
201
+ (define select-higher
202
+ {card --> (list card) --> card}
203
+ _ [Card] -> Card
204
+ Card1 [Card2 | _] -> Card2 where (higher? Card2 Card1)
205
+ Card [_ | Cards] -> (select-higher Card Cards))
206
+
207
+ (define select-lowest
208
+ {(list card) --> card}
209
+ [Card | Cards] -> (select-lowest-help Card Cards))
210
+
211
+ (define select-lowest-help
212
+ {card --> (list card) --> card}
213
+ Card [] -> Card
214
+ Card1 [Card2 | Cards]
215
+ -> (select-lowest-help Card2 Cards) where (lower? Card2 Card1)
216
+ Card [_ | Cards] -> (select-lowest-help Card Cards))
217
+
218
+ (define lower?
219
+ {card --> card --> boolean}
220
+ (@p Rank1 _) (@p Rank2 _) -> (< Rank1 Rank2))
221
+
222
+ (define play-player
223
+ {(list card) --> card}
224
+ Cards -> (do (output "~%Your hand is ~%~%")
225
+ (show-cards 1 Cards)
226
+ (let N (input+ number)
227
+ (if (in-range? N Cards)
228
+ (nth N Cards)
229
+ (play-player Cards)))))
230
+
231
+ (define show-cards
232
+ {number --> (list card) --> string}
233
+ _ [] -> (output "~%~%Choose a Card: ")
234
+ N [(@p Rank Suit) | Cards]
235
+ -> (do (output "~%~A. ~A of ~A" N (map-rank Rank) (map-suit Suit))
236
+ (show-cards (+ N 1) Cards)))
237
+
238
+ (define in-range?
239
+ {number --> (list card) --> boolean}
240
240
  N Cards -> (and (integer? N) (and (> N 0) (<= N (length Cards)))))