emacs.d/clones/lisp/www.cliki.net/CLPfAI.html

547 lines
81 KiB
HTML
Raw Normal View History

2022-10-07 15:47:14 +02:00
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>CLiki: CLPfAI</title>
<link rel="alternate" type="application/atom+xml" title="ATOM feed of edits to current article"
href="https://www.cliki.net/site/feed/article.atom?title=CLPfAI">
<link rel="stylesheet" href="static/css/style.css">
<link rel="stylesheet" href="static/css/colorize.css">
</head>
<body>
<span class="hidden">CLiki - CLPfAI</span>
<div id="content"><div id="content-area"><div id="article-title">CLPfAI</div><div id="article"><cite>Common Lisp Programming for <a href="Artificial&#32;Intelligence.html" class="category">Artificial Intelligence</a></cite>
<br>Tony Hasemer &amp; John Domingue - 1989
<br>International Computer Science Series
<br>Addison &amp; Wesley
<br><a href="https://www.amazon.com/Programming-Artificial-Intelligence-International-Computer/dp/0201175797/ref=sr_1_1?ie=UTF8&amp;s=books&amp;qid=1260219079&amp;sr=8-1">ISBN 0-201-17579-7</a><p>This <a href="book.html" class="category">book</a> was written during the period of standardization of
Common Lisp, before the specification of CLOS was included in
the standard. <p>It was addressed to programmers learning Common Lisp, but
today beginners will prefer newer books, giving a more
complete and modern coverage of Common Lisp and <a href="CLOS.html" class="internal">CLOS</a>,
post standardization.<p>Otherwise it is quite pedagogical a book, leading easily the
beginner to a basic working knowledge of Common Lisp, and
still interesting today for its presentation of:<p><ul>
<li> a simple rule interpreter,
</li>
<li> a simple object system implemented with closures,
</li>
<li> a simplified version of the Schank and Riesbeck's SAM
algorithm (matching events (<a href="https://en.wikipedia.org/wiki/Conceptual_dependency_theory">conceptual dependencies</a>)
to story scripts as the engine of story understanding).
</li>
</ul><p>The programming style is simplified (making use of a small
number of lisp functions). The examples are often
uninteresting (meaningless foo bar stuff, instead of taking
more real examples). Most examples of macros and in exercises
should actually be implemented as functions, and some
functions should have been implemented as macros. Notably in
the last chapter about the SAM algorithm, a big opportunity
to write a couple of nice DSL-like macros was missed.<p>Here is the modernized code from chapter 14:<p><div class="code"><span class="nonparen"> <span class="comment">;;;; -*- mode:lisp; coding:utf-8 -*-
</span>
<span class="comment">;;; This file contains the code for chapter 14, modified and
</span> <span class="comment">;;; modernized to use CLOS and higher order lisp functions. I
</span> <span class="comment">;;; further added some macros notably with-variables and following.
</span> <span class="comment">;;; - PJB
</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defpackage.html" class="symbol"><i><span class="symbol">defpackage</span></i></a> <span class="string">"SAM"</span>
<span class="paren2">(<span class="nonparen"><span class="keyword">:use</span> <span class="string">"CL"</span></span>)</span>
<span class="paren2">(<span class="nonparen"><span class="keyword">:shadow</span> <span class="string">"VARIABLE"</span> <span class="string">"DEFCLASS"</span></span>)</span>
<span class="paren2">(<span class="nonparen"><span class="keyword">:documentation</span> <span class="string">"A program to implement a simplified version of Schank and Riesbeck's Conceptual Dependencies."</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_in-package.html" class="symbol">in-package</a> <span class="string">"SAM"</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defparametercm_defvar.html" class="symbol"><i><span class="symbol">defvar</span></i></a> <span class="special">*cd-trace*</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a>
<span class="string">"A Flag used for tracing. If *cd-trace* is T then cd-trace prints a trace."</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> cd-trace-on <span class="paren2">(<span class="nonparen"></span>)</span> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="special">*cd-trace*</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> cd-trace-off <span class="paren2">(<span class="nonparen"></span>)</span> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="special">*cd-trace*</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> cd-trace <span class="paren2">(<span class="nonparen">&amp;rest args</span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> <span class="special">*cd-trace*</span>
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_apply.html" class="symbol">apply</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">function</span></i></a> <a href="https://www.cliki.net/site/HyperSpec/Body/fun_format.html" class="symbol">format</a></span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/var_stdebug-i_ace-outputst.html" class="symbol"><span class="special">*trace-output*</span></a> args</span>)</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> slots <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/syscla_class.html" class="symbol">class</a></span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_mapccm_ma_istcm_mapcon.html" class="symbol">mapcar</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">function</span></i></a> clos:slot-definition-name</span>)</span>
<span class="paren3">(<span class="nonparen">CLOS:CLASS-SLOTS <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_if.html" class="symbol"><i><span class="symbol">if</span></i></a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_symbolp.html" class="symbol">symbolp</a> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_class.html" class="symbol">class</a></span>)</span>
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_find-class.html" class="symbol">find-class</a> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_class.html" class="symbol">class</a></span>)</span>
<a href="https://www.cliki.net/site/HyperSpec/Body/syscla_class.html" class="symbol">class</a></span>)</span></span>)</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defgeneric.html" class="symbol"><i><span class="symbol">defgeneric</span></i></a> slots-and-values <span class="paren2">(<span class="nonparen">self</span>)</span>
<span class="paren2">(<span class="nonparen"><span class="keyword">:method-combination</span> <a href="https://www.cliki.net/site/HyperSpec/Body/fun_append.html" class="symbol">append</a></span>)</span>
<span class="paren2">(<span class="nonparen"><span class="keyword">:documentation</span> <span class="string">"Return a plist containing the slots name (as keyword)
and values of each slot."</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmacro.html" class="symbol"><i><span class="symbol">defmacro</span></i></a> <a href="https://www.cliki.net/site/HyperSpec/Body/mac_defclass.html" class="symbol"><i><span class="symbol">defclass</span></i></a> <span class="paren2">(<span class="nonparen">classname superclasses slots &amp;rest options</span>)</span>
`<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_progn.html" class="symbol"><i><span class="symbol">progn</span></i></a>
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defclass.html" class="symbol"><i><span class="symbol">cl:defclass</span></i></a> ,classname ,superclasses
,<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_mapccm_ma_istcm_mapcon.html" class="symbol">mapcar</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">lambda</span></i></a> <span class="paren6">(<span class="nonparen">slot</span>)</span>
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_if.html" class="symbol"><i><span class="symbol">if</span></i></a> <span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_atom.html" class="symbol">atom</a> slot</span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">list</a> slot
<span class="keyword">:initarg</span> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_intern.html" class="symbol">intern</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_string.html" class="symbol">string</a> slot</span>)</span> <span class="string">"KEYWORD"</span></span>)</span>
<span class="keyword">:initform</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a>
<span class="keyword">:accessor</span> slot</span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_destructuring-bind.html" class="symbol">destructuring-bind</a> <span class="paren2">(<span class="nonparen">name initform</span>)</span> slot
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">list</a> name
<span class="keyword">:initarg</span> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_intern.html" class="symbol">intern</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_string.html" class="symbol">string</a> name</span>)</span> <span class="string">"KEYWORD"</span></span>)</span>
<span class="keyword">:initform</span> initform
<span class="keyword">:accessor</span> name</span>)</span></span>)</span></span>)</span></span>)</span>
slots</span>)</span>
,@options</span>)</span>
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> slots-and-values <a href="https://www.cliki.net/site/HyperSpec/Body/fun_append.html" class="symbol">append</a> <span class="paren4">(<span class="nonparen"><span class="paren5">(<span class="nonparen">self ,classname</span>)</span></span>)</span>
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">list</a> ,@<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_mapccm_ma_istcm_mapcon.html" class="symbol">mapcan</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">lambda</span></i></a> <span class="paren1">(<span class="nonparen">slot</span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_if.html" class="symbol"><i><span class="symbol">if</span></i></a> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_atom.html" class="symbol">atom</a> slot</span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">list</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_intern.html" class="symbol">intern</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_string.html" class="symbol">string</a> slot</span>)</span> <span class="string">"KEYWORD"</span></span>)</span> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">list</a> slot 'self</span>)</span></span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_destructuring-bind.html" class="symbol">destructuring-bind</a> <span class="paren3">(<span class="nonparen">name initform</span>)</span> slot
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">list</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_intern.html" class="symbol">intern</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_string.html" class="symbol">string</a> name</span>)</span> <span class="string">"KEYWORD"</span></span>)</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">list</a> name 'self</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
slots</span>)</span></span>)</span></span>)</span>
',classname</span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defgeneric.html" class="symbol"><i><span class="symbol">defgeneric</span></i></a> show <span class="paren2">(<span class="nonparen">self &amp;optional pre-string post-string</span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> show <span class="keyword">:before</span> <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">self <a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a></span>)</span> &amp;optional pre-string post-string</span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">declare</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/dec_ignorecm_ignorable.html" class="symbol">ignorable</a> self post-string</span>)</span></span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> pre-string <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_format.html" class="symbol">format</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a> pre-string</span>)</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> show <span class="keyword">:after</span> <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">self <a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a></span>)</span> &amp;optional pre-string post-string</span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">declare</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/dec_ignorecm_ignorable.html" class="symbol">ignorable</a> self pre-string</span>)</span></span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> post-string <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_format.html" class="symbol">format</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a> post-string</span>)</span></span>)</span></span>)</span>
<span class="comment">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defclass.html" class="symbol"><i><span class="symbol">defclass</span></i></a> cd <span class="paren2">(<span class="nonparen"></span>)</span>
<span class="paren2">(<span class="nonparen">action actor object from to</span>)</span>
<span class="paren2">(<span class="nonparen"><span class="keyword">:documentation</span> <span class="string">"A Conceptual Dependency."</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> make-cd <span class="paren2">(<span class="nonparen">&amp;key action actor object from to</span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/stagenfun_make-instance.html" class="symbol">make-instance</a> 'cd <span class="keyword">:action</span> action <span class="keyword">:actor</span> actor <span class="keyword">:object</span> object <span class="keyword">:from</span> from <span class="keyword">:to</span> to</span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> <a href="https://www.cliki.net/site/HyperSpec/Body/stagenfun_print-object.html" class="symbol">print-object</a> <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">self cd</span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a></span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_print-unr_dable-object.html" class="symbol">print-unreadable-object</a> <span class="paren3">(<span class="nonparen">self <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a> <span class="keyword">:identity</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a> <span class="keyword">:type</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a></span>)</span>
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_format.html" class="symbol">format</a> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a> <span class="string">"~{~S ~S~^ ~}"</span> <span class="paren4">(<span class="nonparen">slots-and-values self</span>)</span></span>)</span></span>)</span>
self</span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> show <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">self cd</span>)</span> &amp;optional pre-string post-string</span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">declare</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/dec_ignorecm_ignorable.html" class="symbol">ignorable</a> pre-string post-string</span>)</span></span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_dolist.html" class="symbol">dolist</a> <span class="paren3">(<span class="nonparen">slot <span class="paren4">(<span class="nonparen">cd-slots self</span>)</span></span>)</span>
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren4">(<span class="nonparen"><span class="paren5">(<span class="nonparen">value <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">funcall</a> slot self</span>)</span></span>)</span></span>)</span>
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> value
<span class="paren5">(<span class="nonparen">show value <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_format.html" class="symbol">format</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a> <span class="string">"~%~8A "</span> slot</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> cd-slots <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">self cd</span>)</span></span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_mapccm_ma_istcm_mapcon.html" class="symbol">mapcar</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_function.html" class="symbol"><i><span class="symbol">function</span></i></a> clos:slot-definition-name</span>)</span>
<span class="paren3">(<span class="nonparen">CLOS:CLASS-DIRECT-SLOTS <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_find-class.html" class="symbol">find-class</a> 'cd</span>)</span></span>)</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> script-triggers <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">self cd</span>)</span></span>)</span>
'<span class="paren2">(<span class="nonparen">actor object from to</span>)</span></span>)</span>
<span class="comment">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defclass.html" class="symbol"><i><span class="symbol">defclass</span></i></a> cd-entity <span class="paren2">(<span class="nonparen"></span>)</span>
<span class="paren2">(<span class="nonparen">cd-name</span>)</span>
<span class="paren2">(<span class="nonparen"><span class="keyword">:documentation</span> <span class="string">"A cd-entity is the most general type of object that can
fill a slot in a conceptual dependency."</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> <a href="https://www.cliki.net/site/HyperSpec/Body/stagenfun_print-object.html" class="symbol">print-object</a> <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">self cd-entity</span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a></span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_print-unr_dable-object.html" class="symbol">print-unreadable-object</a> <span class="paren3">(<span class="nonparen">self <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a> <span class="keyword">:identity</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a> <span class="keyword">:type</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a></span>)</span>
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_format.html" class="symbol">format</a> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a> <span class="string">"~{~S ~S~^ ~}"</span> <span class="paren4">(<span class="nonparen">slots-and-values self</span>)</span></span>)</span></span>)</span>
self</span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> show <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">self cd-entity</span>)</span> &amp;optional pre-string post-string</span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">declare</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/dec_ignorecm_ignorable.html" class="symbol">ignorable</a> pre-string post-string</span>)</span></span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_writecm_p_rintcm_princ.html" class="symbol">princ</a> <span class="paren3">(<span class="nonparen">cd-name self</span>)</span></span>)</span></span>)</span>
<span class="comment">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defclass.html" class="symbol"><i><span class="symbol">defclass</span></i></a> action <span class="paren2">(<span class="nonparen">cd-entity</span>)</span> <span class="paren2">(<span class="nonparen"></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmacro.html" class="symbol"><i><span class="symbol">defmacro</span></i></a> <i><span class="symbol">define-action</span></i> <span class="paren2">(<span class="nonparen">name</span>)</span>
`<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_progn.html" class="symbol"><i><span class="symbol">progn</span></i></a>
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defclass.html" class="symbol"><i><span class="symbol">defclass</span></i></a> ,name <span class="paren4">(<span class="nonparen">action</span>)</span> <span class="paren4">(<span class="nonparen"><span class="paren5">(<span class="nonparen">cd-name ',name</span>)</span></span>)</span></span>)</span>
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> <a href="https://www.cliki.net/site/HyperSpec/Body/stagenfun_print-object.html" class="symbol">print-object</a> <span class="paren4">(<span class="nonparen"><span class="paren5">(<span class="nonparen">self ,name</span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a></span>)</span>
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_print-unr_dable-object.html" class="symbol">print-unreadable-object</a> <span class="paren5">(<span class="nonparen">self <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a> <span class="keyword">:type</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a></span>)</span>
<span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_format.html" class="symbol">format</a> <a href="https://www.cliki.net/site/HyperSpec/Body/syscla_stream.html" class="symbol">stream</a> <span class="string">":CD-NAME ~A"</span> <span class="paren6">(<span class="nonparen">cd-name self</span>)</span></span>)</span></span>)</span>
self</span>)</span>
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmacro.html" class="symbol"><i><span class="symbol">defmacro</span></i></a> ,name <span class="paren4">(<span class="nonparen">&amp;key actor object from to</span>)</span>
`<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/stagenfun_make-instance.html" class="symbol">make-instance</a> 'cd <span class="keyword">:action</span> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/stagenfun_make-instance.html" class="symbol">make-instance</a> ',',name</span>)</span>
<span class="keyword">:actor</span> ,actor <span class="keyword">:object</span> ,object <span class="keyword">:from</span> ,from <span class="keyword">:to</span> ,to</span>)</span></span>)</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><i><span class="symbol">define-action</span></i> atrans</span>)</span>
<span class="paren1">(<span class="nonparen"><i><span class="symbol">define-action</span></i> ptrans</span>)</span>
<span class="paren1">(<span class="nonparen"><i><span class="symbol">define-action</span></i> mtrans</span>)</span>
<span class="comment">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defclass.html" class="symbol"><i><span class="symbol">defclass</span></i></a> cd-entity-with-scripts <span class="paren2">(<span class="nonparen">cd-entity</span>)</span>
<span class="paren2">(<span class="nonparen">associated-scripts</span>)</span></span>)</span>
<span class="comment">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defclass.html" class="symbol"><i><span class="symbol">defclass</span></i></a> role <span class="paren2">(<span class="nonparen">cd-entity-with-scripts</span>)</span>
<span class="paren2">(<span class="nonparen"></span>)</span>
<span class="paren2">(<span class="nonparen"><span class="keyword">:documentation</span> <span class="string">"Used to fill the actor slot of a Conceptual Dependency"</span></span>)</span></span>)</span>
<span class="comment">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defclass.html" class="symbol"><i><span class="symbol">defclass</span></i></a> setting <span class="paren2">(<span class="nonparen">cd-entity-with-scripts</span>)</span>
<span class="paren2">(<span class="nonparen"></span>)</span>
<span class="paren2">(<span class="nonparen"><span class="keyword">:documentation</span> <span class="string">"Used to fill the from or to slot of a Conceptual Dependency"</span></span>)</span></span>)</span>
<span class="comment">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defclass.html" class="symbol"><i><span class="symbol">defclass</span></i></a> store <span class="paren2">(<span class="nonparen">setting</span>)</span>
<span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">cd-name 'store</span>)</span>
<span class="paren3">(<span class="nonparen">associated-scripts 'shopping</span>)</span></span>)</span>
<span class="paren2">(<span class="nonparen"><span class="keyword">:documentation</span> <span class="string">"A specialization of setting. Represents any store.
Notice that we have a script associated with this class of object."</span></span>)</span></span>)</span>
<span class="comment">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defclass.html" class="symbol"><i><span class="symbol">defclass</span></i></a> prop <span class="paren2">(<span class="nonparen">cd-entity-with-scripts</span>)</span>
<span class="paren2">(<span class="nonparen"></span>)</span>
<span class="paren2">(<span class="nonparen"><span class="keyword">:documentation</span> <span class="string">"Used to fill the object slot of a Conceptual Dependency"</span></span>)</span></span>)</span>
<span class="comment">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defclass.html" class="symbol"><i><span class="symbol">defclass</span></i></a> story <span class="paren2">(<span class="nonparen"></span>)</span>
<span class="paren2">(<span class="nonparen">cds <span class="comment">; A list of cds
</span> current-script <span class="comment">; The script we are currently trying to match against.
</span> possible-next-events <span class="comment">; The possible next events we are trying to match against.
</span> </span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> show <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">self story</span>)</span> &amp;optional pre-string post-string</span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">declare</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/dec_ignorecm_ignorable.html" class="symbol">ignorable</a> pre-string post-string</span>)</span></span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_dolist.html" class="symbol">dolist</a> <span class="paren3">(<span class="nonparen">cd <span class="paren4">(<span class="nonparen">cds self</span>)</span></span>)</span> <span class="paren3">(<span class="nonparen">show cd <span class="string">"~%"</span></span>)</span></span>)</span></span>)</span>
<span class="comment">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defclass.html" class="symbol"><i><span class="symbol">defclass</span></i></a> script <span class="paren2">(<span class="nonparen"></span>)</span>
<span class="paren2">(<span class="nonparen">events <span class="comment">; The possible events in a story: a list of cds.
</span> variables <span class="comment">; A list of the variables used in the script.
</span> <span class="comment">; This is used to clear the script before it is used.
</span> </span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> show <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">self script</span>)</span> &amp;optional pre-string post-string</span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">declare</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/dec_ignorecm_ignorable.html" class="symbol">ignorable</a> pre-string post-string</span>)</span></span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_dolist.html" class="symbol">dolist</a> <span class="paren3">(<span class="nonparen">event <span class="paren4">(<span class="nonparen">events self</span>)</span></span>)</span> <span class="paren3">(<span class="nonparen">show event <span class="string">"~%"</span></span>)</span></span>)</span></span>)</span>
<span class="comment">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defclass.html" class="symbol"><i><span class="symbol">defclass</span></i></a> <a href="https://www.cliki.net/site/HyperSpec/Body/stagenfun_doc_umentationcp.html" class="symbol">variable</a> <span class="paren2">(<span class="nonparen"></span>)</span>
<span class="paren2">(<span class="nonparen">cd-name <span class="comment">; The name of the variable.
</span> value <span class="comment">; The value of the variable.
</span> </span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> show <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">self <a href="https://www.cliki.net/site/HyperSpec/Body/stagenfun_doc_umentationcp.html" class="symbol">variable</a></span>)</span> &amp;optional pre-string post-string</span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/sym_declare.html" class="symbol">declare</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/dec_ignorecm_ignorable.html" class="symbol">ignorable</a> pre-string post-string</span>)</span></span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_format.html" class="symbol">format</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a> <span class="string">"~A "</span> <span class="paren3">(<span class="nonparen">cd-name self</span>)</span></span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_if.html" class="symbol"><i><span class="symbol">if</span></i></a> <span class="paren3">(<span class="nonparen">value self</span>)</span>
<span class="paren3">(<span class="nonparen">show <span class="paren4">(<span class="nonparen">value self</span>)</span></span>)</span>
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_format.html" class="symbol">format</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a> <span class="string">"Unmatched "</span></span>)</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> bound? <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">self <a href="https://www.cliki.net/site/HyperSpec/Body/stagenfun_doc_umentationcp.html" class="symbol">variable</a></span>)</span></span>)</span>
<span class="paren2">(<span class="nonparen">value self</span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> clear-value <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">self <a href="https://www.cliki.net/site/HyperSpec/Body/stagenfun_doc_umentationcp.html" class="symbol">variable</a></span>)</span></span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren3">(<span class="nonparen">value self</span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a></span>)</span></span>)</span>
<span class="comment">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defparametercm_defvar.html" class="symbol"><i><span class="symbol">defvar</span></i></a> <span class="special">*scripts*</span> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_make-hash-table.html" class="symbol">make-hash-table</a></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> get-script <span class="paren2">(<span class="nonparen">name</span>)</span> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_gethash.html" class="symbol">gethash</a> name <span class="special">*scripts*</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> events-script <span class="paren2">(<span class="nonparen">name</span>)</span> <span class="paren2">(<span class="nonparen">events <span class="paren3">(<span class="nonparen">get-script name</span>)</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> store-script <span class="paren2">(<span class="nonparen">name script</span>)</span> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_gethash.html" class="symbol">gethash</a> name <span class="special">*scripts*</span></span>)</span> script</span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> match <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">self cd</span>)</span> event</span>)</span>
<span class="string">"Tries to match a cd against an event in a script
by matching the slots in the cd against those in the event."</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_everycm_s_erycm_notany.html" class="symbol">every</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">lambda</span></i></a> <span class="paren4">(<span class="nonparen">slot</span>)</span> <span class="paren4">(<span class="nonparen">match-cd-slot self slot event</span>)</span></span>)</span> <span class="paren3">(<span class="nonparen">cd-slots self</span>)</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> match-cd-slot <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">self cd</span>)</span> slot event</span>)</span>
<span class="string">"Try AND match one of the slots in a cd against the same slot
in an event from a script.
SLOT holds the name of the slot (action from to etc) we want
to compare to."</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">e-val <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">funcall</a> slot event</span>)</span></span>)</span>
<span class="paren4">(<span class="nonparen">c-val <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">funcall</a> slot self</span>)</span></span>)</span></span>)</span>
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_cond.html" class="symbol"><i><span class="symbol">cond</span></i></a>
<span class="paren4">(<span class="nonparen"><span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_null.html" class="symbol">null</a> e-val</span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a></span>)</span>
<span class="paren4">(<span class="nonparen"><span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_null.html" class="symbol">null</a> c-val</span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a></span>)</span>
<span class="paren4">(<span class="nonparen"><span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_and.html" class="symbol">and</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_typep.html" class="symbol">typep</a> c-val 'role</span>)</span>
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_member.html" class="symbol">member</a> <span class="paren1">(<span class="nonparen">cd-name c-val</span>)</span> '<span class="paren1">(<span class="nonparen">he she it they</span>)</span></span>)</span></span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a></span>)</span>
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a> <span class="paren5">(<span class="nonparen">check-equal e-val c-val</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> check-equal <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">self <a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a></span>)</span> story-object</span>)</span>
<span class="string">"Checks that two objects are equal."</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_if.html" class="symbol"><i><span class="symbol">if</span></i></a> <span class="paren3">(<span class="nonparen">cd-name story-object</span>)</span>
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_equal.html" class="symbol">equal</a> <span class="paren4">(<span class="nonparen">cd-name self</span>)</span> <span class="paren4">(<span class="nonparen">cd-name story-object</span>)</span></span>)</span>
<a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> check-equal <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">self <a href="https://www.cliki.net/site/HyperSpec/Body/stagenfun_doc_umentationcp.html" class="symbol">variable</a></span>)</span> story-object</span>)</span>
<span class="string">"Checks that a variable can match against a story object."</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_if.html" class="symbol"><i><span class="symbol">if</span></i></a> <span class="paren3">(<span class="nonparen">bound? self</span>)</span>
<span class="paren3">(<span class="nonparen">check-equal <span class="paren4">(<span class="nonparen">value self</span>)</span> story-object</span>)</span>
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren4">(<span class="nonparen">value self</span>)</span> story-object</span>)</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> process <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">self story</span>)</span></span>)</span>
<span class="paren2">(<span class="nonparen">clear self</span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_dolist.html" class="symbol">dolist</a> <span class="paren3">(<span class="nonparen">cd <span class="paren4">(<span class="nonparen">cds self</span>)</span></span>)</span>
<span class="paren3">(<span class="nonparen">show cd <span class="string">"~2%Input is "</span></span>)</span>
<span class="paren3">(<span class="nonparen">process-cd cd self</span>)</span></span>)</span>
<span class="paren2">(<span class="nonparen">show <span class="paren3">(<span class="nonparen">get-script <span class="paren4">(<span class="nonparen">current-script self</span>)</span></span>)</span> <span class="string">"~%Story done -- script is "</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> process-cd <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">self cd</span>)</span> story</span>)</span>
<span class="string">"Process one of the CD in a story."</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_or.html" class="symbol">or</a> <span class="paren3">(<span class="nonparen">find-cd-in-script self story</span>)</span>
<span class="paren3">(<span class="nonparen">suggest-new-script self story</span>)</span>
<span class="paren3">(<span class="nonparen">show self <span class="string">"~2%not adding to any script"</span></span>)</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> clear <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">self script</span>)</span></span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_dolist.html" class="symbol">dolist</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/stagenfun_doc_umentationcp.html" class="symbol">variable</a> <span class="paren4">(<span class="nonparen">variables self</span>)</span></span>)</span>
<span class="paren3">(<span class="nonparen">clear-value <a href="https://www.cliki.net/site/HyperSpec/Body/stagenfun_doc_umentationcp.html" class="symbol">variable</a></span>)</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> clear <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">self story</span>)</span></span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren3">(<span class="nonparen">current-script self</span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a>
<span class="paren3">(<span class="nonparen">possible-next-events self</span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> find-cd-in-script <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">self cd</span>)</span> story</span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">event <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_findcm_fi__find-if-not.html" class="symbol">find-if</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">lambda</span></i></a> <span class="paren1">(<span class="nonparen">event</span>)</span> <span class="paren1">(<span class="nonparen">match self event</span>)</span></span>)</span>
<span class="paren6">(<span class="nonparen">possible-next-events story</span>)</span></span>)</span></span>)</span></span>)</span>
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> event
<span class="paren4">(<span class="nonparen">show event <span class="string">"~2%matches"</span></span>)</span>
<span class="paren4">(<span class="nonparen">reset-script-info story event</span>)</span>
event</span>)</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> reset-script-info <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">self story</span>)</span> <a href="https://www.cliki.net/site/HyperSpec/Body/fun_positionc_ition-if-not.html" class="symbol">position</a></span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren3">(<span class="nonparen">possible-next-events self</span>)</span> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_carcm_cdr_darcm_cddddr.html" class="symbol">cdr</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_member.html" class="symbol">member</a> <a href="https://www.cliki.net/site/HyperSpec/Body/fun_positionc_ition-if-not.html" class="symbol">position</a> <span class="paren5">(<span class="nonparen">possible-next-events self</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> suggest-new-script <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">self cd</span>)</span> story</span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">new-script <span class="paren5">(<span class="nonparen">find-script self</span>)</span></span>)</span></span>)</span>
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> new-script
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_format.html" class="symbol">format</a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_t.html" class="symbol">t</a> <span class="string">"~2%newscript ~A"</span> new-script</span>)</span>
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren5">(<span class="nonparen">current-script story</span>)</span> new-script
<span class="paren5">(<span class="nonparen">possible-next-events story</span>)</span> <span class="paren5">(<span class="nonparen">events-script new-script</span>)</span></span>)</span>
<span class="paren4">(<span class="nonparen">find-cd-in-script self story</span>)</span></span>)</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> find-script <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">self cd</span>)</span></span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_everycm_s_erycm_notany.html" class="symbol">some</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">lambda</span></i></a> <span class="paren4">(<span class="nonparen">trigger</span>)</span> <span class="paren4">(<span class="nonparen">try self trigger</span>)</span></span>)</span> <span class="paren3">(<span class="nonparen">script-triggers self</span>)</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmethod.html" class="symbol"><i><span class="symbol">defmethod</span></i></a> try <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">self cd</span>)</span> slot</span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">funcall</a> slot self</span>)</span>
<span class="paren3">(<span class="nonparen">associated-scripts <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_funcall.html" class="symbol">funcall</a> slot self</span>)</span></span>)</span></span>)</span></span>)</span>
<span class="comment">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
</span> <span class="comment">;;; WITH-VARIABLES Macro
</span> <span class="comment">;;; (with-variables (vardecl...) body...)
</span> <span class="comment">;;;
</span> <span class="comment">;;; vardecl are either a symbol naming the variable,
</span> <span class="comment">;;; or a list (name class [cd-name])
</span> <span class="comment">;;; When the cd-name is absent, it is either the name itself if it
</span> <span class="comment">;;; doesn't start with a question mark, or the name with the prefix
</span> <span class="comment">;;; question mark removed.
</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> variable-name <span class="paren2">(<span class="nonparen">vardecl</span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_if.html" class="symbol"><i><span class="symbol">if</span></i></a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_atom.html" class="symbol">atom</a> vardecl</span>)</span> vardecl <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_firstcm_s_inthcm_tenth.html" class="symbol">first</a> vardecl</span>)</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> variable-cd-name <span class="paren2">(<span class="nonparen">vardecl</span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_if.html" class="symbol"><i><span class="symbol">if</span></i></a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_or.html" class="symbol">or</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_atom.html" class="symbol">atom</a> vardecl</span>)</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_null.html" class="symbol">null</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_firstcm_s_inthcm_tenth.html" class="symbol">third</a> vardecl</span>)</span></span>)</span></span>)</span>
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_if.html" class="symbol"><i><span class="symbol">if</span></i></a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_chareqcm__ar-not-lessp.html" class="symbol">char=</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_aref.html" class="symbol">aref</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_string.html" class="symbol">string</a> <span class="paren1">(<span class="nonparen">variable-name vardecl</span>)</span></span>)</span> 0</span>)</span> <span class="character">#\?</span></span>)</span>
<span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_intern.html" class="symbol">intern</a> <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_subseq.html" class="symbol">subseq</a> <span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_string.html" class="symbol">string</a> <span class="paren1">(<span class="nonparen">variable-name vardecl</span>)</span></span>)</span> 1</span>)</span></span>)</span>
<span class="paren4">(<span class="nonparen">variable-name vardecl</span>)</span></span>)</span>
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_firstcm_s_inthcm_tenth.html" class="symbol">third</a> vardecl</span>)</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> variable-class <span class="paren2">(<span class="nonparen">vardecl</span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_if.html" class="symbol"><i><span class="symbol">if</span></i></a> <span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_atom.html" class="symbol">atom</a> vardecl</span>)</span>
'<a href="https://www.cliki.net/site/HyperSpec/Body/stagenfun_doc_umentationcp.html" class="symbol">variable</a>
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_or.html" class="symbol">or</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_firstcm_s_inthcm_tenth.html" class="symbol">second</a> vardecl</span>)</span> '<a href="https://www.cliki.net/site/HyperSpec/Body/stagenfun_doc_umentationcp.html" class="symbol">variable</a></span>)</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmacro.html" class="symbol"><i><span class="symbol">defmacro</span></i></a> <i><span class="symbol">with-variables</span></i> <span class="paren2">(<span class="nonparen"><span class="paren3">(<span class="nonparen">&amp;rest variables</span>)</span> &amp;body body</span>)</span>
`<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> ,<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_mapccm_ma_istcm_mapcon.html" class="symbol">mapcar</a> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_lambda.html" class="symbol"><i><span class="symbol">lambda</span></i></a> <span class="paren5">(<span class="nonparen">vardecl</span>)</span>
`<span class="paren5">(<span class="nonparen">,<span class="paren6">(<span class="nonparen">variable-name vardecl</span>)</span>
<span class="paren6">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/stagenfun_make-instance.html" class="symbol">make-instance</a> ',<span class="paren1">(<span class="nonparen">variable-class vardecl</span>)</span>
,@<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_whencm_unless.html" class="symbol">when</a> <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_findcm_fi__find-if-not.html" class="symbol">find</a> 'cd-name <span class="paren3">(<span class="nonparen">slots <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/acc_find-class.html" class="symbol">find-class</a> <span class="paren5">(<span class="nonparen">variable-class vardecl</span>)</span></span>)</span></span>)</span></span>)</span>
`<span class="paren2">(<span class="nonparen"><span class="keyword">:cd-name</span> ',<span class="paren3">(<span class="nonparen">variable-cd-name vardecl</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
variables</span>)</span>
,@body</span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmacro.html" class="symbol"><i><span class="symbol">defmacro</span></i></a> goes-to <span class="paren2">(<span class="nonparen">who where-to &amp;key from</span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">vwho <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_gensym.html" class="symbol">gensym</a></span>)</span></span>)</span></span>)</span>
`<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren4">(<span class="nonparen"><span class="paren5">(<span class="nonparen">,vwho ,who</span>)</span></span>)</span>
<span class="paren4">(<span class="nonparen">ptrans <span class="keyword">:actor</span> ,vwho <span class="keyword">:object</span> ,vwho <span class="keyword">:from</span> ,from <span class="keyword">:to</span> ,where-to</span>)</span></span>)</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmacro.html" class="symbol"><i><span class="symbol">defmacro</span></i></a> takes <span class="paren2">(<span class="nonparen">who what &amp;key from</span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">vwho <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_gensym.html" class="symbol">gensym</a></span>)</span></span>)</span></span>)</span>
`<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren4">(<span class="nonparen"><span class="paren5">(<span class="nonparen">,vwho ,who</span>)</span></span>)</span>
<span class="paren4">(<span class="nonparen">ptrans <span class="keyword">:actor</span> ,vwho <span class="keyword">:object</span> ,what <span class="keyword">:from</span> ,from <span class="keyword">:to</span> ,vwho</span>)</span></span>)</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defmacro.html" class="symbol"><i><span class="symbol">defmacro</span></i></a> gives <span class="paren2">(<span class="nonparen">who what to-whom</span>)</span>
<span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">vwho <span class="paren5">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/fun_gensym.html" class="symbol">gensym</a></span>)</span></span>)</span></span>)</span>
`<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/speope_letcm_letst.html" class="symbol"><i><span class="symbol">let</span></i></a> <span class="paren4">(<span class="nonparen"><span class="paren5">(<span class="nonparen">,vwho ,who</span>)</span></span>)</span>
<span class="paren4">(<span class="nonparen">atrans <span class="keyword">:actor</span> ,vwho <span class="keyword">:object</span> ,what <span class="keyword">:from</span> ,vwho <span class="keyword">:to</span> ,to-whom</span>)</span></span>)</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_define-symbol-macro.html" class="symbol"><i><span class="symbol">define-symbol-macro</span></i></a> he <span class="paren2">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/stagenfun_make-instance.html" class="symbol">make-instance</a> 'role <span class="keyword">:cd-name</span> 'he</span>)</span></span>)</span>
<span class="comment">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> initialize-cd-system <span class="paren2">(<span class="nonparen"></span>)</span>
<span class="paren2">(<span class="nonparen"><i><span class="symbol">with-variables</span></i> <span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">money prop</span>)</span>
<span class="paren4">(<span class="nonparen">script script</span>)</span>
?shopper ?store ?item ?elsewhere</span>)</span>
<span class="paren3">(<span class="nonparen">store-script 'shopping script</span>)</span>
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren4">(<span class="nonparen">variables script</span>)</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">list</a> ?shopper ?store ?item ?elsewhere</span>)</span>
<span class="paren4">(<span class="nonparen">events script</span>)</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">list</a> <span class="paren5">(<span class="nonparen">goes-to ?shopper ?store</span>)</span>
<span class="paren5">(<span class="nonparen">takes ?shopper ?item</span>)</span>
<span class="paren5">(<span class="nonparen">gives ?store ?item ?shopper</span>)</span>
<span class="paren5">(<span class="nonparen">gives ?shopper money ?store</span>)</span>
<span class="paren5">(<span class="nonparen">goes-to ?shopper ?elsewhere <span class="keyword">:from</span> ?store</span>)</span></span>)</span></span>)</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defparametercm_defvar.html" class="symbol"><i><span class="symbol">defparameter</span></i></a> <span class="special">*kite-story*</span>
<span class="paren2">(<span class="nonparen"><i><span class="symbol">with-variables</span></i>
<span class="paren3">(<span class="nonparen"><span class="paren4">(<span class="nonparen">jack role</span>)</span>
<span class="paren4">(<span class="nonparen">woolworths store</span>)</span>
<span class="paren4">(<span class="nonparen">kite prop</span>)</span>
<span class="paren4">(<span class="nonparen">home setting</span>)</span>
<span class="paren4">(<span class="nonparen">story story</span>)</span></span>)</span>
<span class="paren3">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <span class="paren4">(<span class="nonparen">cds story</span>)</span> <span class="paren4">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_list.html" class="symbol">list</a> <span class="paren5">(<span class="nonparen">goes-to jack woolworths</span>)</span>
<span class="paren5">(<span class="nonparen">takes he kite</span>)</span>
<span class="paren5">(<span class="nonparen">goes-to he home</span>)</span></span>)</span></span>)</span>
story</span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/mac_defun.html" class="symbol"><i><span class="symbol">defun</span></i></a> demo <span class="paren2">(<span class="nonparen"></span>)</span>
<span class="paren2">(<span class="nonparen">clear <span class="paren3">(<span class="nonparen">get-script 'shopping</span>)</span></span>)</span>
<span class="paren2">(<span class="nonparen">process <span class="special">*kite-story*</span></span>)</span></span>)</span>
<span class="paren1">(<span class="nonparen">initialize-cd-system</span>)</span>
<span class="paren1">(<span class="nonparen"><a href="https://www.cliki.net/site/HyperSpec/Body/any_setf.html" class="symbol">setf</a> <a href="https://www.cliki.net/site/HyperSpec/Body/var_stprint-prettyst.html" class="symbol"><span class="special">*print-pretty*</span></a> <a href="https://www.cliki.net/site/HyperSpec/Body/any_nil.html" class="symbol">nil</a></span>)</span>
<span class="paren1">(<span class="nonparen">demo</span>)</span></span></div><p>Sample run:<p><pre>
C/USER[251]&gt; (load &quot;sam.lisp&quot;)
;; Loading file sam.lisp ...
Input is
ACTION PTRANS
ACTOR JACK
OBJECT JACK
TO WOOLWORTHS
newscript SHOPPING
matches
ACTION PTRANS
ACTOR SHOPPER JACK
OBJECT SHOPPER JACK
TO STORE WOOLWORTHS
Input is
ACTION PTRANS
ACTOR HE
OBJECT KITE
TO HE
matches
ACTION PTRANS
ACTOR SHOPPER JACK
OBJECT ITEM KITE
TO SHOPPER JACK
Input is
ACTION PTRANS
ACTOR HE
OBJECT HE
TO HOME
matches
ACTION PTRANS
ACTOR SHOPPER JACK
OBJECT SHOPPER JACK
FROM STORE WOOLWORTHS
TO ELSEWHERE HOME
Story done -- script is
ACTION PTRANS
ACTOR SHOPPER JACK
OBJECT SHOPPER JACK
TO STORE WOOLWORTHS
ACTION PTRANS
ACTOR SHOPPER JACK
OBJECT ITEM KITE
TO SHOPPER JACK
ACTION ATRANS
ACTOR STORE WOOLWORTHS
OBJECT ITEM KITE
FROM STORE WOOLWORTHS
TO SHOPPER JACK
ACTION ATRANS
ACTOR SHOPPER JACK
OBJECT MONEY
FROM SHOPPER JACK
TO STORE WOOLWORTHS
ACTION PTRANS
ACTOR SHOPPER JACK
OBJECT SHOPPER JACK
FROM STORE WOOLWORTHS
TO ELSEWHERE HOME
;; Loaded file sam.lisp
T
C/USER[252]&gt;
</pre><p><hr>
<a href="macro&#32;example.html" class="category">macro example</a></div></div>
<div id="footer" class="buttonbar"><ul><li><a href="CLPfAI.html">Current version</a></li>
<li><a href="https://www.cliki.net/site/history?article=CLPfAI">History</a></li>
<li><a href="https://www.cliki.net/site/backlinks?article=CLPfAI">Backlinks</a></li><li><a href="https://www.cliki.net/site/edit-article?title=CLPfAI&amp;from-revision=3799946548">Edit</a></li><li><a href="https://www.cliki.net/site/edit-article?create=t">Create</a></li></ul></div>
</div>
<div id="header-buttons" class="buttonbar">
<ul>
<li><a href="https://www.cliki.net/">Home</a></li>
<li><a href="https://www.cliki.net/site/recent-changes">Recent Changes</a></li>
<li><a href="CLiki.html">About</a></li>
<li><a href="Text&#32;Formatting.html">Text Formatting</a></li>
<li><a href="https://www.cliki.net/site/tools">Tools</a></li>
</ul>
<div id="search">
<form action="https://www.cliki.net/site/search">
<label for="search_query" class="hidden">Search CLiki</label>
<input type="text" name="query" id="search_query" value="" />
<input type="submit" value="search" />
</form>
</div>
</div>
<div id="pageheader">
<div id="header">
<span id="logo">CLiki</span>
<span id="slogan">the common lisp wiki</span>
<div id="login"><form method="post" action="https://www.cliki.net/site/login">
<label for="login_name" class="hidden">Account name</label>
<input type="text" name="name" id="login_name" class="login_input" />
<label for= "login_password" class="hidden">Password</label>
<input type="password" name="password" id="login_password" class="login_input" />
<input type="submit" name="login" value="login" id="login_submit" /><br />
<div id="register"><a href="https://www.cliki.net/site/register">register</a></div>
<input type="submit" name="reset-pw" value="reset password" id="reset_pw" />
</form>
</div>
</div>
</div>
</body></html>