The following output illustrates such a coupling.{foot 
The output is from the Lunar Sciences Natural Language Information System developed for the NASA Manned Spacecraft Center by William A. Woods of Bolt Beranek and Newman Inc., Cambridge, Mass.
}{comment endfootnote}
{Label L!50}


{lispcode
**SETQ(ALTFORM (MAPCONC NASDIC (F/L (GETP X 'ALTFORMS]{codetag 1}
=NASDICT
(AL26 BE7 CO56 CO57 CO60 C13 H3 MN54 NA22 SC46 S34 TI44)
**(GIVE ME LINES CONTAINING COBALT){codetag 2}
SAMPLE   PHASE    CONSTIT. CONTENT  UNIT     CITATION TAG
S10002   OVERALL   C056     40.0     DPM/KG  D70-237  0
                  C13      8.8      DEL      D70-228  0
                  H3       314.0    DPM/KG
                  MN54     28

**GETP(COBALT ALTFORMS){codetag 3}
(CO56 CO57 CO60 C13 H3 MN54 NA22 SC46 S34 T144)
**UNDO MAPCONC{codetag 4}
SETQ UNDONE.
**REDO GETP{codetag 5}
(CO56 CO57 CO60)
**REDO COBALT{codetag 6}
SAMPLE   PHASE    CONSTIT. CONTENT  UNIT     CITATION TAG
S10002   OVERALL  CO57     40.0     DPM/KG   D70-237  0
S10003   OVERALL  CO       15.0     D70-203  0
                           14.1              D70-216
                  CO56     43.0     DPM/KG   D70-237  0
                  CO57     43.0              D70-241  0
                  CO60     1.0
**USE MANGANESE FOR COBALT
}


The user is running under his own executive program which accepts requests in the form of sentences, which it first parses and then executes.
The user first "innocently" computes a list of all {lisp ALT}ernative-{lisp FORM}s for the elements in his system {codetag 1}.
He then inputs a request in sentence format {codetag 2} expecting to see under the column {lisp CONSTIT}. only cobalt, {lisp CO}, or its alternate forms, {lisp CO56}, {lisp CO57}, or {lisp CO60}.
Seeing {lisp C13}, {lisp H3}, and {lisp MN54}, he aborts the output, and checks the property {lisp ALTFORMS} for {lisp COBALT} {codetag 3}.
The appearance of {lisp C13}, {lisp H3}, {lisp MN54} et al, remind him that the {fn MAPCONC} is destructive, and that in the process of making a list of the {lisp ALTFORMS}, he has inadvertently strung them all together.
Recovering from this situation would require him to individually examine and correct the {lisp ALTFORM}s for each element in his dictionary, a tedious process.
Instead, he can simply type {lisp UNDO MAPCONC} {codetag 4}, check to make sure the ALTFORM has been corrected {codetag 5}, then redo his original request {codetag 6} and continue.
The {pacom UNDO} is possible because the first input was executed by {index LISPX}{fn LISPX}; the {lisp (GIVE ME LINES CONTAINING COBALT)} is
possible because the user defined {index LISPXUSERFN  PAV}{var LISPXUSERFN} appropriately; and the {pacom REDO} and {pacom USE} are possible because the {lisp (GIVE ME LINES CONTAINING COBALT)} was stored on the history list before it was transmitted to {var LISPXUSERFN} and the user's parsing program.


Thus in the above example, {var LISPXUSERFN} would be defined as:


{lispcode
[LAMBDA (X LINE)
   (COND
      ((AND (NULL LINE)
            (LISTP X))
       (SETQ LISPXVALUE (PARSE X))
       T]}