np.93 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  1. <SETG WORDS <OR <GET WORDS OBLIST> <MOBLIST WORDS 23>>>
  2. <SETG OBJECT-OBL <OR <GET OBJECTS OBLIST> <MOBLIST OBJECTS 23>>>
  3. <SETG ACTIONS <MOBLIST ACTIONS 17>>
  4. <SETG ORPHANS [<> <> <> <> <>]>
  5. <COND (<OR <LOOKUP "COMPILE" <ROOT>>
  6. <GASSIGNED? GROUP-GLUE>>)
  7. (<SETG PREPVEC
  8. [<CHTYPE [<FIND-PREP "WITH"> <FIND-OBJ "#####">] PHRASE>
  9. <CHTYPE [<FIND-PREP "WITH"> <FIND-OBJ "#####">] PHRASE>]>
  10. <SETG PREP2VEC
  11. [<CHTYPE [<FIND-PREP "WITH"> <FIND-OBJ "#####">] PHRASE>
  12. <CHTYPE [<FIND-PREP "WITH"> <FIND-OBJ "#####">] PHRASE>]>)>
  13. <DEFINE SPARSE SPAROUT (SV VB
  14. "AUX" (WORDS ,WORDS) (OBJOB ,OBJECT-OBL) (PV ,PRSVEC)
  15. (PVR <PUT <PUT <REST .PV> 1 <>> 2 <>>)
  16. (ACTIONS ,ACTIONS) (DIRS ,DIRECTIONS) (ORPH ,ORPHANS)
  17. (ORFL <OFLAG .ORPH>) (PRV ,PREPVEC) (HERE ,HERE)
  18. (ACTION <>) (PREP <>) NPREP (ADJ <>) ATM AVAL OBJ
  19. PPREP LOBJ VAL)
  20. #DECL ((SV) <VECTOR [REST STRING]> (VB ORFL) <OR ATOM FALSE>
  21. (ACTIONS WORDS OBJOB DIRS) OBLIST (PV ORPH PRV PVR) VECTOR
  22. (ATM) <OR ATOM FALSE> (HERE) ROOM (ACTION) <OR FALSE ACTION>
  23. (NPREP PREP) <OR FALSE PREP> (ADJ) <OR FALSE ADJECTIVE> (AVAL) ANY
  24. (LOBJ) ANY (OBJ) <OR FALSE OBJECT> (PPREP) PHRASE)
  25. <SET VAL
  26. <MAPF <>
  27. <FUNCTION (X)
  28. #DECL ((X) STRING)
  29. <COND
  30. (<EMPTY? .X> <MAPLEAVE T>)
  31. (<AND <NOT .ACTION>
  32. <SET ATM <LOOKUP .X .ACTIONS>>>
  33. <SET ACTION ,.ATM>)
  34. (<AND <NOT .ACTION>
  35. <SET ATM <LOOKUP .X .DIRS>>>
  36. <PUT .PV 1 ,WALK!-WORDS>
  37. <PUT .PV 2 ,.ATM>
  38. <RETURN WIN .SPAROUT>)
  39. (<AND <SET ATM <LOOKUP .X .WORDS>>
  40. <COND (<TYPE? <SET AVAL ,.ATM> PREP>
  41. <COND (.PREP
  42. <OR .VB <TELL "Double preposition?" 0>>
  43. <MAPLEAVE <>>)
  44. (<SET PREP .AVAL>)>)
  45. (<TYPE? .AVAL ADJECTIVE>
  46. <SET ADJ .AVAL>
  47. <NOT <AND .ORFL
  48. <SET ATM <ONAME .ORPH>>
  49. <SET X <SPNAME .ATM>>>>)
  50. (T)>>)
  51. (<SET ATM <LOOKUP .X .OBJOB>>
  52. <COND
  53. (<SET OBJ <GET-OBJECT .ATM .ADJ>>
  54. <AND <EMPTY? .PVR>
  55. <OR .VB <TELL "Too many objects specified?" 0>>
  56. <MAPLEAVE <>>>
  57. <PUT .PVR
  58. 1
  59. <COND (.PREP
  60. <SET PPREP <1 .PRV>>
  61. <SET PRV <REST .PRV>>
  62. <PUT .PPREP 1 .PREP>
  63. <SET PREP <>>
  64. <PUT .PPREP 2 .OBJ>)
  65. (.OBJ)>>
  66. <SET PVR <REST .PVR>>)
  67. (T
  68. <COND (<EMPTY? .OBJ>
  69. <OR .VB
  70. <COND (<LIT? .HERE>
  71. <TELL "I can't see a" 0>
  72. <COND (.ADJ
  73. <TELL " " 0 <PRSTR <CHTYPE .ADJ ATOM>>>)>
  74. <TELL " " 0 <PRSTR .ATM> " here.">)
  75. (<TELL "It is too dark in here to see." 0>)>>)
  76. (<==? .OBJ ,NEFALS2>
  77. <OR .VB
  78. <TELL "I can't reach that from inside the "
  79. 0
  80. <ODESC2 <AVEHICLE ,WINNER>>
  81. ".">>)
  82. (<OR .VB <TELL "Which " 0 <PRSTR .ATM> "?">>
  83. <ORPHAN T
  84. <OR .ACTION <AND .ORFL <OVERB .ORPH>>>
  85. <2 .PV>
  86. .PREP
  87. .ATM>)>
  88. <MAPLEAVE <>>)>
  89. <SET ADJ <>>
  90. T)
  91. (<OR .VB <TELL "I don't know the word " 0 .X>> <MAPLEAVE <>>)>>
  92. .SV>>
  93. <COND (.VAL
  94. <COND (<AND <NOT .ACTION>
  95. <NOT <SET ACTION <AND .ORFL <OVERB .ORPH>>>>>
  96. <OR .VB
  97. <COND (<TYPE? <2 .PV> OBJECT>
  98. <TELL "What should I do with the "
  99. 0
  100. <ODESC2 <2 .PV>>
  101. "?">)
  102. (<TELL "Huh?" 0>)>>
  103. <ORPHAN T <> <2 .PV>>
  104. <>)
  105. (<AND <PUT .PV 1 .ACTION> .ADJ>
  106. <OR .VB <TELL "Dangling adjective?" 0>>
  107. <>)
  108. (<AND .ORFL
  109. <SET NPREP <OPREP .ORPH>>
  110. <SET OBJ <2 .PV>>
  111. <PUT <SET PPREP <1 .PRV>> 1 .NPREP>
  112. <PUT .PPREP 2 .OBJ>
  113. <COND (<SET OBJ <OSLOT1 .ORPH>>
  114. <PUT .PV 2 .OBJ>
  115. <PUT .PV 3 .PPREP>)
  116. (<PUT .PV 2 .PPREP>)>
  117. <>>)
  118. (.PREP
  119. <AND <TYPE? <SET LOBJ <1 <BACK .PVR>>> OBJECT>
  120. <TOP <PUT <BACK .PVR>
  121. 1
  122. <PUT <PUT <1 .PRV> 1 .PREP> 2 .LOBJ>>>>)
  123. (.PV)>)>>
  124. <DEFINE SP (STR) <PARSE <LEX .STR> <>>>
  125. <DEFINE ORPHAN ("OPTIONAL" (FLAG <>) (ACTION <>) (SLOT1 <>) (PREP <>) (NAME
  126. <>))
  127. #DECL ((FLAG) <OR ATOM FALSE> (NAME) <OR ATOM FALSE>)
  128. <PUT <PUT <PUT <PUT <PUT ,ORPHANS ,ONAME .NAME> ,OPREP .PREP>
  129. ,OSLOT1
  130. .SLOT1>
  131. ,OVERB
  132. .ACTION>
  133. ,OFLAG
  134. .FLAG>>
  135. <DEFINE SYN-MATCH (PV
  136. "AUX" (ACTION <1 .PV>) (OBJS <REST .PV>) (O1 <1 .OBJS>)
  137. (O2 <2 .OBJS>) (DFORCE <>) (DRIVE <>) (GWIM <>) SYNN)
  138. #DECL ((ACTION) ACTION (PV OBJS) VECTOR (DRIVE DFORCE) <OR FALSE SYNTAX>
  139. (O1 O2) <OR FALSE OBJECT PHRASE> (SYNN) VARG (GWIM) <OR FALSE OBJECT>)
  140. <COND
  141. (<MAPF <>
  142. <FUNCTION (SYN)
  143. #DECL ((SYN) SYNTAX)
  144. <COND
  145. (<SYN-EQUAL <SYN1 .SYN> .O1>
  146. <COND (<SYN-EQUAL <SYN2 .SYN> .O2>
  147. <AND <SFLIP .SYN> <PUT .OBJS 1 .O2> <PUT .OBJS 2 .O1>>
  148. <MAPLEAVE <TAKE-IT-OR-LEAVE-IT .SYN <PUT .PV 1 <SFCN .SYN>>>>)
  149. (<NOT .O2>
  150. <COND (<SDRIVER .SYN> <SET DFORCE .SYN>) (<SET DRIVE .SYN>)>
  151. <>)>)
  152. (<NOT .O1>
  153. <COND (<SDRIVER .SYN> <SET DFORCE .SYN>) (<SET DRIVE .SYN>)>
  154. <>)>>
  155. <VDECL .ACTION>>)
  156. (<SET DRIVE <OR .DFORCE .DRIVE>>
  157. <COND (<AND <SET SYNN <SYN1 .DRIVE>>
  158. <NOT .O1>
  159. <NOT <0? <VBIT .SYNN>>>
  160. <NOT <ORFEO .SYNN .OBJS>>
  161. <NOT <SET O1 <SET GWIM <GWIM-SLOT 1 .SYNN .ACTION .OBJS>>>>>
  162. <ORPHAN T .ACTION <> <VPREP .SYNN>>
  163. <ORTELL .SYNN .ACTION .GWIM>)
  164. (<AND <SET SYNN <SYN2 .DRIVE>>
  165. <NOT .O2>
  166. <NOT <0? <VBIT .SYNN>>>
  167. <NOT <GWIM-SLOT 2 .SYNN .ACTION .OBJS>>>
  168. <ORPHAN T .ACTION .O1 <VPREP .SYNN>>
  169. <ORTELL .SYNN .ACTION .GWIM>)
  170. (<TAKE-IT-OR-LEAVE-IT .DRIVE <PUT .PV 1 <SFCN .DRIVE>>>)>)
  171. (<TELL "I can't make sense out of that." 0> <>)>>
  172. <DEFINE TAKE-IT-OR-LEAVE-IT (SYN PV "AUX" (PV1 <2 .PV>) (PV2 <3 .PV>) OBJ VARG)
  173. #DECL ((SYN) SYNTAX (PV) VECTOR (PV1 PV2) <OR FALSE OBJECT PHRASE>
  174. (OBJ) <OR FALSE OBJECT> (VARG) VARG)
  175. <PUT .PV
  176. 2
  177. <SET OBJ
  178. <COND (<TYPE? .PV1 OBJECT> .PV1)
  179. (<TYPE? .PV1 PHRASE> <2 .PV1>)>>>
  180. <COND (<VTRNN <SET VARG <SYN1 .SYN>> ,VRBIT>
  181. <TAKE-IT .OBJ .PV .VARG>)>
  182. <PUT .PV
  183. 3
  184. <SET OBJ
  185. <COND (<TYPE? .PV2 OBJECT> .PV2)
  186. (<TYPE? .PV2 PHRASE> <2 .PV2>)>>>
  187. <COND (<VTRNN <SET VARG <SYN2 .SYN>> ,VRBIT>
  188. <TAKE-IT .OBJ .PV .VARG>)>
  189. T>
  190. <DEFINE TAKE-IT (OBJ VEC VRB "AUX" (SAV1 <1 .VEC>) (SAV2 <2 .VEC>))
  191. #DECL ((OBJ) OBJECT (VEC) VECTOR (SAV1) VERB (SAV2) <OR FALSE OBJECT>
  192. (VRB) VARG)
  193. <COND (<AND <SEARCH-LIST <OID .OBJ> <ROBJS ,HERE> <>>
  194. <OR <CAN-TAKE? .OBJ> <NOT <VTRNN .VRB ,VTBIT>>>>
  195. <PUT .VEC 1 ,TAKE!-WORDS>
  196. <PUT .VEC 2 .OBJ>
  197. <TAKE T>
  198. <PUT .VEC 1 .SAV1>
  199. <PUT .VEC 2 .SAV2>)>>
  200. <DEFINE ORFEO (SYN OBJS "AUX" (ORPH ,ORPHANS) (ORFL <OFLAG .ORPH>) SLOT1)
  201. #DECL ((SYN) VARG (OBJS ORPH) VECTOR (ORFL) <OR ATOM FALSE>
  202. (SLOT1) <OR FALSE PHRASE OBJECT>)
  203. <COND (<NOT .ORFL> <>)
  204. (<SET SLOT1 <OSLOT1 .ORPH>>
  205. <AND <SYN-EQUAL .SYN .SLOT1> <PUT .OBJS 1 .SLOT1>>)>>
  206. <DEFINE ORTELL (VARG ACTION GWIM "AUX" (PREP <VPREP .VARG>) SP)
  207. #DECL ((VARG) VARG (ACTION) ACTION (PREP) <OR FALSE PREP> (SP) STRING
  208. (GWIM) <OR FALSE OBJECT>)
  209. <COND (.PREP
  210. <AND .GWIM
  211. <TELL <VSTR .ACTION> 0 " ">
  212. <TELL <ODESC2 .GWIM> 0 " ">>
  213. <TELL <PRSTR <CHTYPE .PREP ATOM>> 0 " what?">)
  214. (<TELL <VSTR .ACTION> 0 " what?">)>
  215. <>>
  216. <DEFINE PRSTR (ATM "AUX" SP)
  217. #DECL ((ATM) ATOM (SP) STRING)
  218. <FOOSTR <SET SP <SPNAME .ATM>> <BACK ,SCRSTR <LENGTH .SP>> <>>>
  219. <DEFINE FOOSTR (NAM STR "OPTIONAL" (1ST T))
  220. #DECL ((STR NAM) STRING (1ST) <OR ATOM FALSE>)
  221. <MAPR <>
  222. <FUNCTION (X Y)
  223. #DECL ((X Y) STRING)
  224. <COND (<AND .1ST <==? .X .NAM>>
  225. <PUT .Y 1 <1 .X>>)
  226. (<PUT .Y 1 <CHTYPE <+ 32 <ASCII <1 .X>>> CHARACTER>>)>>
  227. .NAM
  228. .STR>
  229. .STR>
  230. <DEFINE GWIM-SLOT (FX VARG ACTION OBJS "AUX" OBJ)
  231. #DECL ((FX) FIX (VARG) VARG (ACTION) ACTION (OBJS) VECTOR
  232. (OBJ) <OR FALSE OBJECT>)
  233. <COND (<SET OBJ <GWIM <VBIT .VARG> .VARG .ACTION>>
  234. <PUT .OBJS .FX .OBJ>
  235. .OBJ)>>
  236. "GET WHAT I MEAN - GWIM
  237. TAKES BIT TO CHECK AND WHERE TO CHECK AND WINS TOTALLY"
  238. <DEFINE GWIM (BIT FWORD ACTION
  239. "AUX" (AOBJ <VTRNN .FWORD ,VABIT>) (NTAKE <VTRNN .FWORD ,VTBIT>)
  240. (ROBJ <VTRNN .FWORD ,VRBIT>) (OBJ <>) NOBJ (PV ,PRSVEC)
  241. SAVOBJ (AV <AVEHICLE ,WINNER>) SF)
  242. #DECL ((BIT) FIX (NTAKE ROBJ AOBJ) <OR ATOM FALSE>
  243. (OBJ NOBJ AV) <OR OBJECT FALSE> (PV) VECTOR
  244. (SAVOBJ) <OR FALSE OBJECT PHRASE> (FWORD) VARG (ACTION) ACTION)
  245. <AND .AOBJ <SET OBJ <FWIM .BIT <AOBJS ,WINNER> .NTAKE>>>
  246. <COND (.ROBJ
  247. <COND (<AND <SET NOBJ <FWIM .BIT <ROBJS ,HERE> .NTAKE>>
  248. <OR <NOT .AV>
  249. <==? .AV .NOBJ>
  250. <MEMQ .NOBJ <OCONTENTS .AV>>
  251. <TRNN .NOBJ ,FINDMEBIT>>>
  252. <COND (<AND <OR <SET SAVOBJ <2 .PV>> T>
  253. <NOT .OBJ>
  254. <OR <SET SF <1 .PV>> T>
  255. <PUT .PV 1 ,TAKE!-WORDS>
  256. <PUT .PV 2 .NOBJ>
  257. <OR <==? .ACTION <1 .PV>> .NTAKE <TAKE>>
  258. <PUT .PV 2 .SAVOBJ>
  259. <PUT .PV 1 .SF>
  260. .NOBJ>)
  261. (<PUT .PV 2 .SAVOBJ> <>)>)
  262. (<OR .NOBJ <NOT <EMPTY? .NOBJ>>> ,NEFALS)
  263. (.OBJ)>)
  264. (.OBJ)>>
  265. ;" [ON (,BIT ,BIT ,BIT ROBJS NO-TAKE ...) [ATOM!-WORDS <FCN>] DRIVER]"
  266. <DEFINE MAKE-ACTION ("TUPLE" SPECS "AUX" VV SUM (PREP <>) ATM)
  267. <CHTYPE
  268. <MAPF ,UVECTOR
  269. <FUNCTION (SP "AUX" (SYN <IVECTOR 5 <>>) (WHR 1))
  270. #DECL ((SP) VECTOR (SYN) VECTOR (WHR) FIX)
  271. <MAPF <>
  272. <FUNCTION (ITM)
  273. <COND (<TYPE? .ITM STRING>
  274. <SET PREP <FIND-PREP .ITM>>)
  275. (<AND <==? .ITM OBJ>
  276. <SET ITM '(-1)>
  277. <>>)
  278. (<TYPE? .ITM LIST>
  279. <SET VV <IVECTOR 3>>
  280. <PUT .VV 1 <1 .ITM>>
  281. <PUT .VV 2 .PREP>
  282. <SET SUM 0>
  283. <SET PREP <>>
  284. <AND <MEMQ AOBJS .ITM>
  285. <SET SUM <+ .SUM ,VABIT>>>
  286. <AND <MEMQ ROBJS .ITM>
  287. <SET SUM <+ .SUM ,VRBIT>>>
  288. <AND <MEMQ NO-TAKE .ITM>
  289. <SET SUM <+ .SUM ,VTBIT>>>
  290. <AND <MEMQ = .ITM>
  291. <SET SUM <+ .SUM ,VXBIT>>>
  292. <PUT .VV 3 .SUM>
  293. <PUT .SYN .WHR <CHTYPE .VV VARG>>
  294. <SET WHR <+ .WHR 1>>)
  295. (<TYPE? .ITM VECTOR>
  296. <COND (<GASSIGNED? <SET ATM <ADD-WORD <1 .ITM>>>>
  297. <PUT .SYN ,SFCN ,.ATM>)
  298. (<PUT .SYN
  299. ,SFCN
  300. <SETG <SET ATM <ADD-WORD <1 .ITM>>>
  301. <CHTYPE [.ATM <2 .ITM>] VERB>>>)>)
  302. (<==? .ITM DRIVER> <PUT .SYN ,SDRIVER T>)
  303. (<==? .ITM FLIP> <PUT .SYN ,SFLIP T>)>>
  304. .SP>
  305. <OR <SYN1 .SYN> <PUT .SYN ,SYN1 ,EVARG>>
  306. <OR <SYN2 .SYN> <PUT .SYN ,SYN2 ,EVARG>>
  307. <CHTYPE .SYN SYNTAX>>
  308. .SPECS>
  309. VSPEC>>
  310. <SETG EVARG <CHTYPE [0 <> 0] VARG>>
  311. <DEFINE SYN-EQUAL (VARG POBJ "AUX" (VBIT <VBIT .VARG>))
  312. #DECL ((VARG) VARG (POBJ) <OR FALSE PHRASE OBJECT> (VBIT) FIX)
  313. <COND (<TYPE? .POBJ PHRASE>
  314. <AND <==? <VPREP .VARG> <1 .POBJ>>
  315. <OR <NOT <VTRNN .VARG ,VXBIT>>
  316. <TRNN <2 .POBJ> .VBIT>>>)
  317. (<TYPE? .POBJ OBJECT>
  318. <AND <NOT <VPREP .VARG>>
  319. <OR <NOT <VTRNN .VARG ,VXBIT>>
  320. <TRNN .POBJ .VBIT>>>)
  321. (<AND <NOT .POBJ> <0? .VBIT>>)>>
  322. <SETG DIRECTIONS <MOBLIST DIRECTIONS>>
  323. <DEFINE EPARSE (PV VB "AUX" VAL)
  324. #DECL ((VAL) ANY (PV) <VECTOR [REST STRING]> (VB) <OR ATOM FALSE>)
  325. <COND (<SET VAL <SPARSE .PV .VB>>
  326. <COND (<OR <==? .VAL WIN> <SYN-MATCH .VAL>> <ORPHAN <>>)
  327. (<OR .VB <TELL "">> <>)>)
  328. (<OR .VB <TELL "">> <>)>>
  329. <SETG SCRSTR <REST <ISTRING 5> 5>>
  330. <SETG SSV <IVECTOR 10 <>>>
  331. "GET-OBJECT: TAKES ATOM (FROM OBJECTS OBLIST), VERBOSITY FLAG. GROVELS
  332. OVER: ,STARS; ,HERE; ,WINNER LOOKING FOR OBJECT (LOOKS DOWN TO ONE LEVEL
  333. OF CONTAINMENT). RETURNS <> IF NOT FOUND OR FOUND MORE THAN ONE, THE
  334. OBJECT OTHERWISE."
  335. <DEFINE GET-OBJECT GET-OBJ (OBJNAM ADJ
  336. "AUX" OBJ (OOBJ <>) (HERE ,HERE)
  337. (AV <AVEHICLE ,WINNER>) (CHOMP <>))
  338. #DECL ((OOBJ OBJ AV) <OR OBJECT FALSE> (OBJNAM) ATOM (HERE) ROOM
  339. (ADJ) <OR ADJECTIVE FALSE> (CHOMP) <OR ATOM FALSE>
  340. (OBJL) <OR FALSE <LIST [REST OBJECT]>>)
  341. <COND (<SET OBJ <SEARCH-LIST .OBJNAM ,STARS .ADJ>> <SET OOBJ .OBJ>)
  342. (<NOT <EMPTY? .OBJ>> <RETURN ,NEFALS .GET-OBJ>)>
  343. <COND (<AND <LIT? .HERE>
  344. <SET OBJ <SEARCH-LIST .OBJNAM <ROBJS ,HERE> .ADJ>>>
  345. <COND (<AND .AV
  346. <N==? .OBJ .AV>
  347. <NOT <MEMQ .OBJ <OCONTENTS .AV>>>
  348. <NOT <TRNN .OBJ ,FINDMEBIT>>>
  349. <SET CHOMP T>)
  350. (.OOBJ <RETURN ,NEFALS .GET-OBJ>)
  351. (<SET OOBJ .OBJ>)>)
  352. (<AND <NOT .OBJ> <NOT <EMPTY? .OBJ>>> <RETURN ,NEFALS .GET-OBJ>)>
  353. <COND (.AV
  354. <COND (<SET OBJ <SEARCH-LIST .OBJNAM <OCONTENTS .AV> .ADJ>>
  355. <SET CHOMP <>>
  356. <SET OOBJ .OBJ>)
  357. (<NOT <EMPTY? .OBJ>> <RETURN ,NEFALS .GET-OBJ>)>)>
  358. <COND (<SET OBJ <SEARCH-LIST .OBJNAM <AOBJS ,WINNER> .ADJ>>
  359. <COND (.OOBJ ,NEFALS) (.OBJ)>)
  360. (<NOT <EMPTY? .OBJ>> ,NEFALS)
  361. (.CHOMP ,NEFALS2)
  362. (.OOBJ)>>
  363. "SEARCH-LIST: TAKES OBJECT NAME, LIST OF OBJECTS, AND VERBOSITY.
  364. IF FINDS ONE FROB UNDER THAT NAME ON LIST, RETURNS IT. SEARCH IS TO
  365. ONE LEVEL OF CONTAINMENT."
  366. <SETG NEFALS #FALSE (1)>
  367. <SETG NEFALS2 #FALSE (2)>
  368. <DEFINE SEARCH-LIST SL (OBJNAM SLIST ADJ "OPTIONAL" (FIRST? T) "AUX" (OOBJ <>)
  369. (NEFALS ,NEFALS) NOBJ)
  370. #DECL ((OBJNAM) ATOM (SLIST) <LIST [REST OBJECT]>
  371. (OOBJ NOBJ) <OR FALSE OBJECT> (ADJ) <OR FALSE ADJECTIVE>
  372. (FIRST?) <OR ATOM FALSE> (NEFALS) FALSE)
  373. <MAPF <>
  374. <FUNCTION (OBJ)
  375. #DECL ((OBJ) OBJECT)
  376. <COND (<THIS-IT? .OBJNAM .OBJ .ADJ>
  377. <COND (.OOBJ <RETURN .NEFALS .SL>) (<SET OOBJ .OBJ>)>)>
  378. <COND
  379. (<AND <OVIS? .OBJ>
  380. <OR <OOPEN? .OBJ> <TRANSPARENT? .OBJ>>
  381. <OR .FIRST? <TRNN .OBJ ,SEARCHBIT>>>
  382. <COND (<SET NOBJ <SEARCH-LIST .OBJNAM <OCONTENTS .OBJ> .ADJ <>>>
  383. <COND (.OOBJ <RETURN .NEFALS .SL>)
  384. (<SET OOBJ .NOBJ>)>)
  385. (<==? .NOBJ .NEFALS> <RETURN .NEFALS .SL>)>)>>
  386. .SLIST>
  387. .OOBJ>
  388. "FWIM: TAKE LIST OF FROBS, FIND ONE THAT CAN BE MANIPULATED (VISIBLE
  389. AND TAKEABLE, OR VISIBLE AND IN SOMETHING THAT'S VISIBLE AND OPEN)"
  390. <DEFINE FWIM DWIM (BIT OBJS NO-TAKE "AUX" (NOBJ <>))
  391. #DECL ((NO-TAKE) <OR ATOM FALSE> (BIT) FIX (OBJS) <LIST [REST OBJECT]>
  392. (NOBJ) <OR FALSE OBJECT>)
  393. <MAPF <>
  394. <FUNCTION (X)
  395. #DECL ((X) OBJECT)
  396. <COND (<AND <OVIS? .X> <OR .NO-TAKE <CAN-TAKE? .X>> <TRNN .X .BIT>>
  397. <COND (.NOBJ <RETURN ,NEFALS .DWIM>)>
  398. <SET NOBJ .X>)>
  399. <COND
  400. (<AND <OVIS? .X> <OOPEN? .X>>
  401. <MAPF <>
  402. <FUNCTION (X)
  403. #DECL ((X) OBJECT)
  404. <COND (<AND <OVIS? .X> <TRNN .X .BIT>>
  405. <COND (.NOBJ <RETURN ,NEFALS .DWIM>)
  406. (<SET NOBJ .X>)>)>>
  407. <OCONTENTS .X>>)>>
  408. .OBJS>
  409. .NOBJ>