tvfrob.94 38 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360
  1. <USE "ASYLUM" "MADMAN" "STR">
  2. <DEFINE MAKE.QUESTIONS ("AUX" TYPE (OUTCHAN ,OUTCHAN) (QSP ,QSPACE)
  3. (TVA ,TVASS) (SSP ,SSPACE) ITM VEC NEW FOOV
  4. COMPLEX?)
  5. #DECL ((QUTCHAN) <CHANNEL FIX [9 STRING]> (QSP SSP) SPACE (TVA) ASYLUM
  6. (VEC) VECTOR (ITM) <LIST [REST FIX]> (NEW) <OR FALSE FIX>
  7. (COMPLEX?) <OR ATOM FALSE> (FOOV) <UVECTOR <PRIMTYPE WORD>>
  8. (TYPE) <OR FALSE SYMBOL FIX>)
  9. <SET-STATUS ,$SMAKE>
  10. <REPEAT (Q QUES HIQ QNUM (COAUTH 0))
  11. #DECL ((Q) <OR FALSE LIST> (QUES) VECTOR (HIQ) <OR FALSE MANIAC> (QNUM) FIX
  12. (COAUTH) <OR FIX <LIST [REST STRING]>>)
  13. <AND ,FLUSH <FLUSH-EM>>
  14. <AND ,PNEWMAIL ,EXISTS <READ.MAIL> <SET-STATUS ,$SMAKE>>
  15. <ARESET .QSP T <>>
  16. <PROG ()
  17. <SET TYPE
  18. <READER ,QTYPES
  19. <TP "Question type: ">
  20. '["" ""]
  21. '["SYM"]
  22. ,VERBOSE>>
  23. <AND .TYPE
  24. <==? <2 .TYPE> ,$TCOAUTH>
  25. <SET COAUTH <BUFLEX <UPPERCASE <STRING <GETBUF "Other authors: ">>>>>
  26. <AGAIN>>>
  27. <COND (<NOT .TYPE> <RETURN>) (<SET TYPE <2 .TYPE>>)>
  28. <COND (<0? .TYPE> <RETURN>)>
  29. <SET-STATUS ,$SMAKE .TYPE>
  30. <SET COMPLEX? <N==? .TYPE ,$TSIMPLE>>
  31. <COND
  32. (<SET Q <APPLY <NTH ,MAKERS .TYPE>>>
  33. <SET QUES <AVECTOR .QSP 0 0 0 0 0 0 0 0 !.Q>>
  34. <PUT .QUES ,QAUTH ,PLAYER>
  35. <PUT .QUES ,QTYPE .TYPE>
  36. <COND (.COMPLEX?
  37. <PROG (TMP)
  38. <COND (<SET TMP <DATA-RESERVE .TVA 1>>
  39. <PUT .QUES ,QSCORE .TMP>)
  40. (T <AGAIN>)>>
  41. <PUT .QUES
  42. ,QCAT
  43. <REPEAT (BAR)
  44. #DECL ((BAR) <OR SYMBOL FALSE>)
  45. <COND (<SET BAR
  46. <READER ,CATS
  47. <TP "Category: ">
  48. ""
  49. '["SYM"]
  50. ,VERBOSE>>
  51. <RETURN <2 .BAR>>)>>>
  52. <PUT .QUES
  53. ,QVAL
  54. <REPEAT (SC)
  55. #DECL ((SC) <OR FALSE FIX FLOAT>)
  56. <COND (<AND <SET SC
  57. <READER '[]
  58. <TP "Value: ">
  59. '[
  60. "
  61. Enter the value of this question (maximum 2.0)"
  62. ""]
  63. '["FIX" "FLOAT"]
  64. ,VERBOSE>>
  65. <L=? .SC 2>
  66. <G=? .SC 0>>
  67. <RETURN <FLOAT .SC>>)>>>)>
  68. <CRLF>
  69. <PUT .QUES ,QCOAUTH <ACOPY .QSP .COAUTH>>
  70. <SET COAUTH 0>
  71. <PUT .QUES
  72. ,QQNUM
  73. <SET QNUM <CHTYPE <DATA-READW .TVA ,HIQNUM> FIX>>>
  74. <DATA-PRINTW .TVA ,HIQNUM <+ .QNUM 1>>
  75. <PUT <SET FOOV ,TTUV> 1 .QNUM>
  76. <PUT-LOC <+ ,PG ,BABBLE-HIQ> .FOOV>
  77. <COND
  78. (<SET NEW <CHAIN-APPEND .TVA .QSP .QUES ,HIQLOC>>
  79. <COND (.COMPLEX?
  80. <DATA-PRINTW
  81. .TVA
  82. <+ ,1STCAT <NTH .QUES ,QCAT>>
  83. <+ <NTH .QUES ,QVAL>
  84. <CHTYPE <DATA-READW .TVA <+ ,1STCAT <NTH .QUES ,QCAT>>>
  85. FLOAT>>>
  86. <DATA-PRINTW .TVA
  87. ,TOTSCR
  88. <+ <NTH .QUES ,QVAL>
  89. <CHTYPE <DATA-READW .TVA ,TOTSCR> FLOAT>>>
  90. <AND <SET HIQ <DATA-OPEN "PRINT" .TVA <+ ,LUBLK ,QASKED>>>
  91. <SET VEC <DATA-IREAD .TVA .HIQ <ARESET .SSP T <>>>>
  92. <SET ITM <NTH .VEC <NTH .QUES ,QCAT>>>
  93. <SET ITM <ACONS .SSP <NTH .QUES ,QQNUM> .ITM>>
  94. <PUT .VEC
  95. <NTH .QUES ,QCAT>
  96. <ACONS .SSP .NEW .ITM>>
  97. <DATA-IPRINT .TVA .HIQ .SSP .VEC>
  98. <DATA-CLOSE .TVA .HIQ>>)
  99. (T
  100. <PROG (SLIST SMAN (SISP <COND (<GASSIGNED? SIMPLE-SPACE> ,SIMPLE-SPACE)
  101. (T <SETG SIMPLE-SPACE <AFIND 1>>)>)
  102. TEMP)
  103. #DECL ((SLIST TEMP) <LIST [REST TIME FIX FIX]>
  104. (SMAN) <OR FALSE MANIAC>
  105. (SISP) SPACE)
  106. <SETG SIMTABLE? <>>
  107. <COND (<SET SMAN <DATA-OPEN "PRINT" .TVA ,SIMPLE-LIST>>
  108. <SET SLIST <DATA-IREAD .TVA .SMAN <ARESET .SISP T <>>>>
  109. <PUTREST <REST <SET TEMP <ALIST .SISP ,PLAYER .QNUM .NEW>> 2>
  110. .SLIST>
  111. <DATA-IPRINT .TVA .SMAN .SISP .TEMP>
  112. <DATA-CLOSE .TVA .SMAN>)
  113. (T
  114. <SLEEP .5>
  115. <AGAIN>)>>)>
  116. <CRLF>
  117. <PRINC "Question is #">
  118. <PRIN1 .QNUM>)
  119. (<PERR "Can't make new question, MAKE.QUESTION" .QUES>)>)
  120. (<CRLF> <PRINC "ERROR - "> <PRINC <1 .Q>> <CRLF>)>>>
  121. <DEFINE GRAB-BUNCH (STR "AUX" FROB FROBS (IDX 1) (QSP ,QSPACE))
  122. #DECL ((STR) STRING (FROB) STRING (FROBS) LIST (IDX) FIX
  123. (QSP) SPACE)
  124. <COND
  125. (<NOT <EMPTY? <SET FROB <GETBUF <STRING .STR "1: ">>>>>
  126. <SET FROBS <ALIST .QSP .FROB>>
  127. <REPEAT ((CRUFT .FROBS))
  128. <SET FROB
  129. <GETBUF <STRING .STR
  130. <UNPARSE <SET IDX <+ .IDX 1>>>
  131. ": ">>>
  132. <COND (<QUESTIONABLE? .FROB> <RETURN .FROBS>)>
  133. <SET CRUFT <REST <PUTREST .CRUFT <ALIST .QSP .FROB>>>>>)
  134. ('#FALSE ("Question aborted"))>>
  135. <SETG SCORED? <>>
  136. <GDECL (SCORED?) <OR ATOM FALSE>>
  137. <DEFINE ASK.QUESTIONS ("AUX" QUESTION? QUESTION (OUTCHAN .OUTCHAN))
  138. #DECL ((QUESTION?) <SPECIAL <OR VECTOR FALSE>> (QUESTION) VECTOR
  139. (OUTCHAN) CHANNEL)
  140. <UNWIND
  141. <REPEAT ()
  142. <TERPRI>
  143. <AND ,PNEWMAIL ,EXISTS <READ.MAIL>>
  144. <COND (,FLUSH <FLUSH-EM>)
  145. (<SET QUESTION? <GETNEXTQ>>
  146. <SET-STATUS ,$SASK <NTH .QUESTION? ,QQNUM>>
  147. <SET QUESTION .QUESTION?>
  148. <ARESET ,ASPACE T <>>
  149. <COND (<OR <==? ,PLAYER <NTH .QUESTION ,QAUTH>>
  150. <AND <N==? <NTH .QUESTION ,QCOAUTH> 0>
  151. <MEMQ ,PLAYER <NTH .QUESTION ,QCOAUTH>>>>)
  152. (<APPLY <NTH ,ASKERS <NTH .QUESTION ,QTYPE>>
  153. .QUESTION>)>
  154. <PROGRESS>
  155. <SETG SCORED? <>>
  156. <COND (<OR ,KEEPASKING
  157. <PROG topask ()
  158. #DECL ((topask) <SPECIAL ACTIVATION>)
  159. <TRUE? "More "
  160. "Y/N"
  161. "Yy"
  162. "Nn"
  163. <ASCII 22>>>>)
  164. (<RETURN>)>)
  165. (T <RETURN <>>)>>
  166. <COND (,SCORED? <SET SCORED? <>> <PROGRESS>)>>>
  167. <DEFINE GETNEXTQ ("AUX" (TVA ,TVASS) (QSP ,QSPACE)
  168. (QNM <THISQ>) Q)
  169. #DECL ((QNM) FIX (QSP) SPACE (TVA) ASYLUM (Q) <OR FALSE VECTOR>)
  170. <PROG ()
  171. <COND (<N==? .QNM 0>
  172. <COND (<SET Q <DATA-AREAD .TVA .QNM <ARESET .QSP T <>>>>
  173. <PQHEADER .Q>
  174. .Q)
  175. (<PROGRESS> <AGAIN>)>)>>>
  176. <DEFINE PQHEADER (Q)
  177. #DECL ((Q) VECTOR)
  178. <CRLF>
  179. <PRINC "Question #">
  180. <PRIN1 <NTH .Q ,QQNUM>>
  181. <PRINC " by ">
  182. <6PRINC <NTH .Q ,QAUTH>>
  183. <COND (<N==? <NTH .Q ,QCOAUTH> 0>
  184. <PRINC " with ">
  185. <MAPF <>
  186. <FUNCTION (X) <6PRINC .X> <PRINC " ">>
  187. <NTH .Q ,QCOAUTH>>)>
  188. <COND (<==? <NTH .Q ,QTYPE> 7> <PRINC " Worthless">)
  189. (<PRINC " Category: ">
  190. <PRINC <NTH <2 ,CATS> <- <* 2 <NTH .Q ,QCAT>> 1>>>
  191. <PRINC " Worth: ">
  192. <PRIN1 <NTH .Q ,QVAL>>
  193. <PRINC " points">)>
  194. <CRLF>
  195. <CRLF>>
  196. <DEFINE THISQ ("AUX" (TVA ,TVASS) (QHI <+ ,LUBLK ,QNEXT>))
  197. #DECL ((TVA) ASYLUM (QHI) FIX)
  198. <CHTYPE <DATA-READW .TVA <CHTYPE <DATA-READW .TVA .QHI> FIX>>
  199. FIX>>
  200. <DEFINE PROGRESS ("AUX" (QHI <+ ,QNEXT ,LUBLK>) (TVA ,TVASS)
  201. (QNM <CHTYPE <DATA-READW .TVA .QHI> FIX>) QNXT)
  202. #DECL ((QHI QNM QNXT) FIX (TVA) ASYLUM)
  203. <COND (<0? <SET QNXT <CHTYPE <DATA-READW .TVA .QNM> FIX>>>)
  204. (<DATA-PRINTW .TVA .QHI .QNXT>
  205. <PROG ((LOC <+ ,PG ,BABBLE-START ,TINDEX>) (TBUV ,TBUV))
  206. #DECL ((LOC) FIX (TBUV) <UVECTOR [4 FIX]>)
  207. <COND (<DHLOCK .LOC>
  208. <GET-LOC .LOC .TBUV>
  209. <PUT .TBUV
  210. 2
  211. <PUTBITS <2 .TBUV>
  212. <BITS 18 0>
  213. <GETLASTQ ,LUBLK>>>
  214. <PUT-LOC .LOC .TBUV>
  215. <DUNLOCK .LOC>)
  216. (<SLEEP 2> <AGAIN>)>>)>>
  217. <DEFINE ANS-VEC (Q "TUPLE" STUFF "AUX" (ASP ,ASPACE))
  218. #DECL ((Q) VECTOR (STUFF) TUPLE (ASP) SPACE)
  219. <AVECTOR .ASP
  220. <THISQ>
  221. <NTH .Q ,QTYPE>
  222. ,PLAYER
  223. !.STUFF>>
  224. <DEFINE GRADE.STUFF ()
  225. <SET-STATUS ,$SGRADE>
  226. <DATA-PRINTW ,TVASS <+ ,LUBLK ,LASTGRD> <DSKDATE>>
  227. <REPEAT ((LOC <+ ,PG ,TELEC-START ,TINDEX 3>))
  228. #DECL ((LOC) FIX)
  229. <AND ,FLUSH <FLUSH-EM>>
  230. <AND ,PNEWMAIL ,EXISTS <READ.MAIL> <SET-STATUS ,$SGRADE>>
  231. <COND (<CHAIN-FOLLOW ,READERS ,ANEXT ,ALAST .LOC>)
  232. (T <PUT-LOC .LOC <PUT ,NTTUV 1 0>> <RETURN>)>>>
  233. <DEFINE READ.MAIL ()
  234. <SET-STATUS ,$SREAD>
  235. <SETG EXISTS <>>
  236. <REPEAT ()
  237. <AND ,FLUSH <FLUSH-EM>>
  238. <COND (<CHAIN-FOLLOW ,MREADERS ,MNEXT ,MLAST>) (<RETURN>)>>>
  239. <DEFINE PRINT.MAIL (ML)
  240. #DECL ((ML) VECTOR)
  241. <PRINC "
  242. Message from ">
  243. <6PRINC <3 .ML>>
  244. <PDSKDATE <SETG LASTMAIL <4 .ML>>>
  245. <CRLF>
  246. <PRINC <1 .ML>>>
  247. <DEFINE QPRINT (A
  248. "OPTIONAL" (MATCH-ANS <>) (QSP ,QSPACE)
  249. "AUX" (TVA ,TVASS) Q QR)
  250. #DECL ((A QR) VECTOR (QSP) SPACE (TVA) ASYLUM
  251. (MATCH-ANS) <OR ATOM FALSE> (Q) <OR VECTOR FALSE>)
  252. <COND (<SET Q <DATA-AREAD .TVA <NTH .A ,AQUES> .QSP>>
  253. <PROG MORE-ACT
  254. ()
  255. #DECL ((MORE-ACT) <SPECIAL ACTIVATION>)
  256. <CRLF>
  257. <SET QR <REST .Q ,QQUES>>
  258. <CRLF>
  259. <PRINC "Re: Question #">
  260. <PRIN1 <NTH .Q ,QQNUM>>
  261. <CRLF>
  262. <COND (<NOT .MATCH-ANS>
  263. <COND (<==? <NTH .Q ,QTYPE> ,$TMATCH> <MATCH-PRINT .QR>)
  264. (<==? <NTH .Q ,QTYPE> ,$TRANK> <PRINC <4 .QR>>)
  265. (<PRINC <1 .QR>>)>
  266. <CRLF>)
  267. (<PRINC <5 .QR>> <CRLF> <CRLF>)>
  268. <6PRINC <NTH .A ,AAUTH>>>
  269. .Q)
  270. (<PERR "Can't read QUESTION, QPRINT" <NTH .A ,AQUES>>)>>
  271. <DEFINE UPDATE.QUESTION ("OPTIONAL" (COMPLEX? T)
  272. "AUX" QUES Q (QSP <ARESET ,QSPACE T <>>) (TVA ,TVASS)
  273. SYM QTOP)
  274. #DECL ((QUES) <OR FALSE VECTOR> (Q) <OR FALSE LIST> (QSP) SPACE
  275. (TVA) ASYLUM (QTOP) VECTOR
  276. (SYM) <OR FALSE SYMBOL> (COMPLEX?) <OR ATOM FALSE>)
  277. <SET-STATUS ,$SUPDATE>
  278. <COND (<COND (.COMPLEX? <SET SYM <GET.QUESTION>>)
  279. (T <SET SYM <GET.SIMPLE <>>>)>
  280. <SET QUES <DATA-AREAD .TVA <2 .SYM> <ARESET ,ASPACE T <>>>>
  281. <SET-STATUS ,$SUPDATE <NTH .QUES ,QQNUM>>
  282. <COND (<SET Q <APPLY <NTH ,MAKERS <NTH .QUES ,QTYPE>> .QUES>>
  283. <SET QTOP <SUBSTRUC .QUES 0 ,QQUES>>
  284. <SET QUES <AVECTOR .QSP 0 0 0 0 0 0 0 0 !.Q>>
  285. <MAPR <>
  286. <FUNCTION (X Y)
  287. #DECL ((X Y) VECTOR)
  288. <PUT .X 1 <ACOPY .QSP <1 .Y>>>>
  289. .QUES
  290. .QTOP>
  291. <PROG (LOSS)
  292. #DECL ((LOSS) <OR MANIAC <FALSE FIX>>)
  293. <COND (<SET LOSS
  294. <DATA-APRINT .TVA <2 .SYM> .QSP .QUES>>)
  295. (<MEMQ <1 .LOSS> '(5 6)>
  296. <STALL <1 .LOSS>>
  297. <AGAIN>)
  298. (<PERR "Can't PRINT UPDATE, UPDATE.QUESTION"
  299. .LOSS>)>>)>)>>
  300. <DEFINE PRINT-QUESTION (QUES
  301. "AUX" (QTYPE <QTYPE .QUES>) (RQ <REST .QUES ,QQUES>)
  302. CORRECT (QVAL <QVAL .QUES>))
  303. #DECL ((QUES) <VECTOR FIX FIX FIX TIME ANY FIX ANY ANY ANY [REST ANY]>
  304. (QVAL) <OR FIX FLOAT> (QTYPE CORRECT) FIX (RQ) VECTOR)
  305. <COND (<OR <==? .QTYPE ,$TSIMPLE> <==? .QTYPE ,$TLONG>>
  306. <PRINC <1 .RQ>>
  307. <COND (<NOT <LENGTH? .RQ 2>>
  308. <MAPR <>
  309. <FUNCTION (HINTS)
  310. #DECL ((HINTS) <VECTOR [REST
  311. <OR STRING FLOAT>]>)
  312. <COND (<TYPE? <1 .HINTS> STRING>
  313. <CRLF>
  314. <PRINC "Hint [for ">
  315. <PRIN1 <* <2 .HINTS> .QVAL>>
  316. <PRINC " points]: ">
  317. <PRINC <1 .HINTS>>)>>
  318. <3 .RQ>>
  319. <CRLF>)>
  320. <COND (<N==? <LENGTH .RQ> 1>
  321. <CRLF>
  322. <PRINC "Answer: ">
  323. <PRINC <2 .RQ>>)>)
  324. (<OR <==? .QTYPE ,$TMC> <==? .QTYPE ,$TTF>>
  325. <SET CORRECT <3 .RQ>>
  326. <PUT <2 <2 ,ALLSYMS>> 2 <UNTASTEFUL-CODE <REST .RQ 3>>>
  327. <PRINC <1 .RQ>>
  328. <MSTPOSSYM!-ICALSYM "" 0 <2 ,ALLSYMS>>
  329. <CRLF>
  330. <PRINC "Correct answer is ">
  331. <PRINC <NTH <REST .RQ 3> .CORRECT>>
  332. <PRINC ".">
  333. <CRLF>
  334. <COND (<NOT <QUESTIONABLE? <2 .RQ>>>
  335. <PRINC "Comment: ">
  336. <PRINC <2 .RQ>>
  337. <CRLF>)>)
  338. (<==? .QTYPE ,$TMATCH>
  339. <MATCH-PRINT .RQ>
  340. <CRLF>
  341. <PRINC "Correct matchings:">
  342. <MATCH-PRINT .RQ T <> <>>
  343. <COND (<NOT <QUESTIONABLE? <4 .RQ>>>
  344. <PRINC "Comment: ">
  345. <PRINC <4 .RQ>>)>)
  346. (<==? .QTYPE ,$TRANK>
  347. <PRINC <4 .RQ>>
  348. <PRINT-RANK <2 .RQ> <UNTASTEFUL-CODE <1 .RQ> <> T>>
  349. <AND <NOT <QUESTIONABLE? <3 .RQ>>>
  350. <CRLF>
  351. <PRINC "Comment: ">
  352. <PRINC <3 .RQ>>>)>>
  353. ;"MATCHING QUESTION ROUTINES"
  354. <DEFINE MAKE.MATCH ("OPTIONAL" UPDATE "AUX" C1 C2 TBL KEY HDR)
  355. #DECL ((C1 C2) <OR FALSE <LIST [REST STRING]>> (KEY) <OR FALSE LIST>
  356. (TBL) SYMTABLE (UPDATE) VECTOR (HDR) STRING)
  357. <PROG ()
  358. <COND (<AND <SET HDR <GETBUF "Heading: ">>
  359. <NOT <QUESTIONABLE? .HDR>>
  360. <SET C1 <GRAB-BUNCH "Column A #">>
  361. <SET C2 <GRAB-BUNCH "Column B #">>>
  362. <SET TBL <MAKESST "TBL" <UNTASTEFUL-CODE .C2>>>
  363. <COND (<SET KEY <ACOPY ,QSPACE <GRAB-ANSWERS .C1 .TBL>>>
  364. (.C1 .C2 .KEY <GETBUF "Comment: "> .HDR))>)
  365. (T '#FALSE ("Question aborted"))>>>
  366. <DEFINE GRAB-ANSWERS (C1 TBL "AUX" (CURSPACE ,ASPACE) LST)
  367. #DECL ((C1) <SPECIAL <LIST [REST STRING]>> (TBL) SYMTABLE
  368. (LST) <OR LIST FALSE> (CURSPACE) <SPECIAL SPACE>)
  369. <SET LST
  370. <MAPF ,ALLIST
  371. <FUNCTION (MCHOICE "AUX" CA)
  372. #DECL ((MCHOICE) STRING (CA) <OR FALSE SYMBOL>)
  373. <SETG MATCH .MCHOICE>
  374. <PRINC "
  375. For ">
  376. <PRINC .MCHOICE>
  377. <COND (<SET CA
  378. <READER .TBL
  379. "which is the correct match? "
  380. '["" ""]
  381. '["SYM"]
  382. ,VERBOSE>>
  383. <MAPRET <ACOPY .CURSPACE <2 .CA>>>)
  384. (<MAPLEAVE
  385. #FALSE ("No correct answer given")>)>>
  386. .C1>>
  387. <GUNASSIGN MATCH>
  388. .LST>
  389. <SETG MATBL <MAKEGST "FROB" [0 T]>>
  390. <SETG MBTBL <MAKESST "FROB" []>>
  391. <SETG MATCH-SYMBOL <CHTYPE ["" 0] SYMBOL>>
  392. <SETG MATCH-SYM ["SYM" "DEF" ,MATCH-SYMBOL]>
  393. <GDECL (MATCH-SYMBOL) SYMBOL (MATCH-SYM) <VECTOR STRING STRING SYMBOL>>
  394. <DEFINE GRAB-MATCH ("AUX" (A ,MATBL) (B ,MBTBL) (S ,MATCH-SYMBOL)
  395. (CURSPACE ,ASPACE) (QUIT-D '["" -1])
  396. (AVEC <REST <2 .A> 2>) (SYM ,MATCH-SYM))
  397. #DECL ((A B) SYMTABLE (CURSPACE) <SPECIAL SPACE>
  398. (SYM AVEC QUIT-D) VECTOR (S) SYMBOL)
  399. <PUT .S 2 .AVEC>
  400. <PUT .S 1 <1 .AVEC>>
  401. <REPEAT (ACH BCH TEMP MSTR (TACH <REST <2 .A> 2>))
  402. #DECL ((ACH BCH TEMP) <OR FALSE <PRIMTYPE VECTOR>>
  403. (TACH) <VECTOR ANY ANY> (MSTR) ANY)
  404. <GUNASSIGN MATCH>
  405. <COND (<AND <SET ACH <READER .A "
  406. Match " "" .SYM ,VERBOSE>>
  407. <N==? <2 <SET ACH <2 .ACH>>> -1>>
  408. <SETG MATCH <MEMQ <ASCII 46> ;"Char ." <1 .ACH>>>
  409. <COND (<SET BCH <READER .B "with " "" '["SYM"] ,VERBOSE>>
  410. <PUT .ACH 2 <2 .BCH>>
  411. <SET MSTR <MEMQ <ASCII 46> <1 .ACH>>>
  412. <PUT .MSTR 2 <ASCII 91>>
  413. <PUT .MSTR 3 <ASCII <+ 48 </ <2 .BCH> 10>>>>
  414. <AND <==? <3 .MSTR> <ASCII 48>>
  415. <PUT .MSTR 2 <ASCII 32>>
  416. <PUT .MSTR 3 <ASCII 91>>>
  417. <PUT .MSTR 4 <ASCII <+ 48 <MOD <2 .BCH> 10>>>>
  418. <PUT .MSTR 5 <ASCII 93>>)>
  419. <COND (<SET TEMP <MEMQ 0 .TACH>>
  420. <PUT .S 2 <SET TEMP <BACK .TEMP>>>
  421. <PUT .S 1 <1 .TEMP>>)
  422. (T <PUT .S 1 ""> <PUT .S 2 .QUIT-D>)>)
  423. (<RETURN <MAPF ,ALLIST
  424. <FUNCTION (X)
  425. <COND (<TYPE? .X FIX> .X)
  426. (<MAPRET>)>>
  427. <REST <2 ,MATBL> 2>>>)>>>
  428. <DEFINE ASK.MATCH (Q
  429. "AUX" (RQ <REST .Q ,QQUES>) (ASP ,ASPACE) LOSER EACH
  430. SCORE)
  431. #DECL ((Q RQ) VECTOR (ASP) SPACE (LOSER) <OR LIST FALSE>
  432. (EACH SCORE) FLOAT)
  433. <CRLF>
  434. <MATCH-PRINT .RQ>
  435. <PUT ,MBTBL 2 <UNTASTEFUL-CODE <2 .RQ>>>
  436. <PUT ,MATBL 2 <UNTASTEFUL-CODE <1 .RQ> T>>
  437. <SET LOSER <GRAB-MATCH>>
  438. <SET EACH </ <NTH .Q ,QVAL> <FLOAT <LENGTH .LOSER>>>>
  439. <INT-LEVEL 20>
  440. <ADDSCORE ,PLAYER
  441. .Q
  442. <SET SCORE
  443. <MAPF ,+
  444. <FUNCTION (X Y)
  445. <COND (<N==? .X .Y> 0.000) (.EACH)>>
  446. .LOSER
  447. <3 .RQ>>>>
  448. <SETG SCORED? T>
  449. <INT-LEVEL 0>
  450. <PRINC "
  451. Score of ">
  452. <PRIN1 .SCORE>
  453. <AND <ANSWER?>
  454. <PRINC "
  455. Correct matchings:">
  456. <MATCH-PRINT .RQ T <> <>>
  457. <CRLF>
  458. <NOT <QUESTIONABLE? <4 .RQ>>>
  459. <PRINC "Comment: ">
  460. <PRINC <4 .RQ>>>
  461. <AND <NOT .LOSER> <SET LOSER <CHTYPE <ALIST .ASP> FALSE>>>
  462. <SEND-PLAYER <NTH .Q ,QAUTH>
  463. <ANS-VEC .Q .SCORE .LOSER>
  464. ,ALAST
  465. <>
  466. ,TELEC-START>>
  467. <DEFINE MATCH-PRINT (RQ "OPTIONAL" (CORRECT <>) (C3 <>) (PRINT-HEAD T) (ANS
  468. <>))
  469. #DECL ((RQ) VECTOR (CORRECT PRINT-HEAD) <OR ATOM FALSE>
  470. (C3 ANS) <OR FALSE LIST>)
  471. <COND
  472. (<OR <NOT .CORRECT> <AND .CORRECT <SET C3 <3 .RQ>>>>
  473. <CRLF>
  474. <COND (.PRINT-HEAD <PRINC <5 .RQ>> <CRLF>)>
  475. <PRINC "
  476. Column A Column B
  477. ">
  478. <REPEAT ((C1 <1 .RQ>) (C2 <2 .RQ>) (IDX 1))
  479. #DECL ((C1 C2) LIST (IDX) FIX)
  480. <COND (<AND <EMPTY? .C1> <EMPTY? .C2> <RETURN>>)
  481. (<EMPTY? .C1>
  482. <AND .CORRECT <RETURN>>
  483. <FORMAT <1 .C2> 36 .IDX>
  484. <SET C2 <REST .C2>>)
  485. (<AND <EMPTY? .C2> <NOT .CORRECT>>
  486. <PRIN1 .IDX>
  487. <PRINC ". ">
  488. <PRINC <1 .C1>>
  489. <SET C1 <REST .C1>>)
  490. (T
  491. <FORMAT <1 .C1> 0 .IDX>
  492. <FORMAT <COND (.CORRECT
  493. <COND (<0? <1 .C3>> "--gave up--")
  494. (<NTH <2 .RQ> <1 .C3>>)>)
  495. (<1 .C2>)>
  496. 36
  497. .IDX
  498. <AND .ANS <==? <1 .C3> <1 .ANS>>>>
  499. <SET C1 <REST .C1>>
  500. <OR <EMPTY? .C2> <SET C2 <REST .C2>>>)>
  501. <AND .CORRECT <SET C3 <REST .C3>>>
  502. <AND .ANS <SET ANS <REST .ANS>>>
  503. <SET IDX <+ .IDX 1>>
  504. <CRLF>>)
  505. (<PRINC "
  506. Gave up.">)>>
  507. <DEFINE FORMAT (STR NUM "OPTIONAL" IDX (STAR <>))
  508. #DECL ((STAR) <OR ATOM FALSE> (STR) STRING (NUM IDX) FIX)
  509. <COND (<0? .NUM>) (<INDENT-TO .NUM>)>
  510. <AND <==? .NUM 36>
  511. <COND (.STAR <PRINC "* ">) (<PRINC " ">)>>
  512. <AND <ASSIGNED? IDX> <PRINC .IDX> <PRINC ". ">>
  513. <COND (<G? <LENGTH .STR> 33> <PRINC .STR> <CRLF>)
  514. (<PRINC .STR>)>>
  515. <DEFINE READ.MATCH (A "AUX" Q.A KEY ANS)
  516. #DECL ((A Q.A) VECTOR (ANS KEY) <OR FALSE <LIST [REST FIX]>>)
  517. <SET Q.A <QPRINT .A T>>
  518. <PRINC " scored ">
  519. <PRIN1 <NTH .A ,ARESP>>
  520. <PRINC " points ">
  521. <COND (<SET KEY <5 .A>>
  522. <SET ANS <NTH .Q.A <+ ,QQUES 3>>>
  523. <PUT .Q.A <+ ,QQUES 3> .KEY>
  524. <MATCH-PRINT <REST .Q.A ,QQUES> T <> <> .ANS>)
  525. (<PRINC " by giving up.">)>
  526. <CRLF>>
  527. <DEFINE MATCH-HACK (X) .X>
  528. ;"TRUE/FALSE AND MULTIPLE CHOICE QUESTION ROUTINES"
  529. <DEFINE MAKE.TF ("OPTIONAL" UPDATE)
  530. #DECL ((UPDATE) VECTOR)
  531. <COND (<ASSIGNED? UPDATE> <MAKE.MC T .UPDATE>)
  532. (<MAKE.MC T>)>>
  533. <DEFINE MAKE.MC ("OPTIONAL" (T/F <>) UPDATE
  534. "AUX" QUESTION ANSWERS CORRECT.ANSWER TBL)
  535. #DECL ((QUESTION) STRUCTURED (T/F) <OR 'T VECTOR FALSE>
  536. (ANSWERS) <OR FALSE <LIST [REST STRING]>> (UPDATE) VECTOR)
  537. <AND <TYPE? .T/F VECTOR> <SET UPDATE .T/F> <SET T/F <>>>
  538. <PROG ()
  539. <SET QUESTION
  540. <GETBUF "Question: "
  541. ,QSPACE
  542. ""
  543. <COND (<ASSIGNED? UPDATE>
  544. <NTH .UPDATE <+ ,QQUES 1>>)>>>
  545. <COND (<EMPTY? .QUESTION> <RETURN '#FALSE ("Question aborted")>)
  546. (<QUESTIONABLE? .QUESTION>
  547. <RETURN '#FALSE ("Empty QUESTION")>)>
  548. <COND (.T/F
  549. <SET ANSWERS
  550. (<ASTRING ,QSPACE "True">
  551. <ASTRING ,QSPACE "False">)>)
  552. (T
  553. <COND (<SET ANSWERS <GRAB-BUNCH "Answer#">>
  554. <COND (<L? <LENGTH .ANSWERS> 2>
  555. <RETURN '#FALSE ("Too few choices")>)>)
  556. (<RETURN '#FALSE ("Question aborted")>)>)>
  557. <SET CORRECT.ANSWER
  558. <READER <SET TBL <MAKESST "FJB" <UNTASTEFUL-CODE .ANSWERS>>>
  559. <TP "Correct answer is ">
  560. '["" ""]
  561. '["SYM"]
  562. ,VERBOSE>>
  563. <COND (.CORRECT.ANSWER
  564. (.QUESTION
  565. <GETBUF "Comment: " ,QSPACE .QUESTION>
  566. <2 .CORRECT.ANSWER>
  567. !.ANSWERS))
  568. ('#FALSE ("No correct answer given"))>>>
  569. <SETG IDUNNO " gave up.">
  570. <DEFINE ASK.MC (Q
  571. "AUX" (RQ <REST .Q ,QQUES>) ANSWER ANSNUM CORRECT
  572. (ASP ,ASPACE) (SEEN 0))
  573. #DECL ((Q RQ) VECTOR (SEEN ANSNUM CORRECT) FIX (ASP) SPACE)
  574. <UNWIND
  575. <PROG ()
  576. <SET CORRECT <3 .RQ>>
  577. <PUT <2 <2 ,ALLSYMS>> 2 <UNTASTEFUL-CODE <REST .RQ 3>>>
  578. <PRINC <1 .RQ>>
  579. <MSTPOSSYM!-ICALSYM "" 0 <2 ,ALLSYMS>>
  580. <SET ANSWER
  581. <READER ,ALLSYMS
  582. <TP "Take your pick: ">
  583. '["" ""]
  584. '["SYM"]
  585. ,VERBOSE>>
  586. <CRLF>
  587. <COND (.ANSWER <SET ANSNUM <2 .ANSWER>>) (<SET ANSNUM 0>)>
  588. <INT-LEVEL 20>
  589. <SET SEEN 1>
  590. <COND (<==? .ANSNUM .CORRECT>
  591. <ADDSCORE ,PLAYER .Q <NTH .Q ,QVAL>>
  592. <PRINC "Right! ">
  593. <SET SEEN 0>)
  594. (T
  595. <ADDSCORE ,PLAYER .Q 0>
  596. <COND (<NOT .ANSWER> <PRINC "Chicken! ">)
  597. (<PRINC "Wrong! ">)>
  598. <PRINC "The correct answer is ">
  599. <PRINC <NTH <REST .RQ 3> .CORRECT>>
  600. <PRINC <ASCII 46> ;"Char .">
  601. <SET SEEN 0>)>
  602. <SETG SCORED? T>
  603. <INT-LEVEL 0>
  604. <AND <NOT <QUESTIONABLE? <2 .RQ>>>
  605. <ANSWER?>
  606. <CRLF>
  607. <PRINC "Comment: ">
  608. <PRINC <2 .RQ>>
  609. <CRLF>>
  610. <SEND-PLAYER
  611. <NTH .Q ,QAUTH>
  612. <ANS-VEC .Q
  613. <COND (<==? .ANSNUM .CORRECT> <ASTRING .ASP " won.">)
  614. (<NOT .ANSWER> <ASTRING .ASP ,IDUNNO>)
  615. (<ASTRING .ASP
  616. " lost with "
  617. <REST <MEMBER ". " <1 .ANSWER>> 2>>)>>
  618. ,ALAST
  619. <>
  620. ,TELEC-START>
  621. <CRLF>>
  622. <COND (<1? .SEEN>
  623. <COND (<==? .ANSNUM .CORRECT> <ADDSCORE ,PLAYER .Q <QVAL .Q>>)
  624. (T <ADDSCORE ,PLAYER .Q 0>)>
  625. <SETG SCORED? T>)>>>
  626. <DEFINE READ.MC (A "AUX" Q.A)
  627. #DECL ((A Q.A) VECTOR)
  628. <SET Q.A <QPRINT .A>>
  629. <PRINC <NTH .A ,ARESP>>
  630. <CRLF>>
  631. ;"REGULAR QUESTION ROUTINES"
  632. <DEFINE MAKE.REGULAR ("OPTIONAL" UPDATE "AUX" Q A (CURSPACE ,QSPACE) HINTS)
  633. #DECL ((Q A) <OR FALSE STRING> (UPDATE HINTS) VECTOR
  634. (CURSPACE) <SPECIAL SPACE>)
  635. <COND
  636. (<EMPTY? <SET Q
  637. <GETBUF "Question: "
  638. .CURSPACE
  639. ""
  640. <COND (<ASSIGNED? UPDATE>
  641. <NTH .UPDATE <+ ,QQUES 1>>)>>>>
  642. '#FALSE ("Question aborted"))
  643. (<QUESTIONABLE? .Q> '#FALSE ("Empty question"))
  644. (<AND
  645. <SET HINTS
  646. <MAPF ,ALVECTOR
  647. <FUNCTION ("AUX" HINT NVALUE)
  648. #DECL ((HINT) STRING (NVALUE) <OR FALSE FLOAT>)
  649. <COND (<AND <SET HINT <GETBUF "Hint: " .CURSPACE "">>
  650. <NOT <QUESTIONABLE? .HINT>>
  651. <PROG ()
  652. <COND (<OR <G=? <SET NVALUE
  653. <READER '[]
  654. "Fractional credit "
  655. ""
  656. '["FLOAT"]
  657. ,VERBOSE>>
  658. 1.000>
  659. <L=? .NVALUE 0.000>>
  660. <CRLF>
  661. <PRINC "Out of range">
  662. <AGAIN>)>
  663. .NVALUE>>
  664. <MAPRET .HINT .NVALUE>)
  665. (<MAPSTOP>)>>>>
  666. <>>)
  667. (<EMPTY?
  668. <SET A
  669. <PROG ((aprompt .Q))
  670. #DECL ((aprompt) <SPECIAL STRING>)
  671. <GETBUF "Answer: "
  672. .CURSPACE
  673. ""
  674. <COND (<ASSIGNED? UPDATE>
  675. <COND (<G=? <LENGTH .UPDATE> <+ ,QQUES 2>>
  676. <NTH .UPDATE <+ ,QQUES 2>>)
  677. ("")>)>>>>>
  678. (.Q <ALSTRING>))
  679. (<QUESTIONABLE? .A> (.Q <ALSTRING>))
  680. (ELSE (.Q .A .HINTS))>>
  681. <DEFINE ASK.REGULAR (Q
  682. "AUX" (RQ <REST .Q ,QQUES>) (ANSWER "")
  683. (CURSPACE ,SSPACE) (ASP ,ASPACE) (SEEN 0)
  684. (HVAL -1.000) (HNUM 0))
  685. #DECL ((Q RQ) VECTOR (ANSWER) STRING (ASP) SPACE (SEEN HNUM) FIX
  686. (HVAL) FLOAT (CURSPACE) <SPECIAL SPACE>)
  687. <UNWIND
  688. <PROG ((QVAL <QVAL .Q>)
  689. (HINTS <COND (<LENGTH? .RQ 2> '[]) (<3 .RQ>)>))
  690. #DECL ((HINTS) VECTOR (QVAL) <OR FLOAT FIX>)
  691. <PRINC <1 .RQ>>
  692. <PROG ()
  693. <SET ANSWER
  694. <GETBUF
  695. <ASTRING <ARESET .CURSPACE T <>>
  696. <MAPR ,ALSTRING
  697. <FUNCTION (X)
  698. <COND (<==? .X .HINTS> <MAPSTOP>)
  699. (<TYPE? <1 .X> STRING>
  700. <MAPRET "Hint: " <1 .X> "
  701. ">)
  702. (<MAPRET>)>>
  703. <TOP .HINTS>>
  704. <COND (<EMPTY? .HINTS> "
  705. Your answer: ")
  706. (<ASTRING .CURSPACE
  707. "
  708. Your answer [Hint for "
  709. <UNPARSE <* .QVAL <2 .HINTS>>>
  710. " points] : ">)>>
  711. .ASP
  712. <1 .RQ>>>
  713. <COND (<AND <QUESTIONABLE? .ANSWER> <NOT <EMPTY? .HINTS>>>
  714. <CRLF>
  715. <SET HNUM <+ .HNUM 1>>
  716. <SET HVAL <* <2 .HINTS> .QVAL>>
  717. <SET HINTS <REST .HINTS 2>>
  718. <AGAIN>)>>
  719. <AND <ANSWER?>
  720. <SET SEEN 1>>
  721. <INT-LEVEL 20>
  722. <COND (<QUESTIONABLE? .ANSWER>
  723. <ADDSCORE ,PLAYER .Q 0.000>
  724. <SEND-PLAYER <NTH .Q ,QAUTH>
  725. <ANS-VEC .Q <ASTRING .ASP " gave up."> .SEEN>
  726. ,ALAST
  727. <>
  728. ,TELEC-START>)
  729. (T
  730. <SEND-PLAYER <NTH .Q ,QAUTH>
  731. <ANS-VEC .Q .ANSWER .SEEN .HNUM .HVAL>
  732. ,ALAST
  733. <>
  734. ,TELEC-START>)>
  735. <COND (<N==? <LENGTH .RQ> 1>
  736. <AND <1? .SEEN>
  737. <CRLF>
  738. <PRINC "Answer is: ">
  739. <PRINC <2 .RQ>>
  740. <CRLF>>)>
  741. <SETG SCORED? T>
  742. <INT-LEVEL 0>
  743. <CRLF>>
  744. <COND (<OR <G? .HNUM 0> <1? .SEEN>>
  745. <COND (<QUESTIONABLE? .ANSWER> <ADDSCORE ,PLAYER .Q 0.000>)
  746. (T
  747. <SEND-PLAYER <QAUTH .Q>
  748. <ANS-VEC .Q .ANSWER .SEEN>
  749. ,ALAST
  750. <>
  751. ,TELEC-START>)>
  752. <SETG SCORED? T>)>>>
  753. <DEFINE READ.COMM (A "AUX" Q.A)
  754. #DECL ((A Q.A) VECTOR)
  755. <SET Q.A <QPRINT .A>>
  756. <PRINC " awarded ">
  757. <PRIN1 <4 .A>>
  758. <PRINC " points out of ">
  759. <PRIN1 <QVAL .Q.A>>
  760. <COND (<G? <LENGTH .A> 5>
  761. <COND (<6 .A>
  762. <PRINC " for your answer
  763. '"> <PRINC <6 .A>>
  764. <PRINC "'">)
  765. (<PRINC " for chickening out">)>)>
  766. <COND (<QUESTIONABLE? <5 .A>>
  767. <PRINC ".">)
  768. (<PRINC " and said
  769. '"> <PRINC <5 .A>>
  770. <PRINC "'">)>>
  771. <DEFINE READ.REGULAR (A
  772. "AUX" Q.A (ASP ,ASPACE) (QSP ,QSPACE) (LBK ,LUBLK)
  773. COMM (TVA ,TVASS) (GAVE-UP <>) TEMP)
  774. #DECL ((A Q.A) <SPECIAL VECTOR> (ASP QSP) SPACE (COMM) STRING
  775. (LBK TEMP) FIX (TVA) ASYLUM (GAVE-UP) <OR ATOM FALSE>)
  776. <SET Q.A <QPRINT .A <> .ASP>>
  777. <COND (<AND <NOT <LENGTH? .A ,ASEEN>>
  778. <N==? <SET TEMP <NTH .A ,AHNUM>> 0>>
  779. <PRINC ", with ">
  780. <PRIN1 .TEMP>
  781. <PRINC <COND (<1? .TEMP> " hint, ") (T " hints, ")>>)>
  782. <COND (<=? <NTH .A ,ARESP> ,IDUNNO>
  783. <PRINC ,IDUNNO>
  784. <SET GAVE-UP T>)
  785. (<PRINC " said :
  786. "> <PRINC <NTH .A ,ARESP>>)>
  787. <ARESET .QSP T <>>
  788. <CRLF>
  789. <AND <G=? <LENGTH .A> ,ASEEN>
  790. <==? <NTH .A ,ASEEN> 1>
  791. <PRINC "[Answer seen] ">>
  792. <SET COMM <GETBUF "Comment: " .QSP <NTH .A ,ARESP>>>
  793. <REPEAT ((SCORE 0)
  794. (MARKING
  795. <COND (<AND <NOT <LENGTH? .A ,ASEEN>> <N==? <AHNUM .A> 0>>
  796. <NTH .A ,AHVAL>)
  797. (<NTH .Q.A ,QVAL>)>))
  798. #DECL ((SCORE) <OR FIX FALSE FLOAT>
  799. (MARKING) <SPECIAL <OR FLOAT FIX>>)
  800. <COND (<OR .GAVE-UP
  801. <AND <AND <PRINC "Score (out of ">
  802. <PRIN1 .MARKING>
  803. <PRINC ")">
  804. <SET SCORE
  805. <READER '[]
  806. " : "
  807. '["" ""]
  808. '["FIX" "FLOAT"]
  809. ,VERBOSE>>
  810. <G=? .SCORE 0>
  811. <L=? .SCORE .MARKING>>
  812. <CRLF>
  813. <ADDSCORE <NTH .A ,AAUTH> .Q.A .SCORE>>>
  814. <OR <AND .GAVE-UP <QUESTIONABLE? .COMM>>
  815. <SEND-PLAYER <NTH .A ,AAUTH>
  816. <AVECTOR .QSP
  817. <NTH .A ,AQUES>
  818. ,$TLOSE
  819. ,PLAYER
  820. .SCORE
  821. .COMM
  822. <AND <NOT .GAVE-UP>
  823. <ACOPY .QSP <NTH .A ,ARESP>>>>
  824. ,ALAST
  825. <>
  826. ,TELEC-START
  827. .QSP>>
  828. <RETURN>)
  829. (<NOT .SCORE>
  830. <CHAIN-APPEND .TVA .ASP .A <+ .LBK ,ALAST>>
  831. <PRINC "
  832. Grading postponed.">
  833. <RETURN>)
  834. (<PRINC "
  835. Illegal score (above VALUE or below 0)
  836. ">)>>>
  837. ;"SIMPLE QUESTION HACKERS. BY DEFINITION, LOSERS."
  838. <DEFINE ASK.SIMPLE (Q
  839. "AUX" (RQ <REST .Q ,QQUES>) ANSWER (ASP ,ASPACE)
  840. (SEEN 0))
  841. #DECL ((Q RQ) VECTOR (ANSWER) STRING (ASP) SPACE (SEEN) FIX)
  842. <COND
  843. (,IGNORE-SIMPLE)
  844. (<PRINC <1 .RQ>>
  845. <COND (<N==? <LENGTH .RQ> 1>
  846. <AND <ANSWER?>
  847. <SET SEEN 1>
  848. <CRLF>
  849. <PRINC "Answer is: ">
  850. <PRINC <2 .RQ>>
  851. <CRLF>
  852. <SET ANSWER <GETBUF "Nonsense: " .ASP <1 .RQ>>>
  853. <COND (<NOT <QUESTIONABLE? .ANSWER>>
  854. <SEND-PLAYER <NTH .Q ,QAUTH>
  855. <ANS-VEC .Q .ANSWER .SEEN>
  856. ,ALAST
  857. <>
  858. ,TELEC-START>)>>)
  859. (T
  860. <CRLF>
  861. <SET ANSWER <GETBUF "Nonsense: " .ASP <1 .RQ>>>
  862. <COND (<NOT <QUESTIONABLE? .ANSWER>>
  863. <SEND-PLAYER <NTH .Q ,QAUTH>
  864. <ANS-VEC .Q .ANSWER .SEEN>
  865. ,ALAST
  866. <>
  867. ,TELEC-START>)>)>
  868. <CRLF>)>>
  869. <DEFINE READ.SANS (A "AUX" Q.A)
  870. #DECL ((A Q.A) VECTOR)
  871. <SET Q.A <QPRINT .A>>
  872. <PRINC " said
  873. '">
  874. <PRINC <NTH .A ,ARESP>>
  875. <PRINC <ASCII 39>>>
  876. <DEFINE PRINT.SIMPLE ("AUX" (TVA ,TVASS) (QSP ,QSPACE) SYML)
  877. #DECL ((TVA) ASYLUM (QSP) SPACE (SYML) <OR FALSE <LIST [REST SYMBOL]>>)
  878. <COND (<SET SYML <GET.SIMPLE T>>
  879. <PROG MORE-ACT
  880. ()
  881. #DECL ((MORE-ACT) <SPECIAL ACTIVATION>)
  882. <CRLF>
  883. <MAPF <>
  884. <FUNCTION (X "AUX" QUES)
  885. #DECL ((X) SYMBOL (QUES) VECTOR)
  886. <SET QUES
  887. <DATA-AREAD .TVA <2 .X> <ARESET .QSP T <>>>>
  888. <PQHEADER .QUES>
  889. <PRINT-QUESTION .QUES>
  890. <CRLF>>
  891. .SYML>>)>>
  892. ;"FUNCTIONS TO HACK RANKING QUESTIONS"
  893. <DEFINE GRADE-RANK (L1 L2
  894. "AUX" (I <LENGTH .L2>) (N <FLOAT <LENGTH .L1>>)
  895. (TOTAL 0.000) MAXTOT PFACT LM
  896. (L3 <IUVECTOR <LENGTH .L1> 0>))
  897. #DECL ((L1 L2 L3) <UVECTOR [REST FIX]>
  898. (N VALUE MAXTOT PFACT TOTAL) FLOAT (I) FIX
  899. (LM) <OR FALSE UVECTOR>)
  900. <PROG ()
  901. <COND (<N==? <LENGTH .L1> <LENGTH .L2>>
  902. <COND (<0? <+ !.L2>> <RETURN 0.0>)>
  903. <SET L3 <REST <SUBSTRUC .L2 0 .I .L3> .I>>
  904. <MAPF <>
  905. <FUNCTION (X)
  906. <COND (<MEMQ .X .L2>)
  907. (T
  908. <PUT .L3 1 .X>
  909. <COND (<EMPTY? <SET L3 <REST .L3>>>
  910. <MAPLEAVE>)>)>>
  911. .L1>
  912. <SET L2 <TOP .L3>>)>
  913. <SET MAXTOT <* .I <- <* 2.000 .N> .I 1>>>
  914. <SET PFACT </ .MAXTOT .I 2.000>>
  915. <REPEAT ((CT 0))
  916. <COND (<G? <SET CT <+ .CT 1>> .I>
  917. <RETURN <COND (<0? .MAXTOT> 0.000)
  918. (</ .TOTAL .MAXTOT>)>>)>
  919. <COND (<NOT <SET LM <MEMQ <1 .L1> .L2>>>)
  920. (<SET TOTAL
  921. <+ .TOTAL
  922. <COND (<==? <LENGTH .L1> <LENGTH .LM>> .PFACT)
  923. (ELSE 0.000)>
  924. <REPEAT ((R1 <REST .L1>) (R2 <REST .LM>)
  925. (M 0.000))
  926. #DECL ((R1 R2) <UVECTOR [REST FIX]>
  927. (M) FLOAT)
  928. <COND (<EMPTY? .R1> <RETURN .M>)
  929. (<MEMQ <1 .R1> .R2>
  930. <SET M <+ .M 1.000>>)>
  931. <SET R1 <REST .R1>>>>>)>
  932. <SET L1 <REST .L1>>>>>
  933. "<UN-RANK rank-uvector possibility-number>, returns rank-vector
  934. <CHANGE-RANK rank-uvector new-rank possibility>
  935. <RANK-BEFORE rank-uvector before-rank poss>
  936. <RANK-AFTER rank-uvector after-rank poss>
  937. "
  938. "backwards memq, of course"
  939. <DEFINE QMEM (ITM STRUC "AUX" (TS <TOP .STRUC>))
  940. #DECL ((ITM) ANY (TS STRUC) UVECTOR (VALUE) <OR FALSE UVECTOR>)
  941. <COND (<==? .STRUC .TS> <>)
  942. (<SET STRUC <BACK .STRUC>>
  943. <REPEAT ()
  944. <COND (<==? .ITM <1 .STRUC>> <RETURN .STRUC>)
  945. (<==? .STRUC .TS> <RETURN <>>)
  946. (<SET STRUC <BACK .STRUC>>)>>)>>
  947. <DEFINE UN-RANK (RV POSS "OPTIONAL" FOO "AUX" (CH? <MEMQ .POSS .RV>))
  948. #DECL ((VALUE RV) UVECTOR (POSS) FIX (CH?) <OR UVECTOR FALSE> (FOO) ANY)
  949. <COND (.CH? <PUT .CH? 1 0>)>
  950. .RV>
  951. <DEFINE RANK-AS (RV NR POSS)
  952. #DECL ((RV VALUE) UVECTOR (POSS NR NPOS) FIX)
  953. <SET NPOS <+ .NR 1>>
  954. <COND (<OR <G? .NR <LENGTH .RV>> <L=? .NR 0>> .RV)
  955. (ELSE <UN-RANK .RV .POSS> <PUT .RV .NR .POSS>)>>
  956. <DEFINE RANK-BEFORE (RV INPOS POSS "AUX" (L <MEMQ .INPOS .RV>) AH BH TMP)
  957. #DECL ((RV VALUE) UVECTOR (TMP POSS NR INPOS) FIX
  958. (L AH BH) <OR FALSE UVECTOR>)
  959. <COND (<==? .INPOS .POSS>)
  960. (.L
  961. <UN-RANK .RV .POSS>
  962. <SET BH <QMEM 0 .L>>
  963. <SET AH <MEMQ 0 .L>>
  964. <COND (<OR <AND .BH
  965. .AH
  966. <L=? <- <LENGTH .BH> <LENGTH .L>>
  967. <- <LENGTH .L> <LENGTH .AH>>>>
  968. <AND .BH <NOT .AH>>>
  969. <STUFF-BEFORE .L .POSS>)
  970. (ELSE
  971. <SET TMP <1 .L>>
  972. <PUT .L 1 .POSS>
  973. <STUFF-AFTER .L .TMP>)>)>
  974. .RV>
  975. <DEFINE STUFF-BEFORE (L POSS "AUX" (RV <TOP .L>) TMP)
  976. #DECL ((L RV) UVECTOR (POSS TMP) FIX)
  977. <OR <==? .L .RV> <SET L <BACK .L>>>
  978. <REPEAT ()
  979. <SET TMP <1 .L>>
  980. <PUT .L 1 .POSS>
  981. <COND (<==? .L .RV> <RETURN>)>
  982. <COND (<0? .TMP> <RETURN>)>
  983. <SET POSS .TMP>
  984. <SET L <BACK .L>>>>
  985. <DEFINE RANK-AFTER (RV INPOS POSS "AUX" TMP AH BH (L <MEMQ .INPOS .RV>))
  986. #DECL ((RV VALUE) UVECTOR (NPOS INPOS TMP POSS NR) FIX
  987. (L AH BH) <OR FALSE UVECTOR>)
  988. <COND (<==? .INPOS .POSS>)
  989. (.L
  990. <UN-RANK .RV .POSS>
  991. <SET NPOS .POSS>
  992. <SET BH <QMEM 0 .L>>
  993. <SET AH <MEMQ 0 .L>>
  994. <COND (<OR <AND .BH
  995. .AH
  996. <L=? <- <LENGTH .L> <LENGTH .AH>>
  997. <- <LENGTH .BH> <LENGTH .L>>>>
  998. <AND .AH <NOT .BH>>>
  999. <STUFF-AFTER .L .POSS>)
  1000. (ELSE
  1001. <SET TMP <1 .L>>
  1002. <PUT .L 1 .POSS>
  1003. <STUFF-BEFORE .L .TMP>)>)>
  1004. .RV>
  1005. <DEFINE STUFF-AFTER (L POSS "AUX" TMP)
  1006. <OR <EMPTY? .L> <SET L <REST .L>>>
  1007. <REPEAT ()
  1008. <COND (<EMPTY? .L> <RETURN>)>
  1009. <SET TMP <1 .L>>
  1010. <PUT .L 1 .POSS>
  1011. <COND (<0? .TMP> <RETURN>)>
  1012. <SET POSS .TMP>
  1013. <SET L <REST .L>>>>
  1014. <SETG ORDERS <MAKEGST "KJL" [1 1 "increasing order" "decreasing order"]>>
  1015. <DEFINE GET-RANK-HEADER ("AUX" ZORK)
  1016. #DECL ((ZORK) VECTOR)
  1017. <SET ZORK <READARGS '[]
  1018. "
  1019. Rank the following "
  1020. ""
  1021. '["TEXT"]
  1022. ,ORDERS
  1023. "in "
  1024. ""
  1025. '["SYM"]
  1026. '[]
  1027. "of "
  1028. ""
  1029. '["TEXT"]>>
  1030. <AND <NOT <QUESTIONABLE? <1 .ZORK>>>
  1031. <2 .ZORK>
  1032. <NOT <QUESTIONABLE? <3 .ZORK>>>
  1033. <ASTRING ,QSPACE
  1034. "Rank the following "
  1035. <1 .ZORK>
  1036. " by "
  1037. <1 <2 .ZORK>>
  1038. " of "
  1039. <3 .ZORK>>>>
  1040. <DEFINE MAKE.RANK ("AUX" HDR C1 KEY NUM TBL)
  1041. #DECL ((HDR) STRING (C1) <OR FALSE <LIST [REST STRING]>> (TBL) SYMTABLE
  1042. (NUM) <OR FALSE FIX> (KEY) <OR FALSE <UVECTOR [REST FIX]>>)
  1043. <COND (<AND <SET HDR <GET-RANK-HEADER>>
  1044. <SET C1 <GRAB-BUNCH "Choice #">>
  1045. <G? <LENGTH .C1> 2>>
  1046. <SET TBL <MAKESST "FOO" <UNTASTEFUL-CODE .C1 <> T>>>
  1047. <COND (<AND <SET KEY <PULL-RANK .TBL>>
  1048. <NOT <MEMQ 0 .KEY>>>
  1049. <SET NUM
  1050. <REPEAT (TMP)
  1051. <COND (<SET TMP <READER '[] "
  1052. How many to rank: " "" '["FIX"] ,VERBOSE>>
  1053. <AND <G? .TMP 1>
  1054. <L=? .TMP <LENGTH .KEY>>
  1055. <RETURN .TMP>>)
  1056. (<RETURN <LENGTH .KEY>>)>>>
  1057. (.C1 .KEY <GETBUF "Comment: "> .HDR .NUM))
  1058. ('#FALSE ("Question aborted"))>)
  1059. ('#FALSE ("Question aborted"))>>
  1060. <DEFINE ASK.RANK (Q
  1061. "AUX" (RQ <REST .Q ,QQUES>) (RAMT <5 .RQ>) (ASP ,ASPACE)
  1062. SCORE TBL ANS)
  1063. #DECL ((Q RQ) VECTOR (ASP) SPACE (SCORE) FLOAT (TBL) <SPECIAL SYMTABLE>
  1064. (ANS) <UVECTOR [REST FIX]> (RAMT) FIX)
  1065. <PRINC <4 .RQ>>
  1066. <CRLF>
  1067. <PRINC "Number to rank: ">
  1068. <PRIN1 .RAMT>
  1069. <SET TBL <MAKESST "FOO" <UNTASTEFUL-CODE <1 .RQ> <> T>>>
  1070. <CRLF>
  1071. <SSTPOSSYM!-ICALSYM "" 0 <2 .TBL>>
  1072. <SET SCORE
  1073. <* <GRADE-RANK <2 .RQ> <SET ANS <PULL-RANK .TBL .ASP <5 .RQ>>>>
  1074. <QVAL .Q>>>
  1075. <INT-LEVEL 20>
  1076. <ADDSCORE ,PLAYER .Q .SCORE>
  1077. <INT-LEVEL 0>
  1078. <PRINC "
  1079. Score: ">
  1080. <PRIN1 .SCORE>
  1081. <AND <ANSWER?>
  1082. <PRINC "
  1083. Correct ranking: ">
  1084. <PRINT-RANK <2 .RQ> <2 .TBL>>
  1085. <CRLF>
  1086. <NOT <QUESTIONABLE? <3 .RQ>>>
  1087. <PRINC "Comment: ">
  1088. <PRINC <3 .RQ>>>
  1089. <SEND-PLAYER <NTH .Q ,QAUTH>
  1090. <ANS-VEC .Q .SCORE .ANS>
  1091. ,ALAST
  1092. <>
  1093. ,TELEC-START>>
  1094. <DEFINE READ.RANK (A "AUX" Q.A)
  1095. #DECL ((A Q.A) VECTOR)
  1096. <SET Q.A <QPRINT .A>>
  1097. <PRINC " scored ">
  1098. <PRIN1 <NTH .A ,ARESP>>
  1099. <PRINC " points with ">
  1100. <PRINT-RANK <5 .A>
  1101. <UNTASTEFUL-CODE <NTH .Q.A <+ ,QQUES 1>> <> T>>>
  1102. <DEFINE PRINT-RANK (UV TBL "AUX" (CNT 0))
  1103. #DECL ((UV) <UVECTOR [REST FIX]> (TBL) <VECTOR [REST STRING FIX]>
  1104. (CNT) FIX)
  1105. <MAPF <>
  1106. <FUNCTION (X)
  1107. #DECL ((X) FIX)
  1108. <CRLF>
  1109. <PRINC <SET CNT <+ .CNT 1>>>
  1110. <PRINC " ==> ">
  1111. <COND (<0? .X>) (<PRINC <NTH .TBL <- <* .X 2> 1>>>)>>
  1112. .UV>
  1113. <CRLF>>
  1114. <SETG NUMTBL <MAKEGST "FKJL" [2 ,NTH]>>
  1115. <SETG GROSSTBL <MAKESST "FOKJL" []>>
  1116. <SETG OPTBL <MAKEBST "KJLKL" ["Print" -2 "Terminate" -1]>>
  1117. <SETG FWEEPTBL <MAKESST "KJLKJLKJ" []>>
  1118. <SETG ZONKTBL <MAKEMST "KJK" [,FWEEPTBL ,OPTBL]>>
  1119. <DEFINE PULL-RANK (TBL
  1120. "OPTIONAL" (SP ,QSPACE) (RLEN </ <LENGTH <2 .TBL>> 2>)
  1121. "AUX" VERB (RUVEC <IUVECTOR .RLEN 0>) (IDX 0))
  1122. #DECL ((TBL) <SPECIAL SYMTABLE> (IDX RLEN) FIX
  1123. (RUVEC) <SPECIAL <UVECTOR [REST FIX]>> (SP) SPACE
  1124. (VERB) <OR 'T FALSE>)
  1125. <UNWIND
  1126. <PROG ()
  1127. <SETG COMPLETES " ,">
  1128. <SET VERB ,VERBOSE>
  1129. <SETG VERBOSE <>>
  1130. <PUT ,NUMTBL
  1131. 2
  1132. <MAPF ,VECTOR
  1133. <FUNCTION ()
  1134. <SET IDX <+ .IDX 1>>
  1135. <AND <G? .IDX .RLEN> <MAPSTOP>>
  1136. <COND (<1? .IDX> <MAPRET 1 ,NTH "1">)
  1137. (<UNPARSE .IDX>)>>>>
  1138. <REPEAT (FN FST COMM COMMAND NUM RANKING NUP M RLENGTH (L1? T)
  1139. (UNRANK? <>) NPOS DEFAULT?)
  1140. #DECL ((FN) APPLICABLE (COMM) <OR FALSE VECTOR> (NUM) FIX (NUP) STRING
  1141. (FST RANKING COMMAND) <SPECIAL ANY> (M) <OR FALSE UVECTOR>
  1142. (RLENGTH) <SPECIAL FIX> (L1? UNRANK?) <SPECIAL <OR ATOM FALSE>>
  1143. (NPOS) <SPECIAL FIX> (DEFAULT?) <SPECIAL <OR ATOM FALSE>>)
  1144. <SET L1? T>
  1145. <SET UNRANK? <>>
  1146. <PUT ,RANKDEFSYM
  1147. 2
  1148. <SET NUM
  1149. <COND (<SET M <MEMQ 0 .RUVEC>>
  1150. <SET DEFAULT? T>
  1151. <+ 1 <- <LENGTH .RUVEC> <LENGTH .M>>>)
  1152. (T
  1153. <SET DEFAULT? <>>
  1154. -1)>>>
  1155. <SET NUP <UNPARSE .NUM>>
  1156. <PUT ,RANKDEFSYM 1 <COND (<L? .NUM 0> "") (.NUP)>>
  1157. <PUT ,FWEEPTBL 2 <2 .TBL>>
  1158. <COND (<SET COMM
  1159. <READARGS RANKING
  1160. ,ZONKTBL
  1161. "
  1162. Rank "
  1163. '["" ""]
  1164. '["SYM" "MULT"]
  1165. COMMAND
  1166. '<COND (<EMPTY? .RANKING>
  1167. #FALSE (T)
  1168. <SET L1? <>>)
  1169. (<N==? <SET RLENGTH <LENGTH .RANKING>> 1>
  1170. <SET L1? <>>
  1171. ,RCOMS)
  1172. (<L? <2 <SET FST <1 .RANKING>>> 0>
  1173. #FALSE (T))
  1174. (,RCOMS)>
  1175. " "
  1176. '["" ""]
  1177. ,RCOMDEF
  1178. '<COND (<==? .COMMAND T> #FALSE (T))
  1179. (<OR <AND .L1? <L? <2 .FST> 0>>
  1180. <AND <=? <1 .COMMAND> "nowhere">
  1181. <SET UNRANK? T>>>
  1182. #FALSE (T))
  1183. (<=? <1 .COMMAND> "as "> ,NUMTBL)
  1184. (<PUT ,GROSSTBL
  1185. 2
  1186. <BLETCHEROUS-CODE .TBL .RUVEC>>)>
  1187. ""
  1188. '["" ""]
  1189. '<COND (<OR <EMPTY? .RANKING>
  1190. <AND .L1? <L? <2 .FST> 0>>> [])
  1191. (<AND .DEFAULT?
  1192. <=? <1 .COMMAND> "as ">>
  1193. ,RANKDEF)
  1194. ('["SYM"])>>>
  1195. <COND (<AND .L1? <==? <2 .FST> -1>> <RETURN <ACOPY .SP .RUVEC>>)
  1196. (<AND .L1? <==? <2 .FST> -2>> <PRINT-RANK .RUVEC <2 .TBL>>)
  1197. (.UNRANK?
  1198. <MAPF <> <FUNCTION (X) <UN-RANK .RUVEC <2 .X>>> .RANKING>)
  1199. (<OR <EMPTY? .RANKING>
  1200. <NOT <1 .COMM>>
  1201. <NOT <2 .COMM>>
  1202. <NOT <3 .COMM>>>
  1203. <PRINC " ?? ">)
  1204. (T
  1205. <SET NPOS
  1206. <COND (<MEMBER <1 <2 .COMM>> '("before " "after ")>
  1207. <2 <3 .COMM>>)
  1208. (<PARSE <1 <3 .COMM>>>)>>
  1209. <SET FN <2 <2 .COMM>>>
  1210. <MAPF <>
  1211. <FUNCTION (X "AUX" (IDX <2 .X>))
  1212. <COND (<L? .IDX 1>)
  1213. (T <APPLY .FN .RUVEC .NPOS <2 .X>>)>>
  1214. .RANKING>)>)
  1215. (<SETG VERBOSE .VERB>
  1216. <SETG COMPLETES " ">
  1217. <RETURN <ACOPY .SP .RUVEC>>)>>>
  1218. <PROG ()
  1219. <SETG VERBOSE .VERB>
  1220. <SETG COMPLETES " ">>>>
  1221. <DEFINE BLETCHEROUS-CODE (TBL RUVEC)
  1222. #DECL ((TBL) SYMTABLE (RUVEC) <UVECTOR [REST FIX]>)
  1223. <MAPF ,VECTOR
  1224. <FUNCTION (X)
  1225. #DECL ((X) FIX)
  1226. <COND (<0? .X> <MAPRET>)
  1227. (<MAPRET <NTH <2 .TBL> <- <* 2 .X> 1>>
  1228. .X>)>>
  1229. .RUVEC>>
  1230. <SETG RANKDEFSYM #SYMBOL ["1" 1]>
  1231. <SETG RANKDEF ["SYM" "DEF" ,RANKDEFSYM]>
  1232. <SETG RCOMDEF ["SYM" "DEF" <CHTYPE ["as " ,RANK-AS] SYMBOL>]>
  1233. <SETG RCOMS
  1234. <MAKEBST "FROMB"
  1235. ["after "
  1236. ,RANK-AFTER
  1237. "as "
  1238. ,RANK-AS
  1239. "before "
  1240. ,RANK-BEFORE
  1241. "nowhere"
  1242. ,ERROR]>>
  1243. ;"TABLES OF FUNCTIONS"
  1244. <COND (<GASSIGNED? COMPILE>)
  1245. (T
  1246. <SETG MAKERS
  1247. [,COMMAND
  1248. ,MAKE.REGULAR
  1249. ,MAKE.MATCH
  1250. ,MAKE.MC
  1251. ,MAKE.TF
  1252. ,QUIT
  1253. ,MAKE.REGULAR
  1254. ,ERROR
  1255. ,MAKE.RANK]>)>
  1256. <SETG ASKERS
  1257. [,TIME
  1258. ,ASK.REGULAR
  1259. ,ASK.MATCH
  1260. ,ASK.MC
  1261. ,ASK.MC
  1262. ,TIME
  1263. ,ASK.SIMPLE
  1264. ,ERROR
  1265. ,ASK.RANK]>
  1266. <SETG MREADERS [,PRINT.MAIL]>
  1267. <SETG READERS
  1268. [,READ.COMM
  1269. ,READ.REGULAR
  1270. ,READ.MATCH
  1271. ,READ.MC
  1272. ,READ.MC
  1273. ,TIME
  1274. ,READ.SANS
  1275. ,ERROR
  1276. ,READ.RANK]>