shogun/qverbs.zil

674 lines
17 KiB
Plaintext
Raw Normal View History

2019-04-16 06:35:32 -07:00
"QVERBS for
SHOGUN
(c) Copyright 1988 Infocom, Inc. All Rights Reserved."
<FILE-FLAGS MDL-ZIL?>
<DEFAULTS-DEFINED
PRINT-IS/ARE>
<BEGIN-SEGMENT 0>
<OBJECT WHAT
(LOC GLOBAL-OBJECTS)
(DESC "what")
(SYNONYM WHAT WHO ;WHOM)
(FLAGS NOTHEBIT)
(ACTION WHAT-F)>
<DEFINE WHAT-F ("AUX" OBJ TMP NOT? LOC?)
<SET NOT? <ANDB ,PARSE-NOT <PARSE-FLAGS ,PARSE-RESULT>>>
<SET LOC? <PARSE-LOC ,PARSE-RESULT>>
<COND (<VERB? BE?>
<RFALSE>)
(<EQUAL? <SET OBJ <PARSE-QW ,PARSE-RESULT>>
,W?WHO ,W?WHAT ,W?WHERE ,W?WHY ,W?WHEN ,W?HOW>
<RFALSE>)
(<NOT <EVERYWHERE-VERB?> ;<ABSTRACT-VERB?>>
<TELL
"That's precisely the sort of question you'll have to answer for
yourself." CR>
<RTRUE>)
(<EQUAL? ,PRSI ,INTPP>
<COND (<AND <SET OBJ <P-PP-OBJ>>
<NOT .NOT?>>
<SET TMP <OR <P-PP-PREP> <PP-PREP .LOC?>>>
<COND (<EQUAL? .TMP ,W?BEHIND>
<PERFORM ,V?LOOK-BEHIND .OBJ>
<RTRUE>)
(<EQUAL? .TMP ,W?DOWN>
<PERFORM ,V?LOOK-DOWN .OBJ>
<RTRUE>)
(<EQUAL? .TMP ,W?IN ,W?ON ,W?THROUGH>
<PERFORM ,V?LOOK-INSIDE .OBJ>
<RTRUE>)
(<EQUAL? .TMP ,W?UNDER>
<PERFORM ,V?LOOK-UNDER .OBJ>
<RTRUE>)>)>)
;(<EQUAL? ,PRSI ,INTADJ>
<SET ADJ? <PARSE-ADJ ,PARSE-RESULT>>
<COND (<IS-PRSO-ADJ? .ADJ?>
<COND (.NOT? <TELL "Wrong,">)
(ELSE <TELL "Right,">)>
<PRSO-IS <>>)
(ELSE
<COND (.NOT? <TELL "Right,">)
(ELSE <TELL "Wrong,">)>
<PRSO-IS T>)>
<TELL " ">
<PRINTB .ADJ?>
<TELL "." CR>)
;(ELSE
<TELL "So you think">
<PRSO-IS .NOT?>
<COND (,PRSI <TELL " " A ,PRSI>)>
<TELL "." CR>)>>
<DEFINE TELL-Q-WORD ("AUX" WD)
<COND (<VERB? BE?>
<TELL "if">)
(<EQUAL? <SET WD <PARSE-QW ,PARSE-RESULT>>
,W?WHO ,W?WHAT ,W?WHERE ,W?WHY ,W?WHEN ,W?HOW>
<PRINTB .WD>)
(T
<TELL "whether">)>>
<DEFINE P-NEGATIVE? ()
<ANDB ,PARSE-NOT <PARSE-FLAGS ,PARSE-RESULT>>>
<DEFINE TRY-QCONTEXT? ("AUX" W)
<COND (<AND ,QCONTEXT
<IN? ,QCONTEXT ,HERE>
<NOT <EQUAL? ,QCONTEXT ,WINNER>>
<OR <PAST-TENSE?>
<AND <NOT <EQUAL? ,QCONTEXT ,PRSO>>
<NOT <VERB? ASK-ABOUT>>
<NOT <AND <VERB? TELL-ABOUT>
<EQUAL? ,PRSO ,ME>>>>>>
<SET W ,WINNER>
<SETG WINNER ,QCONTEXT>
<PERFORM ,PRSA ,PRSO ,PRSI>
<SETG WINNER .W ;,PLAYER>
<RTRUE>)>>
<DEFINE PRE-BE ()
<COND (<TRY-QCONTEXT?>
<RTRUE>)>>
<SYNTAX BE OBJECT (MOBY) = V-BE PRE-BE>
<SYNTAX BE OBJECT (MOBY) OBJECT (MOBY) = V-BE PRE-BE>
<SYNTAX BE? OBJECT (MOBY) = V-BE?>
<SYNTAX BE? OBJECT (MOBY) OBJECT (MOBY) = V-BE?>
<DEFINE V-BE ("AUX" TMP NOT? ADJ? LOC? OBJ PREP)
<SET NOT? <ANDB ,PARSE-NOT <PARSE-FLAGS ,PARSE-RESULT>>>
<SET ADJ? <PARSE-ADJ ,PARSE-RESULT>>
<SET LOC? <PARSE-LOC ,PARSE-RESULT>>
<COND (<OR <VERB? BE? WHO WHAT WHERE WHY WHEN HOW>
<EQUAL? <SET TMP <PARSE-QW ,PARSE-RESULT>>
,W?WHO ,W?WHAT ,W?WHERE ,W?WHY ,W?WHEN ,W?HOW>>
<COND (<TRY-QCONTEXT?>
<RTRUE>)>
<COND (<EQUAL? ,PRSI ,INTADJ>
<COND (<EQUAL? ,PRSO ,ME ,PLAYER>
<COND (<VERB? BE?>
<TELL "You">)
(T
<PRINT ,WHO-KNOWS-STRING>
<TELL-Q-WORD>
<TELL " you">)>
<COND (<IS-PRSO-ADJ? .ADJ?>
<TELL " are ">)
(ELSE <TELL " aren't ">)>)
(ELSE
<COND (<VERB? BE?>
<TELL-CTHE ,PRSO>)
(T
<PRINT ,WHO-KNOWS-STRING>
<TELL-Q-WORD>
<TELL " ">
<TELL-THE ,PRSO>)>
<PRINT-IS/ARE ,PRSO>
<COND (<NOT <IS-PRSO-ADJ? .ADJ?>>
<TELL "n't">)>
<TELL " ">)>
<PRINTB .ADJ?>
<TELL "." CR>)
(<EQUAL? ,PRSI ,INTPP>
<COND (<AND <SET PREP <P-PP-PREP>>
<SET OBJ <P-PP-OBJ>>>
<COND (<VERB? BE?>
<PRSO-IS <NOT <RIGHT-PREP? .PREP ,PRSO .OBJ>>
T>
<TELL " ">
<PRINTB .PREP>
<TELL " ">
<TELL-THE .OBJ>
<TELL "." CR>)
(ELSE
<PRINT ,WHO-KNOWS-STRING>
<TELL-Q-WORD>
<PRSO-IS .NOT?>
<TELL " ">
<PRINTB .PREP>
<TELL " ">
<TELL-THE .OBJ>
<TELL "." CR>)>)
(ELSE
<PRINT ,WHO-KNOWS-STRING>
<TELL-Q-WORD>
<PRSO-IS .NOT?>
<TELL " ">
<PRINTB <PP-PREP .LOC?>>
<TELL " ">
<NP-PRINT <PP-NOUN .LOC?>>
<TELL "." CR>)>)
(<PARSE-SUBJ ,PARSE-RESULT>
<WHO-KNOWS>)
(<AND <NOT ,PRSI> <EQUAL? <PARSE-QW ,PARSE-RESULT> ,W?WHERE>>
<COND (<NOT <EQUAL? ,PRSO <> ,ROOMS>>
<SET LOC? <LOC ,PRSO>>)
(T <SET LOC? <>>)>
<COND (<NOT .LOC?>
<TELL "That's an excellent question." CR>)
(<IN? ,PRSO ,HERE>
<PRSO-IS <> T>
<TELL " here." CR>)
(<EQUAL? .LOC? ,GENERIC-OBJECTS>
<TELL "You don't know where ">
<TELL-THE ,PRSO>
<PRINT-IS/ARE ,PRSO>
<TELL "." CR>)
(<EQUAL? .LOC? ,GLOBAL-OBJECTS>
<TELL "No doubt ">
<TELL-THE ,PRSO>
<PRINT-IS/ARE ,PRSO>
<TELL " around here somewhere." CR>)
(<AND <EQUAL? .LOC? ,LOCAL-GLOBALS>
<GLOBAL-IN? ,PRSO ,HERE>>
<TELL-CTHE ,PRSO>
<PRINT-IS/ARE ,PRSO>
<TELL " nearby." CR>)
(<FSET? .LOC? ,PERSONBIT>
<TELL-CTHE .LOC?>
<TELL " has ">
<TELL-THE ,PRSO>
<TELL "." CR>)
(<EQUAL? <META-LOC ,PRSO> ,HERE>
<TELL-CTHE ,PRSO>
<PRINT-IS/ARE ,PRSO>
<TELL " in ">
<TELL-THE .LOC?>
<TELL "." CR>)
(<IN? .LOC? ,ROOMS>
<TELL-CTHE ,PRSO>
<PRINT-IS/ARE ,PRSO>
<TELL " probably ">
<COND (<FSET? ,PRSO ,TOUCHBIT>
<TELL
"still in the place called \"" D .LOC? ".\"" CR>)
(ELSE
<COND (<NOT <FSET? ,PRSO ,PERSONBIT>>
<TELL "lying ">)>
<TELL "around somewhere." CR>)>)
(ELSE
<PRINT ,WHO-KNOWS-STRING>
<TELL "where ">
<TELL-THE ,PRSO>
<PRINT-IS/ARE ,PRSO>
<TELL "." CR>)>)
(ELSE
<PRINT ,WHO-KNOWS-STRING>
<TELL-Q-WORD>
<COND (<NOT <EQUAL? ,PRSO <> ,ROOMS>>
<PRSO-IS .NOT?>
<COND (,PRSI <TELL " " A ,PRSI>)>)>
<TELL "." CR>)>)
(ELSE
<COND (<EQUAL? ,PRSI ,INTADJ>
<COND (<IS-PRSO-ADJ? .ADJ?>
<COND (.NOT? <TELL "Wrong,">)
(ELSE <TELL "Right,">)>
<PRSO-IS <>>)
(ELSE
<COND (.NOT? <TELL "Right,">)
(ELSE <TELL "Wrong,">)>
<PRSO-IS T>)>
<TELL " ">
<PRINTB .ADJ?>
<TELL "." CR>)
(<EQUAL? ,PRSI ,INTPP>
<TELL "So, you say">
<PRSO-IS .NOT?>
<TELL " ">
<COND (<SET TMP <P-PP-PREP>>
<PRINTB .TMP>)
(ELSE
<PRINTB <PP-PREP .LOC?>>)>
<TELL " ">
<COND (<SET TMP <P-PP-OBJ>>
<TELL-THE .TMP>)
(ELSE <NP-PRINT <PP-NOUN .LOC?>>)>
<TELL "." CR>)
(<EQUAL? ,P-PRSA-WORD ,W?BE>
<COND (<EQUAL? ,PRSO ,WINNER>
<TELL-CTHE ,PRSO>
<TELL " is already " "that" "." CR>)
(T <TELL "That would take a bit of magic." CR>)>)
(ELSE
<TELL "So you think">
<PRSO-IS .NOT?>
<COND (,PRSI <TELL " " A ,PRSI>)>
<TELL "." CR>)>)>>
<DEFINE RIGHT-PREP? (PREP OBJ CONT)
<COND (<NOT <IN? .OBJ .CONT>> <RFALSE>)
(<EQUAL? .PREP ,W?IN ,W?INSIDE>
<COND (<SEE-INSIDE? .CONT>
<RTRUE>)
(ELSE <RFALSE>)>)
(<AND <EQUAL? .PREP ,W?ON>
<OR <FSET? .CONT ,SURFACEBIT>
;<FSET? .CONT ,FURNITURE>>>
<RTRUE>)>>
<DEFINE V-BE? ()
<V-BE>>
<SYNTAX HOW OBJECT (MOBY) (FIND RLANDBIT) = V-HOW>
<SYNTAX HOW OBJECT (MOBY) OBJECT (MOBY) = V-HOW>
<SYNTAX WHAT OBJECT (MOBY) (FIND RLANDBIT) = V-WHAT>
<SYNTAX WHAT OBJECT (MOBY) OBJECT (MOBY) = V-WHAT>
<SYNTAX WHEN OBJECT (MOBY) (FIND RLANDBIT) = V-WHEN>
<SYNTAX WHEN OBJECT (MOBY) OBJECT (MOBY) = V-WHEN>
<SYNTAX WHERE OBJECT (MOBY) (FIND RLANDBIT) = V-WHERE PRE-WHERE>
<SYNTAX WHERE OBJECT (MOBY) OBJECT (MOBY) = V-WHERE PRE-WHERE>
<SYNTAX WHO OBJECT (MOBY) (FIND RLANDBIT) = V-WHO>
<SYNTAX WHO OBJECT (MOBY) OBJECT (MOBY) = V-WHO>
<SYNONYM WHO WHOM>
<SYNTAX WHY OBJECT (MOBY) (FIND RLANDBIT) = V-WHY>
<SYNTAX WHY OBJECT (MOBY) OBJECT (MOBY) = V-WHY>
<SYNTAX WILL OBJECT (MOBY) ;(FIND RLANDBIT) = V-WILL?>
<SYNTAX WOULD OBJECT (MOBY) ;(FIND RLANDBIT) = V-WOULD?>
<DEFINE V-WHO ()
<COND (<PRSO? ,ROOMS>
<MORE-SPECIFIC>)
(<NOT ,PRSI>
<TELL
"You don't know anything special about " THE ,PRSO "." CR>)
(ELSE <V-BE>)>>
<DEFINE V-WHAT ()
<V-WHO>>
<DEFINE PRE-WHERE ()
<COND (<AND <ZERO? ,PRSS> <ZERO? ,PRSQ>>
<PERFORM ,V?FIND ,PRSO ,PRSI>
<RTRUE>)>>
<DEFINE V-WHERE ()
<COND (<PRSO? ,ROOMS>
<MORE-SPECIFIC>)
(ELSE <V-BE>)>>
<DEFINE V-WHEN ()
<COND (<PRSO? ,ROOMS>
<MORE-SPECIFIC>)
(ELSE <V-BE>)>>
<DEFINE V-WHY ()
<COND (<PRSO? ,ROOMS>
<MORE-SPECIFIC>)
(ELSE <V-BE>)>>
<DEFINE V-HOW ()
<COND (<PRSO? ,ROOMS>
<MORE-SPECIFIC>)
(ELSE <V-BE>)>>
<CONSTANT ADJ-TABLE
<LTABLE <VOC "OUTSIDE" <> ;ADJ>
OUTSIDE?
;<VOC "INSIDE" ADJ>
;INSIDE?
<VOC "OPEN" ADJ>
OPEN?
<VOC "CLOSED" ADJ>
Q-CLOSED?
<VOC "LOCKED" ADJ>
LOCKED?
<VOC "UNLOCKED" ADJ>
UNLOCKED?
<VOC "DEAD" ADJ>
DEAD?
<VOC "ALIVE" ADJ>
ALIVE?
<VOC "QUIET" ADJ>
2019-04-16 06:37:36 -07:00
QUIET?
<VOC "DUTCH" ADJ>
DUTCH?
<VOC "PORTUGUESE" ADJ>
PORTUGUESE?
<VOC "SPANISH" ADJ>
SPANISH?
<VOC "ENGLISH" ADJ>
ENGLISH?
<VOC "JAPANESE" ADJ>
JAPANESE?>>
2019-04-16 06:35:32 -07:00
<DEFINE QUIET? (OBJ)
<RTRUE>>
<DEFINE OUTSIDE? (OBJ)
<FSET? ,HERE ,OUTSIDE>>
;<DEFINE INSIDE? (OBJ)
<NOT <FSET? ,HERE ,OUTSIDE>>>
<DEFINE OPEN? (OBJ)
<AND <OR <FSET? .OBJ ,OPENABLE>
<FSET? .OBJ ,DOORBIT>>
<FSET? .OBJ ,OPENBIT>>>
<DEFINE Q-CLOSED? (OBJ)
<AND <OR <FSET? .OBJ ,OPENABLE>
<FSET? .OBJ ,DOORBIT>>
<NOT <FSET? .OBJ ,OPENBIT>>>>
<DEFINE LOCKED? (OBJ)
<AND <FSET? .OBJ ,DOORBIT>
<FSET? .OBJ ,LOCKED>>>
<DEFINE UNLOCKED? (OBJ)
<AND <FSET? .OBJ ,DOORBIT>
<NOT <FSET? .OBJ ,LOCKED>>>>
<DEFINE DEAD? (OBJ)
<OR <NOT <FSET? .OBJ ,PERSONBIT>>
<FSET? .OBJ ,DEAD>>>
<DEFINE ALIVE? (OBJ)
<AND <FSET? .OBJ ,PERSONBIT>
<NOT <FSET? .OBJ ,DEAD>>>>
<DEFINE PRSO-IS (NOT? "OPT" (CAP? <>))
<COND (<EQUAL? ,PRSO ,ME ,PLAYER>
<COND (.CAP? <TELL "You">)
(ELSE <TELL " you">)>
<TELL " are">
<COND (.NOT? <TELL "n't">)>)
(ELSE
<COND (.CAP? <TELL-CTHE ,PRSO>)
(T <TELL " "> <TELL-THE ,PRSO>)>
<PRINT-IS/ARE ,PRSO>
<COND (.NOT? <TELL "n't">)>)>>
<DEFAULT-DEFINITION PRINT-IS/ARE
<DEFINE PRINT-IS/ARE (OBJ)
<COND (<OR <FSET? .OBJ ,PLURAL>
<EQUAL? .OBJ ,BLACKTHORNE ,ME ,YOU>>
<TELL " are">)
(ELSE <TELL " is">)>>>
<DEFINE IS-PRSO-ADJ? (ADJ "AUX" TMP)
<COND (<AND <SET TMP <GETPT ,PRSO ,P?ADJECTIVE>>
<INTBL? .ADJ .TMP </ <PTSIZE .TMP> 2>>>
<RTRUE>)
(<AND <SET TMP <INTBL? .ADJ ,ADJ-TABLE <GET ,ADJ-TABLE 0>>>
<APPLY <GET .TMP 1> ,PRSO>>
<RTRUE>)>>
<DEFINE PP? (P N "AUX" (TMP <PARSE-LOC ,PARSE-RESULT>))
<COND (<NOT .TMP> <RFALSE>)
(<NOT <AND .P <EQUAL? .P <P-PP-PREP>>>>
<RFALSE>)
(<NOT <AND .N <EQUAL? .N <P-PP-OBJ>>>>
<RFALSE>)
(ELSE <RTRUE>)>>
"does a bear shit in the woods?"
"RLANDBIT would allow single-word sentence!"
<SYNTAX CAN OBJECT (MOBY) ;(FIND RLANDBIT) = V-CAN?>
<SYNTAX COULD OBJECT (MOBY) ;(FIND RLANDBIT) = V-COULD?>
<SYNTAX DO OBJECT (MOBY) ;(FIND RLANDBIT) = V-DO?>
<SYNTAX MAY OBJECT (MOBY) ;(FIND RLANDBIT) = V-MAY?>
<SYNTAX MIGHT OBJECT (MOBY) ;(FIND RLANDBIT) = V-MIGHT?>
<SYNTAX MUST OBJECT (MOBY) ;(FIND RLANDBIT) = V-MUST?>
<SYNTAX SHOULD OBJECT (MOBY) ;(FIND RLANDBIT) = V-SHOULD?>
<DEFINE V-STATEMENT () <V-DO?>>
<CONSTANT WHO-KNOWS-STRING "It's not easy to tell "
;"The \"narrator\" can't tell you ">
<DEFINE WHO-KNOWS ("OPT" (WD <PARSE-QUERY ,PARSE-RESULT>) "AUX" OBJ SUBJ)
<COND (<AND <EQUAL? <PARSE-QW ,PARSE-RESULT> ,W?WHO ,W?WHAT>
<SET OBJ <VERB-ONE <WORD-VERB-STUFF ,P-PRSA-WORD>>>
<GET-SYNTAX .OBJ 1 0 T>
<SET OBJ <DETERMINE-OBJ <> 1 T>>
<SET OBJ <NOUN-PHRASE-OBJ1 .OBJ>>>
<TELL "Perhaps">)
(T
<SET OBJ <>>
<PRINT ,WHO-KNOWS-STRING>
<TELL-Q-WORD>)>
<SET SUBJ <PARSE-SUBJ ,PARSE-RESULT>>
<COND (<T? .SUBJ>
<SET SUBJ <NOUN-PHRASE-OBJ1 .SUBJ>>)
(<NOT <EQUAL? ,PRSO <> ,ROOMS>>
<SET SUBJ ,PRSO>)
(T
<TELL "." CR>
<RTRUE>)>
<TELL " ">
<COND (<EQUAL? .SUBJ ,ME ,PLAYER>
<TELL "you">)
(ELSE
<TELL-THE .SUBJ>)>
<COND (<T? .WD>
<COND (<OR <NOT <EQUAL? .WD ,W?DO ,W?DOES ,W?DID>>
<NOT <PARSE-SUBJ ,PARSE-RESULT>>>
<TELL " ">
<PRINTB .WD>)>)>
<COND (<T? <PARSE-SUBJ ,PARSE-RESULT>>
<TELL " ">
;<PRINT-VOCAB-WORD ,P-PRSA-WORD>
<COND (<T? .WD>
<COND (<EQUAL? .WD ,W?DID>
;<BAND ,PAST-TENSE <WORD-FLAGS .WD>>
;"Look for past-tense form in vocabulary:"
<PROG ((V <ZREST ,VOCAB <+ 1 <GETB ,VOCAB 0>>>)
(M <BOR *200* <GETB .V 0>>) N)
<COND (<EQUAL? ,P-PRSA-WORD ,W?GET>
<TELL "got">)
(<AND <SET N <INTBL? ,P-PRSA-WORD <ZREST .V 9 ;3>
<ZGET <ZREST .V 1> 0> .M>>
<BTST <ZGET .N 1> ,PAST-TENSE>>
<PRINT-VOCAB-WORD .N>)
(T
<PRINT-VOCAB-WORD ,P-PRSA-WORD>
<TELL "ed">)>>)
(T
<PRINT-VOCAB-WORD ,P-PRSA-WORD>
<COND (<AND <EQUAL? .WD ,W?DO ,W?DOES>
<NOT <EQUAL? .SUBJ ,ME ,PLAYER>>
<NOT <FSET? .SUBJ ,PLURAL>>>
<TELL "s">)>)>
<COND (<T? .OBJ>
<TELL " ">
<COND (<EQUAL? .OBJ .SUBJ>
<COND (<NOT <FSET? .OBJ ,PERSONBIT>>
<TELL "it">)
(<FSET? .OBJ ,FEMALE>
<TELL "her">)
(T
<TELL "him">)>
<TELL "self">)
(T
<TELL-THE .OBJ>)>)
(T
<ECHO-NOUNS>)>)
(T <PRINT-VOCAB-WORD ,P-PRSA-WORD>)>)>
<TELL "." CR>>
<DEFINE ECHO-NOUNS ("AUX" WD)
<COND (<NOT <EQUAL? ,PRSO 0 ,WHAT ,NOT-HERE-OBJECT>>
<COND (<SET WD <PARSE-PARTICLE1 ,PARSE-RESULT>>
<TELL " ">
<PRINTB .WD>)>
<TELL " ">
<TELL-THE ,PRSO>)>
<COND (<NOT <EQUAL? ,PRSI 0 ,WHAT ,NOT-HERE-OBJECT>>
<COND (<SET WD <PARSE-PARTICLE2 ,PARSE-RESULT>>
<TELL " ">
<PRINTB .WD>)>
<TELL " ">
<TELL-THE ,PRSI>)>>
<DEFINE V-CAN? () <WHO-KNOWS ,W?CAN>>
<DEFINE V-MAY? () <WHO-KNOWS ,W?MAY>>
<DEFINE V-DO? ()
<COND (<TRY-QCONTEXT?>
<RTRUE>)
(<NOT <BTST <PARSE-FLAGS ,PARSE-RESULT> ,PARSE-QUESTION>>
<COND (<NOT ,PRSS>
<MORE-SPECIFIC>
<RTRUE>)
(ELSE
<TELL "So you think">
<COND (<EQUAL? ,PRSS ,ME ,PLAYER>
<TELL " you ">
<COND (<ANDB ,PARSE-NOT <PARSE-FLAGS ,PARSE-RESULT>>
<TELL "don't ">)>)
(T
<COND ;(.CAP? <TELL-CTHE ,PRSS>)
(T <TELL " "> <TELL-THE ,PRSS> <TELL " ">)>
<COND (<ANDB ,PARSE-NOT <PARSE-FLAGS ,PARSE-RESULT>>
<TELL "doesn't ">)>)>
<PRINT-VOCAB-WORD ,P-PRSA-WORD>
<ECHO-NOUNS>
<TELL "." CR>)>)
(T
<WHO-KNOWS ;<COND ;(<BAND ,PAST-TENSE <PARSE-FLAGS ,PARSE-RESULT>>
,W?DID)
(T ,W?DOES)>>)>>
<DEFINE V-COULD? () <WHO-KNOWS ,W?COULD>>
<DEFINE V-WOULD? () <WHO-KNOWS ,W?WOULD>>
<DEFINE V-SHOULD? () <WHO-KNOWS ,W?SHOULD>>
<DEFINE V-MIGHT? () <WHO-KNOWS ,W?MIGHT>>
<DEFINE V-WILL? () <WHO-KNOWS ,W?WILL>>
<DEFINE V-MUST? () <WHO-KNOWS ,W?MUST>>
<DEFINE QUESTION-VERB? ("AUX" TMP) ;"add more later..."
<OR <EQUAL? <SET TMP <PARSE-QW ,PARSE-RESULT>>
,W?WHO ,W?WHAT ,W?WHERE ,W?WHY ,W?WHEN ,W?HOW>
<VERB? BE? CAN? COULD? DO? MAY? MIGHT? MUST? SHOULD? WILL? WOULD?>>>
"PERFORM uses two additional GLOBALs, 'q-verb' and subject, each of
which can be false. Examples:
'IS THE POPE CATHOLIC'
becomes
<SETG PRSQ T>
<PERFORM ,V?BE ,POPE ,INTADJ ;T>
'DOES THE GOVERNMENT TAKE MONEY FROM ME'
becomes
<SETG PRSQ ,V?DO>
<SETG PRSS ,GOVERNMENT>
<PERFORM ,V?TAKE ,MONEY ,ME>
'WHY DOES THE GOVERNMENT TAKE MONEY FROM ME'
becomes
<SETG PRSQ ,V?WHY>
<SETG PRSS ,GOVERNMENT>
<PERFORM ,V?TAKE ,MONEY ,ME>
When PERFORM notices the presence of a q-verb, it calls action routines
in this order:
WINNER
SUBJECT
; M-BEG
Q-PREACTION (from the following table)
; OBJECT #2
; OBJECT #1
Q-ACTION (ditto) or V-STATEMENT
PERFORM also handles statements, for example:
'MY NAME IS ARTHUR DENT'
becomes
<PERFORM ,V?IS ,NAME ,ARTHUR>
"
<CONSTANT QACTIONS <PLTABLE
V-BE V-BE? 0
V-DISEMBARK V-DISEMBARK? 0
V-DROP V-DROP? PRE-DROP?
V-TAKE V-TAKE? PRE-TAKE?
;"and so on">>
<DEFINE PRE-DROP? ()
<COND (<EQUAL? ,PRSO <LOC ,PRSS>>
;<SETG PRSQ ,V?DISEMBARK>
<PERFORM ,V?DISEMBARK ;,PRSA ,PRSO ,PRSI ;,V?DISEMBARK ;,PRSS>
<RTRUE>)>>
<DEFINE V-DROP? ()
<COND (<EQUAL? ,PRSO ,ROOMS>
<PRINT "You aren't ">
<TELL "hanging from anything." CR>)>>
<DEFINE V-DISEMBARK? ("AUX" AV)
<SET AV <LOC ,PRSS>>
<COND (<EQUAL? ,PRSO <> ,ROOMS>
<COND (<AND .AV <NOT <IN? .AV ,ROOMS>>>
<PERFORM ,PRSA .AV ,PRSI ;,PRSQ ;,PRSS>
<RTRUE>)
(ELSE
<PRINT "You aren't ">
<TELL "in anything." CR>)>)
(<AND .AV <NOT <IN? .AV ,ROOMS>>>
<COND (<AND <NOT <EQUAL? .AV ,PRSO>>
<NOT <HELD? .AV ,PRSO>>>
<PRINT "You already are">
<COND (<FSET? .AV ,SURFACEBIT> <TELL " on ">)
(ELSE <TELL " in ">)>
<TELL-THE .AV>
<TELL "!" CR>
<RTRUE>)>)
(<LOC ,PRSO>
;<SETG PRSQ ,V?TAKE>
<PERFORM ,V?TAKE ;,PRSA ,PRSO ,PRSI ;,V?TAKE ;,PRSS>
<RTRUE>)
(ELSE
<PRINT "It's not in anything.">
<CRLF>)>>
<DEFINE PRE-TAKE? ()
<COND (<NOT ,PRSI>
<PRE-TAKE>)>>
<DEFINE V-TAKE? ()
<COND (<ZERO? <PARSE-QW ,PARSE-RESULT>>
<TELL "Seems reasonable." CR>)>>
<END-SEGMENT>