\documentclass[final]{onlisp_j} %{{{3
% vi:set et lisp tw=0 ft=tex fdm=marker isk+=-,*,\::
% $Id: onlisp_j.tex,v 1.12 2004/11/26 16:51:02 nodakai Exp $
\usepackage{fancybox}
\usepackage{times}
\usepackage[scaled]{helvet}
\renewcommand{\ttdefault}{cmtt}

\usepackage[dvipdfm]{color}
\usepackage[dvipdfm,bookmarks=true,bookmarksnumbered=true,bookmarkstype=toc]{hyperref}
\AtBeginDvi{\special{pdf:tounicode EUC-UCS2}}

\makeatletter % why must these be here?  I don't know...
{\catcode`\ =\active%
\gdef\@vobeyspaces{\catcode`\ \active\let \@xobeysp}}
\begingroup \catcode `|=0 \catcode `[= 1
\catcode`]=2 \catcode `\{=12 \catcode `\}=12
\catcode`\\=12 |gdef|@xverbatim#1\end{verbatim}[#1|end[verbatim]|vspace[-7pt]]
|gdef|@sxverbatim#1\end{verbatim*}[#1|end[verbatim*]|vspace[-7pt]]
|endgroup
\def\@verbatim{\trivlist \item\vspace{-4pt}\relax
  \if@minipage\else\vskip\parskip\fi
  \leftskip\@totalleftmargin\rightskip\z@skip
  \parindent\z@\parfillskip\@flushglue\parskip\z@skip
  \par
  \@tempswafalse
  \def\par{\narrowbaselines%
    \if@tempswa
      \leavevmode \null \@@par\penalty\interlinepenalty
    \else
      \@tempswatrue
      \ifhmode\@@par\penalty\interlinepenalty\fi
    \fi}%
  \let\do\@makeother \dospecials
  \obeylines \verbatim@font \@noligs
  \hyphenchar\font\m@ne
  \everypar \expandafter{\the\everypar \unpenalty}%
\def\verbatim{\@verbatim \frenchspacing\@vobeyspaces \@xverbatim}
\def\endverbatim{\if@newlist \leavevmode\fi\endtrivlist}
\def\verbatim@font{\normalfont\ttfamily}
\@namedef{verbatim*}{\@verbatim\@sxverbatim}
\expandafter\let\csname endverbatim*\endcsname =\endverbatim
}

\def\BVerbatim{%
  \catcode`\^^M=13\narrowbaselines\relax
  \@ifnextchar[{\@BVerbatim}{\@BVerbatim[]}}
\makeatother
\newcommand{\CLtL}[1]{\textsf{CLtL#1}}

% }}}3
\begin{document}    %{{{1
\title{\Huge\textbf{On Lisp}}\author{\\[2em]\Large{Paul Graham}}\date{}\maketitle
~\vfil\vfil\centerline{\large To my family, and to Jackie.}
\vfil\vfil\centerline{\large $\lambda\ldots$}\vfil\vfil\vfil~\newpage
\setcounter{section}{-1}
%}}}

\section{Á°½ñ¤­}    %{{{
¤³¤ÎËÜ¤ÏLisp¥×¥í¥°¥é¥Þ¤È¤·¤ÆÀ®Ä¹¤·¤¿¤¤¤È»×¤Ã¤Æ¤¤¤ëÁ´¤Æ¤Î¿Í¤Ë¸þ¤±¤Æ½ñ¤«¤ì¤¿¡¥
ÆÉ¼Ô¤¬´û¤ËLisp¤Ë¿Æ¤·¤ó¤Ç¤¤¤ë¤³¤È¤òÁ°Äó¤È¤·¤¿¤¬¡¤
Ä¹¤¤¥×¥í¥°¥é¥ß¥ó¥°·Ð¸³¤¬É¬¤º¤·¤âÍ×¤ëÌõ¤Ç¤Ï¤Ê¤¤¡¥
»Ï¤á¤Î¿ô¾Ï¤Ï¤«¤Ê¤ê¤ÎÎÌ¤ÎÉü½¬¤ò´Þ¤ó¤Ç¤¤¤ë¡¥
¤³¤ì¤é¤Î¾Ï¤Ï¤­¤Ã¤È½ÏÎýLisp¥×¥í¥°¥é¥Þ¤Ë¤âÌÌÇò¤¯»×¤Ã¤Æ¤â¤é¤¨¤ë¤À¤í¤¦¡¥
¤½¤³¤Ç¤Ï¸«´·¤ì¤¿ÏÃÂê¤Ë¿·¤·¤¤¸÷¤òÅö¤Æ¤Æ¤ß¤¿¤«¤é¤À¡¥

¤¢¤ë¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Î¥¨¥Ã¥»¥ó¥¹¤ò°ìÊ¸¤ÇÅÁ¤¨¤ë¤Î¤ÏÆñ¤·¤¤¤¬¡¤
John Foderaro¤Î¸ÀÍÕ¤Ï¤«¤Ê¤ê¤½¤ì¤Ë¶á¤¤¡§
\begin{center}
Lisp¤Ï¥×¥í¥°¥é¥à²ÄÇ½¤Ê¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤¢¤ë\note{lispis}¡¥
\end{center}
Lisp¤Ï¤½¤ì¤À¤±¤Î¤â¤Î¤Ç¤Ï¤Ê¤¤¤¬¡¤Lisp¤ò¼«Ê¬¤Î°Õ¿Þ¤Ë½¾¤ï¤»¤ë¤³¤È¤Î¤Ç¤­¤ëÇ½ÎÏ¤Ï
Lisp¥¨¥­¥¹¥Ñ¡¼¥È¤È½é¿´¼Ô¤È¤Î°ã¤¤¤ÎÂçÉôÊ¬¤òÀê¤á¤ë¡¥
½ÏÎýLisp¥×¥í¥°¥é¥Þ¤Ï¡¤¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ë½¾¤Ã¤Æ¥×¥í¥°¥é¥à¤ò½ñ¤¯¤Î¤ÈÆ±¤¸¤è¤¦¤Ë
¼«Ê¬¤Î½ñ¤¯¥×¥í¥°¥é¥à¤Ë¸þ¤±¤Æ¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ò¹½ÃÛ¤·¤Æ¤¤¤¯¡¥
¤³¤ÎËÜ¤Ç¤Ï¡¤Lisp¤¬¸µ¡¹Å¬¤·¤Æ¤¤¤ë¥Ü¥È¥à¥¢¥Ã¥×¡¦¥¹¥¿¥¤¥ë¤Ç¤Î¥×¥í¥°¥é¥ß¥ó¥°ÊýË¡¤ò¶µ¤¨¤ë¡¥
\subsection{¥Ü¥È¥à¥¢¥Ã¥×¡¦¥Ç¥¶¥¤¥ó} %{{{
¥Ü¥È¥à¥¢¥Ã¥×¡¦¥Ç¥¶¥¤¥ó¤Ï¡¤
¥½¥Õ¥È¥¦¥§¥¢¤¬¤É¤ó¤É¤óÊ£»¨²½¤·¤Æ¤¤¤¯Ãæ¤Ç°ìÁØ½ÅÍ×¤Ë¤Ê¤Ã¤Æ¤­¤Æ¤¤¤ë¡¥
¸½Âå¤Î¥×¥í¥°¥é¥à¤Ï¡¤¤È¤Æ¤Ä¤â¤Ê¤¯Ê£»¨¤À¤Ã¤¿¤ê¡¤
¤È¤­¤Ë¤Ï²ò¼á¤¬Äê¤Þ¤é¤Ê¤¤¤è¤¦¤Ê»ÅÍÍ¤òËþ¤¿¤µ¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤½¤Î¤è¤¦¤Ê¾õ¶·¤Ç¤ÏÅÁÅýÅª¤Ê¥È¥Ã¥×¥À¥¦¥óÊý¼°¤¬ÇËÃ¾¤·¤Æ¤·¤Þ¤¦¤³¤È¤¬¤¢¤ë¡¥
¤½¤³¤Ç¡¤¸½ºß¤Î¤Û¤È¤ó¤É¤Î¥³¥ó¥Ô¥å¡¼¥¿²Ê³Ø¹ÖºÂ¤Ç¶µ¤¨¤é¤ì¤Æ¤¤¤ë¤Î¤È¤Ï
ÂçÊÑ°Û¤Ê¤Ã¤¿¥×¥í¥°¥é¥ß¥ó¥°¼êË¡¤¬È¯Ã£¤·¤¿¡§
¥Ü¥È¥à¥¢¥Ã¥×¡¦¥¹¥¿¥¤¥ë¤À¡¥
¤½¤³¤Ç¤Ï¥×¥í¥°¥é¥à¤Ï°ìÏ¢¤ÎÁØ¤È¤·¤Æµ­½Ò¤µ¤ì¡¤
¤½¤ì¤¾¤ì¤ÎÁØ¤¬¤½¤Î1ÃÊ¾å¤ËÂÐ¤·¤Æ°ì¼ï¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¤·¤Æµ¡Ç½¤¹¤ë¡¥
¤½¤¦¤·¤Æ½ñ¤«¤ì¤¿¥×¥í¥°¥é¥à¤ÎÎã¤ÏX~Windows¤È\TeX ¤À¡¥

¤³¤ÎËÜ¤Î¥Æ¡¼¥Þ¤ÏÆó¤Ä¤¢¤ë¡¥
Lisp¤¬¥Ü¥È¥à¥¢¥Ã¥×¡¦¥¹¥¿¥¤¥ë¤Ç½ñ¤«¤ì¤ë¥×¥í¥°¥é¥à¤ËÂÐ¤·¤Æ
¼«Á³¤Ê¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤¢¤ë¤È¤¤¤¦¤³¤È¤È¡¤
¥Ü¥È¥à¥¢¥Ã¥×¡¦¥¹¥¿¥¤¥ë¤¬Lisp¥×¥í¥°¥é¥à¤ò½ñ¤¯¤Î¤Ë¼«Á³¤ÊÊýË¡¤Ç¤¢¤ë¤È¤¤¤¦¤³¤È¤À¡¥
¤À¤«¤é\emph{On Lisp}¤Ï2¼ïÎà¤ÎÆÉ¼Ô¤Ë¤È¤Ã¤Æ¶½Ì£¿¼¤¤¤â¤Î¤Ë¤Ê¤ë¤À¤í¤¦¡¥
³ÈÄ¥²ÄÇ½¤Ê¥×¥í¥°¥é¥à¤ò½ñ¤¯¤³¤È¤Ë¶½Ì£¤Î¤¢¤ë¿Í¤Ë¤Ï¡¤
¤³¤ÎËÜ¤ÏÅ¬ÀÚ¤Ê¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤¬¤¢¤ì¤Ð²¿¤¬¤Ç¤­¤ë¤Î¤«¤ò¼¨¤¹¡¥
Lisp¥×¥í¥°¥é¥Þ¤Ë¤Ï¡¤¤³¤ÎËÜ¤ÏLisp¤òºÇÂç¸Â¤Ë³èÍÑ¤¹¤ë¤¿¤á¤Î¼ÂÍÑÅª¤ÊÀâÌÀ¤òÄó¶¡¤¹¤ë¡¥

¤³¤ÎËÜ¤Î¥¿¥¤¥È¥ë¤ÏLisp¤Ç¤Î¥Ü¥È¥à¥¢¥Ã¥×¡¦¥×¥í¥°¥é¥ß¥ó¥°¤Î½ÅÍ×À­¤ò
¶¯Ä´¤¹¤ë¤Ä¤â¤ê¤ÇÉÕ¤±¤é¤ì¤¿¡¥
¥×¥í¥°¥é¥à¤ò¤¿¤ÀLisp¤Ç½ñ¤¯¤À¤±¤Ç¤Ê¤¯¡¤
ÆÈ¼«¤Î¸À¸ì¤ò\emph{Lisp¤ò´ð¤Ë(on Lisp)}½ñ¤¯¤³¤È¤¬²ÄÇ½¤Ç¤¢¤ê¡¤
¥×¥í¥°¥é¥à¤Ï¤½¤Î¸À¸ì¤Ç½ñ¤¯¤³¤È¤¬¤Ç¤­¤ë¡¥

¤É¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤â¥Ü¥È¥à¥¢¥Ã¥×¤Ç¥×¥í¥°¥é¥à¤ò½ñ¤¯¤³¤È¤Ï¤Ç¤­¤ë¤¬¡¤
¤³¤Î¥¹¥¿¥¤¥ë¤Î¥×¥í¥°¥é¥ß¥ó¥°¤Ë¤ÏLisp¤ÏºÇ¤â¼«Á³¤Ê´ï¤À¡¥
Lisp¤Ç¤Ï¡¤¥Ü¥È¥à¥¢¥Ã¥×¡¦¥Ç¥¶¥¤¥ó¤Ï°Û¾ï¤ËÂçµ¬ÌÏ¤À¤Ã¤¿¤êÊ£»¨¤Ê¥×¥í¥°¥é¥àÀìÍÑ¤Î¡¤
ÆÃÊÌ¤Ê¥Æ¥¯¥Ë¥Ã¥¯¤Ç¤Ï¤Ê¤¤¡¥
¤·¤Ã¤«¤ê¤·¤¿¥×¥í¥°¥é¥à¤Ï¤ß¤Ê¡¤ÉôÊ¬Åª¤Ë¤Ï¤³¤Î¥¹¥¿¥¤¥ë¤Ç½ñ¤«¤ì¤ë¤³¤È¤Ë¤Ê¤ë¤À¤í¤¦¡¥
Lisp¤Ï³«È¯Åö½é¤«¤é³ÈÄ¥²ÄÇ½¤Ê¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¤Ê¤ë¤è¤¦Àß·×¤µ¤ì¤Æ¤¤¤¿¡¥
¸À¸ì¤½¤Î¤â¤Î¤ÎÂçÈ¾¤¬Lisp¤Î´Ø¿ô¤Î½¸¹çÂÎ¤Ç¤¢¤ê¡¤
¤½¤ì¤é¤Ï¥æ¡¼¥¶¼«¿È¤ÎÄêµÁ¤Ë¤è¤ë¤â¤Î¤È²¿¤â°ã¤ï¤Ê¤¤¡¥
¤½¤ì¤É¤³¤í¤«Lisp¤Î´Ø¿ô¤Ï¥ê¥¹¥È¤È¤·¤ÆÉ½¸½¤Ç¤­¤ë¤¬¡¤¥ê¥¹¥È¤ÏLisp¤Î¥Ç¡¼¥¿¹½Â¤¤Ê¤Î¤À¡¥
¤³¤Î¤³¤È¤Ï¡¤¥æ¡¼¥¶¤¬Lisp¥³¡¼¥É¤òÀ¸À®¤¹¤ëLisp´Ø¿ô¤ò½ñ¤±¤ë¤È¤¤¤¦¤³¤È¤À¡¥

¤¤¤¤Lisp¥×¥í¥°¥é¥Þ¤Ï¤³¤Î²ÄÇ½À­¤òÍøÍÑ¤¹¤ëÊýË¡¤òÃÎ¤é¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤½¤Î¤¿¤á¤ÎÊýË¡¤ÏÉáÄÌ¡¤\emph{¥Þ¥¯¥í}¤È¸Æ¤Ð¤ì¤ë°ì¼ï¤Î¥ª¥Ú¥ì¡¼¥¿¤òÄêµÁ¤·¤Æ¤ß¤ë¤³¤È¤À¡¥
¥Þ¥¯¥í¤ÎÍý²ò¤Ï¡¤Àµ¤·¤¤Lisp¥×¥í¥°¥é¥à¤ò½ñ¤¯¤³¤È¤«¤é
Èþ¤·¤¤Lisp¥×¥í¥°¥é¥à¤ò½ñ¤¯¤³¤È¤Ø°Ü¹Ô¤¹¤ëºÝ¤ÎºÇ¤â½ÅÍ×¤Ê¥¹¥Æ¥Ã¥×¤Î°ì¤Ä¤À¡¥
ÆþÌçÅª¤ÊLispËÜ¤ËºÜ¤Ã¤Æ¤¤¤ë¤Î¤Ï¥Þ¥¯¥í¤ÎÂç»¨ÇÄ¤Ê³°´ÑÄøÅÙ¡§
¥Þ¥¯¥í¤È¤Ï²¿¤«¤ÎÀâÌÀ¤È¡¤
¥æ¡¼¥¶¤¬¥Þ¥¯¥í¤ò»È¤¨¤Ð²ÄÇ½¤Ë¤Ê¤ë´ñÌ¯¤ÇÁÇÀ²¤é¤·¤¤¤³¤È¤Î¥Ò¥ó¥È¤È¤Ê¤ë´ö¤Ä¤«¤ÎÎã¤À¡¥
¤³¤³¤Ç¤Ï¤½¤¦¤¤¤Ã¤¿´ñÌ¯¤ÇÁÇÀ²¤é¤·¤¤»öÊÁ¤ËÆÃ¤ËÃí°Õ¤·¤Æ¤ß¤ë¡¥
¤³¤ÎËÜ¤ÎÁÀ¤¤¤Î°ì¤Ä¤Ï¡¤¤½¤¦¤¤¤Ã¤¿¥æ¡¼¥¶Ã£¤¬¥Þ¥¯¥í¤Ë´Ø¤¹¤ë·Ð¸³¤«¤é
º£¤Ë»ê¤ë¤Þ¤Ç¤Ë³Ø¤Ð¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤«¤Ã¤¿¤³¤È¤ò°ì²Õ½ê¤Ë¤Þ¤È¤á¤ë¤³¤È¤À¡¥

ÌµÍý¤â¤Ê¤¤¤³¤È¤À¤¬¡¤ÆþÌçÅª¤ÊLispËÜ¤ÏLisp¤ÈÂ¾¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¤Î°ã¤¤¤ò¶¯Ä´¤·¤Ê¤¤¡¥
¤½¤¦¤¤¤Ã¤¿ËÜ¤Ï¡ÊÂçÄñ¡ËPascalÍÑ¸ì¤Ç¥×¥í¥°¥é¥à¤ò¹Í¤¨¤ë¤è¤¦¶µ°é¤µ¤ì¤Æ¤­¤¿À¸ÅÌÃ£¤Ë
¥á¥Ã¥»¡¼¥¸¤òÅÁ¤¨¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¡ÖLisp¤Îdefun¤ÏPascal¤Î¼êÂ³¤­ÄêµÁ¤Ë»÷¤Æ¤¤¤ë¤¬¡¤
¼ÂºÝ¤Ï´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤ë¥³¡¼¥É¤òÀ¸À®¤¹¤ë¥×¥í¥°¥é¥à¤ò½ñ¤¯¥×¥í¥°¥é¥à¤Ç¤¢¤ê¡¤
Âè1¤Î°ú¿ô¤È¤·¤ÆÍ¿¤¨¤é¤ì¤¿¥·¥ó¥Ü¥ë¤òÌ¾»¥¤Ë»È¤¦¤Î¤À¡¥¡×
¤ÈÀâÌÀ¤·¤Æ¤â¡¤º®Íð¤ò¾·¤¯¤Ð¤«¤ê¤À¤í¤¦¡¥

¤³¤ÎËÜ¤ÎÌÜÅª¤Î°ì¤Ä¤Ï¡¤Lisp¤ÈÂ¾¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¤Î°ã¤¤¤Ï²¿¤«¤òÀâÌÀ¤¹¤ë¤³¤È¤À¡¥
»ä¤ÏÅö½é¤«¤é¡¤Â¾¤ÎÅÀ¤¬¤ß¤ÊÆ±¤¸¤À¤Ã¤¿¤éC¤äPascal¤äFortran¤Ç¤Ï¤Ê¤¯
Lisp¤Ç¥×¥í¥°¥é¥à¤ò½ñ¤¤¤¿Êý¤¬¤º¤Ã¤È¤¤¤¤¤È¤¤¤¦¤³¤È¤ÏÊ¬¤«¤Ã¤Æ¤¤¤¿¡¥
¤³¤ì¤ÏÃ±¤Ê¤ë¹¥¤ß¤ÎÌäÂê¤Ç¤Ï¤Ê¤¤¤³¤È¤âÊ¬¤«¤Ã¤Æ¤¤¤¿¡¥
¤·¤«¤·¼ÂºÝ¤ËLisp¤¬²¿¤é¤«¤ÎÅÀ¤Ç¤è¤ê¤¤¤¤¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤À¤È¼çÄ¥¤¹¤ë¤Ê¤é¡¤
¤½¤ì¤¬¤Ê¤¼¤«¤òÀâÌÀ¤Ç¤­¤ë¤è¤¦¤Ë¤·¤¿Êý¤¬¤¤¤¤¤³¤È¤Ëµ¤¤¬ÉÕ¤¤¤¿¤Î¤À¡¥

Ã¯¤«¤¬Louis Armstrong¤Ë¥¸¥ã¥º¤È¤Ï²¿¤«¤È¿Ò¤Í¤¿¤È¤­¡¤Èà¤Ï¤³¤¦Åú¤¨¤¿¡¥
¡Ö¥¸¥ã¥º¤È¤Ï²¿¤«¤¬¿Í¤ËÊ¹¤«¤Ê¤¤¤ÈÊ¬¤«¤é¤Ê¤¤¤ó¤À¤Ã¤¿¤é¡¤
Ê¬¤«¤ë¤è¤¦¤Ë¤Ï¤Ê¤é¤Ê¤¤¤À¤í¤¦¤Í¡¥¡×
¤·¤«¤·Èà¤Ï¤¢¤ëÊýË¡¤Ç³Î¤«¤Ë¤½¤Î¼ÁÌä¤ËÅú¤¨¤¿¡§
Èà¤Ï¿Í¡¹¤Ë¥¸¥ã¥º¤È¤Ï²¿¤«¤ò\emph{¼¨¤·¤¿}¤Î¤À¤Ã¤¿¡¥
¤½¤ì¤¬Lisp¤ÎÎÏ¤òÀâÌÀ¤¹¤ëÍ£°ì¤ÎÊýË¡¤À\wadash
Â¾¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ïº¤Æñ¤À¤Ã¤¿¤ê¡¤ÉÔ²ÄÇ½¤Êµ»¤ò¤ä¤Ã¤Æ¤ß¤»¤ë¤³¤È¤À¡¥
¥×¥í¥°¥é¥ß¥ó¥°¤Ë´Ø¤¹¤ëËÜ¤ÎÂçÈ¾¤¬\wadash Lisp¥×¥í¥°¥é¥ß¥ó¥°¤ÎËÜ¤µ¤¨\wadash
¤É¤ó¤Ê¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤â½ñ¤±¤ë¤è¤¦¤ÊÂêºà¤ò°·¤Ã¤Æ¤¤¤ë¡¥
\emph{On Lisp}¤Ï¡¤Lisp¤Ç¤Î¤ß½ñ¤±¤ë¤è¤¦¤ÊÎà¤Î¥×¥í¥°¥é¥à¤ò¼ç¤Ë°·¤¦¡¥
³ÈÄ¥À­¡¤¥Ü¥È¥à¥¢¥Ã¥×¡¦¥×¥í¥°¥é¥ß¥ó¥°¡¤¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¤Ê³«È¯¡¤
¥½¡¼¥¹¥³¡¼¥É¤ÎÊÑ´¹¡¤Ëä¤á¹þ¤ß¸À¸ì\wadash Lisp¤ÎÄ¹½ê¤¬¸½¤ì¤ë¤Î¤Ï¤½¤¦¤¤¤Ã¤¿½ê¤À¡¥

¤â¤Á¤í¤ó¸¶Â§Åª¤Ë¤Ï¡¤Turingµ¡³£¤ÈÅù²Á¤Ê¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ï¤ß¤Ê
Â¾¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ÈÆ±¤¸ºî¶È¤¬²ÄÇ½¤À¡¥
¤·¤«¤·¤½¤¦¤¤¤Ã¤¿Ç½ÎÏ¤Ï¡¤¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤¬ÌÜÅª¤È¤¹¤ë¤â¤Î¤Ç¤Ï¤Ê¤¤¡¥
¸¶Â§Åª¤Ë¤Ï¡¤¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ç¤­¤ë¤³¤È¤Ï¤ß¤ÊTuringµ¡³£¤Ç¤â¤Ç¤­¤ë¡¥
¤·¤«¤·¼ÂºÝ¤Ë¤Ï¡¤Turingµ¡³£¤Î¥×¥í¥°¥é¥ß¥ó¥°¤Ï¼ê´Ö¤ò¤«¤±¤ë¤ËÃÍ¤¹¤ë¤³¤È¤Ç¤Ï¤Ê¤¤¡¥

¤À¤«¤é»ä¤¬¡Ö¤³¤ì¤ÏÂ¾¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤ÏÉÔ²ÄÇ½¤Ê¤³¤È¤Î¤ä¤êÊý¤Ë
¤Ä¤¤¤Æ¤ÎËÜ¤À¡×¤È¸À¤¦¤È¤­¡¤¿ô³ØÅª¤Ê°ÕÌ£¤Ç¡ÖÉÔ²ÄÇ½¡×¤À¤È¸À¤¦¤Î¤Ç¤Ï¤Ê¤¯¡¤
¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ë´Ø¤ï¤ë°ÕÌ£¤Ç¤½¤¦¸À¤Ã¤Æ¤¤¤ë¤Î¤À¡¥
¤Ä¤Þ¤ê¡¤¤³¤ÎËÜ¤ÎÃæ¤Î¥×¥í¥°¥é¥à¤Î´ö¤Ä¤«¤òC¤Ç½ñ¤«¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤Ê¤é¡¤
»Ï¤á¤ËC¤ÇLisp¥³¥ó¥Ñ¥¤¥é¤ò½ñ¤¯¤³¤È¤ÇÌÜÅª¤òÃ£¤·¤Æ¤âÆ±¤¸¤Ê¤Î¤À¤«¤é¡¥
Îã¤¨¤ÐC¤ÇProlog¤òËä¤á¹þ¤ß¸À¸ì¤Ë¤·¤Æ¤ß¤ë\wadash
¤½¤ì¤Ë¤«¤«¤ë¼ê´Ö¤ÏÁÛÁü¤¬¤Ä¤¯¤À¤í¤¦¤«¡©
Âè24¾Ï¤Ç¤Ï¡¤180¹Ô¤ÎLisp¥³¡¼¥É¤ò»È¤Ã¤Æ¤½¤ÎÊýË¡¤ò¼¨¤¹¡¥

¤·¤«¤·¡¤¤¿¤ÀLisp¤ÎÇ½ÎÏ¤Î¥Ç¥â¥ó¥¹¥È¥ì¡¼¥·¥ç¥ó¤ò¤¹¤ë°Ê³°¤Ë¤â¤Ã¤È¤ä¤ê¤¿¤¤¤³¤È¤¬¤¢¤ë¡¥
\emph{¤Ê¤¼} Lisp¤ÏÂ¾¤È°ã¤Ã¤Æ¤¤¤ë¤Î¤«¤âÀâÌÀ¤·¤¿¤¤¡¥
¤³¤ì¤Ï¼Â¤ÏÈùÌ¯¤ÊÌä¤¤¤À\wadash
Èó¾ï¤ËÈùÌ¯¤ÊÌä¤¤¤Ê¤Î¤Ç¡Öµ­¹æ±é»»(Symbolic computation)¡×
¤Ê¤É¤È¤¤¤¦¸ÀÍÕ¤òÅú¤¨¤Ë¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡¥
»ä¤¬¤³¤ì¤Þ¤Ç¤Ë³Ø¤ó¤À¤³¤È¤Ï¤Ç¤­¤ë¸Â¤êÌÀ²÷¤ËÀâÌÀ¤¹¤ë¤è¤¦»î¤ß¤¿¡¥
%}}}
\subsection{¤³¤ÎËÜ¤ÎÊý¿Ë}   %{{{
´Ø¿ô¤ÏLisp¥×¥í¥°¥é¥à¤Î´ðÁÃ¤Ê¤Î¤Ç¡¤¤³¤ÎËÜ¤ÎºÇ½é¤Î´ö¤Ä¤«¤Î¾Ï¤Ç¤Ï´Ø¿ô¤ò°·¤¦¡¥
Âè2¾Ï¤Ç¤Ï¡¤Lisp¤Î´Ø¿ô¤È¤Ï²¿¤«¤È¤¤¤¦¤³¤È¤È¡¤´Ø¿ô¤Î¤â¤¿¤é¤¹²ÄÇ½À­¤òÀâÌÀ¤¹¤ë¡¥
Âè3¾Ï¤Ç¤Ï¡¤Lisp¥×¥í¥°¥é¥à¤Ç¤Î¼çÍ×¤Ê¥×¥í¥°¥é¥ß¥ó¥°¡¦¥¹¥¿¥¤¥ë¤Ç¤¢¤ë
´Ø¿ô¥×¥í¥°¥é¥ß¥ó¥°¤ÎÄ¹½ê¤Ë¤Ä¤¤¤ÆµÄÏÀ¤¹¤ë¡¥
Âè4¾Ï¤Ç¤Ï¡¤Lisp¤Î³ÈÄ¥¤Î¤¿¤á¤Î´Ø¿ô¤Î»È¤¤Êý¤ò¼¨¤¹¡¥
¤½¤·¤ÆÂè5¾Ï¤Ç¤Ï¡¤ÊÌ¤Î´Ø¿ô¤òÊÖ¤¹´Ø¿ô¤ò»È¤Ã¤ÆÄêµÁ¤Ç¤­¤ë¡¤¿·¤¿¤Ê¼ïÎà¤ÎÃê¾Ý²½¤ò¼¨º¶¤¹¤ë¡¥
ºÇ¸å¤ËÂè6¾Ï¤Ç¤Ï¡¤ÅÁÅýÅª¤Ê¥Ç¡¼¥¿¹½Â¤¤ÎÂå¤ï¤ê¤Ë´Ø¿ô¤ò»È¤¦ÊýË¡¤ò¼¨¤¹¡¥

¤³¤ÎËÜ¤Î»Ä¤ê¤Î¾Ï¤Ç¤Ï¡¤´Ø¿ô¤è¤ê¤â¥Þ¥¯¥í¤ÎÊý¤òÂ¿¤¯°·¤¦¡¥
¥Þ¥¯¥í¤Ë¤Ï¤è¤êÂ¿¤¯¤ÎÃí°Õ¤òÊ§¤Ã¤¿¡¥
°ì¤Ä¤Ë¤Ï¥Þ¥¯¥í¤Ë¤Ï¤â¤Ã¤È¸ì¤ë¤Ù¤­¤³¤È¤¬¤¢¤ë¤«¤é¤Ç¡¤
¤Þ¤¿½ñÀÒ¤Ç¤Ïº£¤Þ¤Ç½½Ê¬¤ËÀâÌÀ¤µ¤ì¤Æ¤¤¤Ê¤«¤Ã¤¿¤«¤é¤Ç¤â¤¢¤ë¡¥
Âè7--10¾Ï¤Ç¤Ï¡¤¥Þ¥¯¥í¤Ë´Ø¤¹¤ë¥Æ¥¯¥Ë¥Ã¥¯¤Ë¤Ä¤¤¤Æ¤Î´°Á´¤Ê¼ê°ú¤­¤òÍ¿¤¨¤ë¡¥
¤½¤³¤Þ¤Ç¤Ç¡¤½ÏÎýLisp¥×¥í¥°¥é¥Þ¤¬¥Þ¥¯¥í¤Ë¤Ä¤¤¤ÆÃÎ¤Ã¤Æ¤¤¤ë¤³¤È\wadash
ºîÍÑ¤Î»ÅÁÈ¤ß¡¤ÄêµÁÊýË¡¡¤¥Æ¥¹¥È¡¤¥Ç¥Ð¥Ã¥°¡¤»È¤¦¤Ù¤­¤È¤­¤È¤½¤¦¤Ç¤Ê¤¤¤È¤­¤Î¶èÊÌ¡¤
¥Þ¥¯¥í¤Î¼çÍ×¤Ê¼ïÎà¡¤¥Þ¥¯¥íÅ¸³«¤òÀ¸À®¤¹¤ë¥×¥í¥°¥é¥à¤Î½ñ¤­Êý¡¤
¥Þ¥¯¥í¤Î¥¹¥¿¥¤¥ë¤ÈLisp¤Î¥¹¥¿¥¤¥ë¤È¤Î°ìÈÌÅª¤Ê°ã¤¤¡¤
¥Þ¥¯¥í¤Ë±Æ¶Á¤¹¤ë¤½¤ì¤¾¤ì¤ÎÆÈÆÃ¤ÊÌäÂê¤òÈ¯¸«¤·¡¤½¤Àµ¤¹¤ëÊýË¡\wadash
¤ÏÁ´¤ÆÍý²ò¤Ç¤­¤ë¤À¤í¤¦¡¥

¤³¤Î¼ê°ú¤­¤ËÂ³¤­¡¤Âè11--18¾Ï¤Ç¤Ï¥Þ¥¯¥í¤Ë¤è¤Ã¤Æ²ÄÇ½¤Ë¤Ê¤ë¶¯ÎÏ¤ÊÃê¾Ý²½¤ò´ö¤Ä¤«¼¨¤¹¡¥
Âè11¾Ï¤Ç¤Ï¡¤¥³¥ó¥Æ¥­¥¹¥È¤ò·ÁÀ®¤·¤¿¤ê¡¤
·«¤êÊÖ¤·¤ä¾ò·ïÊ¬´ô¤ò¼Â¸½¤¹¤ë¸ÅÅµÅª¤Ê¥Þ¥¯¥í¤Î½ñ¤­Êý¤ò¼¨¤¹¡¥
Âè12¾Ï¤Ç¤Ï¡¤°ìÈÌ²½¤µ¤ì¤¿ÊÑ¿ô¤Ø¤ÎºîÍÑ¤Ë¤ª¤±¤ë¥Þ¥¯¥í¤ÎÌò³ä¤òÀâÌÀ¤¹¤ë¡¥
Âè13¾Ï¤Ç¤Ï¡¤¥Þ¥¯¥í¤ò»È¤¤¡¤¹Ô¤¦¤Ù¤­·×»»¤ò¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¤ä¤Ã¤Æ¤·¤Þ¤¦¤³¤È¤Ç
¥×¥í¥°¥é¥à¤òÂ®¤¯Áö¤é¤»¤ëÊýË¡¤ò¼¨¤¹¡¥
Âè14¾Ï¤Ç¤Ï¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¡Êanaphoric¡Ë¥Þ¥¯¥í¤òÆ³Æþ¤¹¤ë¡¥
¤³¤ì¤Ï¥×¥í¥°¥é¥àÆâ¤ÇÂåÌ¾»ì¤ò»È¤¦¤³¤È¤ò²ÄÇ½¤Ë¤¹¤ë¡¥
Âè15¾Ï¤Ç¤Ï¡¤¥Þ¥¯¥í¤ò»È¤Ã¤ÆÂè5¾Ï¤ÇÄêµÁ¤µ¤ì¤¿´Ø¿ô¥Ó¥ë¥À¤Ë
ÊØÍø¤Ê¥¤¥ó¥¿¥Õ¥§¥¤¥¹¤òÄó¶¡¤¹¤ëÊýË¡¤ò¼¨¤¹¡¥
Âè16¾Ï¤Ç¤Ï¡¤Lisp¤Ë¥æ¡¼¥¶¤Î¥×¥í¥°¥é¥à¤ò¥æ¡¼¥¶¤Î¤¿¤á¤Ë½ñ¤«¤»¤ë¤¿¤á¤Ë»È¤ï¤ì¤ë¡¤
¥Þ¥¯¥í¤òÄêµÁ¤¹¤ë¥Þ¥¯¥í¤Î»È¤¤Êý¤ò¼¨¤¹¡¥
Âè17¾Ï¤Ç¤Ï¥ê¡¼¥É¥Þ¥¯¥í¡Êread macro¡Ë¤Ë¤Ä¤¤¤Æ¡¤
Âè18¾Ï¤Ç¤Ï¹½Â¤²½ÂåÆþ¡Êdestructuring¡Ë¤Î¤¿¤á¤Î¥Þ¥¯¥í¤Ë¤Ä¤¤¤ÆµÄÏÀ¤¹¤ë¡¥

Âè19¾Ï¤«¤é¤Ï¤³¤ÎËÜ¤ÎÂè4Éô\wadash Ëä¤á¹þ¤ß¸À¸ì¤Î¤¿¤á¤Ë³ä¤«¤ì¤¿ÉôÊ¬¤¬»Ï¤Þ¤ë¡¥
Âè19¾Ï¤Ç¤Ï¡¤2¼ïÎà¤ÎÆ±¤¸Æ¯¤­¤Î¥×¥í¥°¥é¥à¤ò¼¨¤¹¤³¤È¤Ç¤½¤ÎÏÃÂê¤òÆ³Æþ¤¹¤ë¡¥
¤½¤ì¤Ï¥Ç¡¼¥¿¥Ù¡¼¥¹¤ËÂÐ¤¹¤ëÌä¤¤¹ç¤ï¤»¡Ê¥¯¥¨¥ê¡Ë¤ËÅú¤¨¤ë¤â¤Î¤À¤¬¡¤
ºÇ½é¤Ï¥¤¥ó¥¿¥×¥ê¥¿¤Ë¤è¤Ã¤Æ¼ÂÁõ¤µ¤ì¤¿¤â¤Î¤ò¡¤
¤½¤·¤Æ¼¡¤Ë¤ÏËÜÊª¤ÎËä¤á¹þ¤ß¸À¸ì¤È¤·¤Æ¼ÂÁõ¤µ¤ì¤¿¤â¤Î¤ò¼¨¤¹¡¥
Âè20¾Ï¤Ç¤Ï¡¤Common Lisp¥×¥í¥°¥é¥à¤Ë¡¤
·×»»¤Î»Ä¤ê¤òÉ½¤¹¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë·ÑÂ³¡Êcontinuation¡Ë¤Î³µÇ°¤òÆ³Æþ¤¹¤ëÊýË¡¤ò¼¨¤¹¡¥
·ÑÂ³¤ÏÈó¾ï¤Ë¶¯ÎÏ¤Ê¥Ä¡¼¥ë¤Ç¡¤Ê£¿ô¥×¥í¥»¥¹¤ÈÈó·èÄêÅªÁªÂò¤ÎÎ¾Êý¤Î¼ÂÁõ¤Ë»È¤¨¤ë¡¥
¤³¤ì¤é¤ÎÀ©¸æ¹½Â¤¤òLisp¤ËËä¤á¹þ¤àÊýË¡¤Ï¡¤¤½¤ì¤¾¤ìÂè21,~22¾Ï¤ÇµÄÏÀ¤¹¤ë¡¥
Èó·èÄêÀ­¤ò»È¤¨¤ÐÍ½ÃÎÇ½ÎÏ¤ò»ý¤Ã¤Æ¤¤¤ë¤«¤Î¤è¤¦¤Ê¥×¥í¥°¥é¥à¤¬½ñ¤±¤ë¤è¤¦¤Ë¤Ê¤ë¤¬¡¤
¤³¤ì¤ÏÉÔ»×µÄ¤ÊÇ½ÎÏ¤Î³µÎ¬¤Î¤è¤¦¤Ë»×¤¨¤Æ¤¤¤ë¤³¤È¤À¤í¤¦¡¥
Âè23,~24¾Ï¤Ç¤Ï¡¤
Èó·èÄêÀ­¤¬¤½¤Î¿¨¤ì¹þ¤ß¤Ë°ã¤ï¤Ê¤¤¤³¤È¤ò¼¨¤¹Ëä¤á¹þ¤ß¸À¸ì¤ò2¸Ä¼è¤ê¾å¤²¤ë¡§
´°Á´¤ÊATN¥Ñ¡¼¥µ¤ÈËä¤á¹þ¤ßProlog¤À¤¬¡¤¥³¡¼¥É¤ÏÁ´Éô¤Ç200¹ÔÍ¾¤ê\note{200lines}¤Ë¤Ê¤ë¡¥

¤³¤ì¤é¤Î¥×¥í¥°¥é¥à¤¬Ã»¤¤¤È¤¤¤¦»ö¼Â¤Ï¡¤¤½¤ì¼«¿È¤ÎÃæ¿È¤Ï²¿¤â¤Ê¤¤¤È¤¤¤¦¤³¤È¤òÉ½¤·¤Æ¤¤¤ë¡¥
ÉÔ²Ä²ò¤Ê¥³¡¼¥É¤ò½ñ¤¯¤³¤È¤ËÍê¤Ã¤¿¤Ê¤é¡¤200¹Ô¤Ç²ÄÇ½¤Ê¤³¤È¤Ë¤Ä¤¤¤Æ¤Ï²¿¤âÊ¬¤«¤é¤Ê¤¤¡¥
¤³¤ì¤é¤Î¥³¡¼¥É¤¬Ã»¤¯ºÑ¤à¤Î¤Ï¡¤¥×¥í¥°¥é¥ß¥ó¥°¾å¤Î¥È¥ê¥Ã¥¯¤ËÍê¤Ã¤¿¤«¤é¤Ç¤Ï¤Ê¤¯¡¤
Lisp¤¬ËÜÍè°Õ¿Þ¤·¤Æ¤¤¤¿»È¤¤Êý¤Ë½¾¤Ã¤Æ½ñ¤«¤ì¤Æ¤¤¤ë¤«¤é¤Ê¤Î¤À¡¥
¤½¤ì¤³¤½¤¬½ÅÍ×¤ÊÅÀ¤À¡¥
Âè23,~24¾Ï¤ÎÃæ³Ë¤Ï¡¤ATN¥Ñ¡¼¥µ¤ò1¥Ú¡¼¥¸Ê¬¤Î¥³¡¼¥É¤Ç¼ÂÁõ¤·¤¿¤ê¡¤
Prolog¤ò2¥Ú¡¼¥¸Ê¬¤Î¥³¡¼¥É¤Ç¼ÂÁõ¤¹¤ëÊýË¡¤Ç¤Ï¤Ê¤¤¡¥
ºÇ¤â¼«Á³¤ÊLisp¤Ë¤è¤ë¼ÂÁõ¤Ë¤è¤ì¤Ð¡¤¤½¤ì¤é¤Î¥×¥í¥°¥é¥à¤ÏÃ±¤Ë¤½¤ÎÃ»¤µ¤ÇºÑ¤à¤È¤¤¤¦»ö¼Â¤À¡¥
¤½¤Î¸å¤Î¾Ï¤Ç»È¤ï¤ì¤ëËä¤á¹þ¤ß¸À¸ì¤Ï¡¤ºÇ½é¤Î¥Ý¥¤¥ó¥ÈÆó¤Ä\wadash
Lisp¤Ï¥Ü¥È¥à¥¢¥Ã¥×¡¦¥Ç¥¶¥¤¥ó¤Î¤¿¤á¤Î¼«Á³¤Ê¸À¸ì¤Ç¤¢¤ë¤³¤È¤È¡¤
¥Ü¥È¥à¥¢¥Ã¥×¡¦¥Ç¥¶¥¤¥ó¤ÏLisp¤Î¼«Á³¤Ê»ÈÍÑÊýË¡¤Ç¤¢¤ë¤³¤È\wadash
¤ÎÎã¤Ë´ð¤Å¤¯¾ÚÌÀ¤òÍ¿¤¨¤ë¡¥

¤³¤ÎËÜ¤Î¤Þ¤È¤á¤Ï¡¤¥ª¥Ö¥¸¥§¥¯¥È»Ø¸þ¥×¥í¥°¥é¥ß¥ó¥°¤ÎµÄÏÀ¤È¡¤
ÆÃ¤ËCLOS (the Common Lisp Object System)¤À¡¥
¤³¤ÎÏÃÂê¤òºÇ¸å¤Ë¼è¤Ã¤Æ¤ª¤¯¤³¤È¤Ç¡¤¥ª¥Ö¥¸¥§¥¯¥È»Ø¸þ¥×¥í¥°¥é¥ß¥ó¥°¤¬LispÆâ¤Ë´û¤Ë¤¢¤ë
¹Í¤¨Êý¤Î±äÄ¹¤Ë°ÌÃÖ¤¹¤ë¤È¤¤¤¦¤³¤È¤ò°ìÁØ¤Ï¤Ã¤­¤ê¤ÈÍý²ò¤Ç¤­¤ë¡¥
¤½¤ì¤Ï\emph{Lisp¤Ç}¹½ÃÛ¤Ç¤­¤ë¿ôÂ¿¤¯¤ÎÃê¾Ý²½¹½Â¤¤Î¤¦¤Á¤Î°ì¤Ä¤Ê¤Î¤À¡¥

Ãí¼á¤Ï\pageref{chap:note}¥Ú¡¼¥¸¤«¤é»Ï¤Þ¤ê¡¤»²¹ÍÊ¸¸¥°ÆÆâ¡¤
ÄÉ²Ã¤Þ¤¿¤ÏÂåÂØÍÑ¤Î¥³¡¼¥É¤ä¡¤¤½¤Î¾ì¤Ë¤ÏÄ¾ÀÜ´Ø·¸¤Î¤Ê¤¤Lisp¤ÎÂ¦ÌÌ¤ÎÀâÌÀ¤â´Þ¤à¡¥
Ãí¼á¤Ï\textdagger ¤ò¸ª¤Ë¾è¤»¤Æ¼¨¤·¤¿byÌõ¼Ô¡¥
¤Þ¤¿¥Ñ¥Ã¥±¡¼¥¸¤Ë´Ø¤¹¤ëÉÕÏ¿¡Ê\pageref{chap:package}¥Ú¡¼¥¸¡Ë¤â¤¢¤ë¡¥

¥Ë¥å¡¼¥è¡¼¥¯¤Î¥Ä¥¢¡¼¤¬À¤³¦¤ÎÊ¸²½¤ÎÂçÈ¾¤Î¥Ä¥¢¡¼¤Ë¤Ê¤ê¤¦¤ë¤Î¤ÈÆ±ÍÍ¡¤
¥×¥í¥°¥é¥à²ÄÇ½¤Ê¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¤·¤Æ¤ÎLisp¤Î³Ø½¬¤Ï
Lisp¥Æ¥¯¥Ë¥Ã¥¯¤ÎÂçÉôÊ¬¤Î¥¹¥±¥Ã¥Á¤Ë¤Ê¤ë¡¥
¤³¤³¤ÇÀâÌÀ¤µ¤ì¤¿¥Æ¥¯¥Ë¥Ã¥¯¤ÎÂçÈ¾¤ÏLisp¥³¥ß¥å¥Ë¥Æ¥£¤ËÃÎ¤é¤ì¤Æ¤¤¤ë¤¬¡¤
º£¤Þ¤Ç¤É¤³¤Ë¤â½ñ¤«¤ì¤Æ¤¤¤Ê¤«¤Ã¤¿¤³¤È¤âÂ¿¤¤¡¥
¤Þ¤¿¥Þ¥¯¥í¤ÎÅ¬ÀÚ¤ÊÌò³ä¤äÊÑ¿ô¥­¥ã¥×¥Á¥ã¤ÎËÜ¼Á¤È¤¤¤Ã¤¿ÏÃÂê¤Ï¡¤
Â¿¿ô¤Î½ÏÎýLisp¥×¥í¥°¥é¥Þ¤¿¤Á¤â¤ª¤Ü¤í¤²¤Ë¤·¤«Íý²ò¤·¤Æ¤¤¤Ê¤«¤Ã¤¿¡¥
%}}}
\subsection{Îã} %{{{
Lisp¤Ï¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Î°ìÂ²¤À¡¥
¤½¤Î¤¦¤ÁCommon Lisp¤Ï¤³¤ÎÀè¤º¤Ã¤È¹­¤¯»È¤ï¤ì¤ëÊý¸À(dialect)¤À¤í¤¦¤«¤é¡¤
¤³¤ÎËÜ¤ÎÎã¤ÎÂçÈ¾¤ÏCommon Lisp¤Ç½ñ¤«¤ì¤Æ¤¤¤ë¡¥
¤³¤Î¸À¸ì¤Ï¸µ¡¹1984Ç¯¤ËGuy Steele¤ÎËÜ\emph{Common Lisp: the Language}
(\textsf{CLtL1})¤Ë¤è¤Ã¤ÆÄêµÁ¤µ¤ì¤¿¤â¤Î¤À¡¥
¤³¤ÎÄêµÁ¤Ï1990Ç¯¤ËÂè2ÈÇ(\textsf{CLtL2})¤Î½ÐÈÇ¤Ë¤è¤Ã¤Æ²þÄû¤µ¤ì¤¿\note{CLtL2}¡¥
º£ÅÙ¤Ï¾­Íè¤Î\textsf{ANSI}É¸½à¤¬¤½¤ÎÌòÌÜ¤ò°ú¤­·Ñ¤°¤³¤È¤À¤í¤¦
\footnote{ÌõÃí¡§1996Ç¯¤ËANSI Common Lisp¡Ê¥¢¥á¥ê¥«¸ø¼°É¸½à¡ËÀ©Äê¡¥
GCL¡¤Clisp¡¤CMUCL¡¤SBCL¤Ê¤É¥Õ¥ê¡¼¤Î¼ÂÁõ¤¢¤ê¡¥}¡¥

¤³¤ÎËÜ¤Ë¤Ï¡¤¼°°ì¸Ä¤«¤éÀµ¤·¤¯Æ°ºî¤¹¤ëProlog¤Î¼ÂÁõ¤Þ¤Ç¡¤¿ôÉ´¤ÎÎã¤¬ºÜ¤Ã¤Æ¤¤¤ë¡¥
¤³¤ÎËÜ¤Î¥³¡¼¥É¤Î¤¦¤Á¡¤
²ÄÇ½¤Ê¤â¤Î¤Ï¤ß¤ÊÁ´¤Æ¤Î¥ô¥¡¡¼¥¸¥ç¥ó¤ÎCommon Lisp¤ÇÆ°ºî¤¹¤ë¤è¤¦¤Ë½ñ¤«¤ì¤Æ¤¤¤ë¡¥
\textsf{CLtL1}¤Î¼ÂÁõ¤Ë¤Ê¤¤µ¡Ç½¤òÉ¬Í×¤È¤¹¤ë¤ï¤º¤«¤ÊÎã¤Ï¡¤ËÜÊ¸Ãæ¤Ë¤½¤Î»Ý¤òÌÀµ­¤·¤Æ¤¢¤ë¡¥
¸åÈ¾¤Î¾Ï¤Ë¤ÏScheme¤Ë¤è¤ëÎã¤â´ö¤Ä¤«¤¢¤ë¡¥
¤³¤ì¤é¤â¤Ï¤Ã¤­¤ê¤ÈÊ¬¤«¤ë¤è¤¦¤Ë¤·¤Æ¤¢¤ë¡¥

¥³¡¼¥É¤Ï\verb|endor.harvard.edu|¤Îanonymous \textsf{FTP}¤Î
\verb|pub/onlisp|¥Ç¥£¥ì¥¯¥È¥ê¤«¤é¼ê¤ËÆþ¤ë¡¥
¼ÁÌä¤ä¥³¥á¥ó¥È¤Ï\verb_onlisp@das.harvard.edu_¤ËÁ÷¤Ã¤Æ¤Û¤·¤¤¡¥
%}}}
\subsection{¼Õ¼­}   %{{{
{\narrowbaselines\vskip.5\baselineskip
\noindent
While writing this book I have been particularly thankful for the help of Robert
Morris. I went to him constantly for advice and was always glad I did. Several
of the examples in this book are derived from code he originally wrote, including
the version of for on page 127, the version of aand on page 191, match on
page 239, the breadth-first true-choose on page 304, and the Prolog interpreter
in Section 24.2. In fact, the whole book reflects (sometimes, indeed, transcribes)
conversations I've had with Robert during the past seven years. (Thanks, rtm!)

\hspace*{2ex}I would also like to give special thanks to David Moon, who read large parts
of the manuscript with great care, and gave me very useful comments. Chapter 12
was completely rewritten at his suggestion, and the example of variable capture
on page 119 is one that he provided.

\hspace*{2ex}I was fortunate to have David Touretzky and Skona Brittain as the technical
reviewers for the book. Several sections were added or rewritten at their sugges-tion.
The alternative true nondeterministic choice operator on page 397 is based
on a suggestion by David Toureztky.

\hspace*{2ex}Several other people consented to read all or part of the manuscript, including
Tom Cheatham, Richard Draves (who also rewrote alambda and propmacro
back in 1985), John Foderaro, David Hendler, George Luger, Robert Muller,
Mark Nitzberg, and Guy Steele.

\hspace*{2ex}I'm grateful to Professor Cheatham, and Harvard generally, for providing the
facilities used to write this book. Thanks also to the staff at Aiken Lab, including
Tony Hartman, Janusz Juda, Harry Bochner, and Joanne Klys.

\hspace*{2ex}The people at Prentice Hall did a great job. I feel fortunate to have worked
with Alan Apt, a good editor and a good guy. Thanks also to Mona Pompili,
Shirley Michaels, and Shirley McGuire for their organization and good humor.

\hspace*{2ex}The incomparable Gino Lee of the Bow and Arrow Press, Cambridge, did the
cover. The tree on the cover alludes specifically to the point made on page 27.

\hspace*{2ex}This book was typeset using \LaTeX, a language written by Leslie Lamport atop
Donald Knuth's \TeX, with additional macros by L. A. Carr, Van Jacobson, and
Guy Steele. The diagrams were done with Idraw, by John Vlissides and Scott
Stanton. The whole was previewed with Ghostview, by Tim Theisen, which is
built on Ghostscript, by L. Peter Deutsch. Gary Bisbee of Chiron Inc. produced
the camera-ready copy.

\hspace*{2ex}I owe thanks to many others, including Paul Becker, Phil Chapnick, Alice
Hartley, Glenn Holloway, Meichun Hsu, Krzysztof Lenk, Arman Maghbouleh,
Howard Mullings, Nancy Parmet, Robert Penny, Gary Sabot, Patrick Slaney, Steve
Strassman, Dave Watkins, the Weickers, and Bill Woods.

\hspace*{2ex}Most of all, I'd like to thank my parents, for their example and encouragement;
and Jackie, who taught me what I might have learned if I had listened to them. \\

¤³¤ÎËÜ¤òÆÉ¤à¤Î¤Ï¤­¤Ã¤È³Ú¤·¤¤¤È»×¤¦¡¥
»ä¤Ï¡¤ÃÎ¤Ã¤Æ¤¤¤ë¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Î¤¦¤Á¤ÇLisp¤¬°ìÈÖ¹¥¤­¤À¡¥
¤½¤ì¤Ï¤¿¤ÀLisp¤¬°ìÈÖÈþ¤·¤¤¤«¤é¤À¡¥
¤³¤ÎËÜ¤Ï¡¤ºÇ¹â¤ËLisp¤Ã¤Ý¤¤Lisp (Lisp at its lispiest)¤Ë¤Ä¤¤¤Æ¤ÎËÜ¤À¡¥
¤³¤ÎËÜ¤ò½ñ¤¯¤Î¤Ï³Ú¤·¤«¤Ã¤¿¡¥
¤½¤Î´¶¤¸¤¬¹Ô´Ö¤ËÎ®¤ì¤Æ¤¤¤¿¤é´ò¤·¤¤¡¥}
\begin{flushright}\emph{Paul Graham}\end{flushright}
%}}}
%}}}
    \newpage\MYtableofcontents\newpage
\section{³ÈÄ¥²ÄÇ½¤Ê¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì}  %{{{
±ó¤¯¤Ê¤¤ÀÎ¡¤Lisp¤Ï²¿¤Î¤¿¤á¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤«¤È¿Ò¤Í¤ì¤Ð¡¤
Â¿¤¯¤Î¿Í¤¬¡Ö¿Í¹©ÃÎÇ½(\textsf{AI})ÍÑ¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¡×¤ÈÅú¤¨¤¿¤À¤í¤¦¡¥
¼ÂºÝ¤ÏLisp¤È\textsf{AI}¤È¤Î´Ø·¸¤ÏÎò»Ë¤Î¶öÁ³¤Ë²á¤®¤Ê¤¤¡¥
Lisp¤Î³«È¯¼Ô¤ÏJohn McCarthy¤Ç¡¤Èà¤Ï¡Ö¿Í¹©ÃÎÇ½¡×¤È¤¤¤¦¸ÀÍÕ¤ÎÄó¾§¼Ô¤Ç¤â¤¢¤ë¡¥
Èà¤ÎÀ¸ÅÌ¤ÈÆ±Î½Ã£¤ÏÈà¤é¤Î¥×¥í¥°¥é¥à¤òLisp¤Ç½ñ¤¤¤¿¡¥
¤½¤ì¤¬Lisp¤¬\textsf{AI}ÍÑ¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¸À¤ï¤ì½Ð¤·¤¿¤­¤Ã¤«¤±¤À¡¥
¤³¤Î¤Ä¤Ê¤¬¤ê¤Ï¹­¤¯¼è¤ê¾å¤²¤é¤ì¡¤1980Ç¯Âå¤ÎÃ»¤¤\textsf{AI}¥Ö¡¼¥à¤Î´Ö¤Ë
ÂçÊÑ¤ÊÄø·«¤êÊÖ¤µ¤ì¤¿¤Î¤Ç¡¤¤Û¤È¤ó¤ÉÌÂ¿®¤Î¤è¤¦¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤Ã¤¿¡¥

¹¬±¿¤Ê¤³¤È¤Ë¡¤\textsf{AI}¤À¤±¤¬Lisp¤ÎÌÜÅª¤Ç¤Ê¤¤¤È¤Î¸ÀÍÕ¤¬¹­¤Þ¤ê»Ï¤á¤¿¡¥
ºÇ¶á¤Î¥Ï¡¼¥É¥¦¥§¥¢¤È¥½¥Õ¥È¥¦¥§¥¢¤Î¿ÊÊâ¤Î¤ª¤«¤²¤Ç¡¤Lisp¤Ï¾¦¶ÈÅª¤Ë¤âÀ®¸ù¤·»Ï¤á¤¿¡§
º£¤Ç¤ÏºÇ¹â¤ÎUNIX·Ï¥Æ¥­¥¹¥È¥¨¥Ç¥£¥¿GNU Emacs¡¤
¶È³¦É¸½à¤Î¥Ç¥¹¥¯¥È¥Ã¥×\textsf{CAD}¥½¥Õ¥ÈAutocad¡¤
¤½¤·¤ÆÀè¶îÅª¥Ï¥¤¥¨¥ó¥É½ÐÈÇ¥½¥Õ¥ÈInterleaf¤Ç»È¤ï¤ì¤Æ¤¤¤ë¡¥
¤³¤ì¤é¤Î¥×¥í¥°¥é¥à¤Ç¤ÎLisp¤Î»È¤ï¤ìÊý¤Ï\textsf{AI}¤È¤Ï²¿¤â´Ø·¸¤Ê¤¤¡¥

Lisp¤¬\textsf{AI}ÍÑ¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ê¤¤¤Î¤Ê¤é¡¤¤¤¤Ã¤¿¤¤²¿¤Ê¤Î¤«¡©
Lisp¤ò¼è¤ê´¬¤¯Ãç´Ö¤Ç¤½¤ì¤òÈ½ÃÇ¤¹¤ë¤Î¤Ç¤Ê¤¯¡¤¸À¸ì¤½¤Î¤â¤Î¤ò¸«¤Æ¤ß¤è¤¦¡¥
Â¾¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ç¤­¤Ê¤¤¤³¤È¤Î¤¦¤Á¡¤Lisp¤Ë¤Ï²¿¤¬¤Ç¤­¤ë¤«¡©
Lisp¤ÎºÇ¤âÆÃÄ§Åª¤ÊÀ­¼Á¤Î°ì¤Ä¤Ï¡¤Lisp¤Ë¤è¤Ã¤Æ½ñ¤«¤ì¤Æ¤¤¤ë¥×¥í¥°¥é¥à¤Ë¹ç¤ï¤»¤Æ
Lisp¤ò»ÅÎ©¤Æ¤ë¤³¤È¤¬¤Ç¤­¤ëÅÀ¤À¡¥
Lisp¤½¤Î¤â¤Î¤¬Lisp¤Î¥×¥í¥°¥é¥à¤Î°ì¤Ä¤Ç¤¢¤ê¡¤
Lisp¤Î¥×¥í¥°¥é¥à¤Ï¥ê¥¹¥È¤È¤·¤ÆÉ½¸½¤Ç¤­¤ë¤¬¡¤¥ê¥¹¥È¤ÏLisp¤Î¥Ç¡¼¥¿¹½Â¤¤Ê¤Î¤À¡¥
¤³¤ì¤é2¸Ä¤Î¸¶Â§¤¬ÁêÐØ¤Ã¤Æ¡¤
¤É¤Î¥æ¡¼¥¶¤âÁÈ¤ß¹þ¤ß¤Î¤â¤Î¤È¶èÊÌ¤ÎÉÕ¤«¤Ê¤¤¥ª¥Ú¥ì¡¼¥¿¤òLisp¤ËÄÉ²Ã¤Ç¤­¤ë¤³¤È¤Ë¤Ê¤ë¡¥
\subsection{¿Ê²½¤Ë¤è¤ë¥Ç¥¶¥¤¥ó} %{{{
Lisp¤Ç¤Ï¥æ¡¼¥¶¤ËÆÈ¼«¤Î¥ª¥Ú¥ì¡¼¥¿¤òÄêµÁ¤¹¤ë¼«Í³¤¬¤¢¤ë¤Î¤Ç¡¤
Lisp¤òÉ¬Í×¤Ê¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ë¤­¤Ã¤Á¤ê»ÅÎ©¤Æ¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
¥æ¡¼¥¶¤¬¥Æ¥­¥¹¥È¥¨¥Ç¥£¥¿¤Î¥×¥í¥°¥é¥à¤ò½ñ¤¤¤Æ¤¤¤ë¤Î¤Ê¤é¡¤
Lisp¤ò¥Æ¥­¥¹¥È¥¨¥Ç¥£¥¿¤ò½ñ¤¯¤¿¤á¤Î¸À¸ì¤ËÊÑ¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
¤Þ¤¿\textsf{CAD}¥½¥Õ¥È¤Î¥×¥í¥°¥é¥à¤ò½ñ¤¤¤Æ¤¤¤ë¤Î¤Ê¤é¡¤
Lisp¤ò\textsf{CAD}¥½¥Õ¥È¤ò½ñ¤¯¤¿¤á¤Î¸À¸ì¤ËÊÑ¤¨¤ë¤³¤È¤â¤Ç¤­¤ë¡¥
¤½¤·¤Æ¤É¤ó¤Ê¥×¥í¥°¥é¥à¤ò½ñ¤¯¤«¤Þ¤À³Î¤«¤Ç¤Ê¤¤¤Ê¤é¡¤Lisp¤Ç½ñ¤¤¤Æ¤ª¤¯¤Î¤¬°ÂÁ´¤ÊÅÒ¤±¤À¡¥
¤½¤ì¤¬¤É¤ó¤Ê¼ïÎà¤Î¥×¥í¥°¥é¥à¤Ë¤Ê¤Ã¤¿¤È¤·¤Æ¤â¡¤¤½¤ì¤ò½ñ¤¤¤Æ¤¤¤ë´Ö¤Ë¡¤
Lisp¤Ï\emph{¤½¤Î¼ïÎà¤Î}¥×¥í¥°¥é¥à¤ò½ñ¤¯¤¿¤á¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ë¿Ê²½¤·¤Æ¤¤¤ë¤³¤È¤À¤í¤¦¡¥

¤É¤ó¤Ê¥×¥í¥°¥é¥à¤ò½ñ¤¯¤«¤Þ¤À³Î¤«¤Ç¤Ê¤¤¤Ê¤é¡©
¿Í¤Ë¤è¤Ã¤Æ¤Ï¤³¤ÎÊ¸¤Ï´ñÌ¯¤Ë¶Á¤¯¤À¤í¤¦¡¥
¤½¤Î¿Í¤Ï
(1)~¤³¤ì¤«¤é¤ä¤ë¤³¤È¤òÃí°Õ¿¼¤¯·×²è¤·¡¤¤½¤·¤Æ
(2)~¤½¤ì¤ò¼Â¹Ô¤¹¤ë¡¤¤È¤¤¤¦¥â¥Ç¥ë¤È¤ÎÉÔÌû²÷¤ÊÂÐ¾È¤òÌÜ¤Ë¤·¤¿¤³¤È¤Ë¤Ê¤ë¡¥
¤³¤Î¥â¥Ç¥ë¤Ë¤è¤ì¤Ð¡¤¥×¥í¥°¥é¥à¤Î¤¹¤Ù¤­Æ°ºî¤ò·è¤á¤ëÁ°¤Ë¥×¥í¥°¥é¥à¤ò½ñ¤¯¤³¤È¤ò
Lisp¤¬´«¤á¤ë¤È¤¹¤ì¤Ð¡¤¤½¤ì¤ÏÅª³°¤ì¤Ê¹Í¤¨Êý¤ò´«¤á¤Æ¤¤¤ë¤Ë²á¤®¤Ê¤¤¤³¤È¤Ë¤Ê¤ë¡¥

¤µ¤Æ¡¤Á´¤¯¤½¤ó¤Ê¤³¤È¤Ï¤Ê¤¤¡¥
¡Ö·×²è¡Ý¼ÂÁõ¡×Êý¼°¤â¥À¥à·úÀß¤ä¿¯Î¬ºîÀï¤Î·è¹Ô¤Ë¤Ï¤¤¤¤ÊýË¡¤À¤Ã¤¿¤¬¡¤
¿Í¡¹¤Î·Ð¸³¤Ë¤è¤ì¤Ð¥×¥í¥°¥é¥à¤ò½ñ¤¯¤Î¤Ë¤¤¤¤ÊýË¡¤À¤Ã¤¿¤«¤É¤¦¤«¤ÏÄê¤«¤Ç¤Ê¤¤¡¥
¤Ê¤¼¤«¡©~¤­¤Ã¤È¤½¤ì¤Ï¡¤¥³¥ó¥Ô¥å¡¼¥¿¤ÏÂçÊÑÀµ³Î¤À¤«¤é¤À¡¥
¤­¤Ã¤È¥×¥í¥°¥é¥à¤Ë¤Ï¥À¥à¤ä¿¯Î¬ºîÀï¤è¤ê¤â¥ô¥¡¥ê¥¨¡¼¥·¥ç¥ó¤¬Â¿¤¤¤«¤é¤À¡¥
¤Þ¤¿¤Ï¡ÖÍ¾Ê¬¡×¤È¤¤¤¦¤³¤È¤Ë´Ø¤¹¤ë¸Å¤¤³µÇ°¤È¥½¥Õ¥È¥¦¥§¥¢³«È¯¤ËÎà»÷ÅÀ¤¬
¤Ê¤¤¤»¤¤¤Ç¡¤¸Å¤¤Êý¼°¤¬µ¡Ç½¤·¤Ê¤¤¤³¤È¤Ë¤è¤ë¤Î¤À¤í¤¦¡§
¥À¥à¤¬30\%Í¾Ê¬¤Ê¥³¥ó¥¯¥ê¡¼¥È¤ò»È¤Ã¤Æ¤¤¤Æ¤â¡¤¤½¤ì¤Ï´Ö°ã¤¤¤Ê¤Î¤«¤É¤¦¤«¤®¤ê¤®¤ê¤Î½ê¤À¡¥
¤·¤«¤·¥×¥í¥°¥é¥à¤¬30\%Í¾Ê¬¤ÊÆ°ºî¤ò¤·¤Æ¤¤¤¿¤é¡¤¤½¤ì¤Ï\emph{´Ö°ã¤¤}¤À¡¥

¸Å¤¤Êý¼°¤¬¼ºÇÔ¤Ë½ª¤ï¤ë¤Î¤¬¤Ê¤¼¤«¤ò¸À¤¦¤Î¤ÏÆñ¤·¤¤¤«¤â¤·¤ì¤Ê¤¤¤¬¡¤
¤½¤ì¤Ï³Î¤«¤Ë¼ºÇÔ¤·¡¤·ë²Ì¤ÏÃ¯¤ÎÌÜ¤Ë¤âÌÀ¤é¤«¤À¡¥
¥½¥Õ¥È¥¦¥§¥¢¤¬´üÆüÄÌ¤ê¤Ë´°À®¤·¤¿¤³¤È¤¬¤¢¤ë¤À¤í¤¦¤«¡©
½ÏÎý¥×¥í¥°¥é¥Þ¤Ï¡¤¤É¤ìÄø¿µ½Å¤Ë¥×¥í¥°¥é¥à¤Î·×²è¤òÎ©¤Æ¤Æ¤â¡¤
¥×¥í¥°¥é¥à¤ò½ñ¤­»Ï¤á¤ë¤È¡¤É¬¤º·×²è¤Ë¤É¤³¤«ÉÔ´°Á´¤ÊÅÀ¤¬¸«¤Ä¤«¤ë¤³¤È¤òÃÎ¤Ã¤Æ¤¤¤ë¡¥
·×²è¤¬Ë¾¤ß¤Î¤Ê¤¤Äø¤Þ¤Ç´Ö°ã¤Ã¤Æ¤¤¤ë¤³¤È¤â¤¢¤ë¡¥
¤·¤«¤·¡Ö·×²è¡Ý¼ÂÁõ¡×Êý¼°¤Îµ¾À·¼Ô¤Î¤Û¤È¤ó¤É¤Ï¤½¤Î´ðÁÃ¤Î·òÁ´¤µ¤òµ¿¤ª¤¦¤È¤Ï¤·¤Ê¤¤¡¥
Âå¤ï¤ê¤ËÈà¤é¤Ï¿Í´Ö¤Î¼ºÇÔ¤òÀÕ¤á¤ë¡§
¡Ö¤â¤¦¾¯¤·¤¤¤¤Å¸Ë¾¤Î²¼¤Ë·×²è¤òÎ©¤Æ¤Æ¤µ¤¨¤¤¤¿¤é¡¤¤³¤ó¤ÊÌäÂê¤ÏÁ´¤ÆÈò¤±¤é¤ì¤¿¤À¤í¤¦¡¥¡×
ºÇ¹â¥ì¥Ù¥ë¤Î¥×¥í¥°¥é¥Þ¤Ç¤µ¤¨¼ÂÁõ¤È¤Ê¤ì¤ÐÌäÂê¤ËÆÍ¤­Åö¤¿¤ë¤Î¤À¤«¤é¡¤
¿Í¡¹¤¬É¬¤º¤½¤ì¤À¤±¤ÎÅ¸Ë¾¤ò»ý¤Ä¤³¤È¤òË¾¤à¤Î¤Ï¤É¤¦¤ä¤éÌµÃã¤Î¤è¤¦¤À¡¥
¤ª¤½¤é¤¯¡Ö·×²è¡Ý¼ÂÁõ¡×Êý¼°¤Ï¡¤
²æ¡¹¤Î»ý¤Ä¸Â³¦¤Ë¤è¤êÅ¬¤·¤¿ÊÌ¤Î¥¢¥×¥í¡¼¥Á¤ÇÃÖ¤­´¹¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¤À¤í¤¦¡¥

Å¬ÀÚ¤Ê¥Ä¡¼¥ë¤¬¤¢¤ë¤Ê¤é¤Ð¡¤¥×¥í¥°¥é¥ß¥ó¥°¤Ø¤ÎÊÌ¤Î¥¢¥×¥í¡¼¥Á¤¬²ÄÇ½¤À¡¥
¤Ê¤¼¼ÂÁõ¤ÎÁ°¤Ë·×²è¤òÎ©¤Æ¤ë¤Î¤«¡©
¥×¥í¥¸¥§¥¯¥È¤ÎÎ©°Æ¤Ë¤É¤Ã¤×¤ê¿»¤«¤ê¹þ¤à¤³¤È¤ÎÂç¤­¤Ê´í¸±À­¤Ï¡¤
¼«¤é¤òº¤Æñ¤ËÄÉ¤¤¹þ¤ó¤Ç¤·¤Þ¤¦²ÄÇ½À­¤¬¤¢¤ëÅÀ¤À¡¥
¤â¤Ã¤È½ÀÆð¤Ê¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤¬¤¢¤ì¤Ð¡¤¤³¤Î¿´ÇÛ¤ò¸º¤é¤»¤ë¤Î¤Ç¤Ï¡©
¤Þ¤µ¤Ë¤½¤ÎÄÌ¤ê¤À¡¥
Lisp¤Î½ÀÆðÀ­¤ÏÁ´¤¯¿·¤·¤¤¥×¥í¥°¥é¥ß¥ó¥°¤Î¥¹¥¿¥¤¥ë¤òÀ¸¤ß½Ð¤·¤¿¡¥
Lisp¤Ë¤ª¤¤¤Æ¤Ï¡¤·×²è¤ÎÂçÉôÊ¬¤òÎ©¤Æ¤ë¤Î¤Ï¥×¥í¥°¥é¥à¤ò½ñ¤­¤Ê¤¬¤é¤Ç¤¤¤¤¡¥

¤Ê¤¼¸åÃÎ·Ã¤¬Éâ¤«¤Ö¤Î¤òÂÔ¤Ä¤Î¤«¡©
Montaigne¤¬µ¤ÉÕ¤¤¤¿¤è¤¦¤Ë¡¤¹Í¤¨¤òÌÀ³Î¤Ë¤¹¤ë¤Ë¤Ï¤½¤ì¤ò½ñ¤­²¼¤í¤½¤¦¤È¤¹¤ë¤³¤È¤¬°ìÈÖ¤À¡¥
¼«¤é¤òº¤Æñ¤ËÄÉ¤¤¹þ¤ó¤Ç¤·¤Þ¤¦¤È¤Î¿´ÇÛ¤«¤é¤Ò¤È¤¿¤Ó²òÊü¤µ¤ì¤ì¤Ð¡¤
¤³¤Î²ÄÇ½À­¤òºÇÂç¸Â¤Ë³èÍÑ¤Ç¤­¤ë¡¥
¥×¥í¥°¥é¥à¤ò½ñ¤­¤Ê¤¬¤é·×²è¤òÎ©¤Æ¤ëÇ½ÎÏ¤Ë¤ÏÆó¤Ä¤Î½ÅÍ×¤Ê·ë²Ì¤Ë¤Ä¤Ê¤¬¤ë¡§
¤Þ¤º¡¤¥×¥í¥°¥é¥à¤ò½ñ¤¯¤Î¤Ë¤«¤«¤ë»þ´Ö¤¬Ã»¤¯¤Ê¤ë¡¥
¤½¤ì¤Ï·×²è¤òÎ©¤Æ¤ë¤ÈÆ±»þ¤Ë¥×¥í¥°¥é¥à¤ò½ñ¤¯¤È¡¤
Ãí°Õ¤ò½¸Ãæ¤¹¤ë¤³¤È¤ÇËÜÅö¤Î¥×¥í¥°¥é¥à¤¬½ÐÍè¾å¤¬¤ë¤«¤é¤À¡¥
¤½¤·¤Æ¤½¤ÎÊýË¡¤Ç½ÐÍè¤¿¥×¥í¥°¥é¥à¤Ï¤è¤ê¤¤¤¤¤â¤Î¤Ç¤¢¤ë¤ÈÊ¬¤«¤ë¤À¤í¤¦¡¥
¤½¤ì¤Ï¥×¥í¥°¥é¥à¤ÎºÇ½ª¥Ç¥¶¥¤¥ó¤ÏÉ¬¤º¿Ê²½¤Î»ºÊª¤À¤«¤é¤À¡¥
¥×¥í¥°¥é¥à¤ÎÌÜÅª¤òÃµ¤¹´Ö¡¤´Ö°ã¤Ã¤Æ¤¤¤¿ÉôÊ¬¤ò¡¤
ÌÀ¤é¤«¤Ë¤Ê¤Ã¤¿¤½¤Î¾ì¤ÇÉ¬¤º½ñ¤­Ä¾¤¹¤È¤¤¤¦¸¶Â§¤ò¼é¤ë¸Â¤ê¡¤
ºÇ¸å¤Ë½ÐÍè¾å¤¬¤Ã¤¿¤â¤Î¤Ï¡¤
¤¢¤é¤«¤¸¤á·×²è¤Ë¿ô½µ´Ö¤òÈñ¤ä¤·¤¿¾ì¹ç¤è¤ê¤âÍ¥Èþ¤Ê¥×¥í¥°¥é¥à¤Ë¤Ê¤ë¤À¤í¤¦¡¥

Lisp¤¬Â¿ÌÜÅª¤Ê¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤À¤«¤é¤³¤½¡¤
¤³¤Î¼ï¤Î¥×¥í¥°¥é¥ß¥ó¥°¤¬¼ÂÍÑÅª¤ÊÂåÂØ¼êÃÊ¤Ë¤Ê¤ë¡¥
»ö¼Â¡¤Lisp¤Î»ý¤ÄºÇÂç¤Î´í¸±¤ÏLisp¤¬¥æ¡¼¥¶¤Ë°­±Æ¶Á¤òÍ¿¤¨¤ë¤«¤â¤·¤ì¤Ê¤¤¤³¤È¤À¡¥
°ìÅÙLisp¤ò¤·¤Ð¤é¤¯»È¤¦¤È¡¤¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤È¤ÎÁêÀ­¤ËÉÒ´¶¤Ë¤Ê¤ê¤¹¤®¡¤
¸µ¡¹»È¤Ã¤Æ¤¤¤¿¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ËÌá¤Ã¤Æ¤â¡¤
¤³¤ì¤Ç¤ÏÉ¬Í×¤Ê½ÀÆðÀ­¤¬¼ê¤ËÆþ¤é¤Ê¤¤¤È¤¤¤¦»×¤¤¤Ë¾ï¤Ë¼ü¤ï¤ì¤ë¤è¤¦¤Ë¤Ê¤ê¤«¤Í¤Ê¤¤¡¥
%}}}
\subsection{¥Ü¥È¥à¥¢¥Ã¥×¡¦¥×¥í¥°¥é¥ß¥ó¥°}   %{{{
¥×¥í¥°¥é¥à¤Îµ¡Ç½ÅªÍ×ÁÇ¤ÏÍ¾¤êÂç¤­¤¯¤Ê¤ë¤Ù¤­¤Ç¤Ê¤¤¤È¤¤¤¦¤Î¤¬¡¤
¥×¥í¥°¥é¥ß¥ó¥°¡¦¥¹¥¿¥¤¥ë¤ÎÄ¹Ç¯¤Î¸¶Â§¤À¡¥
¥×¥í¥°¥é¥à¤Î¹½À®Í×ÁÇ¤¬¡¤ÆÉ¤á¤ÐÍý²ò¤Ç¤­¤ë¾õÂÖ¤òÄ¶¤¨¤ÆÈîÂç²½¤¹¤ë¤Ê¤é¡¤
¤½¤ì¤ÏÊ£»¨¤µ¤Î¸Ç¤Þ¤ê¤ËÀ®¤ê²Ì¤Æ¡¤¡ÊÂçÅÔ»Ô¤¬Î®¤ì¼Ô¤ò±£¤¹¤è¤¦¤Ë¡Ë´ÊÃ±¤Ë¥¨¥é¡¼¤òÊ¤¤¤±£¤¹¡¥
¤½¤¦¤¤¤¦¥½¥Õ¥È¥¦¥§¥¢¤ÏÆÉ¤ß¿É¤¯¡¤¥Æ¥¹¥È¤·¿É¤¯¡¤¥Ç¥Ð¥Ã¥°¤·¿É¤¤¡¥

¤³¤Î¸¶Â§¤Ë½¾¤¤¡¤Âçµ¬ÌÏ¤Ê¥×¥í¥°¥é¥à¤ÏÉôÉÊ¤Ø¤ÈÊ¬³ä¤·¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¡¥
¤Þ¤¿¥×¥í¥°¥é¥à¤¬Âçµ¬ÌÏ¤Ç¤¢¤ì¤Ð¤¢¤ëÄø¡¤¤µ¤é¤ËÊ¬³ä¤·¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¡¥
¥×¥í¥°¥é¥à¤òÊ¬³ä¤¹¤ëÊýË¡¤È¤Ï²¿¤«¡©
ÅÁÅýÅª¥¢¥×¥í¡¼¥Á¤Ï\emph{¥È¥Ã¥×¥À¥¦¥ó¡¦¥Ç¥¶¥¤¥ó}¤È¸Æ¤Ð¤ì¤ë¡§
¡Ö¤³¤Î¥×¥í¥°¥é¥à¤ÎÌÜÅª¤Ï¤³¤ì¤é¤Î7¸Ä¤À¤«¤é¡¤
¥×¥í¥°¥é¥à¤ò7¸Ä¤Î¼çÍ×¥µ¥Ö¥ë¡¼¥Á¥ó¤ËÊ¬³ä¤¹¤ë¤³¤È¤Ë¤¹¤ë¡¥
1¸ÄÌÜ¤Î¥µ¥Ö¥ë¡¼¥Á¥ó¤Ï¤³¤ì¤é4¸Ä¤Î¤³¤È¤ò¹Ô¤ï¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¤«¤é¡¤
¤½¤ì¼«¿È¤Î¥µ¥Ö¥ë¡¼¥Á¥ó¤¬º£ÅÙ¤Ï4¸Ä¤Ë¤Ê¤ê¡¤\dots¡×¤È¤¤¤Ã¤¿¶ñ¹ç¤À¡¥
¤³¤Î¥×¥í¥»¥¹¤Ï¥×¥í¥°¥é¥àÁ´ÂÎ¤¬Å¬ÀÚ¤Ê¥Ð¥é¥Ð¥é¾õÂÖ\wadash
Á´¤Æ¤ÎÉôÊ¬¤¬°ÕÌ£¤Î¤¢¤ë»Å»ö¤ò¹Ô¤¨¤ë¤À¤±¤ÎÂç¤­¤µ¤Ç¤¢¤ê¤Ê¤¬¤é¡¤
Ã±°ì¤Î¥æ¥Ë¥Ã¥È¤È¤·¤ÆÍý²ò¤Ç¤­¤ë°Ì¾®¤µ¤¯¤Ê¤Ã¤¿¾õÂÖ\wadash ¤Ë¤Ê¤ë¤Þ¤ÇÂ³¤¯¡¥

½ÏÎýLisp¥×¥í¥°¥é¥Þ¤¬¥×¥í¥°¥é¥à¤òÊ¬³ä¤¹¤ëÊýË¡¤Ï°ã¤Ã¤Æ¤¤¤ë¡¥
¥È¥Ã¥×¥À¥¦¥ó¡¦¥Ç¥¶¥¤¥ó¤ÈÆ±ÍÍ¡¤Èà¤é¤Ë¤Ï½¾¤¦¸¶Â§¤¬¤¢¤ê¡¤
¤½¤ì¤Ï\emph{¥Ü¥È¥à¥¢¥Ã¥×¡¦¥Ç¥¶¥¤¥ó}\wadash
¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤òÌäÂê¤ËÅ¬¤¹¤ë¤è¤¦¤ËÊÑ¤¨¤Æ¤¤¤¯\wadash ¤È¸Æ¤Ð¤ì¤ë¡¥
Lisp¤Ç¤Ï¡¤¥×¥í¥°¥é¥à¤ò¤¿¤À¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ë½¾¤Ã¤Æ½ñ¤¯¤³¤È¤Ï¤·¤Ê¤¤¡¥
¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ò¼«Ê¬¤Î½ñ¤¯¥×¥í¥°¥é¥à¤Ë¸þ¤±¤Æ¹½ÃÛ¤¹¤ë¤Î¤À¡¥
¥×¥í¥°¥é¥à¤ò½ñ¤¤¤Æ¤¤¤ë¤È¤­¡¤
¡ÖLisp¤Ë¡û¢¤¤Î¥ª¥Ú¥ì¡¼¥¿¤¬¤¢¤ì¤Ð¤Ê¤¢¡¥¡×¤È»×¤¦¤³¤È¤¬¤¢¤ë¤«¤â¤·¤ì¤Ê¤¤¡¥
¤½¤¦¤·¤¿¤é¤½¤ì¤ò½ñ¤±¤Ð¤¤¤¤¡¥
¸å¤Ç¡¤¿·¤·¤¤¥ª¥Ú¥ì¡¼¥¿¤Î»ÈÍÑ¤¬
¥×¥í¥°¥é¥à¤ÎÊÌ¤ÎÉôÊ¬¤Î¥Ç¥¶¥¤¥ó¤ò´Ê·é¤Ë¤Þ¤È¤á¤ë¤³¤È¤Ë¤Ä¤Ê¤¬¤Ã¤¿¤Èµ¤ÉÕ¤¯¤À¤í¤¦¡¥
¤½¤¦¤¤¤Ã¤¿´¶¤¸¤Ç¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¥×¥í¥°¥é¥à¤Ï¶¦¤Ë¿Ê²½¤¹¤ë¡¥
¸òÀïÃæ¤Î2¹ñ´Ö¤Î¹ñ¶­¤Î¤è¤¦¤Ë¡¤Æó¤Ä¤Î¶­³¦¤Ï²¿ÅÙ¤â½ñ¤­Ä¾¤µ¤ì¤ë¡¥
¤½¤ì¤¬Íî¤ÁÃå¤¯¤Î¤Ï¡¤
»³¤äÀî¡Ê¤³¤³¤Ç¤Ï¥æ¡¼¥¶¤ÎÌäÂê¤Î»ý¤Ä¼«Á³¤Ê¶­³¦¡Ë¤ËÃ©¤êÃå¤¤¤¿¤È¤­¤À¡¥
ºÇ½ªÅª¤Ë¤Ï¡¤¥æ¡¼¥¶¤Î¥×¥í¥°¥é¥à¤Ç¤Ï¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤¬¤½¤Î¤¿¤á¤Ë
Àß·×¤µ¤ì¤¿¤«¤Î¤è¤¦¤Ê¸«³Ý¤±¤Ë¤Ê¤ë¡¥
¤½¤·¤Æ¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¥×¥í¥°¥é¥à¤¬ÁêÀ­ÎÉ¤¯Íî¤ÁÃå¤¤¤¿¤È¤­¡¤
¥æ¡¼¥¶¤ÏÌÀ²÷¤Ç¾®µ¬ÌÏ¤Ç¸úÎ¨Åª¤Ê¥³¡¼¥É¤ò¼ê¤Ë¤¹¤ë¡¥

¥Ü¥È¥à¥¢¥Ã¥×¡¦¥Ç¥¶¥¤¥ó¤Ï¡¤Æ±¤¸¥×¥í¥°¥é¥à¤ò¤¿¤ÀÊÌ¤Î½çÈÖ¤Ç
½ñ¤¯¤À¤±¤Î¤³¤È¤Ç¤Ï¤Ê¤¤¤È¤¤¤¦¤³¤È¤Ï¡¤¶¯Ä´¤¹¤ë²ÁÃÍ¤¬¤¢¤ë¡¥
¥Ü¥È¥à¥¢¥Ã¥×¤Çºî¶È¤¹¤ë¤È¡¤ÂçÄñÊÌ¤Î¥×¥í¥°¥é¥à¤¬½ÐÍè¾å¤¬¤ë¡¥
Ã±°ì¤Î°ìÂÎ¤È¤Ê¤Ã¤¿¥×¥í¥°¥é¥à¤Ç¤Ï¤Ê¤¯¡¤
Ãê¾ÝÅª¤Ê¥ª¥Ú¥ì¡¼¥¿¤ò»ý¤ÄÂçµ¬ÌÏ¤Ê¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¡¤
¤½¤ì¤Ç½ñ¤«¤ì¤¿¾®µ¬ÌÏ¤Ê¥×¥í¥°¥é¥à¤¬½ÐÍè¤ë¤Î¤À¡¥
¥æ¡¼¥¶¤ÏÉßÀÐ¤Ç¤Ï¤Ê¤¯¡¤¹â¤¤¥¢¡¼¥Á¤ò¼ê¤Ë¤¹¤ë¡¥

Åµ·¿Åª¤Ê¥³¡¼¥É¤Ç¤Ï¡¤Ã±¤Ê¤ëÊíµ­¤Ë²á¤®¤Ê¤¤ÉôÊ¬¤ò°ìÅÙÃê¾Ý²½¤¹¤ë¤È¡¤»Ä¤ë¤â¤Î¤Ï¤º¤Ã¤ÈÃ»¤¤¡¥
¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ò¹â¤¯¹½ÃÛ¤¹¤ì¤Ð¤¹¤ëÄø¡¤ÄºÅÀ¤«¤é¤½¤³¤Ë»ê¤ë¤Þ¤Ç¤ÎÆ»¤Î¤ê¤ÏÃ»¤¯¤Ê¤ë¡¥
¤³¤ì¤Ï´ö¤Ä¤«¤ÎÄ¹½ê¤ò¤â¤¿¤é¤¹¡§
\begin{enumerate}
\item ¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ë»Å»ö¤òÇ¤¤»¤ë¤³¤È¤Ç¡¤
    ¥Ü¥È¥à¥¢¥Ã¥×¡¦¥Ç¥¶¥¤¥ó¤Ç¤Ï¾®µ¬ÌÏ¤Çµ¡ÉÒ¤Ê¥×¥í¥°¥é¥à¤¬À¸¤Þ¤ì¤ë¡¥
    Ã»¤¤¥×¥í¥°¥é¥à¤ÏÂ¿¿ô¤Î¹½À®Í×ÁÇ¤ËÊ¬³ä¤¹¤ëÉ¬Í×¤¬¤Ê¤¤¡¥
    ¤½¤·¤Æ¹½À®Í×ÁÇ¤¬¾¯¤Ê¤¤¤È¤¤¤¦¤³¤È¤Ï¡¤
    ¥×¥í¥°¥é¥à¤¬ÆÉ¤ß°×¤¯½¤Àµ¤·°×¤¤¤â¤Î¤À¤È¤¤¤¦¤³¤È¤À¡¥
    ¤Þ¤¿¹½À®Í×ÁÇ¤¬¾¯¤Ê¤¤¤È¤¤¤¦¤³¤È¤Ï¡¤¹½À®Í×ÁÇÆ±»Î¤ÎÏ¢·ë¤â¾¯¤Ê¤¤¤È¤¤¤¦¤³¤È¤Ê¤Î¤Ç¡¤
    ¤½¤³¤Ç¥¨¥é¡¼¤¬µ¯¤­¤ë²ÄÇ½À­¤â¾¯¤Ê¤¤¡¥
    ¹©¶È¥Ç¥¶¥¤¥Ê¤¬µ¡³£¤Î²ÄÆ°ÉôÊ¬¤ò¸º¤é¤½¤¦¤ÈÅØÎÏ¤¹¤ë¤Î¤ÈÆ±ÍÍ¤Ë¡¤
    ½ÏÎýLisp¥×¥í¥°¥é¥Þ¤Ï¥Ü¥È¥à¥¢¥Ã¥×¡¦¥Ç¥¶¥¤¥ó¤ò»È¤Ã¤Æ
    ¥×¥í¥°¥é¥à¤ÎÂç¤­¤µ¤ÈÊ£»¨¤µ¤ò¸º¤é¤½¤¦¤È¤¹¤ë¡¥
\item ¥Ü¥È¥à¥¢¥Ã¥×¡¦¥Ç¥¶¥¤¥ó¤Ï¥³¡¼¥É¤ÎºÆÍøÍÑ¤òÂ¥¿Ê¤¹¤ë¡¥
    ¥×¥í¥°¥é¥à¤òÆó¤Ä°Ê¾å½ñ¤¯¤È¤­¡¤
    ºÇ½é¤Î¥×¥í¥°¥é¥à¤Î¤¿¤á¤Ë½ñ¤¤¤¿¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ÎÂ¿¤¯¤ÏÂ¾¤Î¥×¥í¥°¥é¥à¤Ç¤âÍ­ÍÑ¤Ë¤Ê¤ë¡¥
    ¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ÎÂçµ¬ÌÏ¤Ê´ðÈ×¤ò¼ê¤Ë¤·¤Æ¤·¤Þ¤¨¤Ð¡¤¿·¤·¤¤¥×¥í¥°¥é¥à¤ò½ñ¤¯¼ê´Ö¤Ï¡¤
    Lisp¤½¤Î¤â¤Î¤Ç½ñ¤«¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤È¤­¤Ë¤«¤«¤ë¼ê´Ö¤Î¿ôÊ¬¤Î°ì¤Ë²á¤®¤Ê¤¤¡¥
\item ¥Ü¥È¥à¥¢¥Ã¥×¥Ç¥¶¥¤¥ó¤Ï¥×¥í¥°¥é¥à¤òÆÉ¤ß°×¤¯¤¹¤ë¡¥
    ¤³¤Î¼ï¤ÎÃê¾Ý²½¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤Ï¡¤ÆÉ¤à¿Í¤ËÈÆÍÑ¥ª¥Ú¥ì¡¼¥¿¤òÍý²ò¤¹¤ë¤è¤¦Í×µá¤¹¤ë¡¥
    µ¡Ç½ÅªÃê¾Ý²½¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤Ï¡¤
    ÆÉ¤à¿Í¤ËÆÃ¼ìÌÜÅª¤Î¥µ¥Ö¥ë¡¼¥Á¥ó¤òÍý²ò¤¹¤ë¤è¤¦Í×µá¤¹¤ë
    \footnote{¡Ö¤Ç¤â¤¢¤ó¤¿¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤òÁ´ÉôÍý²ò¤·¤Ê¤¤¤³¤È¤Ë¤Ï¡¤
    ¥×¥í¥°¥é¥à¤¬ÆÉ¤á¤Ê¤¯¤Ê¤ë¤¸¤ã¤Ê¤¤¤«¡¥¡×
    ¤½¤¦¤¤¤Ã¤¿¸ÀÍÕ¤ÏÂçÄñ¸í¤ê¤À¡¥¤Ê¤¼¤«¤Ë¤Ä¤¤¤Æ¤Ï¡¤Âè4.8Àá¤ò»²¾È¡¥}¡¥
\item ¥æ¡¼¥¶¤Ë¥³¡¼¥ÉÆâ¤Î¥Ñ¥¿¡¼¥ó¤Ë¾ï¤Ë´Ø¿´¤òÊ§¤¦¤è¤¦¤Ë¤µ¤»¤ë¡¥
    ¥Ü¥È¥à¥¢¥Ã¥×¤Ç¤Îºî¶È¤Ï¥×¥í¥°¥é¥à¤Î¥Ç¥¶¥¤¥ó¤Ë´Ø¤¹¤ë¥¢¥¤¥Ç¥£¥¢¤ò
    ÌÀ³Î¤Ë¤¹¤ë¤Î¤ËÌòÎ©¤Ä¡¥
    °ì¤Ä¤Î¥×¥í¥°¥é¥à¤ÎÃæ¤Ç¼ïÎà¤Î°ã¤¦2¸Ä¤Î¹½À®Í×ÁÇ¤¬·Á¤Î¾å¤Ç»÷¤Æ¤¤¤ë¤Ê¤é¡¤
    Îà»÷À­¤Ëµ¤ÉÕ¤¯¤è¤¦Â¥¤µ¤ì¤ë¤·¡¤
    ¤ª¤½¤é¤¯Ã±½ã¤ÊÊýË¡¤Ç¥×¥í¥°¥é¥à¤ò¥Ç¥¶¥¤¥ó¤·Ä¾¤¹¤è¤¦Â¥¤µ¤ì¤ë¤À¤í¤¦¡¥
\end{enumerate}
¤¢¤ëÄøÅÙ¤Þ¤Ç¤Ï¡¤¥Ü¥È¥à¥¢¥Ã¥×¡¦¥Ç¥¶¥¤¥ó¤ÏLisp°Ê³°¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤â²ÄÇ½¤À¡¥
¥é¥¤¥Ö¥é¥ê´Ø¿ô¤ò¸«¤ì¤Ð¤½¤³¤Ë¤ÏÉ¬¤º¥Ü¥È¥à¥¢¥Ã¥×¡¦¥Ç¥¶¥¤¥ó¤ÎÎã¤¬¤¢¤ë¡¥
¤·¤«¤·Lisp¤Ï¤³¤ÎÅÀ¤Ë´Ø¤·¤Æ¤º¤Ã¤ÈÉý¹­¤¤ÎÏ¤òÍ¿¤¨¡¤
¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ë¤½¤ì¤ËÈæÎã¤·¤ÆLisp¤Î¥¹¥¿¥¤¥ë¤ÎÃæ¤Ç
Âç¤­¤ÊÌò³ä¤ò±é¤¸¤ë¤è¤¦Â¥¤¹\wadash ¤½¤ÎÌò³ä¤¬Í¾¤êÂç¤­¤¤¤Î¤Ç¡¤
Lisp¤Ï¤¿¤À¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Î°ì¤Ä¤Ç¤Ï¤Ê¤¯¡¤
Á´¤¯°ã¤Ã¤¿¥×¥í¥°¥é¥ß¥ó¥°ÊýË¡¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥

¤³¤Î¥¹¥¿¥¤¥ë¤Î³«È¯¤Ï¡¤´ö¤Ä¤«¤Î¾®µ¬ÌÏ¥°¥ë¡¼¥×¤Ë¤è¤Ã¤Æ½ñ¤±¤ëÄøÅÙ¤Î¥×¥í¥°¥é¥à¤Ë
Å¬¤·¤Æ¤¤¤ë¤È¤¤¤¦¤Î¤Ï³Î¤«¤Ë¿¿¼Â¤À¡¥
¤·¤«¤·Æ±»þ¤Ë¡¤¤³¤Î¥¹¥¿¥¤¥ë¤Ï¾®µ¬ÌÏ¥°¥ë¡¼¥×¤Î¤Ê¤·ÆÀ¤ë¤³¤È¤Î¸Â³¦¤ò³ÈÄ¥¤¹¤ë¡¥
Frederick Brooks¤¬¡Ö¿Í·î¤Î¿ÀÏÃ¡×\kern0pt (\emph{The Mythical Man-Month})%
\note{myth}¤ÎÃæ¤Ç¼¨º¶¤·¤¿¤Î¤Ï¡¤¥×¥í¥°¥é¥Þ¤Î¥°¥ë¡¼¥×¤ÎÀ¸»ºÀ­¤Ï
¤½¤Îµ¬ÌÏ¤ËÂÐ¤·¤ÆÀþ·Á¤Ë¤ÏÁýÂç¤·¤Ê¤¤¤È¤¤¤¦¤³¤È¤À¤Ã¤¿¡¥
¥°¥ë¡¼¥×¤Î¥µ¥¤¥º¤¬ÁýÂç¤¹¤ë¤Ë¤Ä¤ì¡¤¸Ä¡¹¤Î¥×¥í¥°¥é¥Þ¤ÎÀ¸»ºÀ­¤ÏÄã²¼¤·¤Æ¤æ¤¯¡¥
Lisp¥×¥í¥°¥é¥ß¥ó¥°¤Î·Ð¸³¤Ï¤³¤ÎË¡Â§¤òÉ½¸½¤¹¤ë¤¿¤á¤Î¤è¤êÁÇÅ¨¤ÊÊýË¡¤òÄó°Æ¤¹¤ë¡§
¥°¥ë¡¼¥×¤Î¥µ¥¤¥º¤¬¸º¾¯¤¹¤ë¤Ë¤Ä¤ì¡¤¸Ä¡¹¤Î¥×¥í¥°¥é¥Þ¤ÎÀ¸»ºÀ­¤Ï¸þ¾å¤·¤Æ¤æ¤¯¡¥
ÁêÂÐÅª¤Ë¾®µ¬ÌÏ¤Ê¥°¥ë¡¼¥×¤¬¾¡Íø¤ò¼ý¤á¤ë¡¥
ÍýÍ³¤ÏÃ±½ã¡¤¾®¤µ¤¤¤«¤é¡¥
¾®µ¬ÌÏ¥°¥ë¡¼¥×¤¬Lisp¤Ë¤è¤Ã¤Æ²ÄÇ½¤Ë¤Ê¤ë¥Æ¥¯¥Ë¥Ã¥¯¤ò³èÍÑ¤¹¤ë¤È¤­¡¤
´°Á´¤Ê¾¡Íø¤¬ÂÔ¤Ã¤Æ¤¤¤ë¡¥
%}}}
\subsection{³ÈÄ¥²ÄÇ½¤Ê¥½¥Õ¥È¥¦¥§¥¢} %{{{
Lisp¥¹¥¿¥¤¥ë¤Î¥×¥í¥°¥é¥ß¥ó¥°¤Ï¡¤¥½¥Õ¥È¥¦¥§¥¢¤¬Ê£»¨¤µ¤òÁý¤¹¤Ë¤Ä¤ì½ÅÍ×À­¤òÁý¤·¤Æ¤­¤¿¡¥
º£»þ¤Î¥æ¡¼¥¶¤«¤é¤Î¥½¥Õ¥È¥¦¥§¥¢¤Ø¤ÎÍ×µá¤ÏÍ¾¤ê¤ËÂ¿¤¯¡¤
¥×¥í¥°¥é¥Þ¤Ë¤Ï¤Û¤È¤ó¤ÉÍ½ÁÛ¤·¤­¤ì¤Ê¤¤¡¥
¥æ¡¼¥¶¼«¿È¤âÍ×µá¤ÎÁ´¤Æ¤òÍ½ÁÛ¤¹¤ë¤³¤È¤¬¤Ç¤­¤Ê¤¯¤Ê¤Ã¤Æ¤¤¤ë¡¥
¤·¤«¤·¥æ¡¼¥¶¤ÎË¾¤ß¤ò´°àú¤Ë³ð¤¨¤ë¥½¥Õ¥È¥¦¥§¥¢¤ò¥×¥í¥°¥é¥Þ¤¬¶¡µë¤Ç¤­¤Ê¤¯¤È¤â¡¤
¥×¥í¥°¥é¥Þ¤Ë¤Ï³ÈÄ¥¤Ç¤­¤ë¥½¥Õ¥È¥¦¥§¥¢¤ò¶¡µë¤¹¤ë¤³¤È¤Ï¤Ç¤­¤ë¡¥
¥×¥í¥°¥é¥Þ¤Ï¼«Ê¬¤Î¥½¥Õ¥È¥¦¥§¥¢¤ò¤¿¤À¤Î¥×¥í¥°¥é¥à¤«¤é¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ËÅ¾´¹¤·¡¤
µ»½Ñ¤Î¹â¤¤¥æ¡¼¥¶¤ÏÉ¬Í×¤ÊÉÕ²ÃÅªµ¡Ç½¤ò¤½¤Î¾å¤Ëºî¤ê¾å¤²¤ë¤è¤¦¤Ë¤Ê¤ë¡¥

¥Ü¥È¥à¥¢¥Ã¥×¡¦¥Ç¥¶¥¤¥ó¤Ï³ÈÄ¥²ÄÇ½¤Ê¥×¥í¥°¥é¥à¤Ë¼«Á³¤Ë¤Ä¤Ê¤¬¤Ã¤Æ¤¤¤¯¡¥
¥Ü¥È¥à¥¢¥Ã¥×¡¦¥×¥í¥°¥é¥à¤ÎºÇ¤âÃ±½ã¤Ê¤â¤Î¤Ï¡¤2ÁØ¤«¤éÀ®¤ë¡§
¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¥×¥í¥°¥é¥à¤À¡¥
Ê£»¨¤Ê¥×¥í¥°¥é¥à¤â°ìÏ¢¤ÎÁØ¤È¤·¤Æ½ñ¤­¾å¤²¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
¤½¤ì¤¾¤ì¤ÎÁØ¤Ï1ÃÊ²¼¤ÎÁØ¤ËÂÐ¤·¤Æ¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¤·¤Æµ¡Ç½¤¹¤ë¡¥
¤³¤ÎÊý¿Ë¤¬ºÇ¾åÁØ¤Þ¤Ç´Ó¤«¤ì¤ì¤Ð¡¤¤½¤ÎÁØ¤¬¥æ¡¼¥¶¤Î»È¤¦¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¤Ê¤ë¡¥
¤½¤Î¤è¤¦¤Ê¥×¥í¥°¥é¥à¤Ç¤Ï¤¢¤é¤æ¤ë¥ì¥Ù¥ë¤Ç³ÈÄ¥¤¬²ÄÇ½¤Ë¤Ê¤Ã¤Æ¤¤¤Æ¡¤
ÅÁÅýÅª¤Ê¥Ö¥é¥Ã¥¯¥Ü¥Ã¥¯¥¹¤È¤·¤Æ½ñ¤«¤ì¡¤¸å¤«¤é³ÈÄ¥À­¤òÉÕ¤±²Ã¤¨¤¿¥·¥¹¥Æ¥à¤è¤ê¤â
ÍÚ¤«¤Ë¤¤¤¤¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤¬½ÐÍè¾å¤¬¤ë¤³¤È¤¬Â¿¤¤¡¥

X~Windows¤È\TeX ¤Ï¤³¤Î¸¶Â§¤Ë´ð¤Å¤¯¥×¥í¥°¥é¥à¤Î¸Å¤¤Îã¤À¡¥
1980Ç¯Âå¤Ë¤Ï¹âÀ­Ç½¤Î¥Ï¡¼¥É¥¦¥§¥¢¤Ë¤è¤Ã¤ÆLisp¤ò¼«¤é¤Î³ÈÄ¥¸À¸ì¤È¤¹¤ë
¿·À¤Âå¤Î¥×¥í¥°¥é¥à¤¬²ÄÇ½¤Ë¤Ê¤Ã¤¿¡¥
¤½¤ÎºÇ½é¤ÏÍ­Ì¾¤ÊUNIX¤Î¥Æ¥­¥¹¥È¥¨¥Ç¥£¥¿¡¤GNU Emacs¤À¡¥
¼¡¤ÏAutocad¤Ç¡¤¤³¤ì¤ÏLisp¤ò³ÈÄ¥¸À¸ì¤È¤¹¤ëÂçµ¬ÌÏ¾¦ÍÑÀ½ÉÊ¤È¤·¤Æ¤Ï½é¤Ë¤Ê¤ë¡¥
1991Ç¯¤Ë¤ÏInterleaf¤Î¿·¥ô¥¡¡¼¥¸¥ç¥ó¤¬¥ê¥ê¡¼¥¹¤µ¤ì¤¿¤¬¡¤
¤½¤ì¤ÏLisp¤ò³ÈÄ¥¸À¸ì¤Ë»È¤Ã¤Æ¤¤¤¿¤À¤±¤Ç¤Ï¤Ê¤¯¡¤¤«¤Ê¤ê¤ÎÉôÊ¬¤¬Lisp¤Ç¼ÂÁõ¤µ¤ì¤Æ¤¤¤¿¡¥

Lisp¤Ï³ÈÄ¥²ÄÇ½¤Ê¥×¥í¥°¥é¥à¤ò½ñ¤¯¤¿¤á¤Ë¤ÏÁÇÀ²¤é¤·¤¯¤¤¤¤¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤À¡¥
¤½¤ì¤ÏLisp¼«¿È¤¬³ÈÄ¥²ÄÇ½¤Ê¥×¥í¥°¥é¥à¤Ç¤¢¤ë¤«¤é¤À¡¥
Lisp¤Î³ÈÄ¥À­¤ò¥æ¡¼¥¶¤Ë¤âÅÏ¤¹¤è¤¦¤ÊLisp¥×¥í¥°¥é¥à¤ò½ñ¤±¤Ð¡¤
¼Â¼ÁÅª¤Ë¤Ï²¿¤â¤»¤º¤Ë³ÈÄ¥¸À¸ì¤¬½ÐÍè¤¿¤³¤È¤Ë¤Ê¤ë¡¥
¤½¤·¤ÆLisp¤ÇLisp¥×¥í¥°¥é¥à¤ò³ÈÄ¥¤¹¤ë¤³¤È¤È¡¤
ÅÁÅýÅª¤Ê¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤½¤ì¤ò¹Ô¤¦¤³¤È¤È¤Î°ã¤¤¤Ï¡¤
Ã¯¤«¤ËÄ¾ÀÜ²ñ¤¦¤³¤È¤È¼ê»æ¤Ç¤ä¤ê¤È¤ê¤¹¤ë¤³¤È¤È¤Î°ã¤¤¤Î¤è¤¦¤Ê¤â¤Î¤À¡¥
³°Éô¥×¥í¥°¥é¥à¤Ø¤Î¥¢¥¯¥»¥¹¼êÃÊ¤òÄó¶¡¤¹¤ë¤³¤È¤À¤±¤Ç
³ÈÄ¥²ÄÇ½¤Ë¤Ê¤Ã¤¿¥×¥í¥°¥é¥à¤Ç¤Ï¡¤
´ûÄê¤Î¥Á¥ã¥ó¥Í¥ë¤òÄÌ¤¸¤ÆÏ¢Íí¤·¹ç¤¦Æó¤Ä¤Î¥Ö¥é¥Ã¥¯¥Ü¥Ã¥¯¥¹¤¬¤»¤¤¤¼¤¤¤À¡¥
Lisp¤Ç¤Ï¡¤³ÈÄ¥µ¡Ç½¤ÏÇØ¸å¤Ë¤¢¤ë¥×¥í¥°¥é¥àÁ´ÂÎ¤ËÄ¾ÀÜ¥¢¥¯¥»¥¹¤Ç¤­¤ë¡¥
¤³¤ì¤Ï¥æ¡¼¥¶¤Ë¥×¥í¥°¥é¥à¤Î¤¢¤é¤æ¤ëÉôÊ¬¤Ø¤Î¥¢¥¯¥»¥¹¤ò
Í¿¤¨¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤È¤¤¤¦¤³¤È¤Ç¤Ï¤Ê¤¯¡¤
¤¿¤À¥¢¥¯¥»¥¹¤òÍ¿¤¨¤ë¤«Í¿¤¨¤Ê¤¤¤«¤ÎÁªÂò»è¤¬¤¢¤ë¤È¤¤¤¦¤À¤±¤Î¤³¤È¤À¡¥

¤³¤Î¤è¤¦¤ÊÉôÊ¬Åª¥¢¥¯¥»¥¹¤¬¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¤Ê´Ä¶­¤È·ë¤Ó¤Ä¤¯¤È¡¤ºÇ¹â¤Î³ÈÄ¥À­¤¬ÆÀ¤é¤ì¤ë¡¥
¼«Ê¬¤Î¥×¥í¥°¥é¥à¤Î³ÈÄ¥µ¡Ç½¤Î´ðÁÃ¤È¤·¤Æ»È¤¨¤ë¤è¤¦¤Ê¥×¥í¥°¥é¥à¤Ï¡¤
¤É¤ì¤â¤«¤Ê¤êÂçµ¬ÌÏ¤Ë¤Ê¤ê¤¬¤Á¤À¡¥
¤ª¤½¤é¤¯µ¬ÌÏ¤¬Âç¤­¤¹¤®¤ÆÁ´ÂÎÅª¤Ê¥¤¥á¡¼¥¸¤¬ÄÏ¤á¤Ê¤¤Äø¤À¤í¤¦¡¥
²¿¤«ÉÔ³Î¤«¤ÊÅÀ¤¬¤¢¤ë¤È¤­¤É¤¦¤Ê¤ë¤À¤í¤¦¡©
¤½¤Î¤È¤­¸µ¤Î¥×¥í¥°¥é¥à¤¬Lisp¤Ç½ñ¤«¤ì¤Æ¤¤¤ì¤Ð¡¤
¤½¤ì¤ò¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¤ËÄ´¤Ù¤ë¤³¤È¤¬¤Ç¤­¤ë¡§
¥Ç¡¼¥¿¹½Â¤¤òÄ´ºº¤Ç¤­¤ë¡¥´Ø¿ô¤ò¸Æ¤Ó½Ð¤»¤ë¡¥¥½¡¼¥¹¥³¡¼¥É¤òÆÉ¤à¤³¤È¤µ¤¨¤Ç¤­¤ë¡¥
¤³¤Î¼ï¤Î¥Õ¥£¡¼¥É¥Ð¥Ã¥¯¤Ë¤è¤ê¡¤³Î¤«¤Ê¼«¿®¤ò»ý¤Ã¤Æ¥×¥í¥°¥é¥à¤òÀ½ºî¤Ç¤­¤ë¡¥
»×¤¤ÀÚ¤Ã¤¿³ÈÄ¥µ¡Ç½¤ò½ñ¤±¤ë¤·¡¤¤·¤«¤â¤½¤ì¤¬ÁÇÁá¤¯¤Ç¤­¤ë¡¥
¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¤Ê´Ä¶­¤Ï¾ï¤Ë¥×¥í¥°¥é¥ß¥ó¥°¤òÍÆ°×¤Ê¤â¤Î¤Ë¤·¤Æ¤¯¤ì¤ë¤¬¡¤
³ÈÄ¥µ¡Ç½¤ò½ñ¤¤¤Æ¤¤¤ë¤È¤­Äø¤½¤ì¤¬Í­¤êÆñ¤¤¤È¤­¤Ï¤Ê¤¤¡¥

³ÈÄ¥²ÄÇ½¤Ê¥×¥í¥°¥é¥à¤Ï½ô¿Ï¤Î·õ¤À¤¬¡¤
ºÇ¶á¤Î·Ð¸³¤Ë¤è¤ì¤Ð¥æ¡¼¥¶¤Ï¤¿¤À¤Î·õ¤è¤ê½ô¿Ï¤Î·õ¤ÎÊý¤ò¹¥¤à¡¥
¤É¤ó¤Ê´í¸±À­¤¬È÷¤ï¤Ã¤Æ¤¤¤è¤¦¤È¤â¡¤
³ÈÄ¥²ÄÇ½¤Ê¥×¥í¥°¥é¥à¤ÎÊý¤¬¾¡¤ë¤è¤¦¤À¡¥
%}}}
\subsection{Lisp¤Î³ÈÄ¥} %{{{
Lisp¤Ë¿·¤·¤¤¥ª¥Ú¥ì¡¼¥¿¤ò²Ã¤¨¤ë¤Ë¤Ï2ÄÌ¤ê¤ÎÊýË¡¤¬¤¢¤ë: ´Ø¿ô¤È¥Þ¥¯¥í¤À¡¥
Lisp¤Ç¤Ï¥æ¡¼¥¶¤ÎÄêµÁ¤·¤¿´Ø¿ô¤ÏÁÈ¤ß¹þ¤ß´Ø¿ô¤ÈÆ±¤¸ÃÏ°Ì¤òÀê¤á¤ë¡¥
¤â¤·\verb@mapcar@¤ÎÊÑ¼ï¤¬¿·¤·¤¯É¬Í×¤Ë¤Ê¤Ã¤¿¤é¡¤¤½¤ì¤ò¼«Ê¬¤ÇÄêµÁ¤·¡¤
\verb@mapcar@¤ò»È¤¦¤Î¤ÈÆ±¤¸¤è¤¦¤Ë¤½¤ì¤ò»È¤¦¤³¤È¤¬¤Ç¤­¤ë¡¥
Îã¤¨¤Ð¡¤¤¢¤ë´Ø¿ô¤¬\verb@1@¤«¤é\verb@10@¤Þ¤Ç¤ÎÀ°¿ô¤ËÅ¬ÍÑ¤µ¤ì¤¿¤È¤­¤Ë
¤½¤ì¤¬ÊÖ¤¹ÃÍ¤Î¥ê¥¹¥È¤¬É¬Í×¤Ê¤é¡¤
¿·¤·¤¤¥ê¥¹¥È¤òºî¤Ã¤Æ¤½¤ì¤ò\verb@mapcar@¤ËÅÏ¤¹¤³¤È¤¬¤Ç¤­¤ë¡§
\begin{verbatim}
(mapcar fn
        (do* ((x 1 (1+ x))
              (result (list x) (push x result)))
          ((= x 10) (nreverse result))))
\end{verbatim}
¤·¤«¤·¤³¤ÎÊýË¡¤Ï³Ê¹¥°­¤¤¤·Èó¸úÎ¨¤À\footnote{¤³¤ì¤Ï¿·¤·¤¤Common Lisp¤Î
¿ôÎó¥Þ¥¯¥í¤ò»È¤Ã¤Æ¤â¤Ã¤È¥¨¥ì¥¬¥ó¥È¤Ë½ñ¤¯¤³¤È¤â¤Ç¤­¤ë¡¥
¤·¤«¤·¤³¤ì¤é¤Î¥Þ¥¯¥í¤ÏLisp¤½¤Î¤â¤Î¤Î³ÈÄ¥¤È¤Ê¤Ã¤Æ¤¤¤ë¤Î¤Ç¡¤·ë¶É¤ÏÆ±¤¸¤³¤È¤À¡¥}.
Âå¤ï¤ê¤Ë¿·¤·¤¤ÂÐ±þ´Ø¿ô\verb@map1-n@¡Ê54¥Ú¡¼¥¸»²¾È¡Ë¤òÄêµÁ¤·¡¤
¤½¤ì¤ò¼¡¤Î¤è¤¦¤Ë¸Æ¤Ó½Ð¤»¤Ð¤¤¤¤¡§
\begin{verbatim}
(map1-n fn 10)
\end{verbatim}

´Ø¿ô¤òÄêµÁ¤¹¤ë¤Î¤ÏÈæ³ÓÅª¿¿¤ÃÅö¤ÊÊýË¡¤À¡¥
¥Þ¥¯¥í¤Ï¿·¤·¤¤¥ª¥Ú¥ì¡¼¥¿¤Î¤µ¤é¤Ë°ìÈÌÅª¤Ê
¡Ê¤·¤«¤·Í¾¤êÍý²ò¤µ¤ì¤Æ¤¤¤Ê¤¤¡ËÄêµÁÊýË¡¤òÄó¶¡¤¹¤ë¡¥
¥Þ¥¯¥í¤Ï¥×¥í¥°¥é¥à¤ò½ñ¤¯¥×¥í¥°¥é¥à¤À¡¥
¤³¤ÎÊ¸¤Ë¤ÏÈó¾ï¤Ë¿¼¤¤°ÕÌ£¤¬¹þ¤á¤é¤ì¤Æ¤¤¤ë¡¥
¤½¤·¤Æ¤½¤ÎÃµµá¤Ï¤³¤ÎËÜ¤Î¼çÌÜÅª¤Î°ì¤Ä¤Ê¤Î¤À¡¥

¥Þ¥¯¥í¤òÃí°Õ¤·¤Æ»È¤¨¤Ð¶Ã°ÛÅª¤ËÌÀ³Î¤Ç¥¨¥ì¥¬¥ó¥È¤Ê¥×¥í¥°¥é¥à¤¬¤Ç¤­¤ë¡¥
¤³¤ì¤é¤ÎÊõÀÐ¤Î¤è¤¦¤Ê¥×¥í¥°¥é¥à¤Ï¡¤²¿¤â¤»¤º¤ËÆÀ¤é¤ì¤¿¤ï¤±¤Ç¤Ï¤Ê¤¤¡¥
ºÇ¸å¤Ë¤Ï¥Þ¥¯¥í¤ÏÀ¤³¦¤Ç°ìÈÖ¼«Á³¤Ê¤â¤Î¤Ë»×¤¨¤ë¤À¤í¤¦¤¬¡¤ºÇ½é¤ÏÍý²ò¤¬Æñ¤·¤¤¡¥
¤³¤ì¤Ï¥Þ¥¯¥í¤¬´Ø¿ô¤è¤ê¤â°ìÈÌÅª¤Ç¡¤½ñ¤¯¤È¤­¤ËÃí°Õ¤¹¤Ù¤­¤³¤È¤¬Â¿¤¤¤»¤¤¤â¤¢¤ë¡¥
¤·¤«¤·¥Þ¥¯¥í¤ÎÍý²ò¤¬Æñ¤·¤¤Âç¤­¤ÊÍýÍ³¤Ï¡¤¤½¤ì¤¬Á´¤¯°Û¼Á¤Ê(\emph{foreign})¤â¤Î¤À¤«¤é¤À¡¥
Lisp¤Î¥Þ¥¯¥í¤Î¤è¤¦¤Ê¤â¤Î¤ò»ý¤Ä¸À¸ì¤ÏÂ¾¤Ë¤Ê¤¤¡¥
¤À¤«¤é¥Þ¥¯¥í¤Ë¤Ä¤¤¤Æ³Ø¤Ö¤È¡¤
Â¾¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤«¤é¤¦¤Ã¤«¤ê°ú¤­·Ñ¤¤¤ÀÀèÆþ´Ñ¤ò¿¶¤ê¼Î¤Æ¤ë¤³¤È¤Ë
¤Ä¤Ê¤¬¤ë¤«¤â¤·¤ì¤Ê¤¤¡¥
¤½¤ÎÃæ¤Î¼çÍ×¤Ê¤â¤Î¤Ï¡¤»à¸å¹ÅÄ¾¤ËÇº¤Þ¤µ¤ì¤ë¤â¤Î¤È¤·¤Æ¤Î¥×¥í¥°¥é¥à¤È¤¤¤¦³µÇ°¤À¡¥
¤Ê¤¼¥Ç¡¼¥¿¹½Â¤¤¬Î®Æ°Åª¤ÇÊÑ¹¹²ÄÇ½¤Ç¤¢¤ë¤Ù¤­¤Ê¤Î¤Ë¡¤¥×¥í¥°¥é¥à¤Ï¤½¤¦¤Ç¤Ê¤¤¤Î¤À¤í¤¦¤«¡©
Lisp¤Ç¤Ï¥×¥í¥°¥é¥à¤¬¥Ç¡¼¥¿\emph{¤Ç¤¢¤ë}¤Î¤À¡¥
¤·¤«¤·¤³¤Î»ö¼Â¤Î»ý¤Ä°ÕÌ£¤ò¥â¥Î¤Ë¤¹¤ë¤Ë¤Ï»Ã¤¯»þ´Ö¤¬¤«¤«¤ë¡¥

¥Þ¥¯¥í¤Ë´·¤ì¤ë¤Î¤Ë»Ã¤¯»þ´Ö¤¬¤«¤«¤Ã¤Æ¤â¡¤¤½¤ì¤ÏÅØÎÏ¤Ë¸«¹ç¤¦¤³¤È¤À¡¥
·«¤êÊÖ¤·¤Î¤è¤¦¤Ê¤¢¤ê¤Õ¤ì¤¿ÍÑÅÓ¤Ç¤â¡¤
¥Þ¥¯¥í¤Ï¥×¥í¥°¥é¥à¤òÌÜ³Ð¤Þ¤·¤¯¾®·¿¤Ç¤­¤ì¤¤¤Ê¤â¤Î¤ËÊÑ¤¨¤ë¡¥
¤³¤³¤Ç¡¤¤¢¤ë¥×¥í¥°¥é¥à¤¬¥³¡¼¥ÉËÜÂÎ¤ò\verb@x@¤Ë¤Ä¤¤¤Æ\verb@a@¤«¤é\verb@b@¤Þ¤Ç
·«¤êÊÖ¤µ¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤È¤·¤è¤¦¡¥
LispÁÈ¤ß¹þ¤ß¤Î\verb@do@¤Ï¤â¤Ã¤È°ìÈÌÅª¤ÊÌÜÅª¤Î¤¿¤á¤Î¤â¤Î¤À¡¥
¤½¤ì¤òÃ±½ã¤Ê·«¤êÊÖ¤·¤Ë»È¤¦¤È°ìÈÖÆÉ¤ß°×¤¤¥³¡¼¥É¤Ë¤Ï¤Ê¤é¤Ê¤¤¡§
\begin{verbatim}
(do ((x a (+ 1 x)))
    ((> x b))
  (print x))
\end{verbatim}
Âå¤ï¤ê¤Ë¤³¤¦¤¹¤ë¤À¤±¤Ç¤¤¤¤¡§
\begin{verbatim}
(for (x a b)
  (print x))
\end{verbatim}
¥Þ¥¯¥í¤¬¤³¤ì¤ò²ÄÇ½¤Ë¤¹¤ë¡¥
6¹Ô¤Î¥³¡¼¥É¤Ç¡Ê154¥Ú¡¼¥¸»²¾È¡Ë\verb@for@Ê¸¤ò¤³¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ËÄÉ²Ã¤Ç¤­¤ë¡¥
¤½¤·¤Æ¤½¤ì¤Ï½é¤á¤«¤é¤¢¤Ã¤¿¹½Ê¸¤Î¤è¤¦¤Ëµ¡Ç½¤¹¤ë¡¥
¤½¤·¤Æ¸å¤Î¾Ï¤Ç¸«¤ë¤è¤¦¤Ë¡¤\verb@for@¤Î¼ÂÁõ¤Ï¥Þ¥¯¥í¤Ç¤Ç¤­¤ë¤³¤È¤Î¼ê»Ï¤á¤Ç¤·¤«¤Ê¤¤¡¥

Lisp¤Î³ÈÄ¥¤Ç°ìÅÙ¤Ë»È¤¨¤ë¤Î¤Ï´Ø¿ô¤ä¥Þ¥¯¥í1¸Ä¤º¤Ä¤Ë¸Â¤é¤ì¤ë¤ï¤±¤Ç¤Ï¤Ê¤¤¡¥
É¬Í×¤È¤¢¤ì¤Ð¤¢¤ë¥×¥í¥°¥é¥ß¥ó¥°¸À¸ìÁ´ÂÎ¤òLisp¤Î¾å¤Ë¹½ÃÛ¤·¡¤
¤½¤ì¤ò»È¤Ã¤Æ¥×¥í¥°¥é¥ß¥ó¥°¤¹¤ë¤³¤È¤â¤Ç¤­¤ë¡¥
Lisp¤Ï¥³¥ó¥Ñ¥¤¥é¤ä¥¤¥ó¥¿¥×¥ê¥¿¤ò½ñ¤¯¤Î¤ËºÇÅ¬¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤À¤¬¡¤
¿·¤·¤¤¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤òÄêµÁ¤¹¤ëÊÌ¤ÎÊýË¡¤òÄó¶¡¤¹¤ë¡¥
¤½¤ÎÊý¤¬¤·¤Ð¤·¤Ð¥¨¥ì¥¬¥ó¥È¤À¤·¡¤Ï«ÎÏ¤¬¾¯¤Ê¤¯ºÑ¤à¤Î¤Ï³Î¤«¤À¡§
¤½¤ì¤ÏLisp¤ò½¤Àµ¤·¤Æ¿·¤·¤¤¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤òÄêµÁ¤¹¤ëÊýË¡¤À¡¥
¤½¤¦¤¹¤ì¤ÐLisp¤Îµ¡Ç½¤Î¤¦¤Á¿·¤·¤¤¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤âÊÑ¹¹¤»¤º¤Ë»È¤¨¤ëÉôÊ¬
¡ÊÎã¤¨¤Ð»»½Ñ±é»»¤ä\textsf{I/O}¡Ë¤Ï¤½¤Î¤Þ¤ÞÍøÍÑ¤Ç¤­¡¤
°Û¤Ê¤Ã¤Æ¤¤¤ëÉôÊ¬¡ÊÎã¤¨¤ÐÀ©¸æ¹½Â¤¡Ë¤À¤±¼ÂÁõ¤¹¤ì¤Ð¤¤¤¤¡¥
¤³¤Î¤è¤¦¤Ë¼ÂÁõ¤µ¤ì¤¿¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ò\emph{Ëä¤á¹þ¤ß¸À¸ì}¤È¸Æ¤Ö¡¥

Ëä¤á¹þ¤ß¸À¸ì¤Ï¥Ü¥È¥à¥¢¥Ã¥×¡¦¥×¥í¥°¥é¥ß¥ó¥°¤Î¼«Á³¤Êµ¢·ë¤À¡¥
Common Lisp¤Ë¤Ï´û¤Ë´ö¤Ä¤«Îã¤¬¤¢¤ë¡¥
°ìÈÖÍ­Ì¾¤Ê\textsf{CLOS}¤Ë¤Ä¤¤¤Æ¤Ï¸å¤Î¾Ï¤ÇµÄÏÀ¤¹¤ë¡¥
¤·¤«¤·¼«Ê¬¤À¤±¤ÎËä¤á¹þ¤ß¸À¸ì¤òÄêµÁ¤¹¤ë¤³¤È¤â¤Ç¤­¤ë¡¥
¼«Ê¬¤Î¥×¥í¥°¥é¥à¤ËÅ¬¤·¤¿Ëä¤á¹þ¤ß¸À¸ì¤òºî¤ë¤³¤È¤¬¤Ç¤­¤ë¤¬¡¤
¤½¤ì¤¬Lisp¤È¤«¤±Î¥¤ì¤¿¤è¤¦¤Ê¤â¤Î¤Ë¤Ê¤Ã¤Æ¤â¤¤¤¤¡¥
%}}}
\subsection{¤Ê¤¼¡Ê¤Þ¤¿¤Ï¤¤¤Ä¡ËLisp¤«}   %{{{
¤³¤ì¤é¤Î¿·¤¿¤Ê²ÄÇ½À­¤ÏËâË¡¤ÎÍ×ÁÇ¤¿¤Ã¤¿1¸Ä¤«¤éÀ¸¤Þ¤ì¤ëÌõ¤Ç¤Ï¤Ê¤¤¡¥
¤³¤ÎÅÀ¤ò¸«¤ì¤Ð¡¤Lisp¤Ï¥¢¡¼¥Á¤Î¤è¤¦¤Ê¤â¤Î¤À¡¥
Ü¸·Á¤ÎÀÐ(voussoirs)¤Î¤¦¤Á¡¤¤É¤ì¤¬¥¢¡¼¥Á¤ò»Ù¤¨¤Æ¤¤¤ë¤Î¤«¡©
¤³¤ì¤Ï¼ÁÌä¤½¤Î¤â¤Î¤¬¸í¤Ã¤Æ¤¤¤ë¡§¤É¤ÎÀÐ¤â¥¢¡¼¥Á¤ò»Ù¤¨¤Æ¤¤¤ë¤Î¤À¡¥
¥¢¡¼¥Á¤ÈÆ±ÍÍ¡¤Lisp¤ÏÁÈ¤ß¹ç¤ï¤µ¤Ã¤¿µ¡Ç½¤Î½¸¹çÂÎ¤À¡¥
¤½¤ì¤é¤Î´ö¤Ä¤«¤ò¤³¤³¤Çµó¤²¤ë¤³¤È¤¬¤Ç¤­¤ë\wadash
Æ°Åª¥á¥â¥ê³ä¤êÅö¤Æ¤È¥¬¡¼¥Ù¥¸¡¦¥³¥ì¥¯¥·¥ç¥ó¡¤¼Â¹Ô»þ·¿»ØÄê¡¤
¥ª¥Ö¥¸¥§¥¯¥È¤È¤·¤Æ¤Î´Ø¿ô¡¤¥ê¥¹¥È¤òÀ¸À®¤¹¤ëÁÈ¤ß¹þ¤ß¥Ñ¡¼¥µ¡¤
¥ê¥¹¥È¤È¤·¤ÆÉ½¸½¤µ¤ì¤¿¥×¥í¥°¥é¥à¤ò¼õ¤±ÉÕ¤±¤ë¥³¥ó¥Ñ¥¤¥é¡¤
¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¤Ê´Ä¶­Åù¡¹\wadash
¤·¤«¤·¤É¤Î°ì¤Ä¤ò¤È¤Ã¤Æ¤âLisp¤Î»ý¤ÄÎÏ¤ÎÍýÍ³¤Ë¤Ï¤Ê¤é¤Ê¤¤¡¥
Lisp¥×¥í¥°¥é¥ß¥ó¥°¤òLisp¥×¥í¥°¥é¥ß¥ó¥°¤¿¤é¤·¤á¤Æ¤¤¤ë¤Î¤Ï¡¤¤½¤Î¥³¥ó¥Ó¥Í¡¼¥·¥ç¥ó¤À¡¥

²áµî20Ç¯¤Ç¥×¥í¥°¥é¥ß¥ó¥°¤ÎÊýË¡¤ÏÊÑ²½¤·¤¿¡¥
¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¤Ê´Ä¶­¡¤Æ°Åª¥ê¥ó¥¯¡¤¥ª¥Ö¥¸¥§¥¯¥È»Ø¸þ¥×¥í¥°¥é¥ß¥ó¥°¤Þ¤Ç\wadash
¤³¤ì¤é¤ÎÊÑ²½¤ÎÂ¿¤¯¤Ï¡¤Lisp¤Î½ÀÆðÀ­¤ò´öÊ¬¤«¤Ç¤âÂ¾¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ËÍ¿¤¨¤è¤¦¤È¤¹¤ë
ºÙÀÚ¤ì¤Î»î¤ß¤À¤Ã¤¿¡¥
¥¢¡¼¥Á¤ÎÓÈ¤¨¤Ï¡¤¤½¤ì¤é¤¬¤É¤ìÄøÀ®¸ù¤ò¼ý¤á¤¿¤«¤ò¼¨º¶¤·¤Æ¤¤¤ë¡¥

Lisp¤ÈFortran¤¬¸½Â¸¤¹¤ë¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Î¤¦¤ÁºÇ¤â¸Å¤¤¤â¤Î¤À¤È¤¤¤¦¤³¤È¤Ï¡¤
¤è¤¯ÃÎ¤é¤ì¤Æ¤¤¤ë¡¥
¤ª¤½¤é¤¯¤â¤Ã¤È°ÕÌ£¤Î¤¢¤ë»ö¼Â¤Ï¡¤¤½¤ì¤é¤Ï¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Î¥Ç¥¶¥¤¥ó¤Î»×ÁÛ¤Î¤¦¤Á
ÂÐ¶Ë¤Ë¤¢¤ë¤â¤Î¤òÂåÉ½¤·¤Æ¤¤¤ë¤È¤¤¤¦¤³¤È¤À¡¥
Fortran¤Ï¥¢¥»¥ó¥Ö¥ê¸À¸ì¤«¤é¤Î¿ÊÊâ¤È¤·¤Æ³«È¯¤µ¤ì¤¿¡¥
Lisp¤Ï¥¢¥ë¥´¥ê¥º¥à¤òÉ½¸½¤¹¤ë¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¤·¤Æ³«È¯¤µ¤ì¤¿¡¥
¤½¤¦¤¤¤Ã¤¿°Û¤Ê¤ë°Õ¿Þ¤Ï¡¤Âç¤­¤¯°Û¤Ê¤ë¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤òÀ¸¤ó¤À¡¥
Fortran¤Ï¥³¥ó¥Ñ¥¤¥é³«È¯¼Ô¤Î¿ÍÀ¸¤ò³Ú¤Ë¤·¤Æ¤¯¤ì¤ë¡¥
Lisp¤Ï¥×¥í¥°¥é¥Þ¤Î¿ÍÀ¸¤ò³Ú¤Ë¤·¤Æ¤¯¤ì¤ë¡¥
¤½¤ì°ÊÍè¡¤ÂçÄñ¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ÏÆó¤Ä¤Î¶Ë¤Î´Ö¤Î¤É¤³¤«¤Ë°ÌÃÖ¤¹¤ë¤â¤Î¤À¤Ã¤¿¡¥
¤½¤·¤ÆFortran¤ÈLisp¤Ï¿¿¤óÃæ¤Ë¸þ¤«¤Ã¤ÆÊâ¤ß´ó¤Ã¤Æ¤­¤¿¡¥
Fortran¤Ïº£¤Ç¤Ï¤º¤¤¤Ö¤óAlgol¤Ë»÷¤Æ¤­¤¿¤·¡¤
Lisp¤Ï¼ã¤«¤ê¤·º¢¤ÎÌµÂÌ¤Ê½¬´·¤ò´ö¤Ä¤«Äü¤á¤¿¡¥

ºÇ½é¤ÎFortran¤ÈLisp¤Ï°ì¼ï¤ÎÀï¾ì¤Î¤è¤¦¤Ê¤â¤Î¤òÄêµÁ¤·¤¿¡¥
ÊÒÊý¤Ç¤Ïòª¤ÎÀ¼¤Ï¡Ö¸úÎ¨¡Á¡ª¡Ê¼ÂÁõ¤Ï¿É¤¹¤®¤ë¡Ë¡×¤Ç¡¤
¤â¤¦ÊÒÊý¤Ç¤Ïòª¤ÎÀ¼¤Ï¡ÖÃê¾Ý²½¡Á¡ª¡Ê¾¦ÍÑ¥½¥Õ¥È¤Ç¤Ï¤¢¤êÆÀ¤Ê¤¤¡Ë¡×¤À¡¥
¸ÅÂå¥®¥ê¥·¥ã¤ÎÀïÁè¤Î·ë²Ì¤ò¿À¡¹¤¬¹â¤ß¤«¤é·è¤á¤¿¤è¤¦¤Ë¡¤
¤³¤ÎÀï¤Î·ë²Ì¤Ï¥Ï¡¼¥É¥¦¥§¥¢¤Ë¤è¤Ã¤Æ·è¤á¤é¤ì¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥
Ç¯¤òÄÉ¤¦¤´¤È¤Ë¾ðÀª¤ÏLispÂ¦¤ËÍ­Íø¤Ë¤Ê¤Ã¤Æ¤­¤Æ¤¤¤ë¤è¤¦¤À¡¥
º£¤Ç¤ÏLisp¤ËÂÐ¤¹¤ëµÄÏÀ¤Ï¡¤1970Ç¯Âå½éÆ¬¤Ë¥¢¥»¥ó¥Ö¥ê¸À¸ì¥×¥í¥°¥é¥ÞÃ£¤¬
¹â¿å½à¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ËÂÐ¤·¤Æ»Å³Ý¤±¤¿µÄÏÀ¤ËÈó¾ï¤Ë»÷¤Æ¤­¤¿¡¥
º£¤äÌä¤¤¤Ï\emph{¤Ê¤¼Lisp¤«¡©}¤Ç¤Ï¤Ê¤¯\emph{¤¤¤ÄLisp¤«¡©}¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥
%}}}
%}}}
\section{´Ø¿ô}  %{{{
Lisp¤ÏLisp¥×¥í¥°¥é¥à¤òºî¤ê¾å¤²¤ë¥Ö¥í¥Ã¥¯¤Ç¤¢¤ê¡¤Lisp¤òºî¤ê¾å¤²¤ë¥Ö¥í¥Ã¥¯¤Ç¤â¤¢¤ë¡¥
ÂçÄñ¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ï¡¤
¥ª¥Ú¥ì¡¼¥¿ \verb@+@ ¤Ï¥æ¡¼¥¶¤ÎÄêµÁ¤·¤¿´Ø¿ô¤ÈÁ´¤¯°ã¤Ã¤¿¤â¤Î¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥
¤·¤«¤·Lisp¤Ï´Ø¿ô¤ÎÅ¬ÍÑ¤È¤¤¤¦¡¤
¥×¥í¥°¥é¥à¤Ë¤è¤Ã¤Æ¹Ô¤ï¤ì¤ëÁ´¤Æ¤Î·×»»¤òÀâÌÀ¤¹¤ëÃ±°ì¤Î¥â¥Ç¥ë¤ò»ý¤Ã¤Æ¤¤¤ë¡¥
Lisp¤Î¥ª¥Ú¥ì¡¼¥¿ \verb@+@ ¤Ï1¸Ä¤Î´Ø¿ô¤Ç¤¢¤ê¡¤
¥æ¡¼¥¶¼«¿È¤¬ÄêµÁ¤Ç¤­¤ë´Ø¿ô¤ÈÁ´¤¯Æ±¤¸¤À¡¥

»ö¼Â¡¤ÆÃ¼ì¥ª¥Ú¥ì¡¼¥¿¤È¸Æ¤Ð¤ì¤ë¾¯¿ô¤Î¥ª¥Ú¥ì¡¼¥¿¤ò½ü¤­¡¤Lisp¤ÎÃæ³Ë¤ÏLisp¤Î´Ø¿ô¤Î½¸¹ç¤À¡¥
¤³¤Î½¸¹ç¤ËÄÉ²Ã¤¹¤ë¤Î¤ò¤¿¤á¤é¤¦É¬Í×¤¬¤¢¤ë¤À¤í¤¦¤«¡©
¤½¤ó¤Ê¤³¤È¤Ï¤Ê¤¤¡§Lisp¤¬¤³¤ì¤ò¤·¤Æ¤¯¤ì¤¿¤é¡¤
¤È»×¤¦¤³¤È¤¬¤¢¤ì¤Ð¤½¤ì¤ò¼«Ê¬¤Ç½ñ¤¯¤³¤È¤¬¤Ç¤­¡¤
¤½¤Î¿·¤·¤¤´Ø¿ô¤ÏÁÈ¤ß¹þ¤ß¤Î¤â¤Î¤ÈÁ´¤¯Æ±¤¸¤è¤¦¤Ë°·¤ï¤ì¤ë¤À¤í¤¦¡¥

¤³¤Î»ö¼Â¤ÏLisp¥×¥í¥°¥é¥Þ¤Ë¤È¤Ã¤Æ½ÅÍ×¤Ê·ëÏÀ¤ò¤â¤¿¤é¤¹¡¥
¤³¤ì¤Ï¿·¤·¤¤´Ø¿ô¤Î¤É¤ì¤â¤¬¡¤Lisp¤Ø¤ÎÄÉ²Ã¤È¤â¡¤
ÆÃÄê¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î°ìÉô¤È¤â¹Í¤¨¤é¤ì¤ë¤È¤¤¤¦¤³¤È¤À¡¥
½ÏÎýLisp¥×¥í¥°¥é¥Þ¤ÎÅµ·¿Åª¤Ê¤ä¤êÊý¤Ï¡¤Î¾Êý¤ò´ö¤é¤«¤º¤Ä½ñ¤­¡¤
¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤¬´°àú¤Ë³ú¤ß¹ç¤¦¤Þ¤ÇÆó¤Ä¤Î¶­³¦¤òÄ´À°¤¹¤ë¤³¤È¤À¡¥
¤³¤ÎËÜ¤Ï¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤òÁêÀ­¤è¤¯¤Þ¤È¤á¤ëÊýË¡¤Ë¤Ä¤¤¤Æ
½ñ¤«¤ì¤¿¤â¤Î¤À¡¥
¤³¤ÎÌÜÉ¸¤Ë¸þ¤«¤Ã¤Æ¹Ô¤¦¤³¤È¤Ï¤ß¤Ê´Ø¿ô¤Ë°ÍÂ¸¤¹¤ë¤Î¤À¤«¤é¡¤
´Ø¿ô¤«¤é»Ï¤á¤ë¤Î¤¬¼«Á³¤Ê¤ä¤êÊý¤À¡¥
\subsection{¥Ç¡¼¥¿¤È¤·¤Æ¤Î´Ø¿ô} %{{{
Lisp¤Î´Ø¿ô¤òÂ¾¤«¤éºÝ¤À¤¿¤»¤Æ¤¤¤ë¤Î¤Ï2¸Ä¤ÎÆÃÄ§¤À¡¥
1¸ÄÌÜ¤Ï¡¤¾å¤Ç½Ò¤Ù¤¿¤è¤¦¤ËLisp¤½¤Î¤â¤Î¤¬´Ø¿ô¤Î½¸¹ç¤À¤È¤¤¤¦¤³¤È¡¥
¤³¤Î¤³¤È¤ÏLisp¤Ë¼«Ê¬¤Çºî¤Ã¤¿¿·¤·¤¤¥ª¥Ú¥ì¡¼¥¿¤òÄÉ²Ã¤Ç¤­¤ë¤È¤¤¤¦¤³¤È¤À¡¥
´Ø¿ô¤Ë´Ø¤·¤ÆÃÎ¤ë¤Ù¤­¤â¤¦°ì¤Ä¤ÎÂç»ö¤Ê¤³¤È¤Ï¡¤´Ø¿ô¤ÏLisp¤Î¥ª¥Ö¥¸¥§¥¯¥È¤À¤È¤¤¤¦¤³¤È¤À¡¥

Lisp¤Ï¡¤Â¾¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ÇÌÜ¤Ë¤¹¤ë¤è¤¦¤Ê¥Ç¡¼¥¿·¿¤ò¤Û¤È¤ó¤ÉÄó¶¡¤¹¤ë¡¥
À°¿ô¤âÉâÆ°¾®¿ôÅÀ¿ô¤â¤¢¤ì¤Ð¡¤Ê¸»úÎó¡¤ÇÛÎó¡¤¹½Â¤ÂÎÅù¤â¤¢¤ë¡¥
¤·¤«¤·Lisp¤Ï¤¢¤ë¥Ç¡¼¥¿·¿¤òÄó¶¡¤¹¤ë¤¬¡¤¤³¤ì¤ÏºÇ½é¤Ï¾×·âÅª¤«¤â¤·¤ì¤Ê¤¤¡§´Ø¿ô¤À¡¥
¤Û¤È¤ó¤ÉÁ´¤Æ¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤¬²¿¤é¤«¤Î·Á¤Ç´Ø¿ô¤ä¼êÂ³¤­¤òÄó¶¡¤¹¤ë¡¥
Lisp¤¬¤½¤ì¤é¤ò¥Ç¡¼¥¿·¿¤È¤·¤ÆÄó¶¡¤¹¤ë¤È¤Ï¤¤¤Ã¤¿¤¤¤É¤Î¤è¤¦¤Ê°ÕÌ£¤Ê¤Î¤À¤í¤¦¡©
¤½¤ì¤ÏLisp¤Ç¤Ï´Ø¿ô¤ò»È¤Ã¤Æ¡¤
Â¾¤Î¿Æ¤·¤ß¿¼¤¤¥Ç¡¼¥¿·¿¡ÊÀ°¿ôÅù¡Ë¤Ç¤ä¤í¤¦¤È»×¤¦¤³¤È¤¬Á´¤Æ¤Ç¤­¤ë¤È¤¤¤¦¤³¤È¤À¡§
¼Â¹Ô»þ¤Ë¿·¤·¤¯¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤ê¡¤ÊÑ¿ô¤ä¹½Â¤ÂÎ¤ÎÃæ¤ËÊÝ»ý¤·¡¤
Â¾¤Î´Ø¿ô¤Ë°ú¿ô¤È¤·¤ÆÅÏ¤·¡¤·ë²Ì¤È¤·¤ÆÊÖ¤¹¡¤Åù¡¥

¼Â¹Ô»þ¤Ë´Ø¿ô¤òÀ¸À®¤·¡¤¤½¤ì¤òÊÖ¤¹Ç½ÎÏ¤ÏÆÃ¤ËÊØÍø¤À¡¥
¤³¤ì¤Ï¡Ö¤¢¤ë¥³¥ó¥Ô¥å¡¼¥¿¤ÇÁö¤ë¼«¸Ê½¤ÀµÅªµ¡³£¸ì¥×¥í¥°¥é¥à¡×
¤Î¤è¤¦¤ËÈýÂÃÊª¤ÎÄ¹½ê¤Ë»×¤¨¤ë¤«¤â¤·¤ì¤Ê¤¤¡¥
¤·¤«¤·¼Â¹Ô»þ¤Ë¿·¤·¤¤´Ø¿ô¤òÀ¸À®¤¹¤ë¤³¤È¤Ï¡¤
Lisp¥×¥í¥°¥é¥ß¥ó¥°¤ÎÄêÀÐ¥Æ¥¯¥Ë¥Ã¥¯¤È¤¤¤¦¤³¤È¤¬Ê¬¤«¤ë¤À¤í¤¦¡¥
%}}}
\subsection{´Ø¿ô¤ÎÄêµÁ} %{{{
ÂçÄñ¡¤ºÇ½é¤Ë\verb@defun@¤Ç´Ø¿ô¤òÄêµÁ¤¹¤ëÊýË¡¤ò½¬¤¦È¦¤À¡¥
¼¡¤Î¼°¤Ï°ú¿ô¤Î2ÇÜ¤òÊÖ¤¹\verb@double@¤È¤¤¤¦´Ø¿ô¤òÄêµÁ¤¹¤ë¡¥
\begin{verbatim}
> (defun double (x) (* x 2))
DOUBLE
\end{verbatim}
Lisp¤Ë¤³¤ì¤òÍ¿¤¨¤ì¤Ð¡¤\verb@double@¤ÏÂ¾¤Î´Ø¿ôÆâ¤Ç¤â¡¤
¥È¥Ã¥×¥ì¥Ù¥ë¤Ç¤â¸Æ¤Ó½Ð¤»¤ë¡§
\begin{verbatim}
> (double 1)
2
\end{verbatim}
Lisp¥³¡¼¥É¤Î¥Õ¥¡¥¤¥ë¤Ï¼ç¤Ë¤½¤¦¤¤¤Ã¤¿\verb@defun@¤«¤éÀ®¤êÎ©¤Ã¤Æ¤¤¤Æ¡¤
C¤äPascal¤Î¤è¤¦¤Ê¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Î¼êÂ³¤­ÄêµÁ¤Î¥Õ¥¡¥¤¥ë¤Ë»÷¤Æ¤¤¤ë¡¥
¤·¤«¤·Âç¤­¤Ê°ã¤¤¤¬ÌÀ¤é¤«¤Ë¤Ê¤ë¡¥
¤³¤Î\verb@defun@¤Ï¼êÂ³¤­ÄêµÁ¤Ç¤Ï¤Ê¤¯¡¤Lisp¤Î¸Æ¤Ó½Ð¤·¤Ê¤Î¤À¡¥
¤³¤Î¶èÊÌ¤Ï\verb@defun@¤ÎÇØ¸å¤Ç²¿¤¬µ¯¤­¤Æ¤¤¤ë¤Î¤«¤ò¸«¤ì¤ÐÌÀ¤é¤«¤Ë¤Ê¤ë¤À¤í¤¦¡¥

´Ø¿ô¤Ï¤½¤ì¼«¿È¤¬Á´¤¯¤Î¥ª¥Ö¥¸¥§¥¯¥È¤À¡¥
¼ÂºÝ¤Ë\verb@defun@¤¬²Ì¤¿¤¹µ¡Ç½¤Ï´Ø¿ô¤òºî¤ê¡¤
1¸ÄÌÜ¤Î°ú¿ô¤È¤·¤ÆÍ¿¤¨¤é¤ì¤¿Ì¾Á°¤Ç¤½¤ì¤òÊÝ»ý¤¹¤ë¤³¤È¤À¡¥
¤À¤«¤é\verb@double@¤ò¸Æ¤Ó½Ð¤¹¤Î¤ÈÆ±ÍÍ¡¤
¤½¤Îµ¡Ç½¤ò¼ÂÁõ¤¹¤ë´Ø¿ô¤òÆÀ¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
¤³¤ì¤Ë¤ÏÉáÄÌ \verb@#'@¡Ê¥·¥ã¡¼¥×¡¦¥¯¥©¡¼¥È¡Ë¥ª¥Ú¥ì¡¼¥¿¤ò»È¤¦¡¥
¤³¤Î¥ª¥Ú¥ì¡¼¥¿¤ÏÌ¾Á°¤ò¼ÂºÝ¤Î´Ø¿ô¥ª¥Ö¥¸¥§¥¯¥È¤ËÂÐ±þ¤µ¤»¤ë¤â¤Î¤ÈÍý²ò¤¹¤ì¤Ð¤¤¤¤¡¥
¤³¤ì¤ò\verb@double@¤ÎÌ¾Á°¤ÎÁ°¤ËÃÖ¤¯¤³¤È¤Ç
¾å¤ÎÄêµÁ¤Çºî¤é¤ì¤¿¼ÂºÝ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤¬ÆÀ¤é¤ì¤ë¡§
\begin{verbatim}
> #'double
#<Interpreted-Function C66ACE>
\end{verbatim}
É½¼¨¤µ¤ì¤¿É½¸½¤ÏLisp½èÍý·Ï¤Î¼ÂÁõ¤´¤È¤Ë°ã¤¦¤±¤ì¤É¡¤
Common Lisp¤Î´Ø¿ô¤Ï´ðËÜÅª¥ª¥Ö¥¸¥§¥¯¥È¤Ç¡¤
¿ô¤äÊ¸»úÎó¤È¤¤¤Ã¤¿¿Æ¤·¤ß¿¼¤¤¥ª¥Ö¥¸¥§¥¯¥È¤ÈÆ±¤¸Ìò³ä¤ò»ý¤Ã¤Æ¤¤¤ë¡¥
¤À¤«¤é¤³¤Î´Ø¿ô¤ò°ú¿ô¤È¤·¤ÆÅÏ¤·¤¿¤ê¡¤ÊÖ¤êÃÍ¤È¤·¤ÆÊÖ¤·¤¿¤ê¡¤
¥Ç¡¼¥¿¹½Â¤¤Î¤Ê¤«¤ËÊÝÂ¸¤·¤¿¤ê¡¤¿§¡¹¤Ê¤³¤È¤¬¤Ç¤­¤ë¡§
\begin{verbatim}
> (eq #'double (car (list #'double)))
T
\end{verbatim}

´Ø¿ô¤òºî¤ë¤Î¤Ë¤Ï\verb@defun@¤âÍ×¤é¤Ê¤¤¡¥
Lisp¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Î¤Û¤È¤ó¤É¤ÈÆ±¤¸¤è¤¦¤Ë¡¤¤½¤ì¤òÊ¸»úÄÌ¤ê¤Ë»²¾È¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
À°¿ô¤ò»²¾È¤·¤¿¤¤¤È¤­¤Ï¡¤¤¿¤ÀÀ°¿ô¤½¤Î¤â¤Î¤ò»È¤¦¡¥
Ê¸»úÎó¤òÉ½¸½¤·¤¿¤¤¤È¤­¤Ï¡¤¥À¥Ö¥ë¥¯¥©¡¼¥È¤Ç°Ï¤Þ¤ì¤¿°ìÏ¢¤ÎÊ¸»ú¤ò»È¤¦¡¥
´Ø¿ô¤òÉ½¸½¤¹¤ë¤Ë¤Ï¡¤\emph{$\lambda$¼°}¤È¸Æ¤Ð¤ì¤ë¤â¤Î¤ò»È¤¦¡¥
$\lambda$¼°¤Ï¥ê¥¹¥È¤Ç¡¤3ÉôÊ¬¤«¤éÀ®¤ë¡§\verb@lambda@¥·¥ó¥Ü¥ë¡¤²¾°ú¿ô¤Î¥ê¥¹¥È¡¤
0¸Ä°Ê¾å¤Î¼°¤«¤éÀ®¤ëËÜÂÎ¤À¡¥
¼¡¤Î$\lambda$¼°¤Ï\verb@double@¤ÈÅù²Á¤Ê´Ø¿ô¤ò¼¨¤·¤Æ¤¤¤ë¡§
\begin{verbatim}
(lambda (x) (* x 2))
\end{verbatim}
¤³¤ì¤Ï1¸Ä¤Î°ú¿ô$x$¤ò¼è¤ê¡¤$2x$¤òÊÖ¤¹´Ø¿ô¤òµ¬Äê¤·¤Æ¤¤¤ë¡¥

$\lambda$¼°¤Ï´Ø¿ôÌ¾¤È¤â¹Í¤¨¤é¤ì¤ë¡¥
\verb@double@¤¬¡Ö¥ß¥±¥é¥ó¥¸¥§¥í¡×¤Î¤è¤¦¤Ê¸ÇÍ­Ì¾¤À¤È¤¹¤ì¤Ð¡¤
\verb@(lambda (x) (* x 2))@¤Ï
¡Ö¥·¥¹¥Æ¥£¡¼¥ÊÎéÇÒÆ²¤ÎÅ·°æ²è¤òÉÁ¤¤¤¿ÃË¡×¤Î¤è¤¦¤Ê¡¤ÄêµÁ¤È¤Ê¤ëÀâÌÀ¤À¡¥
¥·¥ã¡¼¥×¥¯¥©¡¼¥È¤ò$\lambda$¼°¤ÎÁ°¤ËÃÖ¤¯¤³¤È¤ÇÂÐ±þ¤¹¤ë´Ø¿ô¤¬ÆÀ¤é¤ì¤ë¡§
\begin{verbatim}
> #'(lambda (x) (* x 2))
#<Interpreted-Function C674CE>
\end{verbatim}
¤³¤Î´Ø¿ô¤Ï\verb@double@¤ÈÁ´¤¯Æ±¤¸Æ¯¤­¤ò»ý¤Ä¤¬¡¤Æó¤Ä¤Ï°Û¤Ê¤Ã¤¿¥ª¥Ö¥¸¥§¥¯¥È¤À¡¥

´Ø¿ô¸Æ¤Ó½Ð¤·¤Ç¤Ï´Ø¿ôÌ¾¤¬ÀèÆ¬¤ËÍè¤Æ¡¤°ú¿ô¤¬Â³¤¯¡§
\begin{verbatim}
> (double 3)
6
\end{verbatim}
$\lambda$¼°¤Ï´Ø¿ôÌ¾¤Ç¤â¤¢¤ë¤«¤é¡¤´Ø¿ô¸Æ¤Ó½Ð¤·¤ÎÀèÆ¬¤ËÍè¤ë¤³¤È¤â¤Ç¤­¤ë¡§
\begin{verbatim}
> ((lambda (x) (* x 2)) 3)
6
\end{verbatim}
Common Lisp¤Ç¤Ï\verb@double@¤È¤¤¤¦´Ø¿ô¤È\verb@double@¤È¤¤¤¦ÊÑ¿ô¤ò
Æ±»þ¤Ë»ý¤Ä¤³¤È¤¬¤Ç¤­¤ë¡¥
\begin{verbatim}
> (setq double 2)
2
> (double double)
4
\end{verbatim}
Ì¾Á°¤¬´Ø¿ô¸Æ¤Ó½Ð¤·¤ÎÀèÆ¬¤«¥·¥ã¡¼¥×¥¯¥©¡¼¥È¤Î¼¡¤ËÍè¤ë¤È´Ø¿ô¤Ø¤Î»²¾È¤È¸«¤Ê¤µ¤ì¡¤
¤½¤ì°Ê³°¤Ç¤ÏÊÑ¿ôÌ¾¤È¸«¤Ê¤µ¤ì¤ë¡¥

¤À¤«¤é¡ÖCommon Lisp¤Ë¤ÏÊÑ¿ô¤È´Ø¿ô¤Ë°Û¤Ê¤Ã¤¿\emph{Ì¾Á°¶õ´Ö}¤¬¤¢¤ë¡¥¡×¤È¸À¤¨¤ë¡¥
\verb@foo@¤È¤¤¤¦ÊÑ¿ô¤È\verb@foo@¤È¤¤¤¦´Ø¿ô¤òÎ¾Êý»ý¤Ä¤³¤È¤¬¤Ç¤­¡¤
¤½¤ì¤é¤ÏÊÌ¡¹¤Ç¤¢¤ëÉ¬Í×¤â¤Ê¤¤¡¥
¤³¤Î¾õ¶·¤Ï¤ä¤ä¤³¤·¤¯¡¤¥³¡¼¥É¤¬¤«¤Ê¤ê³Ê¹¥°­¤¯¤Ê¤Ã¤Æ¤·¤Þ¤¦¤³¤È¤Ë¤Ä¤Ê¤¬¤ë¤¬¡¤
¤³¤ì¤ÏCommon Lisp¥×¥í¥°¥é¥Þ¤¬ÉÕ¤­¹ç¤Ã¤Æ¤¤¤«¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤³¤È¤À¡¥

É¬Í×¤Ë±þ¤¸¡¤Common Lisp¤Ç¤Ï¥·¥ó¥Ü¥ë¤ò¤½¤ÎÉ½¸½¤¹¤ëÃÍ¤ËÂÐ±þ¤µ¤»¤¿¤ê¡¤
¤½¤ÎÉ½¸½¤¹¤ë´Ø¿ô¤ËÂÐ±þ¤µ¤»¤ë´Ø¿ô¤¬»È¤¨¤ë¡¥
´Ø¿ô\verb@symbol-value@¤Ï¥·¥ó¥Ü¥ë¤ò°ú¿ô¤Ë¼è¤ê¡¤
ÂÐ±þ¤¹¤ë¥¹¥Ú¥·¥ã¥ëÊÑ¿ô¤ÎÃÍ¤òÊÖ¤¹¡§
\begin{verbatim}
> (symbol-value 'double)
2
\end{verbatim}
¤Þ¤¿\verb@symbol-function@¤Ï¥°¥í¡¼¥Ð¥ë´Ø¿ô¤Ë¤Ä¤¤¤ÆÆ±¤¸¤³¤È¤ò¤¹¤ë¡¥
\begin{verbatim}
> (symbol-function 'double)
#<Interpreted-Function C66ACE>
\end{verbatim}
´Ø¿ô¤ÏÉáÄÌ¤Î¥Ç¡¼¥¿¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Ê¤Î¤Ç¡¤ÊÑ¿ô¤¬ÃÍ¤È¤·¤Æ´Ø¿ô¤ò»ý¤Æ¤ë¤³¤È¤ËÃí°Õ¡§
\begin{verbatim}
> (setq x #'append)
#<Compiled-Function 46B4BE>
> (eq (symbol-value 'x) (symbol-function 'append))
T
\end{verbatim}
ÇØ¸å¤Ç¤Ï¡¤\verb@defun@¤Ï¤½¤Î1¸ÄÌÜ¤Î°ú¿ô¤Î\verb@symbol-function@¤ò¡¤
»Ä¤ê¤Î°ú¿ô¤ÇÁÈ¤ßÎ©¤Æ¤é¤ì¤ë´Ø¿ô¤ËÀßÄê¤·¤Æ¤¤¤ë¤Î¤À¡¥
¼¡¤Î2¸Ä¤Î¼°¤ÏÂçÂÎÆ±¤¸¤³¤È¤ò¤·¤Æ¤¤¤ë¡§
\begin{verbatim}
(defun double (x) (* x 2))

(setf (symbol-function 'double)
#'(lambda (x) (* x 2)))
\end{verbatim}
¤À¤«¤é\verb@defun@¤ÏÂ¾¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Î¼êÂ³¤­ÄêµÁ¤ÈÆ±¤¸Ìò³ä¤ò»ý¤Ä¡¥
¤Ä¤Þ¤êÌ¾Á°¤ò¥³¡¼¥É¤Î°ìÉô¤Ë´ØÏ¢¤Å¤±¤ë¤³¤È¤À¡¥
¤·¤«¤·ÇØ¸å¤Î»ÅÁÈ¤ß¤Þ¤ÇÆ±¤¸¤Ç¤Ï¤Ê¤¤¡¥
´Ø¿ô¤òºî¤ë¤Î¤Ë\verb@defun@¤ÏÉ¬Í×¤Ç¤Ï¤Ê¤¯¡¤
´Ø¿ô¤Ï²¿¤«¤Î¥·¥ó¥Ü¥ë¤ÎÃÍ¤È¤·¤ÆÊÝÂ¸¤µ¤ì¤Ê¤¯¤Æ¤â¤¤¤¤¡¥
Â¾¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Î¼êÂ³¤­ÄêµÁ¤Ë»÷¤¿\verb@defun@¤ÎÇØ¸å¤Ë¤Ï¡¤
¤â¤Ã¤È°ìÈÌÅª¤Ê»ÅÁÈ¤ß¤¬±£¤ì¤Æ¤¤¤ë¡§
´Ø¿ô¤òºî¤ë¤³¤È¤È¡¤¤½¤ì¤ò¤¢¤ëÌ¾Á°¤Ë´ØÏ¢¤Å¤±¤ë¤³¤È¤ÏÊÌ¡¹¤ÎÆ¯¤­¤À¡¥
Lisp¤Î´Ø¿ô¤Î³µÇ°¤Î°ìÈÌÀ­Á´ÂÎ¤Þ¤Ç¤ÏÉ¬Í×¤Ê¤¤¤È¤­¡¤
\verb@defun@¤Ï¤â¤Ã¤ÈÀ©¸Â¤Î¶¯¤¤¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ÈÆ±¤¸°ÌÃ±½ã¤Ë´Ø¿ôÄêµÁ¤ò¹Ô¤¦¡¥
%}}}
\subsection{´Ø¿ô¤ò°ú¿ô¤Ë¤¹¤ë}   %{{{
´Ø¿ô¤¬¥Ç¡¼¥¿¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë¤È¤¤¤¦¤³¤È¤Ï¡¤
²¿¤è¤ê´Ø¿ô¤òÂ¾¤Î´Ø¿ô¤Î°ú¿ô¤È¤·¤ÆÅÏ¤»¤ë¤È¤¤¤¦¤³¤È¤À¡¥
¤³¤Î²ÄÇ½À­¤ÏLisp¤Ë¤ª¤±¤ë¥Ü¥È¥à¥¢¥Ã¥×¡¦¥×¥í¥°¥é¥ß¥ó¥°¤Î½ÅÍ×À­¤ò
»Ù¤¨¤ë¤â¤Î¤Î°ì¤Ä¤Ê¤Î¤À¡¥

´Ø¿ô¤¬¥Ç¡¼¥¿¡¦¥ª¥Ö¥¸¥§¥¯¥È¤È¤Ê¤ê¤¦¤ë¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ï¡¤
¥ª¥Ö¥¸¥§¥¯¥È¤Ï¤½¤ì¤ò¸Æ¤Ó½Ð¤¹ÊýË¡¤â²¿¤«Äó¶¡¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
Lisp¤Ç¤Ï¤½¤Î´Ø¿ô¤Ï\verb@apply@¤À¡¥
°ìÈÌÅª¤Ë\verb@apply@¤Ï2¸Ä¤Î°ú¿ô¤Ç¸Æ¤Ð¤ì¤ë¡§
´Ø¿ô¤È¡¤¤½¤Î¤¿¤á¤Î°ú¿ô¤Î¥ê¥¹¥È¤À¡¥
°Ê²¼¤Î4¸Ä¤Î¼°¤Ï¤ß¤ÊÆ±¤¸Æ¯¤­¤ò¤¹¤ë¡§
\begin{verbatim}
(+ 1 2)
(apply #'+ '(1 2))
(apply (symbol-function '+) '(1 2))
(apply #'(lambda (x y) (+ x y)) '(1 2))
\end{verbatim}
Common Lisp¤Ç¤Ï\verb@apply@¤Ë¤Ï´ö¤Ä¤Î°ú¿ô¤òÅÏ¤·¤Æ¤â¤è¤¯¡¤
1ÈÖÌÜ¤ËÅÏ¤µ¤ì¤¿´Ø¿ô¤¬Å¬ÍÑ¤µ¤ì¤ë¤Î¤Ï¡¤
»Ä¤ê¤Î°ú¿ô¤òºÇ¸å¤Î¥ê¥¹¥È¤Ë¥³¥ó¥·¥ó¥°¤¹¤ë¤³¤È¤ÇÆÀ¤é¤ì¤ë¥ê¥¹¥È¤À¡¥
¤À¤«¤é¤³¤Î¼°
\begin{verbatim}
(apply #'+ 1 '(2))
\end{verbatim}
¤Ï¾åµ­¤Î4¸Ä¤Î¼°¤ÈÅù²Á¤À¡¥
°ú¿ô¤ò¥ê¥¹¥È¤È¤·¤ÆÅÏ¤¹¤Î¤¬ÉÔÊØ¤À¤È»×¤Ã¤¿¤é\verb@funcall@¤ò»È¤¨¤Ð¤¤¤¤¡¥
¤³¤ì¤Ï¤½¤ÎÅÀ¤Î¤ß¤¬\verb@apply@¤È°ã¤Ã¤Æ¤¤¤ë¡¥
¤³¤Î¼°
\begin{verbatim}
(funcall #'+ 1 2)
\end{verbatim}
¤â¾åµ­¤Î¼°¤ÈÆ±¤¸Æ¯¤­¤ò»ý¤Ä¡¥

Common Lisp¤ÎÁÈ¤ß¹þ¤ß´Ø¿ô¤ÎÂ¿¤¯¤¬´Ø¿ô¤ò°ú¿ô¤Ë¼è¤ì¤ë¡¥
Ãæ¤Ç¤âºÇ¤â¤è¤¯»È¤ï¤ì¤ë¤â¤Î¤Î°ì¤Ä¤¬ÂÐ±þÉÕ¤±(mapping)´Ø¿ô¤À¡¥
Îã¤¨¤Ð\verb@mapcar@¤Ï2¸Ä°Ê¾å¤Î°ú¿ô¡Ê´Ø¿ô¤È1¸Ä°Ê¾å¤Î¥ê¥¹¥È¡¤
¤½¤Î´Ø¿ô¤Î¼è¤ë°ú¿ôËè¤Ë¥ê¥¹¥È¤¬1¸ÄÉ¬Í×¡Ë¤ò¼è¤ê¡¤
¤½¤Î´Ø¿ô¤ò¤½¤ì¤¾¤ì¤Î¥ê¥¹¥È¤ÎÍ×ÁÇ¤ËÀèÆ¬¤«¤éÅ¬ÍÑ¤·¤Æ¤¤¤¯¡¥
\begin{verbatim}
> (mapcar #'(lambda (x) (+ x 10))
          '(1 2 3))
(11 12 13)
> (mapcar #'+
          '(1 2 3)
          '(10 100 1000))
(11 102 1003)
\end{verbatim}
Lisp¥×¥í¥°¥é¥Þ¤Ë¤Ï¥ê¥¹¥È¤ÎÍ×ÁÇ¤½¤ì¤¾¤ì¤ËÂÐ¤·¤Æ²¿¤«Áàºî¤ò¹Ô¤¤¡¤
·ë²Ì¤Î¥ê¥¹¥È¤òÊÖ¤·¤Æ¤Û¤·¤¤¤È»×¤¦¤³¤È¤¬¤è¤¯¤¢¤ë¡¥
¾å¤ÎÎã¤Î1ÈÖÌÜ¤Ï¤½¤ì¤ò¹Ô¤¦¸ÅÅµÅª¤ÊÎã¤ò¼¨¤·¤Æ¤¤¤ë¡§
¤·¤Æ¤Û¤·¤¤Áàºî¤ò¹Ô¤¦´Ø¿ô¤òºî¤ê¡¤¥ê¥¹¥È¤ËÅÏ¤Ã¤Æ\verb@mapcar@¤ò»È¤¦¡¥

´Ø¿ô¤ò¥Ç¡¼¥¿¤È¤·¤Æ°·¤¨¤ë¤³¤È¤¬¤É¤ìÄøÊØÍø¤Ê¤³¤È¤«¤Ï´û¤Ë¸«¤Æ¤­¤¿¡¥
Â¿¤¯¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ï¡¤
\verb@mapcar@¤Î¤è¤¦¤Ê¤â¤Î¤Ë´Ø¿ô¤ò°ú¿ô¤È¤·¤ÆÅÏ¤»¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤¿¤È¤·¤Æ¤â¡¤
¤½¤ì¤Ï¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤Î¤É¤³¤«¤ÇÍ½¤áÄêµÁ¤µ¤ì¤¿´Ø¿ô¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤¿¤À¥³¡¼¥É¤Î°ìÉô¤Ç¥ê¥¹¥È¤ÎÍ×ÁÇ¤½¤ì¤¾¤ì¤Ë10¤ò²Ã¤¨¤¿¤¤¤È¤­¤Ç¤â¡¤
\verb@plus_ten@¤È¤«¤¤¤¦Ì¾¤Î´Ø¿ô¤ò¤½¤Î¤¿¤á¤À¤±¤ËÄêµÁ¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤À¤í¤¦¡¥
$\lambda$¼°¤ò»È¤¨¤Ð´Ø¿ô¤½¤Î¤â¤Î¤òÄ¾ÀÜ»²¾È¤Ç¤­¤ë¡¥

Common Lisp¤È¤½¤ì°ÊÁ°¤ÎÊý¸À¤È¤ÎÂç¤­¤Ê°ã¤¤¤Î°ì¤Ä¤Ï¡¤
´Ø¿ô¤ò°ú¿ô¤Ë¼è¤ì¤ë´Ø¿ô¤¬Â¿¿ôÁÈ¤ß¹þ¤Þ¤ì¤Æ¤¤¤ë¤³¤È¤À¡¥
¤¢¤é¤æ¤ë¤È¤³¤í¤ÇÌÜ¤Ë¤¹¤ë\verb@mapcar@¤Î¼¡¤ËÂ¿¤¯»È¤ï¤ì¤ë¤Î¤Ï¡¤
\verb@sort@¤È\verb@remove-if@¤À¡¥
Á°¼Ô¤ÏÂ¿ÌÜÅª¤ÎÀ°Îó´Ø¿ô¤Ç¡¤¥ê¥¹¥È¤È½Ò¸ì¤ò¼è¤ê¡¤
Í×ÁÇ¤Î¥Ú¥¢¤ò¤½¤Î½Ò¸ì¤ËÅÏ¤·¤ÆÀ°Îó¤·¤¿¥ê¥¹¥È¤òÊÖ¤¹¡¥
\begin{verbatim}
> (sort '(1 4 2 5 6 7 3) #'<)
(1 2 3 4 5 6 7)
\end{verbatim}
\verb@sort@¤ÎÆ°ºî¤ò³Ð¤¨¤ë¤Ë¤Ï¡¤½ÅÊ£¤Î¤Ê¤¤¥ê¥¹¥È¤ò \verb@<@ ¤ÇÀ°Îó¤µ¤»¡¤
¤½¤Î·ë²Ì¤Ë \verb@<@ ¤òÅ¬ÍÑ¤·¤¿¤é¿¿¤¬ÊÖ¤ë¡¤¤È³Ð¤¨¤Æ¤ª¤±¤Ð¤è¤¤¡¥

¤µ¤Æ¤â¤·\verb@remove-if@¤¬Common Lisp¤Ë´Þ¤Þ¤ì¤Æ¤¤¤Ê¤«¤Ã¤¿¤é¡¤
¤³¤ì¤Ï°ìÈÖºÇ½é¤Ë½ñ¤­²Ã¤¨¤¿¤¤¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤À¤í¤¦¡¥
¤³¤ì¤Ï´Ø¿ô¤È¥ê¥¹¥È¤ò¼è¤ê¡¤¤½¤Î¥ê¥¹¥È¤ÎÍ×ÁÇ¤Î¤¦¤Á´Ø¿ô¤¬µ¶¤òÊÖ¤¹¤â¤Î¤òÁ´¤ÆÊÖ¤¹¡¥
\begin{verbatim}
> (remove-if #'evenp '(1 2 3 4 5 6 7))
(1 3 5 7)
\end{verbatim}

´Ø¿ô¤ò°ú¿ô¤Ë¼è¤ë´Ø¿ô¤ÎÎã¤È¤·¤Æ¡¤
¤³¤³¤Ë\verb@remove-if@¤Îµ¡Ç½¸ÂÄêÈÇ¤ÎÄêµÁ¤ò¼¨¤¹¡§
\begin{verbatim}
(defun our-remove-if (fn lst)
  (if (null lst)
      nil
      (if (funcall fn (car lst))
          (our-remove-if fn (cdr lst))
          (cons (car lst) (our-remove-if fn (cdr lst))))))
\end{verbatim}
¤³¤ÎÄêµÁ¤ÎÃæ¤Ç\verb@fn@¤Ë¥·¥ã¡¼¥×¥¯¥©¡¼¥È¤¬ÉÕ¤¤¤Æ¤¤¤Ê¤¤¤³¤È¤ËÃí°Õ¡¥
´Ø¿ô¤Ï¥Ç¡¼¥¿¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Ê¤Î¤Ç¡¤ÊÑ¿ô¤Ï´Ø¿ô¤òÃÍ¤È¤·¤ÆÉáÄÌ¤ËÊÝ»ý¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
¾å¤Ç¤ä¤Ã¤Æ¤¤¤ë¤³¤È¤Ï¤½¤ì¤À¡¥
¥·¥ã¡¼¥×¥¯¥©¡¼¥È¤Ï¥·¥ó¥Ü¥ë¤ÇÉ½¤µ¤ì¤ë´Ø¿ô¡ÊÉáÄÌ\verb@defun@Åù¤Ç
¥°¥í¡¼¥Ð¥ë¤ËÄêµÁ¤µ¤ì¤¿¤â¤Î¡Ë¤ò»²¾È¤¹¤ë¤È¤­¤À¤±¤·¤«»È¤ï¤Ê¤¤¡¥

Âè4¾Ï¤Ç¸«¤ë¤è¤¦¤Ë¡¤´Ø¿ô¤ò°ú¿ô¤Ë¼è¤ë¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò¿·¤·¤¯½ñ¤¯¤Î¤Ï
¥Ü¥È¥à¥¢¥Ã¥×¡¦¥×¥í¥°¥é¥ß¥ó¥°¤Î½ÅÍ×¤ÊÍ×ÁÇ¤À¡¥
Common Lisp¤Ë¤Ï¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤¬¤¿¤¯¤µ¤óÁÈ¤ß¹þ¤Þ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¤
É¬Í×¤À¤È»×¤Ã¤¿¤â¤Î¤Ï´û¤ËÂ¸ºß¤·¤Æ¤¤¤ë¤«¤â¤·¤ì¤Ê¤¤¡¥
¤·¤«¤·\verb@sort@Åù¤ÎÁÈ¤ß¹þ¤ß¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò»È¤¦¤Ë¤»¤è¡¤
¼«Ê¬¤Ç½ñ¤­²Ã¤¨¤ë¤Ë¤»¤è¡¤¸¶Â§¤Ë°ã¤¤¤Ï¤Ê¤¤¡¥
´Ø¿ô¤òÏ¢·ë¤»¤º¤Ë¡¤´Ø¿ô¤ò°ú¿ô¤ËÅÏ¤»¤Ð¤¤¤¤Ìõ¤À¡¥
%}}}
\subsection{Â°À­¤È¤·¤Æ¤Î´Ø¿ô}   %{{{
´Ø¿ô¤¬Lisp¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ë¤»¤¤¤Ç¡¤
¿·¤·¤¤»öÂÖ¤ËÂÐ½è¤Ç¤­¤ë¤è¤¦¤Ë¼Â¹ÔÃæ¤Ë³ÈÄ¥¤Ç¤­¤ë¤è¤¦¤Ê¥×¥í¥°¥é¥à¤¬½ñ¤±¤ë¡¥
Æ°Êª¤Î¼ïÎà¤ò¼è¤ê¡¤Å¬ÀÚ¤Ë¿¶¤ëÉñ¤¦´Ø¿ô¤¬½ñ¤­¤¿¤¤¤È¤·¤è¤¦¡¥
ÂçÄñ¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ï¡¤¤³¤ì¤ò¼Â¸½¤¹¤ëÊýË¡¤Ï\verb@case@Ê¸¤À¤í¤¦¡¥
Lisp¤Ç¤â¼¡¤Î¤è¤¦¤Ë¤·¤Æ¼Â¸½¤Ç¤­¤ë¡§
\begin{verbatim}
(defun behave (animal)
  (case animal
    (dog (wag-tail)
      (bark))
    (rat (scurry)
      (squeak))
    (cat (rub-legs)
      (scratch-carpet))))
\end{verbatim}
¿·¤·¤¤Æ°Êª¤òÄÉ²Ã¤·¤¿¤¤¤È¤­¤Ë¤Ï¤É¤¦¤·¤è¤¦¤«¡©
¿·¤·¤¤Æ°Êª¤ÎÄÉ²Ã¤ò·×²è¤·¤Æ¤¤¤ë¤Ê¤é¡¤
Æ°Êª¤Î¿¶¤ëÉñ¤¤¤ò°Ê²¼¤Î¤è¤¦¤ËÄêµÁ¤¹¤ëÊý¤¬¤¤¤¤¤À¤í¤¦¡§
\begin{verbatim}
(defun behave (animal)
  (funcall (get animal 'behavior)))
\end{verbatim}
¤½¤·¤Æ¸Ä¡¹¤ÎÆ°Êª¤Î¿¶¤ëÉñ¤¤¤Ï¡¤
Îã¤¨¤Ð¤½¤ÎÌ¾Á°¤ÎÂ°À­¥ê¥¹¥È¤ËÊÝÂ¸¤µ¤ì¤¿´Ø¿ô¤È¤·¤ÆÄêµÁ¤¹¤ë¡§
\begin{verbatim}
(setf (get 'dog 'behavior)
  #'(lambda ()
      (wag-tail)
        (bark)))
\end{verbatim}
¤³¤ÎÊýË¡¤Ç¤Ï¡¤¿·¤·¤¤Æ°Êª¤òÄÉ²Ã¤¹¤ë¤Ë¤Ï¿·¤·¤¤Â°À­¤òÄêµÁ¤·¤µ¤¨¤¹¤ì¤Ð¤¤¤¤¡¥
´Ø¿ô¤Î½ñ¤­Ä¾¤·¤ÏÉ¬Í×¤Ê¤¯¤Ê¤ë¡¥

2ÈÖÌÜ¤ÎÊýË¡¤Ï½ÀÆð¤À¤¬¡¤Æ°ºî¤¬ÃÙ¤¤¤è¤¦¤Ë»×¤ï¤ì¤ë¡¥»ö¼Â¤½¤ÎÄÌ¤ê¤À¡¥
¤â¤·Â®ÅÙ¤¬ºÇ½ÅÍ×¤À¤È¤¤¤¦¤Î¤Ê¤éÂ°À­¥ê¥¹¥È¤ÎÂå¤ï¤ê¤Ë¹½Â¤ÂÎ¤ò»È¤¤¡¤
¤Þ¤¿ÆÃ¤Ë´Ø¿ô¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤Æ¤ª¤¯¤À¤í¤¦¡¥
¡Ê¤³¤ÎÊýË¡¤ÏÂèfoo¾Ï¤ÇÀâÌÀ¤¹¤ë¡¥¡Ë
¹½Â¤ÂÎ¤È¥³¥ó¥Ñ¥¤¥ëºÑ¤ß´Ø¿ô¤ò»È¤¨¤Ð¡¤
½ÀÆð¤Ê¥³¡¼¥É¤Ç¤â\verb@case@Ê¸¤ò»È¤Ã¤¿Êý¤ÈÆ±Åù¤«¤½¤ì¤òÎ¿¤°Â®ÅÙ¤¬½Ð¤ë¡¥

´Ø¿ô¤Î¤³¤Î¤è¤¦¤Ê»È¤¤Êý¤Ï¥ª¥Ö¥¸¥§¥¯¥È»Ø¸þ¥×¥í¥°¥é¥ß¥ó¥°¤Ç¤Î¥á¥½¥Ã¥É¤Î³µÇ°¤ËÂÐ±þ¤¹¤ë¡¥
°ìÈÌÅª¤Ë¸À¤Ã¤Æ¡¤¥á¥½¥Ã¥É¤È¤Ï¥ª¥Ö¥¸¥§¥¯¥È¤Î¥×¥í¥Ñ¥Æ¥£¤Ç¤¢¤ë´Ø¿ô¤Ç¤¢¤ê¡¤
¤½¤ì¤ÏÀµ¤Ë¤³¤³¤Ç¼Â¸½¤·¤¿¤â¤Î¤À¡¥
¤³¤Î¥â¥Ç¥ë¤Ë·Ñ¾µ¤ò²Ã¤¨¤ì¤Ð¥ª¥Ö¥¸¥§¥¯¥È»Ø¸þ¥×¥í¥°¥é¥ß¥ó¥°¤ÎÍ×ÁÇ¤¬¤ß¤ÊÂ·¤¦¡¥
Âèfoo¾Ï¤Ç¸«¤ë¤è¤¦¤Ë¡¤¤³¤ì¤Ï¶Ã¤¯ÄøÃ»¤¤¥³¡¼¥É¤Ç¼Â¸½¤Ç¤­¤ë¡¥

¥ª¥Ö¥¸¥§¥¯¥È»Ø¸þ¥×¥í¥°¥é¥ß¥ó¥°¤ÎºÇÂç¤Î¥»¡¼¥ë¥¹¡¦¥Ý¥¤¥ó¥È¤Î°ì¤Ä¤Ï¡¤
¤½¤ì¤Ë¤è¤Ã¤Æ¥×¥í¥°¥é¥à¤¬³ÈÄ¥²ÄÇ½¤Ë¤Ê¤ë¤³¤È¤À¡¥
¤³¤Î¸«¹þ¤ß¤ÏLisp¤ÎÀ¤³¦¤Ç¤Ï¤½¤ìÄø¶½Ê³¤òÍ¶¤¦¤â¤Î¤Ç¤Ï¤Ê¤¤¡¥
¤³¤³¤Ç¤Ï³ÈÄ¥À­¤Ï¤¤¤Ä¤âÅöÁ³¤Î¤â¤Î¤È¸«¤Ê¤µ¤ì¤Æ¤¤¤ë¤«¤é¤À¡¥
É¬Í×¤Ê¼ïÎà¤Î³ÈÄ¥À­¤¬Í¾¤ê·Ñ¾µ¤ËÍê¤é¤º¤ËºÑ¤à¤â¤Î¤Ê¤é¡¤ÁÇ¤ÎLisp¤Ç¤â½½Ê¬¤À¤í¤¦¡¥
%}}}
\subsection{¥¹¥³¡¼¥×}   %{{{
Common Lisp¤Ï¥ì¥­¥·¥«¥ë¥¹¥³¡¼¥×¤ò»ý¤ÄLisp¤À¡¥
Scheme¤Ï¥ì¥­¥·¥«¥ë¥¹¥³¡¼¥×¤ò»ý¤ÄLispÊý¸À¤Î¤¦¤ÁºÇ¤â¸Å¤¤¤â¤Î¤Ç¡¤
Scheme°ÊÁ°¤Ë¤Ï¥À¥¤¥Ê¥ß¥Ã¥¯¥¹¥³¡¼¥×¤ÏLisp¤ÎÆÃÄ§Åª¤Êµ¡Ç½¤È¤µ¤ì¤Æ¤¤¤¿¡¥
¥ì¥­¥·¥«¥ë¥¹¥³¡¼¥×¤È¥À¥¤¥Ê¥ß¥Ã¥¯¥¹¥³¡¼¥×¤È¤Î°ã¤¤¤Ï¡¤
½èÍý·Ï¤Î¼ÂÁõ¤¬¤É¤Î¤è¤¦¤Ë¥Õ¥ê¡¼ÊÑ¿ô¤ò°·¤¦¤«¤È¤¤¤¦ÅÀ¤À¡¥
²¾°ú¿ô¤È¤·¤Æ¸½¤ì¤ë¤«¡¤
ÊÑ¿ô¤òÂ«Çû¤¹¤ëµ¡Ç½¤ò»ý¤Ä\verb@let@¤ä\verb@do@Åù¤Î¥ª¥Ú¥ì¡¼¥¿¤Ë¤è¤ë¤«¤·¤Æ¡¤
ÊÑ¿ô¤È¤·¤Æºî¤é¤ì¤¿¥·¥ó¥Ü¥ë¤Ï¡¤¼°¤ËÂ«Çû¤µ¤ì¤Æ¤¤¤ë¡¥
Â«Çû¤µ¤ì¤Æ¤¤¤Ê¤¤¥·¥ó¥Ü¥ë¤Ï¥Õ¥ê¡¼¤Ç¤¢¤ë¤È¸À¤ï¤ì¤ë¡¥
¼¡¤ÎÎã¤Ç¤Ï¡¤¥¹¥³¡¼¥×¤¬Æ°ºî¤ËÍí¤ó¤Ç¤¯¤ë¡§
\begin{verbatim}
(let ((y 7))
  (defun scope-test (x)
    (list x y)))
\end{verbatim}
¤³¤Î\verb@defun@¼°¤ÎÃæ¤Ç¤Ï¡¤\verb@x@¤¬Â«Çû¤µ¤ì¤Æ¤¤¤Æ\verb@y@¤Ï¥Õ¥ê¡¼¤À¡¥
¥Õ¥ê¡¼ÊÑ¿ô¤Ï¡¤¤¢¤ë¤Ù¤­ÃÍ¤¬ÌÀ¤é¤«¤Ç¤Ê¤¤¤Î¤Ç¶½Ì£¿¼¤¤¡¥
Â«ÇûÊÑ¿ô¤ÎÃÍ¤Ë´Ø¤·¤Æ¤ÏÛ£Ëæ¤Ê¤³¤È¤Ï²¿¤â¤Ê¤¤\wadash
\verb@scope-test@¤¬¸Æ¤Ð¤ì¤¿¤È¤­¡¤\verb@x@¤ÎÃÍ¤Ï¤È¤Ë¤«¤¯°ú¿ô¤ÇÅÏ¤µ¤ì¤¿¤â¤Î¤Ë¤Ê¤ë¡¥
¤·¤«¤·\verb@y@¤ÎÃÍ¤Ï¤É¤¦¤¢¤ë¤Ù¤­¤À¤í¤¦¡©
¤³¤ÎÌä¤ÎÅú¤¨¤Ï¤½¤ÎLispÊý¸À¤Î¥¹¥³¡¼¥×¤Î°·¤¤¤Ë¤è¤ë¡¥

¥À¥¤¥Ê¥ß¥Ã¥¯¥¹¥³¡¼¥×¤ò»ý¤ÄLisp¤Ç¤Ï¡¤
\verb@scope-test@¤Î¼Â¹Ô»þ¤Î¥Õ¥ê¡¼ÊÑ¿ô¤ÎÃÍ¤ò¸«¤Ä¤±¤ë¤Ë¤Ï¡¤
¤½¤ì¤ò¸Æ¤Ó½Ð¤·¤¿´Ø¿ô¤ÎÏ¢º¿¤òÁÌ¤ëÉ¬Í×¤¬¤¢¤ë¡¥
¤½¤·¤Æ\verb@y@¤¬Â«Çû¤µ¤ì¤Æ¤¤¤ë´Ä¶­¤¬¸«¤Ä¤«¤ì¤Ð¡¤
¤½¤ÎÂ«Çû¤¬\verb@scope-test@¤Ç»È¤ï¤ì¤Æ¤¤¤ë¤â¤Î¤À¡¥
¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¤é¡¤\verb@y@¤Î¥°¥í¡¼¥Ð¥ë¤ÊÃÍ¤¬»È¤ï¤ì¤ë¡¥
¤À¤«¤é¥À¥¤¥Ê¥ß¥Ã¥¯¥¹¥³¡¼¥×¤ò»ý¤ÄLisp¤Ç¤Ï¡¤
\verb@y@¤ÎÃÍ¤Ï¸Æ¤Ó½Ð¤·Â¦¤Î¼°¤ÎÃæ¤Ç¤ÎÃÍ¤Ë¤Ê¤ë¡§
\begin{verbatim}
> (let ((y 5))
    (scope-test 3))
      (3 5)
\end{verbatim}
¥À¥¤¥Ê¥ß¥Ã¥¯¥¹¥³¡¼¥×¤Ç¤Ï¡¤\verb@scope-test@¤¬ÄêµÁ¤µ¤ì¤¿»þÅÀ¤Ç
\verb@y@¤¬7¤ËÂ«Çû¤µ¤ì¤Æ¤¤¤¿¤³¤È¤Ë¤Ï²¿¤Î°ÕÌ£¤â¤Ê¤¤¡¥
±Æ¶Á¤¬¤¢¤ë¤Î¤Ï¡¤\verb@scope-test@¤¬¸Æ¤Ð¤ì¤¿¤È¤­¤Ë
\verb@y@¤ÎÃÍ¤¬5¤À¤Ã¤¿¤È¤¤¤¦¤³¤È¤À¡¥

¥ì¥­¥·¥«¥ë¥¹¥³¡¼¥×¤ò»ý¤ÄLisp¤Ç¤Ï¡¤´Ø¿ô¸Æ¤Ó½Ð¤·¤ÎÏ¢º¿¤òÁÌ¤ëÂå¤ï¤ê¤Ë¡¤
´Ø¿ô¤¬ÄêµÁ¤µ¤ì¤¿»þÅÀ¤Ç¤Î¼þ¤ê¤Î´Ä¶­¤òÁÌ¤Ã¤ÆÄ´¤Ù¤ë¡¥
¥ì¥­¥·¥«¥ë¥¹¥³¡¼¥×¤ò»ý¤ÄLisp¤Ç¤Ï¡¤¾å¤ÎÎã¤Î\verb@y@¤Ï
\verb@scope-test@¤¬ÄêµÁ¤µ¤ì¤¿»þÅÀ¤Ç¤ÎÂ«Çû¤ò»ý¤Ä¤À¤í¤¦¡¥
¤Þ¤¿Common Lisp¤Ç¤â¤½¤¦¤Ê¤ë¡§
\begin{verbatim}
> (let ((y 5))
    (scope-test 3))
      (3 7)
\end{verbatim}
¤³¤³¤Ç¡¤¸Æ¤Ó½Ð¤·»þ¤Ë\verb@y@¤ò5¤ËÂ«Çû¤·¤¿¤³¤È¤ÏÊÖ¤êÃÍ¤Ë²¿¤Î±Æ¶Á¤â»ý¤¿¤Ê¤¤¡¥

ÊÑ¿ô¤ò¥¹¥Ú¥·¥ã¥ëÀë¸À¤¹¤ë¤³¤È¤Ç¥À¥¤¥Ê¥ß¥Ã¥¯¥¹¥³¡¼¥×¤ò»ý¤¿¤»¤ë¤³¤È¤¬¤Ç¤­¤ë¤¬¡¤
Common Lisp¤Ç¤ÏÉáÄÌ¤Ï¥ì¥­¥·¥«¥ë¥¹¥³¡¼¥×¤Ë¤Ê¤ë¡¥
°ìÈÌÅª¤Ë¸À¤Ã¤Æ¡¤Lisp¥³¥ß¥å¥Ë¥Æ¥£¤Ï¥À¥¤¥Ê¥ß¥Ã¥¯¥¹¥³¡¼¥×¤ÎÇÑ»ß¤ò
¤Û¤È¤ó¤É»ÄÇ°¤Ë»×¤Ã¤Æ¤¤¤Ê¤¤¤è¤¦¤À¡¥
°ì¤Ä¤Ë¤Ï¡¤¤½¤ì¤¬¶²¤í¤·¤¯Âª¤¨¤Å¤é¤¤¥Ð¥°¤ò¾·¤¤¤¿¤³¤È¤¬¤¢¤ë¡¥
¤·¤«¤·¥ì¥­¥·¥«¥ë¥¹¥³¡¼¥×¤Ï¥Ð¥°²óÈò¤ÎÊýË¡ÄøÅÙ¤Î¤â¤Î¤Ç¤Ï¤Ê¤¤¡¥
¼¡¾Ï¤Ç¸«¤ë¤è¤¦¤Ë¡¤¤½¤ì¤Ë¤è¤Ã¤Æ´ö¤Ä¤«¤Î¿·¤·¤¤¥×¥í¥°¥é¥ß¥ó¥°µ»Ë¡¤¬²ÄÇ½¤Ë¤Ê¤ë¡¥
%}}}
\subsection{¥¯¥í¡¼¥¸¥ã} %{{{
Common Lisp¤¬¥ì¥­¥·¥«¥ë¥¹¥³¡¼¥×¤ò»ý¤Ä¤»¤¤¤Ç¡¤
¥Õ¥ê¡¼ÊÑ¿ô¤òÃæ¤Ë´Þ¤à´Ø¿ô¤òÄêµÁ¤·¤¿¤È¤­¤Ë¤Ï¡¤
½èÍý·Ï¤Ï¤½¤Î´Ø¿ô¤¬ÄêµÁ¤µ¤ì¤¿»þÅÀ¤Ç¤Î¤½¤ì¤é¤ÎÊÑ¿ô¤ÎÂ«Çû¤ò¥³¥Ô¡¼¤·¤ÆÊÝÂ¸¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
´Ø¿ô¤ÈÊÑ¿ôÂ«Çû¤Î°ì¼°¤Î¤½¤Î¤è¤¦¤ÊÁÈ¤ß¹ç¤ï¤»¤Ï\emph{¥¯¥í¡¼¥¸¥ã}¤È¸Æ¤Ð¤ì¤ë¡¥
¥¯¥í¡¼¥¸¥ã¤ÏÂ¿ÊýÌÌ¤Î±þÍÑ¤Ë¤ª¤¤¤ÆÊØÍø¤Ê¤â¤Î¤À¤ÈÊ¬¤«¤ë¤À¤í¤¦¡¥

¥¯¥í¡¼¥¸¥ã¤ÏCommon Lisp¤ÎÃæ¤Ë¹­¤¯¿»Æ©¤·¤Æ¤¤¤ë¤Î¤Ç¡¤
¤½¤ì¤È¤Ï°Õ¼±¤¹¤ë¤³¤È¤µ¤¨¤Ê¤¯»È¤¦¤³¤È¤¬¤Ç¤­¤ë¡¥
\verb@mapcar@¤Ë¥Õ¥ê¡¼ÊÑ¿ô¤ò´Þ¤à$\lambda$¼°¤ò¥·¥ã¡¼¥×¥¯¥©¡¼¥È¤·¤ÆÍ¿¤¨¤ëÅÙ¡¤
¥æ¡¼¥¶¤Ï¥¯¥í¡¼¥¸¥ã¤ò»È¤Ã¤Æ¤¤¤ë¤Î¤À¡¥
Îã¤¨¤Ð¡¤¿ô¤Î¥ê¥¹¥È¤ò¼è¤ê¡¤¤¢¤ë¿ô¤ò¤½¤ì¤¾¤ì¤Ë²Ã¤¨¤ë´Ø¿ô¤ò½ñ¤­¤¿¤¤¤È¤·¤è¤¦¡¥
¤³¤Î´Ø¿ô\verb@list+@
\begin{verbatim}
(defun list+ (lst n)
  (mapcar #'(lambda (x) (+ x n))
          lst))
\end{verbatim}
¤¬Ë¾¤ß¤ÎÆ°ºî¤ò¤·¤Æ¤¯¤ì¤ë¡§
\begin{verbatim}
> (list+ '(1 2 3) 10)
(11 12 13)
\end{verbatim}
\verb@list+@ ¤ÎÃæ¤Ç\verb@mapcar@¤ËÅÏ¤µ¤ì¤ë´Ø¿ô¤ò¤è¤¯¸«¤ì¤Ð¡¤
¤½¤ì¤¬¼ÂºÝ¥¯¥í¡¼¥¸¥ã¤À¤ÈÊ¬¤«¤ë¡¥
\verb@n@¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤Ï¥Õ¥ê¡¼¤Ç¡¤¤½¤ÎÂ«Çû¤Ï¼þ¤ê¤Î´Ä¶­¤«¤éÍè¤Æ¤¤¤ë¡¥
¥ì¥­¥·¥«¥ë¥¹¥³¡¼¥×¤Î²¼¤Ç¤Ï¡¤
¤½¤Î¤è¤¦¤ÊÂÐ±þÉÕ¤±´Ø¿ô¤ò»È¤¦ÅÙ¤Ë¥¯¥í¡¼¥¸¥ã¤¬ºî¤é¤ì¤Æ¤¤¤ë
\footnote{¥À¥¤¥Ê¥ß¥Ã¥¯¥¹¥³¡¼¥×¤Î²¼¤Ç¤â¡¤
\texttt{mapcar}¤Î²¾°ú¿ô¤¬¤É¤ì¤â\texttt{x}¤È¤¤¤¦Ì¾¤ò»ý¤¿¤Ê¤¤¸Â¤êÆ±¤¸ÎãÊ¸¤¬µ¡Ç½¤¹¤ë¤¬¡¤
¤½¤ÎÍýÍ³¤Ï°Û¤Ê¤ë¡¥}¡¥

Abelson¤ÈSussman¤Î¸ÅÅµ\emph{Structure and Interpretation of Computer
Programs}\note{WizardBook}¤Ë¤è¤Ã¤Æ¾©¤á¤é¤ì¤¿¥×¥í¥°¥é¥ß¥ó¥°¡¦¥¹¥¿¥¤¥ë¤Ç¤Ï¡¤
¥¯¥í¡¼¥¸¥ã¤Ï¤µ¤é¤Ë¸²Ãø¤ÊÌò¤òÃ´¤Ã¤Æ¤¤¤ë¡¥
¥¯¥í¡¼¥¸¥ã¤Ï¥í¡¼¥«¥ë¤Ê¾õÂÖ¤ò»ý¤Ã¤¿´Ø¿ô¤Ç¤¢¤ë¤È¤µ¤ì¤ë¡¥
¤³¤Î¾õÂÖ¤ò»È¤¦Îã¤ÎºÇ¤âÃ±½ã¤Ê¤â¤Î¤Ï¼¡¤Î¤è¤¦¤Ê¾õ¶·¤À¡§
\begin{verbatim}
(let ((counter 0))
  (defun new-id () (incf counter))
  (defun reset-id () (setq counter 0)))
\end{verbatim}
¤³¤ì¤é2¸Ä¤Î´Ø¿ô¤Ï¥«¥¦¥ó¥¿¤È¤·¤ÆÆ¯¤¯ÊÑ¿ô¤ò¶¦Í­¤·¤Æ¤¤¤ë¡¥
1¸ÄÌÜ¤Ï¥«¥¦¥ó¥¿¤ò1Áý¤ä¤·¤Æ¤½¤ÎÃÍ¤òÊÖ¤·¡¤2¸ÄÌÜ¤Ï¥«¥¦¥ó¥¿¤ò0¤Ë¥ê¥»¥Ã¥È¤¹¤ë¡¥
¥«¥¦¥ó¥¿¤ò¥°¥í¡¼¥Ð¥ëÊÑ¿ô¤È¤¹¤ë¤³¤È¤ÇÆ±¤¸¤³¤È¤¬¼Â¸½¤Ç¤­¤ë¤¬¡¤
¤³¤ÎÊýË¡¤Ç¤Ï¥«¥¦¥ó¥¿¤Ï°Õ¿Þ¤·¤Ê¤¤»²¾È¤«¤é¼é¤é¤ì¤Æ¤¤¤ë¡¥
¥í¡¼¥«¥ë¤Ê¾õÂÖ¤ò»ý¤Ä´Ø¿ô¤òÊÖ¤»¤ë¤Î¤ÏÊØÍø¤Ç¤â¤¢¤ë¡¥
Îã¤¨¤Ð¡¤´Ø¿ô\verb@make-adder@
\begin{verbatim}
(defun make-adder (n)
  #'(lambda (x) (+ x n)))
\end{verbatim}
¤Ï¿ô¤ò¼è¤ê¡¤¡Ö¸Æ¤Ð¤ì¤ë¤È°ú¿ô¤Ë¤½¤Î¿ô¤ò²Ã¤¨¤ë¥¯¥í¡¼¥¸¥ã¡×¤òÊÖ¤¹¡¥
¤½¤ÎÂ­¤·»»´Ø¿ô¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤Ï´ö¤é¤Ç¤âºî¤ë¤³¤È¤¬¤Ç¤­¤ë¡§
\begin{verbatim}
> (setq add2 (make-adder 2)
        add10 (make-adder 10))
#<Interpreted-Function BF162E>
> (funcall add2 5)
7
> (funcall add10 3)
13
\end{verbatim}
\verb@make-adder@¤ËÊÖ¤µ¤ì¤¿¥¯¥í¡¼¥¸¥ã¤Ç¤ÏÆâÉô¾õÂÖ¤¬¸ÇÄê¤µ¤ì¤Æ¤¤¤ë¤¬¡¤
¾õÂÖ¤òÊÑ²½¤µ¤»¤é¤ì¤ë¥¯¥í¡¼¥¸¥ã¤òºî¤ë¤³¤È¤â¤Ç¤­¤ë¡¥
\begin{verbatim}
(defun make-adderb (n)
  #'(lambda (x &optional change)
      (if change
          (setq n x)
          (+ x n))))
\end{verbatim}
¾å¤Î¿·¥ô¥¡¡¼¥¸¥ç¥ó¤Î\verb@make-adder@¤¬ÊÖ¤¹¥¯¥í¡¼¥¸¥ã¤Ï¡¤
1¸Ä¤Î°ú¿ô¤Ç¸Æ¤Ð¤ì¤¿¤È¤­¤Ë¤Ï¸Å¤¤¤â¤Î¤ÈÁ´¤¯Æ±¤¸Æ°ºî¤ò¤¹¤ë¡§
\begin{verbatim}
> (setq addx (make-adderb 1))
#<Interpreted-Function BF1C66>
> (funcall addx 3)
4
\end{verbatim}
¤·¤«¤·¿·¤·¤¤Â­¤·»»´Ø¿ô¤¬Èónil¤ÎÂè2°ú¿ô¤È¶¦¤Ë¸Æ¤Ð¤ì¤ë¤È¡¤
ÆâÉô¤Ë¤¢¤ë\verb@n@¤Î¥³¥Ô¡¼¤ÏÂè1°ú¿ô¤È¤·¤ÆÅÏ¤µ¤ì¤¿ÃÍ¤Ë¥ê¥»¥Ã¥È¤µ¤ì¤ë¡§
\begin{verbatim}
> (funcall addx 100 t)
100
> (funcall addx 3)
103
\end{verbatim}
Æ±¤¸¥Ç¡¼¥¿¡¦¥ª¥Ö¥¸¥§¥¯¥È¤ò¶¦Í­¤¹¤ë¥¯¥í¡¼¥¸¥ã¤Î¥°¥ë¡¼¥×¤òÊÖ¤¹¤³¤È¤µ¤¨²ÄÇ½¤À¡¥
Âè\ref{fig:PrimitivDatebase}¿Þ¤Ë¤Ï½éÊâÅª¥Ç¡¼¥¿¥Ù¡¼¥¹¤òºî¤ë´Ø¿ô¤ò¼¨¤·¤¿¡¥
¤½¤ì¤ÏÏ¢ÁÛ¥ê¥¹¥È(\verb@db@)¤ò¼è¤ê¡¤¤½¤ì¤¾¤ì¥¨¥ó¥È¥ê¤Î¥¯¥¨¥ê¡¤ÄÉ²Ã¡¤ºï½ü¤ò¹Ô¤¦
3¸Ä¤Î¥¯¥í¡¼¥¸¥ã¤Î¥ê¥¹¥È¤òÊÖ¤¹¡¥
\verb@make-dbms@¤ò¸Æ¤Ó½Ð¤¹ÅÙ¡¤
Ï¢ÁÛ¥ê¥¹¥È¤Î¼«Ê¬ÀìÍÑ¤Î¥³¥Ô¡¼¤òÆâÉô¤Ç¶¦Í­¤¹¤ë¿·¤·¤¤´Ø¿ô¤ÎÁÈ¤¬ÊÖ¤µ¤ì¤ë¡¥
\begin{verbatim}
> (setq cities (make-dbms '((boston . us) (paris . france))))
(#<Interpreted-Function 8022E7>
 #<Interpreted-Function 802317>
 #<Interpreted-Function 802347>)
\end{verbatim}

\begin{figure}\begin{center}\begin{FramedVerb}
(defun make-dbms (db)
  (list
    #'(lambda (key)
        (cdr (assoc key db)))
    #'(lambda (key val)
        (push (cons key val) db)
        key)
    #'(lambda (key)
        (setf db (delete key db :key #'car))
        key)))
\end{FramedVerb}\end{center}
\caption{3¸Ä¤Î¥¯¥í¡¼¥¸¥ã¤¬¥ê¥¹¥È¤ò¶¦Í­¤¹¤ëÎã¡¥}
\label{fig:PrimitivDatebase}
\end{figure}

¥Ç¡¼¥¿¥Ù¡¼¥¹Æâ¤Î¼ÂºÝ¤ÎÏ¢ÁÛ¥ê¥¹¥È¤Ï¡¤³°¤«¤é¤Ï¸«¤¨¤Ê¤¤¡¥
¤½¤ì¤É¤³¤í¤«¡¤¤½¤ì¤¬Ï¢ÁÛ¥ê¥¹¥È¤Ê¤Î¤«¤É¤¦¤«¤âÊ¬¤«¤é¤Ê¤¤¡¥
¤·¤«¤·¤½¤ì¤Ï\verb@cities@¤Î¥³¥ó¥Ý¡¼¥Í¥ó¥È¤Ç¤¢¤ë´Ø¿ô¤òÄÌ¤¸¤ÆÅþÃ£¤Ç¤­¤ë¡§
\begin{verbatim}
> (funcall (car cities) 'boston)
US
> (funcall (second cities) 'london 'england)
LONDON
> (funcall (car cities) 'london)
ENGLAND
\end{verbatim}
¥ê¥¹¥È¤Î\verb@car@¤ò¸Æ¤Ö¤Î¤Ï¾¯¤·³Ê¹¥°­¤¤¡¥
¼ÂºÝ¤Î¥×¥í¥°¥é¥à¤Ç¤Ï¡¤¥¢¥¯¥»¥¹´Ø¿ô¤Ï¹½Â¤ÂÎ¤Î¥¨¥ó¥È¥ê¤Ç¤â¤¤¤¤¤«¤â¤·¤ì¤Ê¤¤¡¥
¤½¤ì¤é¤ò»È¤¦¤È¤µ¤é¤Ë´Ê·é¤Ë¤Ê¤ë¤À¤í¤¦¡¥
¥Ç¡¼¥¿¥Ù¡¼¥¹¤Ï¼¡¤Î¤è¤¦¤Ê´Ø¿ô
\begin{verbatim}
(defun lookup (key db)
  (funcall (car db) key))
\end{verbatim}
¤«¤é´ÖÀÜÅª¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ë¡¥
¤·¤«¤·¡¤¥¯¥í¡¼¥¸¥ã¤Î´ðËÜÅª¤ÊÆ°ºî¤Ï¤½¤¦¤¤¤Ã¤¿¥Á¥å¡¼¥Ë¥ó¥°¤È¤ÏÌµ´Ø·¸¤À¡¥
¼ÂºÝ¤Î¥×¥í¥°¥é¥à»È¤ï¤ì¤ë¥¯¥í¡¼¥¸¥ã¤È¥Ç¡¼¥¿¹½Â¤¤Ï¡¤
\verb@make-adder@¤ä\verb@make-dbms@¤Ç¸«¤¿¤â¤Î¤è¤ê¼ê¤Î¹þ¤ó¤À¤â¤Î¤À¤í¤¦¡¥
¶¦Í­¤µ¤ì¤Æ¤¤¤ëÊÑ¿ô¤Ï1¸Ä¤À¤Ã¤¿¤¬¡¤´ö¤Ä¤ËÁý¤ä¤·¤Æ¤â¤è¤¯¡¤
¤½¤ì¤¾¤ì¤Ï¤É¤Î¤è¤¦¤Ê¥Ç¡¼¥¿¹½Â¤¤Ë¤âÂ«Çû¤Ç¤­¤ë¡¥
¥¯¥í¡¼¥¸¥ã¤ÏLisp¤ÎÄ¹½ê¤Î¤¦¤Á¸²Ãø¤ÇÌÀÇò¤Ê¤â¤Î¤Î°ì¤Ä¤À¡¥
Lisp¥×¥í¥°¥é¥à¤ÎÃæ¤Ë¤Ï¡¤
ÅØÎÏ¤¹¤ì¤ÐÎÏ¤Î¼å¤¤¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ËËÝÌõ¤Ç¤­¤ë¤â¤Î¤â¤¢¤ë¤«¤â¤·¤ì¤Ê¤¤¡¥
¤·¤«¤·¾å¤Î¤è¤¦¤Ê¥¯¥í¡¼¥¸¥ã¤ò»È¤¦¥×¥í¥°¥é¥à¤òËÝÌõ¤·¤è¤¦¤È¤·¤Æ¤ß¤ì¤Ð¡¤
¤³¤ÎÃê¾Ý²½¹½Â¤¤¬¤É¤ìÄøÏ«ÎÏ¤ÎÀáÌó¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤«ÌÀ¤é¤«¤Ë¤Ê¤ë¤À¤í¤¦¡¥
¸å¤Î¾Ï¤Ç¤Ï¥¯¥í¡¼¥¸¥ã¤ò¤µ¤é¤Ë¾ÜºÙ¤Ë°·¤¦¡¥
Âè5¾Ï¤Ç¤Ï¡¤¤½¤ì¤é¤ò»È¤Ã¤ÆÊ£¹çÅª¤Ê´Ø¿ô¤òºî¤ëÊýË¡¤ò¼¨¤¹¡¥
Âè6¾Ï¤Ç¤Ï¡¤ÅÁÅýÅª¥Ç¡¼¥¿¹½Â¤¤ÎÂå¤ï¤ê¤È¤·¤Æ¤Î»ÈÍÑË¡¤ò¸«¤ë¡¥
%}}}
\subsection{¥í¡¼¥«¥ë´Ø¿ô}   %{{{
$\lambda$¼°¤Ç´Ø¿ô¤òÄêµÁ¤·¤¿¤È¤­¡¤\verb@defun@¤Ç¤ÏÊ¬¤«¤é¤Ê¤«¤Ã¤¿À©¸Â¤ËÄ¾ÌÌ¤¹¤ë¡§
$\lambda$¼°¤ÇÄêµÁ¤·¤¿´Ø¿ô¤Ë¤ÏÌ¾Á°¤¬¤Ê¤¯¡¤¤½¤Î¤¿¤á¤Ë¤½¤ì¼«¿È¤ò»²¾È¤¹¤ëÊýË¡¤¬¤Ê¤¤¡¥
¤³¤Î¤³¤È¤Ï¡¤Common Lisp¤Ç¤ÏºÆµ¢´Ø¿ô¤òÄêµÁ¤¹¤ë¤Î¤Ë$\lambda$¼°¤¬»È¤¨¤Ê¤¤¤È¤¤¤¦¤³¤È¤À¡¥
¤¢¤ë´Ø¿ô¤ò¥ê¥¹¥È¤ÎÍ×ÁÇÁ´¤Æ¤ËÅ¬ÍÑ¤·¤¿¤¤¤È¤­¤Ï¡¤
Lisp¤Î´·ÍÑË¡¤Î¤¦¤ÁºÇ¤â¿Æ¤·¤ß¿¼¤¤¤â¤Î¤ò»È¤¦¡§
\begin{verbatim}
> (mapcar #'(lambda (x) (+ 2 x))
          '(2 5 7 3))
(4 7 9 5)
\end{verbatim}
\verb@mapcar@¤ÎÂè1°ú¿ô¤ËºÆµ¢´Ø¿ô¤òÍ¿¤¨¤¿¤¤¤È¤­¤Ë¤Ï¤É¤¦¤¹¤ì¤Ð¤¤¤¤¤Î¤À¤í¤¦¤«¡©
¤½¤Î´Ø¿ô¤¬\verb@defun@¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤¿¤é¡¤
¤¿¤À´Ø¿ô¤ÎÌ¾Á°¤Ë¤è¤Ã¤Æ¤½¤ì¤ò»²¾È¤¹¤ì¤Ð¤¤¤¤¡§
\begin{verbatim}
> (mapcar #'copy-tree '((a b) (c d e)))
((A B) (C D E))
\end{verbatim}
¤·¤«¤·»È¤¦´Ø¿ô¤¬¡¤\verb@mapcar@¤ÎÂ¸ºß¤¹¤ë´Ä¶­¤«¤é
´ö¤Ä¤«¤ÎÂ«Çû¤ò°ú¤­·Ñ¤°¤è¤¦¤Ê¥¯¥í¡¼¥¸¥ã¤Ç¤Ê¤¯¤Æ¤Ï¤¤¤±¤Ê¤¤¤È¤·¤è¤¦¡¥
Îã¤Ëµó¤²¤¿\verb@list+@
\begin{verbatim}
(defun list+ (lst n)
  (mapcar #'(lambda (x) (+ x n))
          lst))
\end{verbatim}
¤Ç¤Ï\verb@mapcar@¤Ø¤ÎÂè1°ú¿ô \verb@#'(lambda (x) (+ x n))@¤Ï
\verb@list+@ Æâ¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¡¥
¤½¤ì¤Ï\verb@n@¤ÎÂ«Çû¤òÂª¤¨¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¤«¤é¤À¡¥
¤½¤³¤Þ¤Ç¤Ï¤¤¤¤¤¬¡¤¥í¡¼¥«¥ë¤ÊÂ«Çû¤òÉ¬Í×¤È¤·¡¤
¤«¤ÄºÆµ¢Åª¤Ê´Ø¿ô¤ò\verb@mapcar@¤ËÍ¿¤¨¤¿¤¤¤È¤·¤¿¤é¤É¤¦¤À¤í¤¦¡©
¥í¡¼¥«¥ë¤ÊÂ«Çû¤¬É¬Í×¤À¤«¤é¡¤ÊÌ¤Î¾ì½ê¤Ç\verb@defun@¤ÇÄêµÁ¤µ¤ì¤¿´Ø¿ô¤Ï»È¤¨¤Ê¤¤¡¥
¤Þ¤¿$\lambda$¼°¤ÇºÆµ¢´Ø¿ô¤òÄêµÁ¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡¥
¤½¤Î´Ø¿ô¤Ë¤Ï¼«Ê¬¼«¿È¤ò»²¾È¤¹¤ëÊýË¡¤¬¤Ê¤¤¤«¤é¤À¡¥
¤³¤Î¥¸¥ì¥ó¥Þ¤ò²ò·è¤¹¤ë¤¿¤á¡¤Common Lisp¤Ë¤Ï\verb@labels@¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤ë¡¥
1ÅÀ¤Î½ÅÍ×¤ÊÎ±ÊÝ¤ò½ü¤­¡¤\verb@labels@¤Ï´Ø¿ô¤ËÂÐ¤¹¤ë°ì¼ï¤Î\verb@let@¤È¤·¤ÆÀâÌÀ¤Ç¤­¤ë¡¥
\verb@labels@¼°¤ÎÃæ¤ÎÂ«Çû»ØÄêÉô¤Ï¡¤¤½¤ì¤¾¤ì¼¡¤Î¤è¤¦¤Ê·Á¤Ë¤Ê¤ë¡§\\[1.5ex]
\verb@(@$\langle$Ì¾Á°$\rangle~\langle$²¾°ú¿ô$\rangle$
\verb@.@ $\langle$ËÜÂÎ$\rangle$\verb@)@\\[1.5ex]
\verb@labels@¼°¤ÎÃæ¤Ç¤Ï¡¤
\verb@name@¤Ï¼¡¤Î¤è¤¦¤Ê´Ø¿ô¤ÈÅù²Á¤Ê´Ø¿ô¤ò»²¾È¤¹¤ë¡§\\[1.5ex]
\verb@(lambda@ $\langle$²¾°ú¿ô$\rangle$ \verb@.@ $\langle$ËÜÂÎ$\rangle$\verb@)@\\[1.5ex]
Îã¤òµó¤²¤è¤¦¡§
\begin{verbatim}
> (labels ((inc (x) (1+ x)))
          (inc 3))
4
\end{verbatim}
¤·¤«¤·\verb@let@¤È\verb@labels@¤Ë¤Ï½ÅÍ×¤Ê°ã¤¤¤¬¤¢¤ë¡¥
\verb@let@¼°¤ÎÃæ¤Ç¤Ï¡¤
¤¢¤ëÊÑ¿ô¤ÎÃÍ¤ÏÆ±¤¸\verb@let@¤Çºî¤é¤ì¤¿ÊÌ¤ÎÊÑ¿ô¤Ë°ÍÂ¸¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡¥¤Ä¤Þ¤ê
\begin{verbatim}
(let ((x 10) (y x))    ;;¸í¤ê
  y)
\end{verbatim}
¤È¤·¤Æ¡¤¿·¤·¤¤\verb@y@¤ÎÃÍ¤¬¿·¤·¤¤\verb@x@¤ÎÃÍ¤òÈ¿±Ç¤¹¤ë¤³¤È¤ò´üÂÔ¤·¤Æ¤âÂÌÌÜ¤Ê¤Î¤À¡¥
¤½¤ì¤ËÂÐ¤·¡¤\verb@labels@¼°¤ÎÃæ¤ÇÄêµÁ¤µ¤ì¤¿´Ø¿ô\verb@f@¤ÎËÜÂÎ¤Ç¤Ï¡¤
¤½¤³¤ÇÄêµÁ¤µ¤ì¤¿¤É¤Î´Ø¿ô¤ò»²¾È¤·¤Æ¤â¤¤¤¤¡¥
¤½¤ì¤Ï\verb@f@¼«¿È¤Ç¤â¤è¤¯¡¤¤ª¤«¤²¤ÇºÆµ¢´Ø¿ô¤ÎÄêµÁ¤¬²ÄÇ½¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥
\verb@labels@¤ò»È¤Ã¤Æ\verb@list+@ ¤Ë»÷¤¿´Ø¿ô¤ò½ñ¤±¤ë¤¬¡¤
¤³¤Á¤é¤Ç¤Ï\verb@mapcar@¤Ø¤ÎÂè1°ú¿ô¤¬ºÆµ¢´Ø¿ô¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡§
\begin{verbatim}
(defun count-instances (obj lsts)
  (labels ((instances-in (lst)
             (if (consp lst)
                 (+ (if (eq (car lst) obj) 1 0)
                    (instances-in (cdr lst)))
                 0)))
    (mapcar #'instances-in lsts)))
\end{verbatim}
¤³¤Î´Ø¿ô¤Ï1¸Ä¤Î¥ª¥Ö¥¸¥§¥¯¥È¤È1¸Ä¤Î¥ê¥¹¥È¤ò¼è¤ê¡¤
¤½¤Î¥ê¥¹¥È¤ÎÍ×ÁÇÆâ¤Ë¥ª¥Ö¥¸¥§¥¯¥È¤¬²¿¸Ä¤¢¤Ã¤¿¤«¤Î²ó¿ô¤Î¥ê¥¹¥È¤òÊÖ¤¹¡§
\begin{verbatim}
> (count-instances 'a '((a b c) (d a r p a) (d a r) (a a)))
(1 2 1 2)
\end{verbatim}
%}}}
\subsection{ËöÈøºÆµ¢}   %{{{
ºÆµ¢´Ø¿ô¤È¤Ï¼«Ê¬¼«¿È¤ò¸Æ¤Ó½Ð¤¹´Ø¿ô¤À¡¥
¤½¤·¤Æ´Ø¿ô¸Æ¤Ó½Ð¤·¤Î¸å¤Ë¹Ô¤¦¤Ù¤­ºî¶È¤¬»Ä¤Ã¤Æ¤¤¤Ê¤±¤ì¤Ð¡¤
¤½¤Î¸Æ¤Ó½Ð¤·¤Ï\emph{ËöÈøºÆµ¢}¤À¡¥
¼¡¤Î´Ø¿ô¤ÏËöÈøºÆµ¢¤Ç¤Ê¤¤¡¥
\begin{verbatim}
(defun our-length (lst)
  (if (null lst)
      0
      (1+ (our-length (cdr lst)))))
\end{verbatim}
ºÆµ¢¸Æ¤Ó½Ð¤·¤«¤éÌá¤Ã¤¿¸å¡¤·ë²Ì¤ò\verb@1+@ ¤ËÅÏ¤µ¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¤«¤é¤À¡¥
¤·¤«¤·¼¡¤Î´Ø¿ô¤ÏËöÈøºÆµ¢¤À¡¥
\begin{verbatim}
(defun our-find-if (fn lst)
  (if (funcall fn (car lst))
      (car lst)
      (our-find-if fn (cdr lst))))
\end{verbatim}
ºÆµ¢¸Æ¤Ó½Ð¤·¤ÎÃÍ¤¬Â¨ºÂ¤ËÊÖ¤µ¤ì¤Æ¤¤¤ë¤«¤é¤À¡¥
Â¿¤¯¤ÎCommon Lisp¥³¥ó¥Ñ¥¤¥é¤¬ËöÈøºÆµ¢¤Î´Ø¿ô¤ò¥ë¡¼¥×¤ËÊÑ´¹¤Ç¤­¤ë¤Î¤Ç¡¤
ËöÈøºÆµ¢¤ÎÊý¤¬¤¤¤¤¡¥
¤½¤Î¤è¤¦¤Ê¥³¥ó¥Ñ¥¤¥é¤Ç¤Ï¡¤
Í¥Èþ¤ÊºÆµ¢¤ò¥½¡¼¥¹¥³¡¼¥ÉÆâ¤Ç»È¤Ã¤Æ¤â¼Â¹Ô»þ¤Ë´Ø¿ô¸Æ¤Ó½Ð¤·¤Î¥ª¡¼¥ô¥¡¥Ø¥Ã¥É¤ÏÉ¬Í×¤Ê¤¤¡¥
ËöÈøºÆµ¢¤Ë¤¹¤ë¤ÈÂ®ÅÙ¤ÏÂçÄñ¤«¤Ê¤ê¸þ¾å¤¹¤ë¤Î¤Ç¡¤
Lisp¥×¥í¥°¥é¥Þ¤Ï¤É¤ó¤É¤ó´Ø¿ô¤òËöÈøºÆµ¢¤Ë¤·¤è¤¦¤È¤¹¤ë¡¥
ËöÈøºÆµ¢¤Ç¤Ê¤¤´Ø¿ô¤â¤·¤Ð¤·¤ÐËöÈøºÆµ¢¤ËÊÑ´¹¤Ç¤­¤ë¤³¤È¤¬¤¢¤ë¡¥
¤½¤ì¤Ë¤ÏÁíÏÂÊÑ¿ô¤ò»È¤¦¥í¡¼¥«¥ë¤Ê´Ø¿ô¤òËä¤á¹þ¤ó¤Ç¤ä¤ì¤Ð¤¤¤¤¡¥
¤³¤³¤ÇÁíÏÂÊÑ¿ô¤È¤Ï¤½¤ì¤Þ¤Ç¤Ë·×»»¤µ¤ì¤¿ÃÍ¤òÊÝ»ý¤¹¤ë¥Ñ¥é¥á¡¼¥¿¤ò»Ø¤¹¡¥
Îã¤¨¤Ð\verb@our-length@¤Ï¼¡¤Î¤è¤¦¤ËÊÑ´¹¤Ç¤­¤ë¡§
\begin{verbatim}
(defun our-length (lst)
  (labels ((rec (lst acc)
           (if (null lst)
               acc
               (rec (cdr lst) (1+ acc)))))
    (rec lst 0)))
\end{verbatim}
¤³¤³¤Ç¤½¤ì¤Þ¤Ç¤ËÆÉ¤ß¼è¤Ã¤¿¥ê¥¹¥È¤ÎÍ×ÁÇ¤Î¿ô¤Ï¡¤
Âè2²¾°ú¿ô\verb@acc@¤ËÊÝ»ý¤µ¤ì¤Æ¤¤¤ë¡¥
ºÆµ¢¤¬¥ê¥¹¥ÈËöÈø¤Þ¤ÇÃ£¤·¤¿¤È¤­\verb@acc@¤ÎÃÍ¤¬¥ê¥¹¥ÈÁ´ÂÎ¤ÎÄ¹¤µ¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤Î¤Ç¡¤
¤½¤ì¤ò¤½¤Î¤Þ¤ÞÊÖ¤»¤Ð¤¤¤¤¡¥
¸Æ¤Ó½Ð¤·¤Î¥Ä¥ê¡¼¤«¤éÌá¤ëÅÓÃæ¤ÇÃÍ¤òµá¤á¤Æ¤¤¤¯¤Î¤Ç¤Ê¤¯¡¤
¸Æ¤Ó½Ð¤·¤Î¥Ä¥ê¡¼¤ò²¼¤ë¤Ë¤Ä¤ìÃÍ¤òÎßÀÑ¤·¤Æ¤¤¤¯¤³¤È¤Ç¡¤
\verb@rec@¤òËöÈøºÆµ¢¤ËÊÑ¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥

Common Lisp¥³¥ó¥Ñ¥¤¥é¤ÎÂ¿¤¯¤¬ËöÈøºÆµ¢¤ÎºÇÅ¬²½¤ò¹Ô¤¦¤³¤È¤¬¤Ç¤­¤ë¤¬¡¤
¤½¤ì¤éÁ´¤Æ¤¬»Ï¤á¤«¤é¤½¤¦¤¹¤ëÀßÄê¤Ë¤Ê¤Ã¤Æ¤¤¤ëÌõ¤Ç¤Ï¤Ê¤¤¡¥
¤À¤«¤é¼«Ê¬¤Î´Ø¿ô¤òËöÈøºÆµ¢¤Ë½ñ¤­´¹¤¨¤¿¤é¡¤¥Õ¥¡¥¤¥ë¤ÎÀèÆ¬¤Ë
\begin{verbatim}
(proclaim '(optimize speed))
\end{verbatim}
¤ÈÉÕ¤±Â­¤·¡¤ÅØÎÏ¤ÎÀ®²Ì¤ò¥³¥ó¥Ñ¥¤¥é¤¬³Î¤«¤Ë³èÍÑ¤Ç¤­¤ë¤è¤¦¤Ë¤¹¤ë¤È¤¤¤¤¤«¤â¤·¤ì¤Ê¤¤
\footnote{Àë¸À\texttt{(optimize speed)}¤Ï\texttt{(optimize (speed 3))}¤Î
¾ÊÎ¬·Á¤ÎÈ¦¤À¤¬¡¤¤¢¤ëCommon Lisp½èÍý·Ï¤ÏÁ°¼Ô¤Ç¤ÏËöÈøºÆµ¢¤ÎºÇÅ¬²½¤ò¤¹¤ë¤Î¤Ë¡¤
¸å¼Ô¤Ç¤Ï¤·¤Ê¤¤¤³¤È¤¬Ê¬¤«¤Ã¤Æ¤¤¤ë¡¥}¡¥

ËöÈøºÆµ¢·Á¼°¤È·¿Àë¸À¤òÍ¿¤¨¤é¤ì¤ë¤È¡¤
¸½ºß¤ÎCommon Lisp¥³¥ó¥Ñ¥¤¥é¤ÏC¤ÈÆ±Åù¤«¡¤C¤è¤êÂ®¤¤¥³¡¼¥É¤òÀ¸À®¤Ç¤­¤ë¡¥
Richard Gabriel\note{Gabriel}¤Ë¤è¤ë²¼¤ÎÎã¤Î´Ø¿ô¤Ï¡¤
\verb@1@¤«¤é\verb@n@¤Þ¤Ç¤ÎÀ°¿ô¤ÎÏÂ¤òÊÖ¤¹¡§
\begin{verbatim}
(defun triangle (n)
  (labels ((tri (c n)
                (declare (type fixnum n c))
                (if (zerop n)
                    c
                    (tri (the fixnum (+ n c))
                         (the fixnum (- n 1))))))
    (tri 0 n)))
\end{verbatim}
¹âÂ®¤ÊCommon Lisp¥³¡¼¥É¤Ï¤³¤¦¤¤¤¦·Á¤Ë¤Ê¤ë¡¥
»Ï¤á¤Ï´Ø¿ô¤ò¤³¤Î¤è¤¦¤Ë½ñ¤¯¤Î¤ÏÉÔ¼«Á³¤Ë»×¤¨¤ë¤«¤â¤·¤ì¤Ê¤¤¡¥
»Ï¤á¤Ï´Ø¿ô¤ò¤È¤Ë¤«¤¯°ìÈÖ¼«Á³¤Ë»×¤¨¤ë·Á¤Ç½ñ¤­¡¤
¤½¤Î¸åÉ¬Í×¤¬¤¢¤ì¤ÐÅù²Á¤ÊËöÈøºÆµ¢·Á¼°¤Ë½ñ¤­´¹¤¨¤ë¤Î¤¬¤¤¤¤¡¥
%}}}
\subsection{¥³¥ó¥Ñ¥¤¥ë} %{{{
Lisp¤Î´Ø¿ô¤Ï1¸Ä1¸Ä¤Ç¤â¥Õ¥¡¥¤¥ëÃ±°Ì¤Ç¤â¥³¥ó¥Ñ¥¤¥ë¤Ç¤­¤ë¡¥
¥È¥Ã¥×¥ì¥Ù¥ë¤Ë\verb@defun@¼°¤òÂÇ¤Á¹þ¤à¤À¤±¤À¤È
\begin{verbatim}
> (defun foo (x) (1+ x))
FOO
\end{verbatim}
Â¿¤¯¤Î½èÍý·Ï¤¬ºî¤ë¤Î¤Ï¡Ê¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Æ¤¤¤Ê¤¤¡Ë¥¤¥ó¥¿¥×¥ê¥¿¤ËÆÉ¤ß¹þ¤Þ¤ì¤¿´Ø¿ô¤À¡¥
¤¢¤ë´Ø¿ô¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Æ¤¤¤ë¤«¤É¤¦¤«¤Ï¡¤
¤½¤ì¤ò\verb@compiled-function-p@¤ËÅÏ¤»¤ÐÊ¬¤«¤ë¡§
\begin{verbatim}
> (compiled-function-p #'foo)
NIL
\end{verbatim}
\verb@foo@¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤Ë¤Ï¤½¤ÎÌ¾Á°¤ò\verb@compile@¤ËÍ¿¤¨¤ë¡§
\begin{verbatim}
> (compile 'foo)
FOO
\end{verbatim}
¤³¤ì¤Ï\verb@foo@¤ÎÄêµÁ¤ò¥³¥ó¥Ñ¥¤¥ë¤·¡¤
É¾²Á¤µ¤ì¤¿´Ø¿ô¤ò¥³¥ó¥Ñ¥¤¥ëºÑ¤ß¤Î¤â¤Î¤ËÃÖ¤­´¹¤¨¤ë´Ø¿ô¤À\note{compile}¡¥
\begin{verbatim}
> (compiled-function-p #'foo)
T
\end{verbatim}
¥³¥ó¥Ñ¥¤¥ëºÑ¤ß¤Î´Ø¿ô¤ÈÉ¾²Á¤µ¤ì¤¿´Ø¿ô¤Ï¶¦¤ËLisp¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ç¡¤
°ã¤¦¤Î¤Ï\verb@compiled-function-p@¤òÅ¬ÍÑ¤·¤¿¤È¤­¤Î·ë²Ì¤À¤±¤À¡¥
´Ø¿ô¤òÊ¸»úÄÌ¤ê¤ËÉ½µ­¤·¤¿¤â¤Î¤â¥³¥ó¥Ñ¥¤¥ë¤Ç¤­¤ë¡§
\verb@compile@¤ÏÂè1°ú¿ô¤¬¥³¥ó¥Ñ¥¤¥ë¤¹¤ë´Ø¿ô¤ÎÌ¾Á°¤Ç¤¢¤ë¤³¤È¤ò´üÂÔ¤¹¤ë¤¬¡¤
Âè1°ú¿ô¤Ë\verb@nil@¤òÍ¿¤¨¤ë¤È¡¤Âè2°ú¿ô¤ÇÍ¿¤¨¤é¤ì¤¿$\lambda$¼°¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¡¥
\begin{verbatim}
> (compile nil '(lambda (x) (+ x 2)))
#<Compiled-Function BF55BE>
\end{verbatim}
Ì¾Á°¤È´Ø¿ô¤òÎ¾ÊýÍ¿¤¨¤ë¤È¡¤\verb@compile@¤Ï
\verb@defun@¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤è¤¦¤Ê·Á¤Ë¤Ê¤ë¡§
\begin{verbatim}
> (progn (compile 'bar '(lambda (x) (* x 3)))
(compiled-function-p #'bar))
T
\end{verbatim}
¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ÎÃæ¤Ë¥³¥ó¥Ñ¥¤¥ë¤ÎÌ¿Îá¤¬¤¢¤ë¤È¤¤¤¦¤³¤È¤Ï¡¤
¥×¥í¥°¥é¥à¤¬¼Â¹ÔÃæ¤Ë¿·¤·¤¤´Ø¿ô¤òºî¤Ã¤Æ¥³¥ó¥Ñ¥¤¥ë¤Ç¤­¤ë¤È¤¤¤¦¤³¤È¤À¡¥
¤·¤«¤·\verb@compile@¤òÍÛ¤Ë¸Æ¤Ö¤Î¤Ï¡¤
\verb@eval@¤ò¸Æ¤Ö¤Î¤ËÉ¤Å¨¤¹¤ëÄø²á·ã¤ÊÊýË¡¤Ç¡¤Æ±¤¸¤¯¤é¤¤µ¿¤Ã¤Æ¤«¤«¤ë¤Ù¤­¤À
\footnote{ÍÛ¤Ë\texttt{eval}¤ò¸Æ¤Ö¤Î¤¬¤Ê¤¼¤¤¤±¤Ê¤¤¤«¤Ï¡¤foo¥Ú¡¼¥¸¤ÇÀâÌÀ¤¹¤ë¡¥}¡¥
Âè2.1Àá¤Ç¼Â¹Ô»þ¤Ë´Ø¿ô¤òºî¤ë¤Î¤ÏÉÑÈË¤Ë»È¤ï¤ì¤ë¥×¥í¥°¥é¥ß¥ó¥°µ»Ë¡¤À¤È¸À¤Ã¤¿¤¬¡¤
¤½¤ì¤Ï\verb@make-adder@¤Ëºî¤é¤ì¤¿¿·¤·¤¤¥¯¥í¡¼¥¸¥ãÅù¤ò»Ø¤·¤Æ¤ª¤ê¡¤
À¸¤Î¥ê¥¹¥È¤ËÂÐ¤·¤Æ\verb@compile@¤ò¸Æ¤ó¤Çºî¤Ã¤¿´Ø¿ô¤Î¤³¤È¤Ç¤Ï¤Ê¤¤¡¥
\verb@compile@¤ò¸Æ¤Ö¤Î¤ÏÉÑÈË¤Ë»È¤ï¤ì¤ëµ»Ë¡¤Ç¤Ï¤Ê¤¤\wadash ¤½¤ÎÊýË¡¤ÏÊªÀ¨¤¯´õ¤À¡¥
¤À¤«¤éÉÔÉ¬Í×¤Ë»È¤¦¤Î¤ÏÈò¤±¤ë¤³¤È¡¥
Lisp¤Î¾å¤ËÊÌ¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ò¼ÂÁõ¤¹¤ë¤Î¤Ç¤â¤Ê¤¤¸Â¤ê
¡Ê¤½¤·¤Æ¤½¤Î¾ì¹ç¤Ç¤µ¤¨ÂçÄñ¤Ï¡Ë¡¤É¬Í×¤Ê¤³¤È¤Ï¥Þ¥¯¥í¤ò»È¤¨¤Ð²ÄÇ½¤À¤í¤¦¡¥

2¼ïÎà¤Î´Ø¿ô¤Ï\verb@compile@¤Ë°ú¿ô¤È¤·¤ÆÍ¿¤¨¤ë¤³¤È¤¬¤Ç¤­¤Ê¤¤¡¥
\textsf{CLtL2}¤Ë¤è¤ë¤È¡Êvox¥Ú¡¼¥¸¡Ë¡¤
¡Ö¶õ¤Ç¤Ê¤¤¥ì¥­¥·¥«¥ë´Ä¶­¤Ë¤ª¤¤¤Æ¥¤¥ó¥¿¥×¥ê¥¿Åª¤ËÄêµÁ¤µ¤ì¤¿´Ø¿ô¡×¤À¡¥
¤Ä¤Þ¤ê¥È¥Ã¥×¥ì¥Ù¥ë¤Ç\verb@let@¤ò»È¤Ã¤Æ\verb@foo@¤òÄêµÁ¤¹¤ë¤È
\begin{verbatim}
> (let ((y 2))
(defun foo (x) (+ x y)))
\end{verbatim}
\verb@(compile 'foo)@¤Ë¤Ï°ÕÌ£¤¬¤Ê¤¤
\footnote{¤³¤Î¥³¡¼¥É¤ò¥Õ¥¡¥¤¥ë¤ËÊÝÂ¸¤·¡¤¥Õ¥¡¥¤¥ë¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤Î¤ÏÌäÂê¤Ê¤¤¡¥
À©¸Â¤Ï¼ÂÁõ¾å¤ÎÍýÍ³¤«¤é¡Ö¥¤¥ó¥¿¥×¥ê¥¿Åª¤ËÆÉ¤ß¹þ¤Þ¤ì¤¿¥³¡¼¥É¡×¤È¤¤¤¦ÅÀ¤Ë
ÂÐ¤¹¤ë¤â¤Î¤Ç¡¤°Û¤Ê¤ë¥ì¥­¥·¥«¥ë´Ä¶­¤Ç´Ø¿ô¤òÄêµÁ¤¹¤ë¤³¤È¤Ë²¿¤âÌäÂê¤Ï¤Ê¤¤¡¥}¡¥
¤Þ¤¿´û¤Ë¥³¥ó¥Ñ¥¤¥ëºÑ¤ß¤Î´Ø¿ô¤Ç\verb@compile@¤ò¸Æ¤Ö¤³¤È¤â¤Ç¤­¤Ê¤¤¡¥
¤³¤Î¾õ¶·¤Ë´Ø¤·\textsf{CLtL2}¤ÏÉÔµÈ¤Ê¼¨º¶¤ò¤·¤Æ¤¤¤ë¡¥
Û©¤¯¡¤¡Ö¤½¤Î¤È¤­¤Î·ë²Ì¤Ï¡ÄÉÔÄê¤Ç¤¢¤ë¡¥¡×

Lisp¥³¡¼¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ëÊýË¡¤Ï¡¤ÉáÄÌ¡¤
´Ø¿ô¤ò¸ÄÊÌ¤Ë\verb@compile@¤Ç¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤Î¤Ç¤Ê¤¯¡¤
¥Õ¥¡¥¤¥ëÁ´ÂÎ¤ò\verb@compile-file@¤Ç¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤³¤È¤À¡¥
¤³¤Î´Ø¿ô¤Ï¥Õ¥¡¥¤¥ëÌ¾¤ò¼è¤ê¡¤¥½¡¼¥¹¥Õ¥¡¥¤¥ë¤Î¥³¥ó¥Ñ¥¤¥ëºÑ¤ß¤Î¤â¤Î¤òÂ¤¤ê½Ð¤¹¡¥
¥Õ¥¡¥¤¥ëÌ¾ËÜÂÎ¤ÏÆ±¤¸¤Ç³ÈÄ¥»Ò¤¬°ã¤¦¡¤¤È¤¤¤¦¤Î¤¬Åµ·¿Åª¤Ê¤â¤Î¤À¡¥
¥³¥ó¥Ñ¥¤¥ëºÑ¤ß¥Õ¥¡¥¤¥ë¤¬ÆÉ¤ß¹þ¤Þ¤ì¤ë¤È¡¤
\verb@compiled-function-p@¤Ï¤½¤Î¥Õ¥¡¥¤¥ë¤ÇÄêµÁ¤µ¤ì¤¿Á´¤Æ¤Î´Ø¿ô¤Ë¿¿¤òÊÖ¤¹È¦¤À¡¥
¸å¤Î¾Ï¤Ç¤Ï¡¤¥³¥ó¥Ñ¥¤¥ë¤ÎÊÌ¤Î¸ú²Ì¤ò»È¤Ã¤Æ¤¤¤ë¡§
¤¢¤ë´Ø¿ô¤¬ÊÌ¤Î´Ø¿ôÆâ¤Çºî¤é¤ì¡¤³°Â¦¤Î´Ø¿ô¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë¤È¡¤
ÆâÂ¦¤Î´Ø¿ô¤â¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë¡¥
\textsf{CLtL2}¤Ç¤Ï¤³¤¦¤Ê¤ë¤È¤ÏÌÀµ­¤·¤Æ¤¤¤Ê¤¤¤è¤¦¤À¤¬¡¤
¤Á¤ã¤ó¤È¤·¤¿½èÍý·Ï¤Ç¤Ï¤³¤¦¤Ê¤ëÈ¦¤È¹Í¤¨¤Æ¤¤¤¤¡¥

ÆâÉô¤Î´Ø¿ô¤Î¥³¥ó¥Ñ¥¤¥ë¤ÎÌäÂê¤Ï¡¤´Ø¿ô¤òÊÖ¤¹´Ø¿ô¤ò»È¤¦¤ÈÌÀ¤é¤«¤Ë¤Ê¤ë¡¥
\verb@make-adder@¡Êfoo¥Ú¡¼¥¸¡Ë¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë¤È¡¤
¤½¤ì¤¬ÊÖ¤¹´Ø¿ô¤â¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Æ¤¤¤ë¡§
\begin{verbatim}
> (compile 'make-adder)
MAKE-ADDER
> (compiled-function-p (make-adder 2))
T
\end{verbatim}
¸å¤Î¾Ï¤Ç¸«¤ë¤è¤¦¤Ë¡¤¤³¤Î»ö¼Â¤ÏËä¤á¹þ¤ß¸À¸ì¤Î¼ÂÁõ¤Ë¤ª¤¤¤ÆÂçÊÑ½ÅÍ×¤À¡¥
¿·¤·¤¤¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤¬¥³¡¼¥ÉÊÑ´¹¤Ë¤è¤Ã¤Æ¼ÂÁõ¤µ¤ì¤Æ¤¤¤ë¤È¤­¡¤
ÊÑ´¹¤ò»Ê¤ë¥³¡¼¥É¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë¤È¡¤¤½¤ì¤Ï¥³¥ó¥Ñ¥¤¥ëºÑ¤ß¥³¡¼¥É¤òÀ¸À®¤¹¤ë¡¥
¤½¤·¤Æ¿·¤·¤¤¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Î¤¿¤á¤Î¥³¥ó¥Ñ¥¤¥é¤Ç¤½¤ÎÌäÂê¤¬ÌÀ¤é¤«¤Ë¤Ê¤ë¡¥
¡Ê´ÊÃ±¤ÊÎã¤òbaz¥Ú¡¼¥¸¤ÇÀâÌÀ¤·¤¿¡¥¡Ë

¤«¤Ê¤ê¾®¤µ¤¤´Ø¿ô¤òÄêµÁ¤·¤¿¤È¤­¤Ï¡¤¤½¤ì¤ò¥¤¥ó¥é¥¤¥ó¤Ç¥³¥ó¥Ñ¥¤¥ë¤·¤Æ¤Û¤·¤¤¤³¤È¤¬¤¢¤ë¡¥
¤½¤¦¤·¤Ê¤¤¤È¸Æ¤Ó½Ð¤·µ¡¹½¤Ë´Ø¿ô¼«ÂÎ¤è¤ê¤âÂ¿¤¯¤Î¼ê´Ö¤¬¤«¤«¤Ã¤Æ¤·¤Þ¤¦¡¥
´Ø¿ô¤òÄêµÁ¤·¤Æ
\begin{verbatim}
(defun 50th (lst) (nth 49 lst))
\end{verbatim}
¥¤¥ó¥é¥¤¥óÀë¸À¤ò¤¹¤ë¤È
\begin{verbatim}
(proclaim '(inline 50th))
\end{verbatim}
¥³¥ó¥Ñ¥¤¥ëºÑ¤ß´Ø¿ôÆâ¤Ç¤Î\verb@50th@¤Ø¤Î»²¾È¤Ë¤Ï¼ÂºÝ¤Î´Ø¿ô¸Æ¤Ó½Ð¤·¤¬Í×¤é¤Ê¤¯¤Ê¤ë¡¥
¤³¤Î¤È¤­\verb@50th@¤ò¸Æ¤Ó½Ð¤¹´Ø¿ô¤òÄêµÁ¤·¤Æ¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤È
\begin{verbatim}
(defun foo (lst)
  (+ (50th lst) 1))
\end{verbatim}
\verb@50th@¤Î¥³¡¼¥É¤Ï¤½¤ÎÃæ¤Ë¤½¤Î¤Þ¤ÞÁÈ¤ßÆþ¤ì¤é¤ì¤ë¡¥
¤¹¤ë¤ÈºÇ½é¤Î½ê¤Ç¼¡¤Î¤è¤¦¤Ë½ñ¤¤¤¿¤«¤Î¤è¤¦¤Ê·ë²Ì¤Ë¤Ê¤ë¡§
\begin{verbatim}
(defun foo (lst)
  (+ (nth 49 lst) 1))
\end{verbatim}
¥¤¥ó¥é¥¤¥ó´Ø¿ô¤Î·çÅÀ¤Ï¡¤
\verb@50th@¤òÄêµÁ¤·Ä¾¤·¤¿¤È¤­¤Ë¤Ï\verb@foo@¤òºÆ¥³¥ó¥Ñ¥¤¥ë¤·¤Ê¤¯¤Æ¤Ï¤¤¤±¤Ê¤¤¤³¤È¤À¡¥
¤½¤¦¤·¤Ê¤¤¤È\verb@foo@¤Ï\verb@50th@¤Î¸Å¤¤ÄêµÁ¤òÈ¿±Ç¤·¤¿¤Þ¤Þ¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤¦¡¥
¥¤¥ó¥é¥¤¥ó´Ø¿ô¤ËÂÐ¤¹¤ëÀ©¸Â¤Ï¡¤¥Þ¥¯¥í¤ËÂÐ¤¹¤ë¤â¤Î¤È´ðËÜÅª¤ËÆ±¤¸¤À
¡ÊÂèfoo¾Ï¤ò»²¾È¡Ë\note{inline}¡¥
%}}}
\subsection{¥ê¥¹¥È¤«¤éºî¤é¤ì¤ë´Ø¿ô} %{{{
Lisp¤Î½é´ü¤ÎÊý¸À¤Ç¤Ï¡¤´Ø¿ô¤¬¥ê¥¹¥È¤È¤·¤ÆÉ½¸½¤µ¤ì¤Æ¤¤¤ë¤â¤Î¤¬¤¢¤Ã¤¿¡¥
¤³¤Î¤³¤È¤ÏLisp¥×¥í¥°¥é¥à¤Ë¼«Ê¬¼«¿È¤ÇLisp¥×¥í¥°¥é¥à¤ò½ñ¤­¡¤¼Â¹Ô¤¹¤ë¤È¤¤¤¦
ÃíÌÜ¤¹¤Ù¤­Ç½ÎÏ¤ò¤â¤¿¤é¤·¤¿¡¥
Common Lisp¤Ç¤Ï¡¤´Ø¿ô¤Ï¤â¤¦¥ê¥¹¥È¤«¤éºî¤é¤ì¤Æ¤Ï¤¤¤Ê¤¤\wadash
¤è¤¯¤Ç¤­¤¿½èÍý·Ï¤Ï´Ø¿ô¤ò¥Í¥¤¥Æ¥£¥Ö¤Êµ¡³£¸ì¤Ë¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¡¥
¤·¤«¤·¥×¥í¥°¥é¥à¤ò½ñ¤¯¥×¥í¥°¥é¥à¤ò¥æ¡¼¥¶¤¬½ñ¤¯¤³¤È¤Ï°ÍÁ³¤È¤·¤Æ²ÄÇ½¤À¡¥
¤½¤ì¤Ï¥ê¥¹¥È¤¬¥³¥ó¥Ñ¥¤¥é¤ËÂÐ¤¹¤ëÆþÎÏ·Á¼°¤À¤«¤é¤À¡¥

Lisp¥×¥í¥°¥é¥à¤¬Lisp¥×¥í¥°¥é¥à¤ò½ñ¤±¤ë¤È¤¤¤¦¤³¤È¤Ï¡¤
¤É¤ó¤Ê¤Ë¶¯Ä´¤·¤Æ¤â¶¯Ä´¤·²á¤®¤Ë¤Ï¤Ê¤é¤Ê¤¤¡¥
ÆÃ¤Ë¡¤¤³¤Î»ö¼Â¤Ï¤·¤Ð¤·¤Ð·Ú¤¯¸«¤é¤ì¤¬¤Á¤À¤«¤é¤À¡¥
½ÏÎýLisp¥æ¡¼¥¶¤Ç¤µ¤¨¡¤Lisp¤Î¤³¤Îµ¡Ç½¤«¤éÆÀ¤é¤ì¤ëÍøÅÀ¤òÍý²ò¤·¤Æ¤¤¤ë¤³¤È¤Ï¾¯¤Ê¤¤¡¥
Îã¤¨¤ÐLisp¤Î¥Þ¥¯¥í¤¬¤¢¤ìÄø¶¯ÎÏ¤ÊÍýÍ³¤Ï¤³¤ì¤À¡¥
¤³¤ÎËÜ¤ÇÀâÌÀ¤µ¤ì¤Æ¤¤¤ëµ»Ë¡¤Î¤Û¤È¤ó¤É¤¬¡¤
Lisp¤Î¼°¤òÁàºî¤Ç¤­¤ë¥×¥í¥°¥é¥à¤ò½ñ¤±¤ëÇ½ÎÏ¤Ë¤è¤ë¤â¤Î¤À¡¥
%}}}
%}}}
\section{´Ø¿ôÅª¥×¥í¥°¥é¥ß¥ó¥°}  %{{{
Á°¤Î¾Ï¤Ç¤Ï¡¤Lisp¤ÈLisp¤Î¥×¥í¥°¥é¥à¤¬¶¦¤Ë°ì¤Ä¤ÎºàÎÁ¤«¤éÀ®¤êÎ©¤Ã¤Æ¤¤¤ëÍÍ»Ò¤òÀâÌÀ¤·¤¿¡¥
¤É¤Î·úºà¤Ç¤âÆ±ÍÍ¤À¤¬¡¤ºàÎÁ¤ÎÀ­¼Á¤Ï·úÊª¤ÎÀ­¼Á¤È¤½¤ì¤ò·ú¤Æ¤ëÊýË¡¤Ë±Æ¶Á¤òÍ¿¤¨¤ë¡¥

¤³¤Î¾Ï¤Ç¤Ï¡¤Lisp¤ÎÀ¤³¦¤Ç¹­¤¯»È¤ï¤ì¤Æ¤¤¤ë·úÃÛµ»Ë¡¤Î¼ïÎà¤òÀâÌÀ¤¹¤ë¡¥
¤³¤ì¤é¤ÎÊýË¡¤ËÀºÄÌ¤¹¤ì¤Ð¡¤¤â¤Ã¤È»×¤¤ÀÚ¤Ã¤¿¼ïÎà¤Î¥×¥í¥°¥é¥à¤ò½ñ¤³¤¦¤È¤¤¤¦µ¤¤Ë¤Ê¤ë¡¥
¼¡¤Î¾Ï¤Ç¤Ï¡¤Lisp¤Ç²ÄÇ½¤Ë¤Ê¤ë¡¤ÆÃ¤Ë½ÅÍ×¤Ê¼ïÎà¤Î¥×¥í¥°¥é¥à¤òÀâÌÀ¤¹¤ë¡§
¸Å¤¤¡Ö·×²è¡Ý¼ÂÁõ¡×Êý¼°¤Ç³«È¯¤µ¤ì¤ë¤Î¤Ç¤Ê¤¯¡¤¿Ê²½¤·¤Æ¤¤¤¯¥×¥í¥°¥é¥à¤À¡¥
\subsection{´Ø¿ôÅª¥Ç¥¶¥¤¥ó} %{{{
¥ª¥Ö¥¸¥§¥¯¥È¤ÎÀ­³Ê¤Ï¤½¤ì¤òºî¤ëÍ×ÁÇ¤Ë±Æ¶Á¤ò¼õ¤±¤ë¡¥
Îã¤¨¤ÐÌÚÂ¤¤Î·úÊª¤ÏÀÐÂ¤¤ê¤Î·úÊª¤È¤Ï°ã¤Ã¤¿¸«³Ý¤±¤Ë¤Ê¤ë¡¥
ÌÚ¤äÀÐ¤½¤Î¤â¤Î¤ò¸«¤ëµ¡²ñ¤¬Á´¤¯¤Ê¤¤¿Í¤Ç¤â¡¤
·úÊª¤ÎÁ´ÂÎÅª¤Ê·Á¤«¤é¤½¤ì¤¬²¿¤Ç¤Ç¤­¤Æ¤¤¤ë¤«¤ÏÊ¬¤«¤ë¤À¤í¤¦¡¥
Lisp¤Î´Ø¿ô¤ÎÀ­³Ê¤ÏLisp¤Î¥×¥í¥°¥é¥à¤Î¹½Â¤¤ËÂÐ¤·¤Æ»÷¤¿¤è¤¦¤Ê±Æ¶Á¤òµÚ¤Ü¤·¤Æ¤¤¤ë¡¥

´Ø¿ôÅª¥×¥í¥°¥é¥ß¥ó¥°¤È¤Ï¡¤ÉûºîÍÑ¤Ç¤Ï¤Ê¤¯¡¤
ÃÍ¤òÊÖ¤¹¤³¤È¤ÇÆ°ºî¤¹¤ë¥×¥í¥°¥é¥à¤ò½ñ¤¯¤³¤È¤À¡¥
ÉûºîÍÑ¤È¤Ï¥ª¥Ö¥¸¥§¥¯¥È¤ÎÇË²õÅª¤ÊÊÑ¹¹¡Ê\verb@rplaca@¤Î»ÈÍÑÅù¡Ë¤ä
ÊÑ¿ô¤Ø¤ÎÂåÆþ¡Ê\verb@setq@¤Î»ÈÍÑÅù¡Ë¤ò´Þ¤à¡¥
ÉûºîÍÑ¤ò»È¤¦¿ô¤¬¾¯¤Ê¤¯¡¤¤½¤Î±Æ¶ÁÈÏ°Ï¤â¥í¡¼¥«¥ë¤Ê¤â¤Î¤Ç¤¢¤ì¤Ð¡¤
¥×¥í¥°¥é¥à¤ÎÆÉ¤ß¼è¤ê¡¤¥Æ¥¹¥È¡¤¥Ç¥Ð¥Ã¥°¤Ï´ÊÃ±¤Ë¤Ê¤ë¡¥
Lisp¤Î¥×¥í¥°¥é¥à¤¬É¬¤º¤³¤ÎÊýË¡¤Ç½ñ¤«¤ì¤Æ¤­¤¿Ìõ¤Ç¤Ï¤Ê¤¤¤¬¡¤
»þ¤òÄÉ¤Ã¤ÆLisp¤È´Ø¿ôÅª¥×¥í¥°¥é¥ß¥ó¥°¤Ï¼¡Âè¤ËÊ¬¤«¤ÁÆñ¤¤¤â¤Î¤Ë¤Ê¤Ã¤Æ¤­¤¿¡¥

´Ø¿ôÅª¥×¥í¥°¥é¥ß¥ó¥°¤¬ÊÌ¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Î¥×¥í¥°¥é¥ß¥ó¥°¤È
¤É¤ìÄø°ã¤¦¤Î¤«¤Ï¡¤Îã¤ò¸«¤ì¤ÐÊ¬¤«¤ë¤À¤í¤¦¡¥
²¿¤«¤ÎÍýÍ³¤Ç¤¢¤ë¥ê¥¹¥È¤¬µÕ½ç¤Ë¤Ê¤Ã¤¿¤â¤Î¤ÎÍ×ÁÇ¤¬Íß¤·¤¤¤È¤·¤è¤¦¡¥
¤½¤Î¤È¤­¥ê¥¹¥È¤òµÕ½ç¤Ë¤¹¤ë´Ø¿ô¤ò½ñ¤¯¤Î¤Ç¤Ï¤Ê¤¯¡¤
¥ê¥¹¥È¤ò°ú¿ô¤È¤·¡¤Æ±¤¸Í×ÁÇ¤ÇµÕ½ç¤Î¥ê¥¹¥È¤òÊÖ¤¹´Ø¿ô¤ò½ñ¤¯¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defun bad-reverse (lst)
  (let* ((len (length lst))
         (ilimit (truncate (/ len 2))))
    (do ((i 0 (1+ i))
         (j (1- len) (1- j)))
        ((>= i ilimit))
      (rotatef (nth i lst) (nth j lst)))))
\end{FramedVerb}\end{center}
\caption{¥ê¥¹¥È¤ÎÍ×ÁÇ¤Î½ç¤òµÕÅ¾¤µ¤»¤ë´Ø¿ô¡¥}
\label{fig:ReversingList}
\end{figure}

Âè\ref{fig:ReversingList}¿Þ¤Ï¥ê¥¹¥È¤òµÕ½ç¤Ë¤¹¤ë´Ø¿ô¤À¡¥
¤³¤ì¤Ï¥ê¥¹¥È¤òÇÛÎó¤È¤·¤Æ°·¤¤¡¤Í×ÁÇ¤Î¾ì½ê¤ò»È¤Ã¤ÆµÕÅ¾¤µ¤»¤ë¡¥
ÊÖ¤êÃÍ¤Ë°ÕÌ£¤Ï¤Ê¤¤¡§
\begin{verbatim}
> (setq lst '(a b c))
(A B C)
> (bad-reverse lst)
NIL
> lst
(C B A)
\end{verbatim}
Ì¾Á°¤¬¼¨¤¹¤è¤¦¤Ë¡¤\verb@bad-reverse@¤ÏLisp¤Ç¤Î¤è¤¤¥¹¥¿¥¤¥ë¤È¤ÏÄø±ó¤¤¡¥
¤½¤ì¤É¤³¤í¤«ÅÁÀ÷ÉÂ¤Î¤è¤¦¤Ê½¹¤µ¤ò»ý¤Ã¤Æ¤¤¤ë¡§
¤Ä¤Þ¤ê¤³¤ì¤¬ÉûºîÍÑ¤Ë¤è¤Ã¤ÆÆ¯¤­¡¤
¤Þ¤¿¸Æ¤Ó½Ð¤·Â¦¤ËÂÐ¤·¤Æ¤â´Ø¿ôÅª¥×¥í¥°¥é¥ß¥ó¥°¤ÎÍýÁÛ¤òË¸¤²¤ë¤È¤¤¤¦¤³¤È¤À¡¥
°­¼ÔÌò¤Ë¤µ¤ì¤Æ¤·¤Þ¤Ã¤¿¤¬\verb@bad-reverse@¤Ë¤ÏÄ¹½ê¤¬1¸Ä¤¢¤ë¡¥
¤³¤ì¤Ï2¸Ä¤ÎÃÍ¤òÆþ¤ìÂØ¤¨¤ë¤È¤­¤ÎCommon Lisp¤Ç¤Î´·ÍÑË¡¤ò¼¨¤·¤Æ¤¤¤ë¡¥
\verb@rotatef@¥Þ¥¯¥í¤ÏÇ¤°Õ¤Î¿ô¤ÎÈÆÊÑ¿ô¡Êgeneralized variable¡¤
\verb@setf@¤ÎÂè1°ú¿ô¤È¤·¤ÆÍ¿¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¼°¡Ë¤ÎÃÍ¤òµÕ¤ËÊÂ¤ÓÂØ¤¨¤ë¡¥
¤½¤·¤Æ°ú¿ô¤¬2¸Ä¤À¤±¤Î»þ¤Ë¤Ï¤½¤ì¤é¤ò¸ò´¹¤¹¤ë¡¥
ÂÐ¾ÈÅª¤Ë¡¤Âè\ref{fig:ReversingList}¿Þ¤ÏµÕ½ç¤Î¥ê¥¹¥È¤òÊÖ¤¹´Ø¿ô¤ò¼¨¤·¤Æ¤¤¤ë¡¥
\verb@good-reverse@¤Ç¤ÏÊÖ¤êÃÍ¤È¤·¤ÆµÕ½ç¤Î¥ê¥¹¥È¤¬ÆÀ¤é¤ì¡¤¸µ¤Î¥ê¥¹¥È¤Ï¤½¤Î¤Þ¤Þ¤À¡¥
\begin{verbatim}
> (setq lst '(a b c))
(A B C)
> (good-reverse lst)
(C B A)
> lst
(A B C)
\end{verbatim}

¤«¤Ä¤Æ¤Ï¿Í¤ÎÍÆËÆ¤ò¸«¤ì¤Ð¤½¤Î¿Í¤ÎÀ­³Ê¤¬Ê¬¤«¤ë¤È»×¤ï¤ì¤Æ¤¤¤¿¡¥
¤³¤ì¤¬¿Í´Ö¤ËÂÐ¤·¤ÆÀµ¤·¤«¤í¤¦¤È¤½¤¦¤Ç¤Ê¤«¤í¤¦¤È¡¤
Lisp¥×¥í¥°¥é¥à¤ËÂÐ¤·¤Æ¤Ï°ìÈÌÅª¤ËÀµ¤·¤¤¡¥
´Ø¿ôÅª¥×¥í¥°¥é¥à¤ÏÌ¿ÎáÅª¥×¥í¥°¥é¥à¤È°Û¤Ê¤Ã¤¿ÍÆËÆ¤ò»ý¤Ã¤Æ¤¤¤ë¡¥
´Ø¿ôÅª¥×¥í¥°¥é¥à¤Î¹½Â¤¤ÏÁ´¤Æ¼°ÆâÉô¤Î°ú¿ô¤Î¹½À®¤Ë¤è¤Ã¤Æ·è¤Þ¤ê¡¤
¤Þ¤¿°ú¿ô¤¬¥¤¥ó¥Ç¥ó¥È¤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¤¤½¤Î¥¤¥ó¥Ç¥ó¥ÈÊýË¡¤ÏÂ¿´ô¤ËÅÏ¤ë¡¥
´Ø¿ôÅª¥×¥í¥°¥é¥à¤Î¥³¡¼¥É¤Ï¥Ú¡¼¥¸Æâ¤òÎ®¤ì¤Æ¤¤¤¯¤è¤¦¤Ë¸«¤¨¤ë
\footnote{ÆÃÄ§Åª¤ÊÎã¤Ë¤Ä¤¤¤Æ¤Ïbump¥Ú¡¼¥¸¤ò»²¾È¡¥}¡¥
Ì¿ÎáÅª¥×¥í¥°¥é¥à¤Î¥³¡¼¥É¤Ï¸ÇÄêÅª¤Ç¥Ö¥í¥Ã¥¯¤ËÊÌ¤ì¤Æ¤¤¤Æ¡¤¤Á¤ç¤¦¤ÉBasic¤Ë»÷¤Æ¤¤¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defun good-reverse (lst)
  (labels ((rev (lst acc)
           (if (null lst)
               acc
               (rev (cdr lst) (cons (car lst) acc)))))
    (rev lst nil)))
\end{FramedVerb}\end{center}
\caption{Í×ÁÇ¤Î½ç¤¬µÕÅ¾¤·¤¿¥ê¥¹¥È¤òÊÖ¤¹´Ø¿ô¡¥}
\label{fig:ReversedList}
\end{figure}

Ä¯¤á¤ë¤À¤±¤Ç¤â¡¤\verb@bad-reverse@¤È\verb@good-reverse@¤Î
¤É¤Á¤é¤¬¤¤¤¤¤«¤¬ÅÁ¤ï¤Ã¤Æ¤¯¤ë¡¥
¤½¤·¤ÆÃ»¤¤¤À¤±¤Ç¤Ê¤¯\verb@good-reverse@¤Ï¸úÎ¨Åª¤Ç¤â¤¢¤ë¡§
$O(n^2)$¤Ç¤Ï¤Ê¤¯$O(n)$¤Ê¤Î¤À¡¥

Common Lisp¤Ë¤ÏÁÈ¤ß¹þ¤ß¤Ç\verb@reverse@¤¬¤¢¤ë¤Î¤Ç¡¤¤½¤ì¤ò½ñ¤¯¼ê´Ö¤ÏÍ×¤é¤Ê¤¤¡¥
¤³¤Î´Ø¿ô¤Ï¤·¤Ð¤·¤Ð´Ø¿ôÅª¥×¥í¥°¥é¥ß¥ó¥°¤ËÂÐ¤¹¤ëÉ½ÌÌÅª¤Ê¸í²ò¤ò¤â¤¿¤é¤¹¤Î¤Ç¡¤
·Ú¤¯¸«¤Æ¤ª¤¯²ÁÃÍ¤Ï¤¢¤ë¡¥
\verb@good-reverse@¤ÈÆ±ÍÍ¡¤ÁÈ¤ß¹þ¤ß¤Î\verb@reverse@¤âÃÍ¤òÊÖ¤¹¤³¤È¤ÇÆ¯¤¯\wadash
¤½¤Î°ú¿ô¤Ï¼êÉÕ¤«¤º¤À¡¥
¤·¤«¤·Lisp¤Î³Ø½¬ÅÓÃæ¤Î¿Í¤Ï¡¤
¤½¤ì¤¬\verb@bad-reverse@¤Î¤è¤¦¤ËÉûºîÍÑ¤Ë¤è¤Ã¤ÆÆ¯¤¤¤Æ¤¤¤ë¤È»×¤¦¤«¤â¤·¤ì¤Ê¤¤¡¥
¥×¥í¥°¥é¥à¤Î¤É¤³¤«¤Ç¥ê¥¹¥È\verb@lst@¤òµÕ½ç¤ËÊÑ¤¨¤¿¤¤¤È¤­
\begin{verbatim}
(reverse lst)
\end{verbatim}
¤È½ñ¤¤¤Æ¡¤¤É¤¦¤·¤Æ¸Æ¤Ó½Ð¤·¤Î¸ú²Ì¤¬½Ð¤Ê¤¤¤Î¤À¤í¤¦¡¤¤È»×¤¦¤«¤â¤·¤ì¤Ê¤¤¡¥
¼ÂºÝ¤Ï¡¤¤½¤¦¤¤¤Ã¤¿´Ø¿ô¤ÎÉûºîÍÑ¤¬Íß¤·¤¤¤È¤­¤Ë¤Ï¸Æ¤Ó½Ð¤·¥³¡¼¥É¤ÎÃæ¤Ç
ÉûºîÍÑ¤¬µ¯¤­¤ë¤è¤¦¤Ë¤·¤Æ¤ä¤é¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¡¥
¤Ä¤Þ¤ê¡¤Âå¤ï¤ê¤Ë
\begin{verbatim}
(setq lst (reverse lst))
\end{verbatim}
¤È½ñ¤¯É¬Í×¤¬¤¢¤ë¤È¤¤¤¦¤³¤È¤À¡¥
\verb@reverse@Åù¤Î¥ª¥Ú¥ì¡¼¥¿¤Ï¡¤ÉûºîÍÑ¤Ç¤Ê¤¯ÊÖ¤êÃÍ¤Î¤¿¤á¤Ë¸Æ¤Ð¤ì¤ë¤è¤¦°Õ¿Þ¤µ¤ì¤Æ¤¤¤ë¡¥
¼«Ê¬¤Î¥×¥í¥°¥é¥à¤â¤³¤Î¥¹¥¿¥¤¥ë¤Ç½ñ¤¯²ÁÃÍ¤¬¤¢¤ë\wadash
Lisp¤ÎÀ¸¤Þ¤ì»ý¤Ã¤¿Ä¹½ê¤Î¤¿¤á¤Ð¤«¤ê¤Ç¤Ê¤¯¡¤
¤½¤¦¤·¤Ê¤¤¤ÈLisp¤ËµÕ¤é¤Ã¤Æ¥×¥í¥°¥é¥à¤ò½ñ¤¯¤³¤È¤Ë¤Ê¤ë¤«¤é¤À¡¥

\verb@bad-reverse@¤È\verb@good-reverse@¤È¤ÎÈæ³Ó¤ÇÌµ»ë¤·¤Æ¤¤¤¿ÅÀ¤Î°ì¤Ä¤Ï¡¤
\verb@bad-reverse@¤Ï¥³¥ó¥·¥ó¥°¤ò¤·¤Ê¤¤ÅÀ¤À¡¥
¿·¤·¤¤¹½Â¤¤òºî¤ë¤Î¤Ç¤Ê¤¯¡¤¸µ¤Î¥ê¥¹¥È¤ËÂÐ¤·¤ÆÆ°ºî¤·¤Æ¤¤¤ë¡¥
¤³¤ì¤Ï´í¸±¤È¤Ê¤ê¤¦¤ë\wadash
¤½¤Î¥ê¥¹¥È¤Ï¥×¥í¥°¥é¥à¤Î¤É¤³¤«¤ÇÉ¬Í×¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤«¤â¤·¤ì¤Ê¤¤¡¥
¤·¤«¤·¸úÎ¨¤Î¤¿¤á¤Ë¤Ï¤½¤ì¤¬É¬Í×¤Ê¤È¤­¤â¤¢¤ë¡¥
¤½¤ó¤Ê¾ì¹ç¤Î¤¿¤á¤Ë¡¤Common Lisp¤Ë¤Ï$O(n)$¥ª¡¼¥À¡¼¤ÎÇË²õÅª¤ÊµÕÅ¾´Ø¿ô
\verb@nreverse@¤¬¤¢¤ë\note{nreverse}¡¥

ÇË²õÅª´Ø¿ô¤È¤ÏÅÏ¤µ¤ì¤¿°ú¿ô¤ËÊÑ¹¹¤òµÚ¤Ü¤»¤ë´Ø¿ô¤À¡¥
¤·¤«¤·ÇË²õÅª´Ø¿ô¤µ¤¨¤âÉáÄÌ¤ÏÊÖ¤êÃÍ¤Î¤¿¤á¤Ë»È¤ï¤ì¤ë¡§
\verb@nreverse@¤Ï°ú¿ô¤È¤·¤ÆÍ¿¤¨¤é¤ì¤¿¥ê¥¹¥È¤ò»È¤¤²ó¤¹¤È»×¤ï¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¤¬¡¤
¤½¤ì¤¬¥ê¥¹¥È¤òµÕ½ç¤ËÊÑ¤¨¤Æ¤¯¤ì¤ë¤È»×¤Ã¤Æ¤Ï¤¤¤±¤Ê¤¤¡¥
¤³¤ì¤Þ¤Ç¤Î¤â¤Î¤ÈÆ±ÍÍ¡¤µÕ½ç¤Ë¤Ê¤Ã¤¿¥ê¥¹¥È¤ÏÊÖ¤êÃÍ¤Ë¤è¤Ã¤ÆÆÀ¤é¤ì¤ë¡¥
´Ø¿ô¤ÎÅÓÃæ¤Ë
\begin{verbatim}
(nreverse lst)
\end{verbatim}
¤È½ñ¤¤¤Æ¤â¡¤¤½¤ì°Ê¸å\verb@lst@¤¬µÕ½ç¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤È»×¤Ã¤Æ¤Ï¤¤¤±¤Ê¤¤¡¥
ÂçÄñ¤Î½èÍý·Ï¤Ç¤Ï¼¡¤Î¤è¤¦¤Ê¤³¤È¤¬µ¯¤­¤ë¡§
\begin{verbatim}
> (setq lst '(a b c))
(A B C)
> (nreverse lst)
(C B A)
> lst
(A)
\end{verbatim}
\verb@lst@¤òµÕ½ç¤ËÊÑ¤¨¤ë¤¿¤á¤Ë¤Ï¡¤
ÉáÄÌ¤Î\verb@reverse@¤Ç¤ä¤ë¤Î¤ÈÆ±¤¸¤è¤¦¤Ë\verb@lst@¤ËÊÖ¤êÃÍ¤òÂåÆþ¤·¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¡¥

¤¢¤ë´Ø¿ô¤¬ÇË²õÅª¤À¤È½ñ¤«¤ì¤Æ¤¤¤Æ¤â¡¤
¤½¤Î´Ø¿ô¤¬ÉûºîÍÑ¤Î¤¿¤á¤Ë¸Æ¤Ð¤ì¤ëÈ¦¤Î´Ø¿ô¤À¤È¤¤¤¦¤³¤È¤Ç¤Ï¤Ê¤¤¡¥
´í¤Ê¤¤ÅÀ¤Ï¡¤´ö¤Ä¤«¤ÎÇË²õÅª´Ø¿ô¤¬¤½¤¦¤¤¤Ã¤¿°õ¾Ý¤òÍ¿¤¨¤ë¤³¤È¤À¡¥
Îã¤¨¤Ð
\begin{verbatim}
(nconc x y)
\end{verbatim}
¤È
\begin{verbatim}
(setq x (nconc x y))
\end{verbatim}
¤È¤Ï¤Û¤ÜÆ±¤¸¸ú²Ì¤ò»ý¤Ä¡¥
Á°¼Ô¤Î´·ÍÑË¡¤Ë¤è¤ë¥³¡¼¥É¤ò½ñ¤¯¤È¡¤Àµ¤·¤¯Æ¯¤¯¤è¤¦¤Ë»×¤¨¤ë¤³¤È¤â¤¢¤ë¤«¤â¤·¤ì¤Ê¤¤¡¥
¤·¤«¤·\verb@x@¤¬nil¤Î¤È¤­¤Ë¤Ï»×¤Ã¤¿ÄÌ¤ê¤ÎÆ°ºî¤ò¤·¤Ê¤¤¤À¤í¤¦¡¥

Lisp¥ª¥Ú¥ì¡¼¥¿¤Î¤¦¤Á¡¤ÉûºîÍÑ¤Î¤¿¤á¤Ë¸Æ¤Ð¤ì¤ë¤è¤¦°Õ¿Þ¤µ¤ì¤Æ¤¤¤ë¤â¤Î¤Ï¤Û¤ó¤Î¶Ï¤«¤À¡¥
°ìÈÌÅª¤Ë¸À¤Ã¤Æ¡¤ÁÈ¤ß¹þ¤ß¥ª¥Ú¥ì¡¼¥¿¤ÏÊÖ¤êÃÍ¤Î¤¿¤á¤Ë¸Æ¤Ð¤ì¤ë¤è¤¦°Õ¿Þ¤µ¤ì¤Æ¤¤¤ë¡¥
\verb@sort@¡¤\verb@remove@¤ä\verb@substitute@Åù¤ÎÌ¾Á°¤ËÏÇ¤ï¤µ¤ì¤Æ¤Ï¤¤¤±¤Ê¤¤¡¥
ÉûºîÍÑ¤¬É¬Í×¤Ê¤é¡¤ÊÖ¤êÃÍ¤ò\verb@setq@¤ÇÂåÆþ¤¹¤ë¤³¤È¡¥

¤Þ¤µ¤Ë¤³¤Î¥ë¡¼¥ë¤¬¡¤ÉûºîÍÑ¤òÉÔ²ÄÈò¤Ê¤â¤Î¤Ë¤·¤Æ¤¤¤ë¡¥
´Ø¿ôÅª¥×¥í¥°¥é¥ß¥ó¥°¤òÍýÁÛ¤È¤¹¤ë¤È¤¤¤¦¤Î¤Ï¡¤
¥×¥í¥°¥é¥à¤¬·è¤·¤ÆÉûºîÍÑ¤ò»È¤Ã¤Æ¤Ï¤¤¤±¤Ê¤¤¤È¤¤¤¦¤³¤È¤Ç¤Ï¤Ê¤¤¡¥
¤¿¤ÀÉ¬Í×°Ê¾å¤Ë»È¤¦¤Ù¤­¤Ç¤Ê¤¤¤È¤¤¤¦¤³¤È¤À¡¥

¤³¤Î½¬´·¤ò°é¤Æ¤ë¤Ë¤Ï»þ´Ö¤¬¤«¤«¤ë¤«¤â¤·¤ì¤Ê¤¤¡¥
°ì¤Ä¤ÎÊýË¡¤Ï¡¤°Ê²¼¤Î¥ª¥Ú¥ì¡¼¥¿¤ÏÀÇ¶â¤¬¤«¤«¤Ã¤Æ¤¤¤ë¤Ä¤â¤ê¤Ç°·¤¦¤³¤È¤À¡§
\begin{verbatim}
set setq setf psetf psetq incf decf push pop pushnew
rplaca rplacd rotatef shiftf remf remprop remhash
\end{verbatim}
¤¢¤È\verb@let*@¤â¤½¤¦¤À¡¥
¤³¤ÎÃæ¤ËÌ¿ÎáÅª¥×¥í¥°¥é¥à¤¬Àø¤ó¤Ç¤¤¤ë¤³¤È¤¬¤·¤Ð¤·¤Ð¤¢¤ë¡¥
¤³¤ì¤é¤Î¥ª¥Ú¥ì¡¼¥¿¤ËÀÇ¶â¤¬¤«¤«¤Ã¤Æ¤¤¤ë¤Ä¤â¤ê¤Ë¤Ê¤ë¤Î¤Ï¡¤
¤è¤¤Lisp¤Î¥×¥í¥°¥é¥ß¥ó¥°¡¦¥¹¥¿¥¤¥ë¤Ø¸þ¤«¤¦¼ê½õ¤±¤È¤·¤Æ´«¤á¤¿¤À¤±¤Ç¡¤
¤½¤ì¤¬¤è¤¤¥¹¥¿¥¤¥ë¤Î´ð½à¤Ê¤Î¤Ç¤Ï¤Ê¤¤¡¥
¤·¤«¤·¡¤¤½¤ì¤À¤±¤Ç¤â¤º¤¤¤Ö¤ó¿ÊÊâ¤Ç¤­¤ë¤À¤í¤¦¡¥

Â¾¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ï¡¤ÉûºîÍÑ¤ò»È¤¦ÍýÍ³¤ÇºÇ¤âÂç¤­¤¤¤â¤Î¤Ï¡¤
Â¿ÃÍ¤òÊÖ¤¹´Ø¿ô¤¬É¬Í×¤Ë¤Ê¤ë¤³¤È¤À¡¥
´Ø¿ô¤¬1¸Ä¤ÎÃÍ¤·¤«ÊÖ¤»¤Ê¤±¤ì¤Ð¡¤Â¾¤ÎÃÍ¤Ï¥Ñ¥é¥á¡¼¥¿¤ËÊÑ¹¹¤ò²Ã¤¨¤ë¤³¤È¤Ç¡ÖÊÖ¤¹¡×¤·¤«¤Ê¤¤¡¥
¹¬±¿¤Ê¤³¤È¤Ë¡¤Common Lisp¤Ç¤Ï¤½¤ÎÉ¬Í×¤Ï¤Ê¤¤¡¥
¤É¤Î´Ø¿ô¤âÂ¿ÃÍ¤òÊÖ¤»¤ë¤«¤é¤À¡¥

Îã¤¨¤ÐÁÈ¤ß¹þ¤ß´Ø¿ô\verb@truncate@¤Ï2¸Ä¤ÎÃÍ
¡ÊÀÚ¤ê¼Î¤Æ·ë²Ì¤ÎÀ°¿ô¤ÈÀÚ¤ê¼Î¤Æ¤é¤ì¤¿ÉôÊ¬¡Ë¤òÊÖ¤¹¡¥
Åµ·¿Åª¤Ê½èÍý·Ï¤Ç¤Ï¡¤¥È¥Ã¥×¥ì¥Ù¥ë¤Ç\verb@truncate@¤ò¸Æ¤Ö¤ÈÎ¾Êý¤òÉ½¼¨¤¹¤ë¡§
\begin{verbatim}
> (truncate 26.21875)
26
0.21875
\end{verbatim}
¸Æ¤Ó½Ð¤·Â¦¤Î¥³¡¼¥É¤¬ÃÍ¤ò1¸Ä¤·¤«¼è¤é¤Ê¤¤¤È¤­¤Ï¡¤1ÈÖÌÜ¤¬»È¤ï¤ì¤ë¡§
\begin{verbatim}
> (= (truncate 26.21875) 26)
T
\end{verbatim}
\verb@multiple-value-bind@¤ò»È¤¦¤³¤È¤Ç¡¤
¸Æ¤Ó½Ð¤·Â¦¥³¡¼¥É¤ÏÎ¾Êý¤ÎÊÖ¤êÃÍ¤òÂª¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
¤³¤Î¥ª¥Ú¥ì¡¼¥¿¤ÏÊÑ¿ô¤Î¥ê¥¹¥È¡¤´Ø¿ô¸Æ¤Ó½Ð¤·¡¤¥³¡¼¥ÉËÜÂÎ¤ò°ú¿ô¤Ë¼è¤ë¡¥
ËÜÂÎ¤¬É¾²Á¤µ¤ì¤ë¤È¤­¤Ë¤Ï¡¤´Ø¿ô¸Æ¤Ó½Ð¤·¤«¤é¤ÎÊÖ¤êÃÍ¤Ï³Æ¡¹¤¬ÊÑ¿ô¤ËÂåÆþ¤µ¤ì¤Æ¤¤¤ë¡§
\begin{verbatim}
> (multiple-value-bind (int frac) (truncate 26.21875)
    (list int frac))
(26 0.21875)
\end{verbatim}
ºÇ¸å¤Ë¡¤Â¿ÃÍ¤òÊÖ¤¹¤Ë¤Ï\verb@values@¥ª¥Ú¥ì¡¼¥¿¤ò»È¤¦¡§
\begin{verbatim}
> (defun powers (x)
    (values x (sqrt x) (expt x 2)))
POWERS
> (multiple-value-bind (base root square) (powers 4)
    (list base root square))
(4 2.0 16)
\end{verbatim}

Á´ÂÎÅª¤Ë¸«¤Æ´Ø¿ôÅª¥×¥í¥°¥é¥ß¥ó¥°¤Ï¤¤¤¤ÊýË¡¤À¡¥
¤½¤ì¤ÏLisp¤Ç»È¤¦¤Ë¤ÏÆÃ¤Ë¤¤¤¤¡¥
¤È¸À¤¦¤Î¤âLisp¤Ï´Ø¿ôÅª¥×¥í¥°¥é¥ß¥ó¥°¤ò»Ù±ç¤¹¤ë¤¿¤á¤Ë¿Ê²½¤·¤Æ¤­¤¿¤«¤é¤À¡¥
\verb@reverse@¤ä\verb@nreverse@Åù¤ÎÁÈ¤ß¹þ¤ß¥ª¥Ú¥ì¡¼¥¿¤Ï
¤³¤Î¤è¤¦¤Ë»È¤ï¤ì¤ë¤³¤È¤ò°Õ¿Þ¤·¤Æ¤¤¤ë¡¥
\verb@values@¤ä\verb@multiple-value-bind@Åù¤Î¥ª¥Ú¥ì¡¼¥¿¤Ï¡¤
´Ø¿ôÅª¥×¥í¥°¥é¥ß¥ó¥°¤ò´ÊÃ±¤Ë¤¹¤ë¤¿¤á¤ËÆÃ¤ËÍÑ°Õ¤µ¤ì¤¿¤â¤Î¤À¡¥
%}}}
\subsection{Ì¿ÎáÅª¥×¥í¥°¥é¥ß¥ó¥°¤ÎÎ¢ÊÖ¤·}   %{{{
´Ø¿ôÅª¥×¥í¥°¥é¥ß¥ó¥°¤ÎÁÀ¤¤¤Ï¡¤
¤â¤Ã¤ÈÉáÄÌ¤Î¥¢¥×¥í¡¼¥Á¡¤Ì¿ÎáÅª¥×¥í¥°¥é¥ß¥ó¥°¤ÎÁÀ¤¤¤ÈÂÐÈæ¤µ¤»¤ë¤È
¤Ï¤Ã¤­¤ê¸«¤¨¤Æ¤¯¤ë¤«¤â¤·¤ì¤Ê¤¤¡¥
´Ø¿ôÅª¥×¥í¥°¥é¥à¤Ï¡¤¤½¤ì¤¬Íß¤·¤¬¤ë¤â¤Î¤òµá¤á¤ë¡¥
Ì¿ÎáÅª¥×¥í¥°¥é¥à¤Ï¡¤²¿¤ò¤¹¤Ù¤­¤«¤Î»Ø¼¨¤òµá¤á¤ë¡¥
´Ø¿ôÅª¥×¥í¥°¥é¥à¤Î
¡Ö\verb@a@¤È¡¤\verb@x@¤ÎÂè1Í×ÁÇ¤Î2¾è¤«¤éÀ®¤ë¥ê¥¹¥È¤òÊÖ¤»¡¥¡×¡§
\begin{verbatim}
(defun fun (x)
  (list 'a (expt (car x) 2)))
\end{verbatim}
Ì¿ÎáÅª¥×¥í¥°¥é¥ß¥ó¥°¤Ç¤Ï¤³¤¦¤À¡¥
¡Ö\verb@x@¤ÎÂè1Í×ÁÇ¤òµá¤á¡¤¤½¤ì¤ò2¾è¤»¤è¡¥
¤½¤·¤Æ\verb@a@¤È¡¤ÀèÄø2¾è¤·¤¿ÃÍ¤«¤éÀ®¤ë¥ê¥¹¥È¤òÊÖ¤»¡¥¡×¡§
\begin{verbatim}
(defun imp (x)
  (let (y sqr)
    (setq y (car x))
    (setq sqr (expt y 2))
    (list 'a sqr)))
\end{verbatim}
¤³¤Î¥×¥í¥°¥é¥à¤òÎ¾Êý¤ÎÊýË¡¤Ç½ñ¤±¤ëLisp¥æ¡¼¥¶¤Ï¹¬±¿¤À¡¥
Ì¿ÎáÅª¥×¥í¥°¥é¥ß¥ó¥°¤À¤±¤ËÅ¬¤·¤¿¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤â¤¢¤ë\wadash
Basic¤È¡¤¤Û¤È¤ó¤É¤Î¥Þ¥·¥ó¸ì¤À¡¥
¼ÂºÝ¡¤\verb@imp@¤ÎÄêµÁ¤Ï¤Û¤È¤ó¤É¤ÎLisp¥³¥ó¥Ñ¥¤¥é¤¬\verb@fun@¤ËÂÐ¤·¤Æ
À¸À®¤¹¤ë¥Þ¥·¥ó¸ì¤È¹½À®¤¬»÷¤Æ¤¤¤ë¡¥

¥³¥ó¥Ñ¥¤¥é¤¬Âå¤ï¤ê¤Ë¤ä¤Ã¤Æ¤¯¤ì¤ë¤Î¤Ë¡¤¤É¤¦¤·¤Æ¤½¤ó¤Ê¥³¡¼¥É¤ò½ñ¤¯¤Î¤À¤í¤¦¡©
Â¿¤¯¤Î¥×¥í¥°¥é¥Þ¤Ë¤Ï¡¤¤³¤Îµ¿Ìä¤ÏÉâ¤«¤Ó¤¹¤é¤·¤Ê¤¤¡¥
¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ï¤½¤Î¥Ñ¥¿¡¼¥ó¤ò»äÃ£¤Î¹Í¤¨¤Ë¾Æ¤­ÉÕ¤±¤ë¡§
Ì¿ÎáÅª¥×¥í¥°¥é¥ß¥ó¥°¤Ë´·¤ì¤Æ¤·¤Þ¤Ã¤¿¿Í¤Ï¡¤
¥×¥í¥°¥é¥à¤òÌ¿ÎáÅª¥×¥í¥°¥é¥ß¥ó¥°ÍÑ¸ì¤Ç¹Í¤¨¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤Ã¤¿·ë²Ì¡¤
¼ÂºÝ¤Ë´Ø¿ôÅª¥×¥í¥°¥é¥ß¥ó¥°¤è¤êÌ¿ÎáÅª¥×¥í¥°¥é¥ß¥ó¥°¤ÎÊý¤¬°×¤·¤¯»×¤¨¤ë¤Î¤«¤â¤·¤ì¤Ê¤¤¡¥
¤³¤ÎÀº¿ÀÅª½¬´·¤Ï¡¤¾è¤ê±Û¤¨¤ë²ÁÃÍ¤Î¤¢¤ë¤â¤Î¤À\wadash
¤½¤¦¤µ¤»¤Æ¤¯¤ì¤ë¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ò»ý¤Ã¤Æ¤¤¤ë¤Ê¤é¡¥

Â¾¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ÎÂ´¶ÈÀ¸¤Ë¤È¤Ã¤Æ¤Ï¡¤
Lisp¤ò»È¤¤»Ï¤á¤ë¤Î¤Ï»Ï¤á¤Æ¥¹¥±¡¼¥È¥ê¥ó¥¯¤Î¾å¤ËÎ©¤Ä¤Î¤È»÷¤Æ¤¤¤ë¤«¤â¤·¤ì¤Ê¤¤¡¥
É¹¤Î¾å¤ÇÆ°¤­²ó¤ë¤Î¤ÏÎ¦¾å¤ÇÆ°¤­²ó¤ë¤Î¤è¤ê¼ÂºÝ¤Ï¤º¤Ã¤È´ÊÃ±¤À\wadash
¥¹¥±¡¼¥È·¤¤ò»È¤¨¤Ð¡¥
¤½¤¦¤¹¤ë¤Þ¤Ç¤Ï¤³¤Î¥¹¥Ý¡¼¥Ä¤¬²¿¤À¤È¤¤¤¦¤Î¤«¤È°ì¿Í¤Ý¤Ä¤ó¤ÈÇº¤à¤³¤È¤Ë¤Ê¤ë¤À¤í¤¦¡¥

¥¹¥±¡¼¥È¤ÈÉ¹¤Î´Ø·¸¤Ï¡¤´Ø¿ôÅª¥×¥í¥°¥é¥ß¥ó¥°¤ÈLisp¤È¤Î´Ø·¸¤ÈÆ±¤¸¤À¡¥
¤½¤ì¤é¤òÁÈ¤ß¹ç¤ï¤»¤ì¤Ð¡¤Í¥²í¤Ë¡¤¤·¤«¤â¶ìÏ«¤»¤º¤Ë¤¢¤Á¤³¤Á²ó¤ì¤ë¤è¤¦¤Ë¤Ê¤ë¡¥
¤·¤«¤·ÊÌ¤Î¼ïÎà¤Î°ÜÆ°ÊýË¡¤Ë´·¤ì¤Æ¤·¤Þ¤Ã¤Æ¤¤¤ë¤È¡¤»Ï¤á¤Ï²¿¤ä¤é´¶¤¸¤¬ÄÏ¤á¤Ê¤¤¤À¤í¤¦¡¥
ÂèÆó¸À¸ì¤È¤·¤ÆLisp¤ò³Ø¤Ö¤È¤­¤Ë¤Ï¤Ã¤­¤êÍý²ò¤·¤Ë¤¯¤¤ÅÀ¤Î°ì¤Ä¤Ï¡¤
´Ø¿ôÅª¥×¥í¥°¥é¥ß¥ó¥°¤Î¥¹¥¿¥¤¥ë¤ò³Ø¤Ö¤³¤È¤À¤í¤¦¡¥

¹¬±¿¤Ê¤³¤È¤Ë¡¤Ì¿ÎáÅª¥×¥í¥°¥é¥à¤ò´Ø¿ôÅª¥×¥í¥°¥é¥à¤ËÊÑ´¹¤¹¤ë¤¦¤Þ¤¤ÊýË¡¤¬¤¢¤ë¡¥
¤³¤ÎÊýË¡¤Ï´°À®¤·¤¿¥³¡¼¥É¤ËÅ¬ÍÑ¤¹¤ë¤³¤È¤«¤é»Ï¤á¤ë¤È¤¤¤¤¡¥
¤¹¤°¤Ë´ª¤¬Æ¯¤¯¤è¤¦¤Ë¤Ê¤ê¡¤¥³¡¼¥É¤ò½ñ¤­¤Ê¤¬¤éÊÑ´¹¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ë¤À¤í¤¦¡¥
¤½¤¦¤¹¤ì¤Ð¤¢¤Ã¤È¤¤¤¦´Ö¤Ë¡¤
»Ï¤á¤«¤é´Ø¿ôÅª¥×¥í¥°¥é¥ß¥ó¥°¤ÎÍÑ¸ì¤Ç¥×¥í¥°¥é¥à¤ò¹Í¤¨¤ë¤è¤¦¤Ë¤Ê¤ë¤À¤í¤¦¡¥

¤½¤ÎÊýË¡¤Ï¡¤Ì¿ÎáÅª¥×¥í¥°¥é¥à¤Ï´Ø¿ôÅª¥×¥í¥°¥é¥à¤òÎ¢ÊÖ¤·¤Ë¤·¤¿¤â¤Î¤È»×¤¦¤³¤È¤À¡¥
´Ø¿ôÅª¥×¥í¥°¥é¥à¤¬Ì¿ÎáÅª¥×¥í¥°¥é¥à¤ÎÃæ¤Ë±£¤ì¤Æ¤¤¤ë¤Î¤ò¸«¤Ä¤±¤ë¤Ë¤Ï¡¤
¤¿¤ÀÎ¢ÊÖ¤·¤Ë¤¹¤ì¤Ð¤¤¤¤¡¥
¤³¤ÎÊýË¡¤ò\verb@imp@¤Ç»î¤·¤Æ¤ß¤è¤¦¡¥

ºÇ½é¤Ëµ¤ÉÕ¤¯¤Î¤Ï¡¤ÀèÆ¬¤Î\verb@let@Æâ¤Ç\verb@y@¤È\verb@sqr@¤òºî¤Ã¤Æ¤¤¤ë¤³¤È¤À¡¥
¤³¤ì¤Ï¤è¤¯¤Ê¤¤¤³¤È¤¬Â³¤¯Á°¿¨¤ì¤À¡¥
¼Â¹Ô»þ¤Î\verb@eval@¤Î¸Æ¤Ó½Ð¤·¤ÈÆ±ÍÍ¡¤
½é´ü²½¤µ¤ì¤Æ¤¤¤Ê¤¤ÊÑ¿ô¤ÏÌÇÂ¿¤Ë»È¤ï¤ì¤Ê¤¤¤Î¤Ç¡¤
°ìÈÌÅª¤Ë¸À¤Ã¤Æ¥×¥í¥°¥é¥àÆâ¤ÇÊÑ¤Ê¤³¤È¤ò¤·¤¿¸½¤ì¤È¸«¤Ê¤·¤Æ¤¤¤¤¡¥
¤½¤¦¤¤¤Ã¤¿ÊÑ¿ô¤Ï¤·¤Ð¤·¤Ð¥×¥í¥°¥é¥à¤òÎ±¤á¤ë²èÉÆ¤Î¤è¤¦¤Ê¤â¤Î¤Ç¡¤
¥×¥í¥°¥é¥à¤¬¼«Á³¤Ê·Á¤Ë¤Ê¤í¤¦¤È¤¹¤ë¤Î¤òË¸¤²¤Æ¤¤¤ë¡¥

¤·¤«¤·¤³¤³¤Ç¤Ï¤½¤ì¤Ï»Ã¤¯Ìµ»ë¤·¡¤´Ø¿ô¤Î½ª¤ï¤ê¤Þ¤Ç¤Þ¤Ã¤¹¤°¿Ê¤ó¤Ç¤ß¤ë¡¥
Ì¿ÎáÅª¥×¥í¥°¥é¥à¤ÇºÇ¸å¤Ëµ¯¤­¤ë¤³¤È¤Ï¡¤´Ø¿ôÅª¥×¥í¥°¥é¥à¤Ç¤Ï°ìÈÖºÇ½é¤Ëµ¯¤­¤ë¡¥
¤À¤«¤éºÇ½é¤Î°ìÊâ¤ÏºÇ¸å¤Ë¹Ô¤ï¤ì¤ë\verb@list@¤Î¸Æ¤Ó½Ð¤·¤òÄÏ¤ß¡¤
¥×¥í¥°¥é¥à¤Î»Ä¤ê¤ò¤½¤ÎÃæ¤ËµÍ¤á¹þ¤à¤³¤È¤À\wadash
¥·¥ã¥Ä¤òÎ¢ÊÖ¤·¤Ë¤¹¤ë¤è¤¦¤Ë¡¥
¤½¤·¤Æ¥·¥ã¥Ä¤òÂµ¤«¤é¥«¥Õ¥¹¤Ë¤«¤±¤Æ¼¡Âè¤ËÎ¢ÊÖ¤·¤Æ¤¤¤¯¤è¤¦¤Ë¡¤
Æ±¤¸ÊÑ´¹ÊýË¡¤ò·«¤êÊÖ¤·Å¬ÍÑ¤·Â³¤±¤Æ¤¤¤¯¡¥

¸å¤í¤«¤é¸«¤Æ¤¤¤Ã¤Æ¡¤\verb@sqr@¤ò\verb@(expt y 2)@¤ÇÃÖ¤­´¹¤¨
\begin{verbatim}
(list 'a (expt y 2)))
\end{verbatim}
¤¬ÆÀ¤é¤ì¤ë¡¥
¼¡¤Ë\verb@y@¤ò\verb@(car x)@¤ÇÃÖ¤­´¹¤¨¤ë¤È
\begin{verbatim}
(list 'a (expt (car x) 2))
\end{verbatim}
¤È¤Ê¤ë¡¥
¤³¤¦¤·¤Æ¥³¡¼¥É¤Î»Ä¤ê¤ÏºÇ¸å¤Î¼°¤ÎÃæ¤ËµÍ¤á¹þ¤Þ¤ì¤¿¤Î¤Ç¡¤
¤½¤ì¤ò¼Î¤Æµî¤ë¤³¤È¤¬¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤Ã¤¿¡¥
¤³¤³¤Ë»ê¤ë¤Þ¤Ç¤ËÊÑ¿ô\verb@y@¤È\verb@sqr@¤ÎÉ¬Í×À­¤Ï¤Ê¤¯¤Ê¤Ã¤¿¤Î¤Ç¡¤
\verb@let@¤âºï¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥

ºÇ½ª·ë²Ì¤Ï»Ï¤á¤Î¤â¤Î¤è¤êÃ»¤¯¡¤Íý²ò¤âÍÆ°×¤À¡¥
¸µ¤Î¥³¡¼¥É¤Ç¤ÏºÇ¸å¤Ë\verb@(list 'a sqr)@¤È¤¤¤¦¼°¤¬¸½¤ì¤¿¤¬¡¤
¤³¤ì¤Ç¤Ï\verb@sqr@¤ÎÃÍ¤¬¤É¤³¤«¤éÍè¤ë¤Î¤«¤¹¤°¤Ë¤ÏÌÀ¤é¤«¤Ë¤Ê¤é¤Ê¤«¤Ã¤¿¡¥
º£¤ÏÊÖ¤êÃÍ¤Î¸µ¤Ë¤Ê¤ë¤â¤Î¤ÏÆ»Ï©ÃÏ¿Þ¤Î¤è¤¦¤ËÌÜ¤ÎÁ°¤Ë¹­¤¬¤Ã¤Æ¤¤¤ë¡¥

¤³¤Î¾Ï¤Ç¤ÎÎã¤ÏÃ»¤¤¤â¤Î¤À¤Ã¤¿¤¬¡¤¤³¤ÎÊýË¡¤Î¥¹¥±¡¼¥ë¤Ï¼¡Âè¤Ë³ÈÂç¤¹¤ë¡¥
¼ÂºÝ¡¤Âçµ¬ÌÏ¤Ê´Ø¿ô¤ËÅ¬ÍÑ¤¹¤ì¤Ð¤½¤ì¤À¤±²ÁÃÍ¤¬½Ð¤Æ¤¯¤ë¡¥
ÉûºîÍÑ¤òµ¯¤³¤¹´Ø¿ô¤Ç¤µ¤¨¡¤ÉûºîÍÑ¤òµ¯¤³¤µ¤Ê¤¤¥Ñ¡¼¥Ä¤Ø¤È¤­¤ì¤¤¤ËÊ¬²ò¤Ç¤­¤ë¡¥
%}}}
\subsection{´Ø¿ôÅª¥¤¥ó¥¿¥Õ¥§¥¤¥¹}   %{{{
ÉûºîÍÑ¤¬µ¯¤³¤¹ÌäÂê¤Ë¤ÏÂç¤­¤¤¤â¤Î¤È¾®¤µ¤¤¤â¤Î¤¬¤¢¤ë¡¥
Îã¤¨¤Ð¼¡¤Î´Ø¿ô¤Ç¤Ï\verb@nconc@¤ò¸Æ¤ó¤Ç¤¤¤ë¤¬¡¤»²¾ÈÆ©ÌÀÀ­¤ÏÊÝ¤¿¤ì¤Æ¤¤¤ë
\footnote{»²¾ÈÆ©ÌÀÀ­¤ÎÄêµÁ¤Ë¤Ä¤¤¤Æ¤Ïpooh¥Ú¡¼¥¸¤ò»²¾È¡¥}¡¥
\begin{verbatim}
(defun qualify (expr)
  (nconc (copy-list expr) (list 'maybe)))
\end{verbatim}
¤³¤ì¤òÇ¤°Õ¤Î°ú¿ô¤Ç¸Æ¤ó¤Ç¤â¡¤°ú¿ô¤¬Æ±¤¸¤Ê¤éÉ¬¤ºÆ±¤¸¡Ê\verb@equal@¤òËþ¤¿¤¹¡ËÃÍ¤òÊÖ¤¹¡¥
¸Æ¤Ó½Ð¤·Â¦¤«¤é¸«¤ì¤Ð\verb@qualify@¤Ï½ã¿è¤Ê´Ø¿ôÅª¥³¡¼¥É¤Ç¤¢¤ë¤âÆ±Á³¤À¡¥
¤½¤Î¤³¤È¤Ï¡¤¼ÂºÝ¤Ë°ú¿ô¤ò½ñ¤­´¹¤¨¤Æ¤·¤Þ¤¦\verb@bad-reverse@¡Êkaboom¥Ú¡¼¥¸¡Ë
¤Ë¤ÏÅö¤Æ¤Ï¤Þ¤é¤Ê¤¤¡¥

Á´¤Æ¤ÎÉûºîÍÑ¤ò°ì³ç¤ê¤Ë°­¼Ô¤Ë¤¹¤ëÂå¤ï¤ê¤Ë¡¤
ÌäÂê¤Î¤¢¤ë¾ì¹ç¤È¤Ê¤¤¾ì¹ç¤ò¶èÊÌ¤¹¤ëÊýË¡¤¬¤¢¤ì¤ÐÊØÍø¤À¤í¤¦¡¥
Âç»¨ÇÄ¤Ë¸À¤¦¤È¡¤´Ø¿ô¤¬¡¤Â¾¤ÎÃ¯¤Î¤â¤Î¤Ç¤â¤Ê¤¤¥ª¥Ö¥¸¥§¥¯¥È¤ò½ñ¤­´¹¤¨¤ë¤Î¤ÏÌµ³²¤À¡¥
Îã¤¨¤Ð\verb@qualify@Æâ¤Î\verb@nconc@¤ÏÌµ³²¤À¤È¸À¤¨¤ë¡¥
¤½¤ì¤ÏÂè1°ú¿ô¤È¤·¤ÆÍ¿¤¨¤é¤ì¤¿¥ê¥¹¥È¤Ï¿·¤¿¤Ë¥³¥ó¥·¥ó¥°¤µ¤ì¤ë¤«¤é¤À¡¥
Â¾¤Î¤É¤Î´Ø¿ô¤â¤½¤ì¤Ë´Ø¤ï¤ë¤³¤È¤Ï¤Ê¤¤¡¥

°ìÈÌÅª¤Ê¾ì¹ç¤Ç¤Ï¡¤¥ª¥Ö¥¸¥§¥¯¥È¤ò¤É¤Î´Ø¿ô¤¬»ÙÇÛ¤·¤Æ¤¤¤ë¤«¤Ç¤Ï¤Ê¤¯¡¤
¤É¤Î´Ø¿ô¸Æ¤Ó½Ð¤·¤¬»ÙÇÛ¤·¤Æ¤¤¤ë¤«¤Ë¤Ä¤¤¤Æ¹Í¤¨¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¡¥
¼¡¤ÎÎã¤Ç¤ÏÊÑ¿ô\verb@x@¤ò»ÙÇÛ¤·¤Æ¤¤¤ë¤â¤Î¤ÏÂ¾¤Ë²¿¤â¤Ê¤¤¤¬¡¤
¸Æ¤Ó½Ð¤·¤ÎºîÍÑ¤Ï¡¤¼¡¤Î¸Æ¤Ó½Ð¤·»þ¤ËÌÀ¤é¤«¤Ë¤Ê¤ë¡¥
\begin{verbatim}
(let ((x 0))
  (defun total (y)
    (incf x y)))
\end{verbatim}
¤À¤«¤é¥ë¡¼¥ë¤Ï¤³¤¦¤¢¤ë¤Ù¤­¤À¡§
Ç¤°Õ¤Î´Ø¿ô¸Æ¤Ó½Ð¤·¤¬¡¤
¼«Ê¬¤À¤±¤¬»ÙÇÛ¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¤ò°ÂÁ´¤Ë½ñ¤­´¹¤¨¤é¤ì¤ë¤è¤¦¤Ë¤¹¤ë¡¥

²¿¤¬°ú¿ô¤ÈÊÖ¤êÃÍ¤ò»ÙÇÛ¤¹¤ë¤Î¤À¤í¤¦¡©
´Ø¿ô¸Æ¤Ó½Ð¤·¤ÏÊÖ¤êÃÍ¤È¤·¤Æ¼õ¤±¼è¤ë¥ª¥Ö¥¸¥§¥¯¥È¤ò»ÙÇÛ¤¹¤ë¤¬¡¤
°ú¿ô¤È¤·¤ÆÅÏ¤µ¤ì¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Ï»ÙÇÛ¤·¤Ê¤¤¡¤¤È¤¤¤¦¤Î¤¬Lisp¤Î´·½¬¤Î¤è¤¦¤À¡¥
°ú¿ô¤ËÊÑ¹¹¤ò²Ã¤¨¤ë´Ø¿ô¤Ï¡ÖÇË²õÅª¡×¤È¤Î¸Æ¤ÓÌ¾¤Ç¶èÊÌ¤µ¤ì¤ë¤¬¡¤
ÊÖ¤Ã¤Æ¤¯¤ë¥ª¥Ö¥¸¥§¥¯¥È¤ËÊÑ¹¹¤ò²Ã¤¨¤ë´Ø¿ô¤Ë¤ÏÆÃ¤Ë¸Æ¤ÓÌ¾¤¬¤Ê¤¤¡¥

Îã¤¨¤Ð¼¡¤Î´Ø¿ô¤Ï´·½¬¤Ë½¾¤Ã¤Æ¤¤¤ë¡§
\begin{verbatim}
(defun ok (x)
  (nconc (list 'a x) (list 'c)))
\end{verbatim}
¤³¤ì¤Ï´·½¬¤Ë½¾¤ï¤Ê¤¤\verb@nconc@¤ò¸Æ¤ó¤Ç¤¤¤ë¤¬¡¤
\verb@nconc@¤¬ÀÚ¤êÄ¥¤ê¤¹¤ë¥ê¥¹¥È¤Ï¿·¤·¤¯ºî¤é¤ì¤¿¤â¤Î¤Ç¡¤
\verb@ok@¤Ë°ú¿ô¤È¤·¤ÆÅÏ¤µ¤ì¤ë¥ê¥¹¥È¤È¤Ï°ã¤¦¡¥
¤À¤«¤é\verb@ok@¤½¤Î¤â¤Î¤ËÌäÂê¤Ï¤Ê¤¤¡¥

¤·¤«¤·¤³¤ì¤¬¶Ï¤«¤Ë°ã¤Ã¤Æ
\begin{verbatim}
(defun not-ok (x)
  (nconc (list 'a) x (list 'c)))
\end{verbatim}
¤È½ñ¤«¤ì¤Æ¤¤¤¿¤é¡¤
\verb@nconc@¤Î¸Æ¤Ó½Ð¤·¤Ï\verb@not-ok@¤ËÅÏ¤µ¤ì¤¿°ú¿ô¤ËÊÑ¹¹¤ò²Ã¤¨¤ë¤À¤í¤¦¡¥
Â¿¤¯¤ÎLisp¥×¥í¥°¥é¥à¤Ï¤³¤Î´·½¬¤ò¡Ê¾¯¤Ê¤¯¤È¤â¥í¡¼¥«¥ë¤ÊÈÏ°Ï¤Ç¤Ï¡ËÇË¤Ã¤Æ¤¤¤ë¡¥
¤·¤«¤·\verb@ok@¤Ç¸«¤¿¤è¤¦¤Ë¡¤¥í¡¼¥«¥ë¤ÊÈÏ°Ï¤Ç´·½¬¤òÇË¤Ã¤Æ¤â¡¤
´Ø¿ô¸Æ¤Ó½Ð¤·¤¬´·½¬¤òÇË¤ë¤³¤È¤Ë¤Ï¤Ê¤é¤Ê¤¤¡¥
¤½¤·¤Æ¾å¤Î¾ò·ï¤òËþ¤¿¤¹´Ø¿ô¤Ï¡¤½ã¿è¤Ë´Ø¿ôÅª¤Ê¥³¡¼¥É¤ÎÄ¹½ê¤òÂ¿¤¯ÊÝ¤Ä¤À¤í¤¦¡¥

½ã¿è¤Ë´Ø¿ôÅª¤Ê¤â¤Î¤ÈÁ´¤¯¶èÊÌ¤ÎÉÕ¤«¤Ê¤¤¥×¥í¥°¥é¥à¤ò½ñ¤¯¤Ë¤Ï¡¤
¤â¤¦°ì¤Ä¾ò·ï¤òÉÕ¤±²Ã¤¨¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¡¥
´Ø¿ô¤Ï¡¤¤³¤Î¥ë¡¼¥ë¤Ë½¾¤ï¤Ê¤¤Â¾¤Î¥³¡¼¥É¤È¥ª¥Ö¥¸¥§¥¯¥È¤ò¶¦Í­¤·¤Æ¤Ï¤¤¤±¤Ê¤¤¡¥
Îã¤¨¤Ð¼¡¤Î´Ø¿ô¤ÏÉûºîÍÑ¤ò»ý¤¿¤Ê¤¤¡¥
\begin{verbatim}
(defun anything (x)
  (+ x *anything*))
\end{verbatim}
¤³¤Î´Ø¿ô¤ÎÊÖ¤êÃÍ¤Ï¥°¥í¡¼¥Ð¥ëÊÑ¿ô \verb@*anything*@ ¤Ë°ÍÂ¸¤¹¤ë¡¥
¤À¤«¤éÂ¾¤Î´Ø¿ô¤¬¤³¤ÎÊÑ¿ô¤ÎÃÍ¤òÊÑ¤¨¤ë¤³¤È¤¬¤¢¤ì¤Ð¡¤
\verb@anything@¤ÎÊÖ¤¹ÃÍ¤Ï¤É¤¦¤È¤Ç¤â¤Ê¤ê¤¦¤ë¡¥

¸Æ¤Ó½Ð¤·¤Æ¤â¼«Ê¬¤À¤±¤¬´Ø¤ï¤ë¤â¤Î¤Ë¤·¤«ÊÑ¹¹¤ò²Ã¤¨¤Ê¤¤¤è¤¦¤Ë½ñ¤«¤ì¤¿¥³¡¼¥É¤Ï¡¤
½ã¿è¤Ë´Ø¿ôÅª¤Ê¥³¡¼¥É¤Ë°ú¤±¤ò¼è¤é¤Ê¤¤¡¥
¾åµ­¤Î¾ò·ï¤òÁ´¤ÆËþ¤¿¤¹´Ø¿ô¤Ï¡¤
¾¯¤Ê¤¯¤È¤â³°Éô¤Ë´Ø¿ôÅª¥¤¥ó¥¿¥Õ¥§¥¤¥¹¤òÄó¶¡¤·¤Æ¤¤¤ë¡§
¤½¤ì¤òÆ±¤¸°ú¿ô¤Ç2²ó¸Æ¤Ó½Ð¤»¤Ð¡¤Æ±¤¸·ë²Ì¤¬ÆÀ¤é¤ì¤ëÈ¦¤À¡¥
¤½¤·¤Æ¡¤¼¡¤Î¾Ï¤Ç¸«¤ë¤è¤¦¤Ë¡¤¤³¤ì¤¬¥Ü¥È¥à¥¢¥Ã¥×¡¦¥×¥í¥°¥é¥ß¥ó¥°¤ËÉ¬¿Ü¤Î¥Ý¥¤¥ó¥È¤À¡¥

ÇË²õÅª¤ÊÁàºî¤ÎÌäÂêÅÀ¤Î°ì¤Ä¤Ï¡¤¥°¥í¡¼¥Ð¥ëÊÑ¿ô¤ÈÆ±ÍÍ¡¤
¤½¤ì¤¬¥×¥í¥°¥é¥à¤Î¥í¡¼¥«¥ëÀ­¤òÂ»¤Ê¤¤¤¦¤ëÅÀ¤À¡¥
´Ø¿ôÅª¤Ê¥³¡¼¥É¤ò½ñ¤¤¤Æ¤¤¤ë¤È¤­¤Ï¡¤¾ÇÅÀ¤ò¹Ê¤ë¤³¤È¤¬¤Ç¤­¤ë¡§
½ñ¤¤¤Æ¤¤¤ë´Ø¿ô¤«¤é¸Æ¤Ó½Ð¤µ¤ì¤¿¤ê¡¤½ñ¤¤¤Æ¤¤¤ë´Ø¿ô¤ò¸Æ¤Ó½Ð¤¹´Ø¿ô¤À¤±¤ò¹Í¤¨¤ì¤Ð¤¤¤¤¡¥
²¿¤«¤ËÇË²õÅª¤ÊÊÑ²½¤ò²Ã¤¨¤è¤¦¤È¤¹¤ë¤È¡¤¤³¤ÎÄ¹½ê¤Ï¼º¤ï¤ì¤Æ¤·¤Þ¤¦¡¥
¤½¤Î´Ø¿ô¤Ï¤É¤³¤Ç»È¤Ã¤Æ¤â¤¤¤¤È¦¤À¤Ã¤¿¤Î¤Ë¡¥

¾åµ­¤Î¾ò·ï¤Ï¡¤½ã¿è¤Ê´Ø¿ôÅª¥³¡¼¥É¤ÇÆÀ¤é¤ì¤ë´°Á´¤Ê¥í¡¼¥«¥ëÀ­¤òÊÝ¾Ú¤¹¤ëÌõ¤Ç¤Ï¤Ê¤¤¤¬¡¤
¾õ¶·¤Ï´öÊ¬¤Ê¤ê¤È¤â²þÁ±¤µ¤ì¤ë¡¥
Îã¤¨¤Ð¼¡¤Î¤è¤¦¤Ë\verb@f@¤¬\verb@g@¤ò¸Æ¤Ó½Ð¤¹¤â¤Î¤È¤·¤è¤¦¡§
\begin{verbatim}
(defun f (x)
  (let ((val (g x)))
  ; ¤³¤³¤Çval¤ò½ñ¤­´¹¤¨¤Æ¤¤¤¤¤â¤Î¤«¡©
  ))
\end{verbatim}
\verb@f@¤¬\verb@val@¤ËÂÐ¤·¤Æ\verb@nconc@¤Ç²¿¤«¤òÏ¢·ë¤¹¤ë¤Î¤Ï°ÂÁ´¤À¤í¤¦¤«¡©
\verb@g@¤¬identity¤Î¤È¤­¤Ï¤½¤¦¤Ç¤Ï¤Ê¤¤¡§
¤½¤Î¤È¤­¤Ï¡¤¸µ¡¹¤Ï\verb@f@¤½¤Î¤â¤Î¤Ë°ú¿ô¤È¤·¤ÆÅÏ¤µ¤ì¤¿¤â¤Î¤ò½ñ¤­´¹¤¨¤Æ¤·¤Þ¤¦¤À¤í¤¦¡¥

¤À¤«¤éLisp¤Î´·½¬¤ò³Î¤«¤Ë¼é¤Ã¤Æ¤¤¤ë¥×¥í¥°¥é¥à¤Ç¤â¡¤
\verb@f@Æâ¤Ç²¿¤«¤ò½ñ¤­´¹¤¨¤¿¤¤¤Ê¤é¤½¤Î¸þ¤³¤¦¤ò¸«ÄÌ¤µ¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¤À¤í¤¦¡¥
¤È¸À¤Ã¤Æ¤â¡¤¤½¤ìÄø±ó¤¯¤ò¸«ÄÌ¤¹É¬Í×¤Ï¤Ê¤¤¡§
¥×¥í¥°¥é¥àÁ´ÂÎ¤Ë¤Ä¤¤¤Æ¿´ÇÛ¤·¤Ê¤¯¤Æ¤â¡¤
\verb@f@¤Î²¼¤ÎÉôÊ¬¥Ä¥ê¡¼¡Êsubtree¡Ë¤À¤±¤ò¹ÍÎ¸¤¹¤ì¤Ð¤¤¤¤¡¥

¾å¤Î´·½¬¤«¤éÆ³¤«¤ì¤ë¤Î¤Ï¡¤
´Ø¿ô¤Ï°ÂÁ´¤Ë½ñ¤­´¹¤¨¤é¤ì¤Ê¤¤¤â¤Î¤òÊÖ¤·¤Æ¤Ï¤¤¤±¤Ê¤¤¤È¤¤¤¦¤³¤È¤À¡¥
¤À¤«¤éÊÖ¤êÃÍ¤Ë¥¯¥©¡¼¥ÈÉÕ¤­¥ª¥Ö¥¸¥§¥¯¥È¤ò´Þ¤à¤è¤¦¤Ê´Ø¿ô¤ò½ñ¤¯¤Î¤ÏÈò¤±¤ë¤Ù¤­¤À¡¥
¤³¤³¤Ç\verb@exclaim@¤ò¡¤¤½¤ÎÊÖ¤êÃÍ¤¬¥¯¥©¡¼¥ÈÉÕ¤­¥ê¥¹¥È¤ò´Þ¤à¤è¤¦¤ËÄêµÁ¤·
\begin{verbatim}
(defun exclaim (expression)
  (append expression '(oh my)))
\end{verbatim}
¸Æ¤Ó½Ð¤·¸å¤ËÊÖ¤êÃÍ¤ËÇË²õÅª¤ÊÁàºî¤ò¤¹¤ë¤È
\begin{verbatim}
> (exclaim '(lions and tigers and bears))
(LIONS AND TIGERS AND BEARS OH MY)
> (nconc * '(goodness))
(LIONS AND TIGERS AND BEARS OH MY GOODNESS)
\end{verbatim}
´Ø¿ôÆâ¤Î¥ê¥¹¥È¤ËÊÑ¹¹¤òµÚ¤Ü¤¹¤³¤È¤Ë¤Ê¤ê¤¦¤ë¡§
\begin{verbatim}
> (exclaim '(fixnums and bignums and floats))
(FIXNUMS AND BIGNUMS AND FLOATS OH MY GOODNESS)
\end{verbatim}
\verb@exclaim@¤ò¤½¤¦¤¤¤Ã¤¿ÌäÂê¤ËÂÐ¤·¤Æ·ø¸Ç¤Ê¤â¤Î¤Ë¤¹¤ë¤Ë¤Ï¡¤¤³¤¦½ñ¤¯¤Ù¤­¤À¡§
\begin{verbatim}
(defun exclaim (expression)
  (append expression (list 'oh 'my)))
\end{verbatim}

´Ø¿ô¤¬¥¯¥©¡¼¥ÈÉÕ¤­¥ê¥¹¥È¤òÊÖ¤¹¤Ù¤­¤Ç¤Ê¤¤¤È¤¤¤¦¥ë¡¼¥ë¤Ë¤Ï¡¤Âç¤­¤ÊÎã³°¤¬1¸Ä¤¢¤ë¡§
¥Þ¥¯¥í¤òÀ¸À®¤¹¤ë´Ø¿ô¤À¡¥
¥Þ¥¯¥íÅ¸³«´Ø¿ô¤Ï¡¤À¸À®¤¹¤ë¥Þ¥¯¥íÅ¸³«¤¬¥³¥ó¥Ñ¥¤¥é¤Ë¤½¤Î¤Þ¤Þ¼õ¤±¼è¤é¤ì¤ë¤Ê¤é¡¤
¤½¤ÎÃæ¤Ë¥¯¥©¡¼¥ÈÉÕ¤­¥ê¥¹¥È¤ò°ÂÁ´¤Ë´Þ¤à¤³¤È¤¬¤Ç¤­¤ë¡¥

¤½¤ì°Ê³°¤Ç¤Ï¡¤°ìÈÌÅª¤Ë¸À¤Ã¤Æ¥¯¥©¡¼¥ÈÉÕ¤­¥ê¥¹¥È¤Ïµ¿¤Ã¤Æ¤¤¤¤¡¥
¤½¤ì¤é¤ÎÂ¿¤¯¤ÏÂçÄñ\verb@in@¡Êboom¥Ú¡¼¥¸¡ËÅù¤Î¥Þ¥¯¥í¤Ç¼Â¸½¤¹¤Ù¤­¤â¤Î¤À¡¥
%}}}
\subsection{¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¡¦¥×¥í¥°¥é¥ß¥ó¥°}   %{{{
Á°¤Î¾Ï¤Ç¤Ï¥×¥í¥°¥é¥à¤Î¹½À®¤Î¤è¤¤ÊýË¡¤È¤·¤Æ´Ø¿ôÅª¤Ê¥×¥í¥°¥é¥ß¥ó¥°¡¦¥¹¥¿¥¤¥ë¤òÄó¼¨¤·¤¿¡¥
¤·¤«¤·´Ø¿ôÅª¥×¥í¥°¥é¥ß¥ó¥°¡¦¥¹¥¿¥¤¥ë¤Ï¤½¤ì¤À¤±¤Î¤â¤Î¤Ç¤Ï¤Ê¤¤¡¥
Lisp¥×¥í¥°¥é¥Þ¤ÏÈþÅª¤ÊÍýÍ³¤À¤±¤Ç´Ø¿ôÅª¥×¥í¥°¥é¥ß¥ó¥°¡¦¥¹¥¿¥¤¥ë¤ò¼è¤Ã¤Æ¤¤¤ë¤Î¤Ç¤Ï¤Ê¤¤¡¥
ºî¶È¤¬´ÊÃ±¤Ë¤Ê¤ë¤«¤é¤½¤¦¤¹¤ë¤Î¤À¡¥
Lisp¤ÎÆ°Åª¤Ê´Ä¶­¤Ç¤Ï¡¤´Ø¿ôÅª¥×¥í¥°¥é¥à¤ÏÊÂ³°¤ì¤¿Â®¤µ¤Ç½ñ¤¯¤³¤È¤¬¤Ç¤­¡¤
Æ±»þ¤ËÊÂ³°¤ì¤¿¿®ÍêÀ­¤¬¹â¤¤¡¥

Lisp¤Ç¤Ï¥×¥í¥°¥é¥à¤Î¥Ç¥Ð¥Ã¥°¤ÏÈæ³ÓÅª´ÊÃ±¤À¡¥
¤¿¤¯¤µ¤ó¤Î¾ðÊó¤¬¼Â¹Ô»þ¤ËÍøÍÑ²ÄÇ½¤Ç¡¤¥¨¥é¡¼¤Î¸¶°ø¤ò¥È¥ì¡¼¥¹¤¹¤ë¤Î¤ËÌòÎ©¤Ä¡¥
¤·¤«¤·¤â¤Ã¤È½ÅÍ×¤Ê¤Î¤Ï¡¤¥×¥í¥°¥é¥à¤ò¥Æ¥¹¥È¤¹¤ë¤È¤­¤Î´ÊÃ±¤µ¤À¡¥
¥×¥í¥°¥é¥à¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤ÆÁ´ÂÎ¤ò°ìÅÙ¤Ë¥Æ¥¹¥È¤¹¤ëÉ¬Í×¤¬¤Ê¤¤¡¥
´Ø¿ô¤Ï¥È¥Ã¥×¥ì¥Ù¥ë¡¦¥ë¡¼¥×¤«¤é¸Ä¡¹¤Ë¸Æ¤Ó½Ð¤·¤Æ¥Æ¥¹¥È¤Ç¤­¤ë¡¥

¥Æ¥¹¥È¤ò¿ï»þ¹Ô¤¦¤³¤È¤Ë¤ÏÂçÊÑ²ÁÃÍ¤¬¤¢¤ë¤Î¤Ç¡¤
Lisp¤Î¥×¥í¥°¥é¥ß¥ó¥°¡¦¥¹¥¿¥¤¥ë¤Ï¤½¤ÎÄ¹½ê¤ò¼è¤êÆþ¤ì¤Æ¿Ê²½¤·¤Æ¤­¤¿¡¥
´Ø¿ôÅª¥×¥í¥°¥é¥ß¥ó¥°¡¦¥¹¥¿¥¤¥ë¤Ç½ñ¤«¤ì¤¿¥×¥í¥°¥é¥à¤Ï´Ø¿ô1¸ÄËè¤ËÍý²ò¤Ç¤­¤ë¤¬¡¤
ÆÉ¤àÊý¤ÎÂ¦¤«¤é¤Ï¤³¤ì¤¬Âç¤­¤ÊÄ¹½ê¤À¡¥
¤·¤«¤·´Ø¿ôÅª¥×¥í¥°¥é¥ß¥ó¥°¡¦¥¹¥¿¥¤¥ë¤Ï¡¤¥Æ¥¹¥È¤ò¿ï»þ¹Ô¤¦¤³¤È¤Ë¤â´°Á´¤ËÅ¬±þ¤·¤Æ¤¤¤ë¡§
¤³¤Î¥¹¥¿¥¤¥ë¤Ç½ñ¤«¤ì¤¿¥×¥í¥°¥é¥à¤Ï´Ø¿ô1¸ÄËè¤Ë¥Æ¥¹¥È¤Ç¤­¤ë¡¥
¤¢¤ë´Ø¿ô¤¬³°Éô¤ò»²¾È¤â¤»¤º¡¤ÊÑ¹¹¤â¤·¤Ê¤¤¤Ê¤é¡¤¤É¤ó¤Ê¥Ð¥°¤â¤¹¤°¤ËÌÀ¤é¤«¤Ë¤Ê¤ë¡¥
¤½¤¦¤¤¤Ã¤¿´Ø¿ô¤ÏÊÖ¤êÃÍ¤òÄÌ¤·¤Æ¤Î¤ß³°Éô¤Ë±Æ¶Á¤òµÚ¤Ü¤¹¤Î¤À¡¥
ÊÖ¤êÃÍ¤¬Í½ÁÛÄÌ¤ê¤Ç¤¢¤ë¸Â¤ê¡¤¤½¤ì¤òÊÖ¤·¤¿¥³¡¼¥É¤Ï¿®Íê¤Ç¤­¤ë¡¥

¼ÂºÝ¡¤½ÏÎýLisp¥×¥í¥°¥é¥Þ¤Ï¥Æ¥¹¥È¤·¤ä¤¹¤¤¤è¤¦¤Ë¥×¥í¥°¥é¥à¤ò¥Ç¥¶¥¤¥ó¤¹¤ë¡§
\begin{enumerate}
    \item Èà¤é¤ÏÉûºîÍÑ¤ò»È¤¦ÉôÊ¬¤ò´ö¤Ä¤«¤Î´Ø¿ô¤Ë³ÖÎ¥¤·¡¤
        ¥×¥í¥°¥é¥à¤ÎÂçÉôÊ¬¤Ï½ã¿è¤Ë´Ø¿ôÅª¤Ê¥×¥í¥°¥é¥ß¥ó¥°¡¦¥¹¥¿¥¤¥ë¤Ç½ñ¤±¤ë¤è¤¦¤Ë¤¹¤ë¡¥
    \item ´Ø¿ô¤¬ÉûºîÍÑ¤ò»È¤¦¤Î¤òÈò¤±¤é¤ì¤Ê¤¤¤Ê¤é¡¤
        Èà¤é¤Ï¾¯¤Ê¤¯¤È¤â¤½¤³¤Ë´Ø¿ôÅª¥¤¥ó¥¿¥Õ¥§¥¤¥¹¤òÀ¹¤ê¹þ¤â¤¦¤È¤¹¤ë¡¥
    \item Èà¤é¤Ï´Ø¿ô¤ËÌÀ³Î¤ÊÌÜÅª¤ò°ì¤Ä¤À¤±Í¿¤¨¤ë¡¥
\end{enumerate}
´Ø¿ô¤ò½ñ¤¯¤È¡¤¤½¤ì¤òÂåÉ½Åª¤Ê¾õ¶·¤Î¤É¤ì¤«¤Ç¥Æ¥¹¥È¤·¡¤ºÑ¤ó¤À¤é¼¡¤Î¾õ¶·¤Ë°Ü¤ë¡¥
Îû´¤¤¬¤½¤ì¤¾¤ìÍ½ÁÛÄÌ¤ê¤Î»Å»ö¤ò¤¹¤ì¤Ð¡¤ÊÉ¤Ï¤·¤Ã¤«¤êÎ©¤Ä¤À¤í¤¦¡¥

Lisp¤Ç¤Ï¡¤ÊÉ¼«ÂÎ¤â¤¦¤Þ¤¯¥Ç¥¶¥¤¥ó¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
1Ê¬´Ö¤ÎÅ¾Á÷¤ÎÃÙ¤ì¤¬¤¢¤ëÃæ¤Ç¡¤±ó¤¯Î¥¤ì¤¿Ã¯¤«¤È²ñÏÃ¤¹¤ë¤Î¤òÁÛÁü¤·¤ÆÍß¤·¤¤¡¥
¼¡¤Ë¤È¤Ê¤ê¤ÎÉô²°¤ÎÃ¯¤«¤È²ñÏÃ¤¹¤ë¤Î¤òÁÛÁü¤·¤ÆÍß¤·¤¤¡¥
Æ±¤¸²ñÏÃ¤¬Â®¤¯ºÑ¤à¤À¤±¤Ç¤Ï¤Ê¤¯¡¤²ñÏÃ¤Î¼ïÎà¤¬ÊÑ¤ï¤ë¤À¤í¤¦¡¥
Lisp¤Ç¤Ï¡¤¥½¥Õ¥È¥¦¥§¥¢³«È¯¤ÏÌÌ¤È¸þ¤«¤Ã¤ÆÏÃ¤ò¤¹¤ë¤è¤¦¤Ê¤â¤Î¤À¡¥
¥³¡¼¥É¤ò½ñ¤¯¤Ë¤Ä¤ì¤Æ¥Æ¥¹¥È¤¬¤Ç¤­¤ë¡¥
¤½¤·¤Æ´ÊÃ±¤ËÊý¿ËÅ¾´¹¤Ç¤­¤ë¤³¤È¤Ï¡¤
¤½¤ì¤¬²ñÏÃ¤ËµÚ¤Ü¤¹¤Î¤ÈÆ±¤¸¤¯¤é¤¤·àÅª¤Ê±Æ¶Á¤ò¥½¥Õ¥È¥¦¥§¥¢³«È¯¤ËµÚ¤Ü¤¹¡¥
¤½¤Î¤È¤­¡¤Æ±¤¸¥×¥í¥°¥é¥à¤òÂ®¤¯½ñ¤¤¤Æ¤¤¤ë¤À¤±¤Ç¤Ï¤Ê¤¤¡¥
ÊÌ¤Î¼ïÎà¤Î¥×¥í¥°¥é¥à¤ò½ñ¤¤¤Æ¤¤¤ë¤Î¤À¡¥

¤½¤ì¤Ï¤É¤¦¤ä¤Ã¤Æ¡©
¥Æ¥¹¥È¤¬ÁÇÁá¤¯ºÑ¤á¤Ð¡¤¤â¤Ã¤ÈÉÑÈË¤Ë¥Æ¥¹¥È¤¬¤Ç¤­¤ë¡¥
Lisp¤Ç¤Ï¡ÊÂ¾¤Î¤É¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤â¤½¤¦¤À¤¬¡Ë¡¤
¥½¥Õ¥È¥¦¥§¥¢³«È¯¤Ï¥³¡¼¥É½ñ¤­¤È¥Æ¥¹¥È¤Î¥µ¥¤¥¯¥ë¤«¤éÀ®¤ë¡¥
¤·¤«¤·Lisp¤Ç¤Ï¥µ¥¤¥¯¥ë¤¬¤È¤Æ¤âÃ»¤¤¡§
´Ø¿ô1¸ÄËè¡¤¤¤¤ä´Ø¿ô¤ÎÉôÊ¬Ëè¤Ç¤â¤¤¤¤¡¥
¤¢¤é¤æ¤ëÉôÊ¬¤ò½ñ¤¯¤Ë¤Ä¤ì¤Æ¥Æ¥¹¥È¤¹¤ì¤Ð¡¤
¥¨¥é¡¼¤¬µ¯¤­¤¿¤È¤­¤Ë¤É¤³¤ò¸«¤ì¤Ð¤¤¤¤¤«Ê¬¤«¤ë¤À¤í¤¦¡§
ºÇ¸å¤Ë½ñ¤¤¤¿ÉôÊ¬¤À¡¥
Ã±½ã¤ËÊ¹¤³¤¨¤ë¤¬¡¤¤³¤Î¸¶Â§¤Ï¥Ü¥È¥à¥¢¥Ã¥×¡¦¥×¥í¥°¥é¥ß¥ó¥°¤ò·ø¸Ç¤Ê¤â¤Î¤Ë¤·¤Æ¤¤¤ëÍ×°ø¤Î
Âç¤­¤Ê³ä¹ç¤òÀê¤á¤Æ¤¤¤ë¡¥
¤½¤ì¤Ï¹¹¤Ê¤ë¼«¿®¤ò¤â¤¿¤é¤·¡¤ Lisp¥×¥í¥°¥é¥Þ¤Ï¡Ê¾¯¤Ê¤¯¤È¤â¤¢¤ë°ì»þ¡Ë
¸Å¤¤¡Ö·×²è¡Ý¼ÂÁõ¡×¥¹¥¿¥¤¥ë¤Î¥½¥Õ¥È¥¦¥§¥¢³«È¯¤«¤é¥Õ¥ê¡¼¤Ë¤Ê¤ì¤ë¤Î¤À¡¥

Âè1.1Àá¤Ç¤Ï¡¤¥Ü¥È¥à¥¢¥Ã¥×¡¦¥Ç¥¶¥¤¥ó¤¬¿Ê²½¤¹¤ë¥×¥í¥»¥¹¤Ç¤¢¤ë¤³¤È¤ò¶¯Ä´¤·¤¿¡¥
¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ò¹½ÃÛ¤·¤Ä¤Ä¡¤¤½¤ì¤Ç¥×¥í¥°¥é¥à¤ò½ñ¤¯¤³¤È¤¬¤Ç¤­¤ë¡¥
¤³¤Î¥¢¥×¥í¡¼¥Á¤¬Í­¸ú¤Ê¤Î¤Ï²¼Éô¤Î¥³¡¼¥É¤ò¿®Íê¤Ç¤­¤ë¤È¤­¤ÎÏÃ¤À¡¥
¤½¤ÎÁØ¤òËÜÅö¤Ë¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¤·¤Æ»È¤¤¤¿¤¤¤Ê¤é¡¤
Áø¶ø¤·¤¿¥Ð¥°¤Ï¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤½¤Î¤â¤Î¤Ç¤Ï¤Ê¤¯¼«Ê¬¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥óÆâ¤Ë¤¢¤ë¡¤¤È
¡ÊÂ¾¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ò»È¤Ã¤¿¤È¤­¤ÈÆ±¤¸¤è¤¦¤Ë¡Ë³Î¿®¤Ç¤­¤ë¤è¤¦¤Ç¤Ê¤¯¤Æ¤Ï¤¤¤±¤Ê¤¤¡¥

¤À¤«¤é¿·¤·¤¯ºî¤Ã¤¿Ãê¾ÝÅª¹½Â¤¤Ï¤³¤Î½Å¤¤ÀÕÇ¤¤òÇØÉé¤ï¤Ê¤±¤ì¤Ð¤Ê¤é¤º¡¤
¤·¤«¤â¤½¤ì¤é¤ÏÉ¬Í×¤Ë±þ¤¸¤Æºî¤é¤ì¤ë¤è¤¦¤Ç¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¡¥
·ë¹½¤ÊÏÃ¤À¡¥
Lisp¤Ç¤ÏÎ¾Êý¤¬¼Â¸½¤Ç¤­¤ë¡¥
¥×¥í¥°¥é¥à¤ò´Ø¿ôÅª¥¹¥¿¥¤¥ë¤Ç½ñ¤­¡¤¤½¤ì¤ò¿ï»þ¥Æ¥¹¥È¤·¤Æ¤¤¤±¤Ð¡¤
Â¨ºÂ¤ËÌÜÅª¤òÃ£¤»¤ë¤è¤¦¤Ê½ÀÆðÀ­¤È¡¤
ÉáÄÌ¤Ê¤éÃí°Õ¿¼¤¯Î©¤Æ¤¿·×²è¤È·ë¤Ó¤Ä¤±¤Æ¹Í¤¨¤é¤ì¤ë¤è¤¦¤Ê¿®ÍêÀ­¤¬ÆÀ¤é¤ì¤ë¡¥
%}}}
%}}}
\section{¥æ¡¼¥Æ¥£¥ê¥Æ¥£´Ø¿ô}    %{{{
Common Lisp¤Î¥ª¥Ú¥ì¡¼¥¿¤Ï3¼ïÎà¤ËÊ¬¤«¤ì¤ë¡§
´Ø¿ô¤Ë¥Þ¥¯¥í¡Ê¥æ¡¼¥¶¤¬ºî¤ì¤ë¤â¤Î¡Ë¤È¡¤ÆÃ¼ì¥ª¥Ú¥ì¡¼¥¿¡Ê¥æ¡¼¥¶¤Ë¤Ïºî¤ì¤Ê¤¤¡Ë¤À¡¥
¤³¤Î¾Ï¤Ç¤Ï¡¤Lisp¤ò¿·¤·¤¤´Ø¿ô¤Ç³ÈÄ¥¤¹¤ë¥Æ¥¯¥Ë¥Ã¥¯¤òÀâÌÀ¤¹¤ë¡¥
¤·¤«¤·¤³¤³¤Ç¸À¤¦¡Ö¥Æ¥¯¥Ë¥Ã¥¯¡×¤ÏÉáÄÌ¤Î°ÕÌ£¤Î¤â¤Î¤Ç¤Ï¤Ê¤¤¡¥
¤½¤¦¤¤¤Ã¤¿´Ø¿ô¤Ë¤Ä¤¤¤ÆÃÎ¤ë¤Ù¤­½ÅÍ×¤ÊÅÀ¤Ï¡¤
¤½¤ì¤é¤ò¤É¤¦¤ä¤Ã¤Æ½ñ¤¯¤«¤È¤¤¤¦¤³¤È¤Ç¤Ï¤Ê¤¯¡¤¤½¤ì¤é¤¬¤É¤³¤«¤éÍè¤¿¤Î¤«¤È¤¤¤¦¤³¤È¤À¡¥
Lisp¤Î³ÈÄ¥¤Ë¤Ï¡¤Â¾¤Î´Ø¿ô¤ò½ñ¤¯¤È¤­¤ÈÂçÂÎÆ±¤¸¥Æ¥¯¥Ë¥Ã¥¯¤¬»È¤ï¤ì¤ë¤³¤È¤Ë¤Ê¤ë¡¥
¤½¤¦¤¤¤Ã¤¿³ÈÄ¥¤ò½ñ¤¯¤È¤­Æñ¤·¤¤¤Î¤Ï¡¤
¤É¤¦¤ä¤Ã¤Æ½ñ¤¯¤«¤ò·è¤á¤ë¤³¤È¤Ç¤Ï¤Ê¤¯¡¤²¿¤ò½ñ¤¯¤«¤ò·è¤á¤ë¤³¤È¤À¡¥
\subsection{¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ÎÃÂÀ¸}   %{{{
°ìÈÖÃ±½ã¤Ê¾ì¹ç¤Ç¤Ï¡¤Ã¯¤¬¥æ¡¼¥¶¤ÎLisp¤ò¥Ç¥¶¥¤¥ó¤·¤è¤¦¤È¡¤
¥Ü¥È¥à¥¢¥Ã¥×¡¦¥×¥í¥°¥é¥ß¥ó¥°¤È¤Ï¸å¤«¤éÉÕ¤¤¤¿Ì¾Á°¤Ë²á¤®¤Ê¤¤¡¥
¤Þ¤¿Æ±»þ¤Ë¡¤¥æ¡¼¥¶¤Ï¥×¥í¥°¥é¥à¤ò½ñ¤­¤Ê¤¬¤é¡¤
¥×¥í¥°¥é¥à¤ò½ñ¤­°×¤¯¤¹¤ë¿·¤·¤¤¥ª¥Ú¥ì¡¼¥¿¤òLisp¤ËÄÉ²Ã¤·¤Æ¤¤¤¯¡¥
¤³¤ì¤é¤Î¿·¤·¤¯ºî¤é¤ì¤¿¥ª¥Ú¥ì¡¼¥¿¤Ï¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤È¸Æ¤Ð¤ì¤ë¡¥

¡Ö¥æ¡¼¥Æ¥£¥ê¥Æ¥£¡×¤È¤¤¤¦¸ÀÍÕ¤ËÀµ³Î¤ÊÄêµÁ¤Ê¤É¤Ê¤¤¡¥
¤¢¤ëÃ»¤¤¥³¡¼¥É¤¬¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤È¸Æ¤Ð¤ì¤ë¤Î¤Ï¡¤
¤½¤ì¤¬Ã»¤¹¤®¤ÆÆÈÎ©¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤È¤Ï¸«¤Ê¤»¤º¡¤
¤·¤«¤âÍÑÅÓ¤¬°ìÈÌÅª²á¤®¤Æ¤¢¤ë¥×¥í¥°¥é¥à¤Î°ìÉô¤È¤â¸«¤Ê¤»¤Ê¤¤¾ì¹ç¤À¡¥
Îã¤¨¤Ð¡¤¥Ç¡¼¥¿¥Ù¡¼¥¹¡¦¥×¥í¥°¥é¥à¤Ï¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ë¤Ï¤Ê¤é¤Ê¤¤¤¬¡¤
¥ê¥¹¥È¤ËÃ±°ì¤ÎÁàºî¤ò¹Ô¤¦´Ø¿ô¤Ï¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ë¤Ê¤ê¤¦¤ë¡¥
ÂçÉôÊ¬¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ÏLisp¤¬´û¤ËÈ÷¤¨¤Æ¤¤¤ë´Ø¿ô¤ä¥Þ¥¯¥í¤Ë»÷¤Æ¤¤¤ë¡¥
¼ÂºÝ¡¤Common Lisp¤ÎÁÈ¤ß¹þ¤ß¥ª¥Ú¥ì¡¼¥¿¤ÎÂ¿¤¯¤Ï¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤È¤·¤ÆÀ¸¤Þ¤ì¤¿¤â¤Î¤À¡¥
´Ø¿ô\verb@remove-if-not@¤Ï¥ê¥¹¥È¤ÎÍ×ÁÇ¤Î¤¦¤Á¤¢¤ë½Ò¸ì¤òËþ¤¿¤¹¤â¤Î¤òÁ´¤Æ½¸¤á¤ë¤¬¡¤
Common Lisp¤Î°ìÉô¤Ë¤Ê¤ë¤Þ¤Ç¤Î²¿Ç¯¤â¤Î´Ö¡¤¸Ä¡¹¤Î¥×¥í¥°¥é¥Þ¤Ë¤è¤Ã¤Æ»È¤ï¤ì¤Æ¤¤¤¿¡¥

¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Î½ñ¤­Êý¤Ï¡¤
½ñ¤¯¤È¤­¤Î¥Æ¥¯¥Ë¥Ã¥¯¤È¤¹¤ë¤è¤ê¤â¿´ÆÀ¤È¤·¤¿Êý¤¬¾å¼ê¤¯ÀâÌÀ¤Ç¤­¤ë¡¥
¥Ü¥È¥à¥¢¥Ã¥×¡¦¥×¥í¥°¥é¥ß¥ó¥°¤È¤Ï¡¤
¥×¥í¥°¥é¥à¤È¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤òÆ±»þ¤Ë½ñ¤¤¤Æ¤¤¤¯¤³¤È¤À¡¥
¤³¤ì¤ò¾å¼ê¤Ë¤³¤Ê¤¹¤Ë¤Ï¡¤
¥×¥í¥°¥é¥à¤Ë¤É¤Î¥ª¥Ú¥ì¡¼¥¿¤¬·ç¤±¤Æ¤¤¤ë¤«¤ò±Ô¤¯´¶¤¸¤ë´¶³Ð¤òÃÃ¤¨¤Ê¤¤¤È¤¤¤±¤Ê¤¤¡¥
¥×¥í¥°¥é¥à¤ò¸«¤Æ¡¤¡Ö¤¢¤¢¡¤¤¢¤Ê¤¿¤¬ËÜÅö¤Ë¸À¤¤¤¿¤¤¤Î¤Ï¤³¤ì¤Ç¤·¤ç¤¦¡¥¡×
¤È¸À¤¨¤ë¤è¤¦¤Ë¤Ê¤é¤Ê¤¯¤Æ¤Ï¤¤¤±¤Ê¤¤¡¥

Îã¤¨¤Ð¡¤¤³¤³¤Ç\verb@nicknames@¤¬Ì¾Á°¤ò°ú¿ô¤Ë¼è¤ê¡¤
¤½¤ì¤«¤éÇÉÀ¸¤·¤¦¤ë°¦¾Î¤ÎÁ´¤Æ¤ò¥ê¥¹¥È¤Ë¤Þ¤È¤á¤ë´Ø¿ô¤À¤È¤·¤è¤¦¡¥
¤³¤Î´Ø¿ô¤¬Í¿¤¨¤é¤ì¤¿¤È¤­¡¤
Ì¾Á°¤Î¥ê¥¹¥È¤«¤éÆÀ¤é¤ì¤ë°¦¾Î¤òÁ´¤Æ½¸¤á¤ë¤Ë¤Ï¤É¤¦¤¹¤ì¤Ð¤¤¤¤¤À¤í¤¦¡©
Lisp¤ò³Ø½¬Ãæ¤ÎÃ¯¤«¤¬¼¡¤Î¤è¤¦¤Ê¥³¡¼¥É¤ò½ñ¤¯¤«¤â¤·¤ì¤Ê¤¤¡§
\begin{verbatim}
(defun all-nicknames (names)
  (if (null names)
      nil
      (nconc (nicknames (car names))
        (all-nicknames (cdr names)))))
\end{verbatim}
·Ð¸³¤òÀÑ¤ó¤ÀLisp¥×¥í¥°¥é¥Þ¤Ï¡¤¤³¤ó¤Ê´Ø¿ô¤ò¸«¤Æ
¡Ö¤¢¤¢¡¤ËÜÅö¤ËÍß¤·¤¤¤Î¤Ï\verb@mapcan@¤À¤í¡¥¡×¤È¸À¤¦¡¥
¤½¤ì¤Ê¤é¤¢¤ë¿Í¡¹¤Î°¦¾Î¤òÁ´¤ÆÃµ¤¹¿·¤·¤¤´Ø¿ô¤òÄêµÁ¤·¤Æ¸Æ¤Ó½Ð¤µ¤Ê¤¯¤Æ¤â¡¤1¸Ä¤Î¼°¤ÇºÑ¤à¡§
\begin{verbatim}
(mapcan #'nicknames people)
\end{verbatim}
\verb@all-nicknames@¤Ï¼ÖÎØ¤ÎºÆÈ¯ÌÀ¤À¡¥
¤À¤¬¡¤¤½¤ì¤¬¤Þ¤º¤¤¤Î¤Ï¤½¤ÎÅÀ¤À¤±¤Ç¤Ï¤Ê¤¤¡§
ÈÆÍÑ¥ª¥Ú¥ì¡¼¥¿¤Ç²ÄÇ½¤Ê¤³¤È¤òÆÃÄê¤Î´Ø¿ô¤ËËä¤â¤ì¤µ¤»¤Æ¤·¤Þ¤Ã¤Æ¤¤¤ë¡¥

¤³¤Î¾ì¹ç¥ª¥Ú¥ì¡¼¥¿\verb@mapcan@¤Ï´û¤ËÂ¸ºß¤·¤Æ¤¤¤¿¡¥
\verb@mapcan@¤òÃÎ¤Ã¤Æ¤¤¤¿¿Í¤Ï\verb@all-nicknames@¤ò¸«¤ë¤È¾¯¤·ÊÑ¤Êµ¤¤¬¤·¤¿¤À¤í¤¦¡¥
¥Ü¥È¥à¥¢¥Ã¥×¡¦¥×¥í¥°¥é¥ß¥ó¥°¤Ë¾åÃ£¤¹¤ë¤Ë¤Ï¡¤
»È¤ï¤ì¤Æ¤¤¤Ê¤¤¥ª¥Ú¥ì¡¼¥¿¤¬¤Þ¤À½ñ¤«¤ì¤Æ¤¤¤Ê¤¤¤â¤Î¤À¤Ã¤¿¤È¤­¡¤
Æ±¤¸¤è¤¦¤ÊÉÔ²÷´¶¤ò´¶¤¸¤é¤ì¤ë¤è¤¦¤Ë¤Ê¤é¤Ê¤¯¤Æ¤Ï¤¤¤±¤Ê¤¤¡¥
¡ÖËÜÅö¤ËÍß¤·¤¤¤Î¤Ï\verb@x@¤À¤í¡¥¡×¤È¸À¤¨¤Ê¤¯¤Æ¤Ï¤Ê¤é¤º¡¤
Æ±»þ¤Ë\verb@x@¤¬¤É¤¦¤¤¤¦¤â¤Î¤Ç¤¢¤ë¤Ù¤­¤«Ê¬¤«¤Ã¤Æ¤¤¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
Lisp¥×¥í¥°¥é¥ß¥ó¥°¤Ï¡¤²¿¤è¤ê¤âÉ¬Í×¤Ë±þ¤¸¤Æ¿·¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤òÀ¸¤ß½Ð¤¹¤³¤È¤òÉ¬Á³Åª¤ËÈ¼¤¦¡¥
¤³¤Î¾Ï¤ÎÁÀ¤¤¤Ï¡¤¤½¤¦¤¤¤Ã¤¿¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤¬¤É¤Î¤è¤¦¤ËÀ¸¤Þ¤ì¤ë¤«¤ò¼¨¤¹¤³¤È¤À¡¥

¤³¤³¤Ç¡¤\verb@towns@¤Ï¶áÎÙ¤Î³¹¤ò¶á¤¤Êý¤«¤é½ç¤ËÊÂ¤Ù¤¿¥ê¥¹¥È¤Ç¡¤
\verb@bookshops@¤Ï»ÔÆâ¤ÎÁ´¤Æ¤Î½ñÅ¹¤Î¥ê¥¹¥È¤òÊÖ¤¹´Ø¿ô¤À¤È¤·¤è¤¦¡¥
½ñÅ¹¤¬¤¢¤ë°ìÈÖ¶á¤¤³¹¤È¡¤¤½¤ÎÃæ¤Î½ñÅ¹¤òÃµ¤·¤¿¤¤¤È¤­¡¤¤Þ¤º¼¡¤Î¤â¤Î¤«¤é»Ï¤á¤è¤¦¡§
\begin{verbatim}
(let ((town (find-if #'bookshops towns)))
  (values town (bookshops town)))
\end{verbatim}
¤·¤«¤·¤³¤ì¤Ï¾¯¤·³Ê¹¥°­¤¤¡§\verb@find-if@¤¬
¡Ö\verb@bookshops@¤¬Èónil¤ÎÃÍ¤òÊÖ¤¹¤è¤¦¤ÊÍ×ÁÇ¡×¤ò¸«¤Ä¤±¤¿¤È¤­¤â¤½¤ÎÃÍ¤Ï¼Î¤Æ¤é¤ì¡¤
\verb@find-if@¤«¤éÌá¤Ã¤¿Ä¾¸å¤ËºÆ¤Ó¤½¤ÎÃÍ¤òµá¤á¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥
\verb@bookshops@¤Î¸Æ¤Ó½Ð¤·¤Î¥³¥¹¥È¤¬Âç¤­¤¤¤È¤¹¤ë¤È¡¤
´·ÍÑË¡¤Ë½¾¤Ã¤¿¤³¤ÎÊýË¡¤Ï³Ê¹¥°­¤¤¤Ð¤«¤ê¤«Èó¸úÎ¨¤Ë¤â¤Ê¤ë¤À¤í¤¦¡¥
ÉÔÉ¬Í×¤Ê½èÍý¤òÈò¤±¤ë¤¿¤á¡¤Âå¤ï¤ê¤Ë¼¡¤Î´Ø¿ô¤ò»È¤¦¡§
\begin{verbatim}
(defun find-books (towns)
  (if (null towns)
      nil
      (let ((shops (bookshops (car towns))))
        (if shops
            (values (car towns) shops)
            (find-books (cdr towns))))))
\end{verbatim}
\verb@(find-books towns)@¤Î¸Æ¤Ó½Ð¤·¤Ç¤Ï¡¤
¾¯¤Ê¤¯¤È¤âÉ¬Í×ºÇÄã¸Â¤Î·×»»¤ÇË¾¤ß¤Î·ë²Ì¤¬½Ð¤ë¡¥
¤·¤«¤·¤Á¤ç¤Ã¤ÈÂÔ¤Æ\wadash
¤¤¤Ä¤«¾­Íè¡¤ºÆ¤Ó»÷¤¿¤è¤¦¤Ê¸¡º÷¤ò¤·¤¿¤¯¤Ê¤ë¤³¤È¤Ï¤Ê¤¤¤À¤í¤¦¤«¡©
¤³¤³¤ÇËÜÅö¤ËÉ¬Í×¤Ê¤Î¤Ï¡¤\verb@find-if@¤È¡¤
È¯¸«¤µ¤ì¤¿Í×ÁÇ¤ÈÈæ³Ó´Ø¿ô¤ÎÊÖ¤êÃÍ¤ÎÎ¾Êý¤òÊÖ¤¹²¿¤«¤Î´Ø¿ô¤ò·ë¹ç¤¹¤ë¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤À¡¥
¤½¤Î¤è¤¦¤Ê¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï
\begin{verbatim}
(defun find2 (fn lst)
  (if (null lst)
      nil
      (let ((val (funcall fn (car lst))))
        (if val
            (values (car lst) val)
            (find2 fn (cdr lst))))))
\end{verbatim}
¤È¤·¤ÆÄêµÁ¤Ç¤­¤ë¡¥
\verb@find-books@¤È\verb@find2@¤¬»÷¤Æ¤¤¤ë¤³¤È¤ËÃí°Õ¤·¤è¤¦¡¥
¼ÂºÝ¡¤¸å¼Ô¤ÏÁ°¼Ô¤ÎÁ´ÂÎ¹½Â¤¤È¤·¤ÆÉ½¤»¤ë¡¥
º£¡¤¿·¤·¤¤¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò»È¤¨¤Ð¡¤ºÇ½é¤ÎÌÜÅª¤ò1¸Ä¤Î¼°¤ÇÃ£À®¤Ç¤­¤ë¡§
\begin{verbatim}
(find2 #'bookshops towns)
\end{verbatim}
Lisp¥×¥í¥°¥é¥ß¥ó¥°ÆÈÆÃ¤ÎÆÃÄ§¤Î°ì¤Ä¤Ï¡¤°ú¿ô¤È¤·¤Æ¤Î´Ø¿ô¤Î½ÅÍ×À­¤À¡¥
¤³¤ì¤ÏLisp¤¬¥Ü¥È¥à¥¢¥Ã¥×¡¦¥×¥í¥°¥é¥ß¥ó¥°¤ËÅ¬¤·¤Æ¤¤¤ëÍýÍ³¤Î°ìÉô¤À¡¥
´Ø¿ô¤Î¹ü³Ê¤òÃê¾Ý²½¤¹¤ë¤Î¤Ï¡¤°ú¿ô¤Ë´Ø¿ô¤ò»È¤¦¤³¤È¤ÇÆùÉÕ¤±¤¬¤Ç¤­¤ë¤È¤­¤Ë¤ÏÈæ³ÓÅª´ÊÃ±¤À¡¥

¥×¥í¥°¥é¥ß¥ó¥°¤ÎÆþÌç²ÝÄø¤Ç¤Ï¡¤ºÇ½é¤Ë¡ÖÃê¾Ý²½¤ÏÆóÅÙ¼ê´Ö¤Î²óÈò¤Ë¤Ä¤Ê¤¬¤ë¡×¤È¶µ¤¨¤ë¡¥
¤½¤ÎÃæ¤Î½éÊâ¤Î°ì¤Ä¤Ë¡ÖÆ°ºî¤ò½ÅÊ£¤µ¤»¤Æ¤Ï¤¤¤±¤Ê¤¤¡×¤È¤¢¤ë¡¥
Îã¤¨¤Ð¡¤1¡Á2¸Ä¤ÎÄê¿ô¤Ë½¾¤Ã¤ÆÆ±¤¸¤³¤È¤ò¤¹¤ë´Ø¿ô¤òÄê¿ôÊÌ¤ËÄêµÁ¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¤
1¸Ä¤Î´Ø¿ô¤òÄêµÁ¤·¡¤¤½¤ì¤ËÄê¿ô¤ò°ú¿ô¤È¤·¤ÆÍ¿¤¨¤ì¤Ð¤¤¤¤¡¥

Lisp¤Ç¤Ï´Ø¿ôÁ´ÂÎ¤ò°ú¿ô¤È¤·¤ÆÅÏ¤»¤ë¤Î¤Ç¡¤¤³¤Î¹Í¤¨¤ò¤µ¤é¤Ë¿¼¤á¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
Á°½Ò¤ÎÎã¤ÎÎ¾Êý¤Ç¡¤ÆÃÄê¤Î´Ø¿ô¤«¤é»Ï¤á¤Æ¡¤´Ø¿ô¤ò°ú¿ô¤Ë¼è¤ë°ìÈÌÅª¤Ê´Ø¿ô¤Ë¿Ê¤ó¤À¡¥
1ÈÖÌÜ¤ÎÎã¤Ç¤Ï´û¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤¿\verb@mapcan@¤ò»È¤¤¡¤
2ÈÖÌÜ¤ÎÎã¤Ç¤Ï¿·¤·¤¤¥æ¡¼¥Æ¥£¥ê¥Æ¥£\verb@find2@¤ò½ñ¤¤¤¿¤¬¡¤
Á´ÂÎÅª¤Ê¸¶Â§¤ÏÆ±¤¸¤À¡§
°ìÈÌÉôÊ¬¤È¸ÄÊÌÉôÊ¬¤òº®¤¼¹ç¤ï¤»¤ë¤Î¤Ç¤Ê¤¯¡¤
°ìÈÌÉôÊ¬¤òÄêµÁ¤·¤Æ¸ÄÊÌÉôÊ¬¤ò°ú¿ô¤È¤·¤ÆÅÏ¤¹¤³¤È¡¥

Ãí°Õ¿¼¤¯Å¬ÍÑ¤¹¤ì¤Ð¡¤¤³¤Î¸¶Â§¤ÏÌÜ³Ð¤Þ¤·¤¤Äø¥¨¥ì¥¬¥ó¥È¤Ê¥×¥í¥°¥é¥à¤ò¤â¤¿¤é¤¹¡¥
¥Ü¥È¥à¥¢¥Ã¥×¡¦¥×¥í¥°¥é¥ß¥ó¥°¤ò»Ù¤¨¤ëÎÏ¤Ï¤½¤ì¤À¤±¤Ç¤Ï¤Ê¤¤¤¬¡¤¤³¤ì¤Ï¼çÍ×¤Ê¤â¤Î¤À¡¥
¤³¤Î¾Ï¤ÇÄêµÁ¤·¤¿32¸Ä¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Î¤¦¤Á¡¤18¸Ä¤¬´Ø¿ô¤ò°ú¿ô¤Ë¼è¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
%}}}
\subsection{Ãê¾Ý²½¤Ø¤ÎÅê»ñ} %{{{
´Ê·é¤µ¤¬¥¦¥£¥Ã¥È¤Îº²¤Ê¤é¤Ð¡¤¤½¤ì¤Ï¤Þ¤¿¡¤¸úÎ¨¤ÈÊÂ¤ó¤Ç¡¤¤¤¤¤¥½¥Õ¥È¥¦¥§¥¢¤Î¿¿¿ñ¤Ç¤â¤¢¤ë¡¥
¥×¥í¥°¥é¥à¤ò½ñ¤¤¤¿¤êÊÝ¼é¤¹¤ë¤Î¤Ë¤«¤«¤ë¥³¥¹¥È¤Ï¡¤
¥×¥í¥°¥é¥à¤¬Ä¹¤¯¤Ê¤ë¤Ë¤Ä¤ì¤Æ¹â¤Þ¤ë\note{MaintainningCost}¡¥
Â¾¤Î¾ò·ï¤¬Æ±¤¸¤Ê¤é¡¤Ã»¤¤¥×¥í¥°¥é¥à¤ÎÊý¤¬¤¤¤¤¡¥

¤³¤Î»ëÅÀ¤«¤é¤Ï¡¤¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ÎºîÀ®¤Ï¼çÍ×¤ÊÏ«ÎÏÇÛÊ¬¤ÎÂÐ¾Ý¤È¸«¤Ê¤µ¤ì¤ë¤Ù¤­¤À¡¥
\verb@find-books@¤ò¥æ¡¼¥Æ¥£¥ê¥Æ¥£\verb@find2@¤ÇÃÖ¤­´¹¤¨¤¿·ë²Ì¡¤
¥³¡¼¥É¤Î¹Ô¿ô¤ÏÊÑ¤ï¤é¤Ê¤«¤Ã¤¿¡¥
¤·¤«¤·¤¢¤ë°ÕÌ£¤Ç¤Ï¥×¥í¥°¥é¥à¤òÃ»¤¯¤·¤¿¤³¤È¤Ë¤Ê¤Ã¤¿¡¥
¤Ê¤¼¤Ê¤é¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ÎÄ¹¤µ¤Ï¸½ºßÀ½ºîÃæ¤Î¥×¥í¥°¥é¥à¤ÎÄ¹¤µ¤Ë²Ã¤¨¤Ê¤¯¤Æ¤â¤¤¤¤¤«¤é¤À¡¥

Lisp¤Î³ÈÄ¥¤ò¼çÍ×¤ÊÏ«ÎÏÇÛÊ¬¤ÎÂÐ¾Ý¤È¤·¤Æ°·¤¦¤Î¤Ï¡¤Ã±¤Ê¤ë¿ô»ú¾å¤Î¤´¤Þ¤«¤·¤Ç¤Ï¤Ê¤¤¡¥
¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ÏÆÈÎ©¤·¤¿¥Õ¥¡¥¤¥ë¤Ë¼ý¤á¤ë¤³¤È¤â¤Ç¤­¤ë¡¥
¥×¥í¥°¥é¥àÀ½ºî¤Ë½¾»ö¤·¤Æ¤¤¤ë¤È¤­¤Ë¤Ï¡¤¤½¤ì¤é¤Ï»äÃ£¤ÎÌÜ¤òÈÑ¤ï¤»¤Ê¤¤¤·¡¤
¸å¤Ç¤½¤Î¥×¥í¥°¥é¥à¤Î²¿¤«¤òÊÑ¹¹¤·¤Ê¤¤¤È¤¤¤±¤Ê¤¯¤Ê¤Ã¤¿¤È¤­¤Ë¤â¡¤
¤½¤ì¤é¤ÎÃæ¿È¤¬´Ø¤ï¤Ã¤Æ¤¯¤ë¤³¤È¤Ï¤Þ¤º¤Ê¤¤¤À¤í¤¦¡¥

¤·¤«¤·¡¤¼çÍ×¤ÊÏ«ÎÏÇÛÊ¬¤ÎÂÐ¾Ý¤È¤·¤Æ¡¤¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ë¤ÏÍ¾Ê¬¤ËÃí°Õ¤òÊ§¤ï¤Ê¤¤¤È¤¤¤±¤Ê¤¤¡¥
¤½¤ì¤Ï¾å¼ê¤¯½ñ¤±¤Æ¤¤¤ë¤³¤È¤¬ÆÃ¤Ë½ÅÍ×¤À¡¥
·«¤êÊÖ¤·»È¤ï¤ì¤ë¤â¤Î¤À¤«¤é¡¤´Ö°ã¤¤¤äÈó¸úÎ¨¤ÊÆ°ºî¤â·«¤êÊÖ¤µ¤ì¤ë¤À¤í¤¦¡¥
¤½¤Î¥Ç¥¶¥¤¥ó¤Ë¤âÍ¾Ê¬¤ÊÃí°Õ¤¬É¬Í×¤À¡§
¿·¤·¤¤¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¡¤ÌÜÁ°¤ÎÌäÂê¤À¤±¤Ç¤Ï¤Ê¤¯°ìÈÌÅª¤Ê¾õ¶·¤ËÂÐ¤·¤Æ½ñ¤«¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¡¥
ºÇ¸å¤Ë¡¤¤½¤ÎÂ¾¤Î¼çÍ×¤ÊÏ«ÎÏÇÛÊ¬¤ÎÂÐ¾Ý¤ÈÆ±ÍÍ¡¤¹²¤Æ¤Æ½ñ¤¤¤Æ¤Ï¤¤¤±¤Ê¤¤¡¥
¿·¤·¤¤²¿¤«¤Î¥ª¥Ú¥ì¡¼¥¿¤òÀ¸¤ß½Ð¤½¤¦¤È¹Í¤¨¤Æ¤¤¤ë¤¬¡¤
ÊÌ¤Î¤È¤­¤ËÉ¬Í×¤Ë¤Ê¤ë¤«¤É¤¦¤«¤è¤¯Ê¬¤«¤é¤Ê¤¤¤È¤­¤Ï¡¤¤½¤ì¤ò½ñ¤¤¤Æ¤·¤Þ¤¦¤³¤È¡¥
¤·¤«¤·¡¤¤½¤ì¤ò»È¤¦ÆÃÄê¤Î¥×¥í¥°¥é¥àÆâ¤Ë¤Þ¤ÀÃÖ¤¤¤Æ¤ª¤¯¤Î¤À¡¥
¤½¤Î¸å¡¤Â¾¤Î¥×¥í¥°¥é¥à¤Ç¤½¤Î¿·¥ª¥Ú¥ì¡¼¥¿¤ò»È¤¦¤³¤È¤¬¤¢¤ì¤Ð¡¤
¤½¤ì¤ò¥µ¥Ö¥ë¡¼¥Á¥ó¤«¤é¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ø¾º³Ê¤µ¤»¤Æ¹­¤¯ÍøÍÑ²ÄÇ½¤Ë¤¹¤ì¤Ð¤¤¤¤¡¥

¥æ¡¼¥Æ¥£¥ê¥Æ¥£\verb@find2@¤Ï¤è¤¤Åê»ñ¤À¤Ã¤¿¤è¤¦¤À¡¥
7¹Ô¤ÎÅê»ñ¤ò¤¹¤ë¤³¤È¤ÇÂ¨ºÂ¤Ë7¹Ô¤¬ÀáÌó¤Ç¤­¤¿¡¥
¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤È¤¤¤¦¤â¤Î¤Ï¡¤1²ó»È¤¦¤À¤±¤Ç¸µ¤¬¼è¤ì¤ë¡¥
Guy Steele¤Î¸ÀÍÕ¤Ë¡¤¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ï
¡Ö»äÃ£¤Î»ý¤Ä´Ê·é¤µ¤Ø¤Î¼«Á³¤Ê·¹¸þ¤È¶¨Ä´¡×¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¤¤È¤¢¤ë¡¥
\begin{quote}
\dots ¥×¥í¥°¥é¥ß¥ó¥°¹½Â¤¤Î¥³¥¹¥È¤Ï¥×¥í¥°¥é¥Þ¤Î¶¯¤¤¤é¤ì¤¿¶ìÏ«¤ÎÎÌ¤ËÈæÎã¤¹¤ë¡¤
¤È¿®¤¸¤¬¤Á¤À
¡Ê¤³¤³¤Ç¡Ö¿®¤¸¤ë¡×¤È¤¤¤¦¸ÀÍÕ¤Ï¡¤Ç®Îõ¤Ê³Î¿®¤Ç¤Ï¤Ê¤¯Ìµ°Õ¼±¤Î·¹¸þ¤È¤¤¤¦°ÕÌ£¤Ç»È¤Ã¤¿¡Ë¡¥
¼ÂºÝ¡¤¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¥Ç¥¶¥¤¥Ê¤¬¤³¤ÎÀº¿ÀÅª¸¶Â§¤ò¿´¤ËÎ±¤á¤Æ¤ª¤¯¤Î¤Ï
°­¤¤¤³¤È¤Ç¤Ï¤Ê¤¤\note{belief}¡¥
²Ã»»Áàºî¤ò¥³¥¹¥È¤ÎÄã¤¤¤â¤Î¤È»×¤¦ÍýÍ³¤Î°ì¤Ä¤Ï¡¤
¤½¤ì¤ò1Ê¸»ú\,``\verb@+@''\,¤ÇÉ½µ­¤Ç¤­¤ë¤³¤È¤À¡¥
¤¢¤ë¥×¥í¥°¥é¥ß¥ó¥°¹½Â¤¤Ë¹â¤¤¥³¥¹¥È¤¬¤«¤«¤ë¤È¤Ï»×¤Ã¤Æ¤â¡¤
¤½¤ì¤¬¥³¡¼¥É½ñ¤­¤ÎÏ«ÎÏ¤òÈ¾Ê¬¤Ë¤·¤Æ¤¯¤ì¤ë¤Ê¤é¡¤
¤·¤Ð¤·¤Ð¥³¥¹¥È¤ÎÄã¤¤¤â¤Î¤è¤ê¤½¤Á¤é¤¬¹¥¤Þ¤ì¤ë¡¥
\end{quote}
¤É¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤â¡Ö´Ê·é¤µ¤Ø¤Î·¹¸þ¡×¤Ï¡¤
¤½¤ì¤ò¿·¤·¤¤¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ËÅ¬±þ¤µ¤»¤é¤ì¤ë½ÀÆðÀ­¤¬¤Ê¤¤¸Â¤ê¡¤ÌäÂê¤Î¼ï¤Ë¤Ê¤ë¡¥
°ìÈÖÃ»¤¤´·ÍÑË¡¤¬°ìÈÖ¸úÎ¨Åª¤Ê¤³¤È¤ÏÌÇÂ¿¤Ë¤Ê¤¤¡¥
¤¢¤ë¥ê¥¹¥È¤¬ÊÌ¤Î¥ê¥¹¥È¤è¤êÄ¹¤¤¤«¤É¤¦¤«ÃÎ¤ê¤¿¤¤¤È¤­¡¤ÁÇ¤Î¤Þ¤Þ¤ÎLisp¤Ç¤Ï
\begin{verbatim}
(> (length x) (length y))
\end{verbatim}
¤È½ñ¤­¤¿¤¯¤Ê¤ë¡¥
¤¢¤ë´Ø¿ô¤òÊ£¿ô¤Î¥ê¥¹¥È¤ÎÍ×ÁÇ¤ËÅ¬ÍÑ¤·¤¿¤¤¤È¤­¤â¡¤Æ±ÍÍ¤Ë¥ê¥¹¥È¤ò¼¡¤Î¤è¤¦¤ËÏ¢·ë¤·¤¿¤¯¤Ê¤ë¡§
\begin{verbatim}
(mapcar fn (append x y z))
\end{verbatim}
¤³¤¦¤·¤¿Îã¤«¤é¡¤
¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¤½¤ì¤Ê¤·¤Ç¤ÏÈó¸úÎ¨Åª¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤¦¾õ¶·¤ËÂÐ¤·¤Æ½ñ¤¯¤³¤È¤¬Âç»ö¤À¤ÈÊ¬¤«¤ë¡¥
Å¬ÀÚ¤Ê¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ë¤è¤Ã¤ÆÊä¶¯¤µ¤ì¤¿¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤¬¤¢¤ì¤Ð¡¤
°ìÁØÃê¾ÝÅª¤Ê¥×¥í¥°¥é¥à¤¬½ñ¤±¤ë¤À¤í¤¦¡¥
¹¹¤Ë¤½¤ì¤é¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¡¤Å¬ÀÚ¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ì¤Ð¡¤
¸úÎ¨Åª¤Ê¥×¥í¥°¥é¥à¤ò½ñ¤±¤ë¤è¤¦Æ³¤¤¤Æ¤¯¤ì¤ë¡¥

¥æ¡¼¥Æ¥£¥ê¥Æ¥£½¸¤Ï³Î¼Â¤Ë¥×¥í¥°¥é¥ß¥ó¥°¤ò´ÊÃ±¤Ë¤·¤Æ¤¯¤ì¤ë¡¥
¤·¤«¤·¥æ¡¼¥Æ¥£¥ê¥Æ¥£½¸¤ÎÌò³ä¤Ï¤½¤ì¤À¤±¤Ç¤Ï¤Ê¤¤¡§
¤¤¤¤¥×¥í¥°¥é¥à¤¬½ñ¤±¤ë¤è¤¦¤Ë¤â¤·¤Æ¤¯¤ì¤ë¡¥
·Ý½Ñ¤Î¿À¤Ï¡¤¥³¥Ã¥¯¤ÈÆ±¤¸¤Ç¡¤ºàÎÁ¤òÌÜ¤Ë¤·¤¿»þÅÀ¤Ç¹ÔÆ°¤Ë°Ü¤ë¡¥
¤À¤«¤é·Ý½Ñ²È¤Ï¥¢¥È¥ê¥¨Æâ¤Ë¤¿¤¯¤µ¤ó¤ÎÆ»¶ñ¤ä²èºà¤ò»ý¤Ã¤Æ¤ª¤­¤¿¤¬¤ë¤Î¤À¡¥
Èà¤é¤Ï¡¤É¬Í×¤Ê¤â¤Î¤ò¼ê¸µ¤Ë¤·¤Ã¤«¤ê½àÈ÷¤·¤Æ¤ª¤±¤Ð¡¤¿·¤·¤¤¤³¤È¤ò»Ï¤á°×¤¤¤³¤È¤òÃÎ¤Ã¤Æ¤¤¤ë¡¥
Æ±¤¸¸½¾Ý¤Ï¥Ü¥È¥à¥¢¥Ã¥×¡¦¥¹¥¿¥¤¥ë¤Ç½ñ¤«¤ì¤ë¥×¥í¥°¥é¥à¤Ç¤â¸½¤ì¤ë¡¥
¿·¤·¤¤¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò½ñ¤¯¤È¡¤¤½¤ì¤òÍ½ÁÛ¤è¤êÂ¿¤¯»È¤¦¤³¤È¤Ëµ¤ÉÕ¤¯¤À¤í¤¦¡¥
¼¡¤Î¾Ï¤Ç¤Ï¡¤¿ô¼ïÎà¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£´Ø¿ô¤òÀâÌÀ¤¹¤ë¡¥
¤½¤ì¤é¤Ï¡¤¤É¤Î¤è¤¦¤Ê°ÕÌ£¤Ë¤ª¤¤¤Æ¤â¡¤
¤¢¤Ê¤¿¤¬Lisp¤ËÄÉ²Ã¤·¤¿¤¤¤È»×¤¦¤è¤¦¤Ê´Ø¿ô¤ÎÁ´¤Æ¤Î¼ïÎà¤òÂåÉ½¤·¤Æ¤¤¤ë¤ï¤±¤Ç¤Ï¤Ê¤¤¡¥
¤·¤«¤·¡¤Îã¼¨¤µ¤ì¤¿¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¤É¤ì¤â¸½¾ì¤Ç²ÁÃÍ¤ò¾ÚÌÀ¤µ¤ì¤¿¤â¤Î¤Ð¤«¤ê¤À¡¥
%}}}
\subsection{¥ê¥¹¥È¤ËÂÐ¤¹¤ëÁàºî} %{{{
¸µ¡¹¡¤¥ê¥¹¥È¤ÏLisp¤Î¼çÍ×¤Ê¥Ç¡¼¥¿¹½Â¤¤À¤Ã¤¿¡¥
»ö¼Â¡¤``Lisp''¤È¤¤¤¦Ì¾Á°¤Ï``LISt \mbox{Processing}''¤«¤éÍè¤Æ¤¤¤ë¡¥
¤·¤«¤·Lisp¤¬¤³¤ÎÎò»Ë¾å¤Î»ö¼Â¤Î¤»¤¤¤Ç¸í²ò¤µ¤ì¤Æ¤Ïº¤¤ë¡¥
¥Ý¥í¥·¥ã¥Ä¤¬¥Ý¥íÀìÍÑ¤Ç¤Ê¤¤¤Î¤ÈÆ±¤¸¤¯¡¤Lisp¤Ï¥ê¥¹¥ÈÁàºîÍÑ¤ËÀ¸¤Þ¤ì¤¿¤Î¤Ç¤Ï¤Ê¤¤¡¥
¹âÅÙ¤ÊºÇÅ¬²½¤ò»Ü¤µ¤ì¤¿Common Lisp¥×¥í¥°¥é¥à¤Ç¤Ï¡¤¥ê¥¹¥È¤òÁ´¤¯¸«¤«¤±¤Ê¤¤¤À¤í¤¦¡¥

¤·¤«¤·¡¤Lisp¥×¥í¥°¥é¥à¤Ï¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¤Ï¤ä¤Ï¤ê¥ê¥¹¥È¤À¡¥
¹âÅÙ¤ËÀöÎý¤µ¤ì¤¿Lisp¥×¥í¥°¥é¥à¤Ï¼Â¹Ô»þ¤Ë¤ÏÍ¾¤ê¥ê¥¹¥È¤ò»È¤ï¤Ê¤¤¤¬¡¤
µÕ¤Ë¤½¤ÎÊ¬¡¤¥³¥ó¥Ñ¥¤¥ë»þ¤Î¥Þ¥¯¥íÅ¸³«¤òÀ¸À®¤¹¤ë¤È¤­¤Ë¤ÏÂ¿¤¯¤Î¥ê¥¹¥È¤ò»È¤¦¡¥
¤À¤«¤é¸½Âå¤ÎLispÊý¸À¤Ç¤Ï¥ê¥¹¥È¤ÎÌò³ä¤Ï¸º¾¯¤·¤¿¤¬¡¤
¥ê¥¹¥È¤ËÂÐ¤¹¤ëÁàºî¤Ï°ÍÁ³¤È¤·¤ÆLisp¥×¥í¥°¥é¥à¤ÎÂç¤­¤ÊÉôÊ¬¤òÀê¤á¤ë¤³¤È¤¬¤¢¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(proclaim '(inline last1 single append1 conc1 mklist))

(defun last1 (lst)
  (car (last lst)))

(defun single (lst)
  (and (consp lst) (not (cdr lst))))

(defun append1 (lst obj)
  (append lst (list obj)))

(defun conc1 (lst obj)
  (nconc lst (list obj)))

(defun mklist (obj)
  (if (listp obj) obj (list obj)))
\end{FramedVerb}\end{center}
\caption{¥ê¥¹¥È¤ËºîÍÑ¤¹¤ë¾®¤µ¤Ê´Ø¿ô}
\label{fig:SmallF}
\end{figure}

Âè\ref{fig:SmallF}¿Þ¤ÈÂè\ref{fig:LargeF}¿Þ¤Ë¤Ï¡¤
¥ê¥¹¥È¤òÀ¸À®¤·¤¿¤ê¥ê¥¹¥È¤Ë´Ø¤¹¤ë¾ò·ïÈ½ÃÇ¤ò¹Ô¤¦´Ø¿ô¤ò´ö¤Ä¤«¼¨¤·¤¿¡¥
Âè\ref{fig:SmallF}¿Þ¤Î¤â¤Î¤Ï¡¤ÄêµÁ¤¹¤ë²ÁÃÍ¤Î¤¢¤ë¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ÎÃæ¤Ç¤âºÇ¾®µ¬ÌÏ¤Î¤â¤Î¤À¡¥
¸úÎ¨À­¤Î¤¿¤á¡¤¤½¤ì¤é¤Ë¤Ï¤ß¤Ê¥¤¥ó¥é¥¤¥óÀë¸À¤ò¤¹¤ë¤Ù¤­¤À¡¥

1ÈÖÌÜ¤Î\verb@last1@¤Ï¥ê¥¹¥È¤ÎºÇ¸å¤ÎÍ×ÁÇ¤òÊÖ¤¹¡¥
ÁÈ¤ß¹þ¤ß´Ø¿ô\verb@last@¤¬ÊÖ¤¹¤Î¤Ï¥ê¥¹¥È¤ÎºÇ¸å¤Î¥³¥ó¥¹¤Ç¡¤ºÇ¸å¤ÎÍ×ÁÇ¤Ç¤Ï¤Ê¤¤¡¥
\verb@last@¤ò»È¤¦¤Î¤ÏÂçÄñ\verb@(car (last ...))@¤È¤·¤ÆºÇ¸å¤ÎÍ×ÁÇ¤òÆÀ¤ë¤¿¤á¤À¡¥
¤½¤ó¤Ê¾ì¹ç¤Ë¿·¤·¤¤¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò½ñ¤¯²ÁÃÍ¤¬¤¢¤ë¤À¤í¤¦¤«¡©
¤½¤¦¡¤¤½¤ì¤¬¼Â¼ÁÅª¤ËÁÈ¤ß¹þ¤ß´Ø¿ô¤ÎÂå¤ï¤ê¤Ë¤Ê¤ë¤è¤¦¤Ê¤È¤­¤Ï½ñ¤¯²ÁÃÍ¤¬¤¢¤ë¡¥
\verb@last1@¤Ï¥¨¥é¡¼¡¦¥Á¥§¥Ã¥¯¤ò¤·¤Ê¤¤¤³¤È¤ËÃí°Õ¤¹¤ë¤³¤È¡¥
°ìÈÌÅª¤Ë¤Ï¡¤¤³¤ÎËÜ¤ÇÄêµÁ¤µ¤ì¤¿¥³¡¼¥É¤Ï¤É¤ì¤â¥¨¥é¡¼¡¦¥Á¥§¥Ã¥¯¤ò¤·¤Ê¤¤¡¥
¤³¤ì¤ÏÎã¤ò´Ê·é¤Ë¤¹¤ë¤¿¤á¤â¤¢¤ë¤¬¡¤
Ã»¤¤¥æ¡¼¥Æ¥£¥ê¥Æ¥£Æâ¤Ç¤Ï¤È¤Ë¤«¤¯¥¨¥é¡¼¡¦¥Á¥§¥Ã¥¯¤ò°ìÀÚ¤·¤Ê¤¤Êý¤¬Íý¤ËÅ¬¤Ã¤Æ¤¤¤ë¡¥
¤â¤·¼¡¤Î¤è¤¦¤Ë¤¹¤ë¤È
\begin{verbatim}
> (last1 "blub")
>>Error: "blub" is not a list.
Broken at LAST...
\end{verbatim}
¥¨¥é¡¼¤Ï\verb@last@¼«¿È¤ËÂª¤¨¤é¤ì¤ë¡¥
¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤¬¾®¤µ¤¤¤È¤­¤Ï¡¤¤½¤ì¤¬·ÁÀ®¤¹¤ëÃê¾Ý²½¤ÎÁØ¤ÏÂçÊÑÇö¤¯¡¤¤Û¤È¤ó¤ÉÆ©ÌÀ¤À¡¥
Çö¤¤É¹¤Î¸þ¤³¤¦¤¬Æ©¤±¤Æ¸«¤¨¤ë¤è¤¦¤Ë¡¤
\verb@last1@¤Î¤è¤¦¤Ê¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Î¸þ¤³¤¦¤ÏÆ©¤±¤Æ¸«¤¨¤ë¤Î¤Ç¡¤
¤½¤ÎÇØ¸å¤Î´Ø¿ô¤Çµ¯¤­¤¿¥¨¥é¡¼¤Ï²ò¼á¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥

´Ø¿ô\verb@single@¤Ï°ú¿ô¤¬1¸Ä¤ÎÍ×ÁÇ¤ò»ý¤Ä¥ê¥¹¥È¤«¤É¤¦¤«¤òÄ´¤Ù¤ë¡¥
Lisp¤Î¥×¥í¥°¥é¥à¤Ç¤Ï¤³¤ì¤ò¤«¤Ê¤êÉÑÈË¤ËÄ´¤Ù¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡¥
ºÇ½é¤Ï¤Ä¤¤¿Í´Ö¸ì¤«¤é¤Î¼«Á³¤ÊËÝÌõ¤ò»È¤¤¤¬¤Á¤À¡§
\begin{verbatim}
(= (length lst) 1)
\end{verbatim}
¤³¤¦¤·¤ÆÄ´¤Ù¤ë¤Î¤Ï¤È¤Æ¤âÈó¸úÎ¨Åª¤À¡¥
Âè1Í×ÁÇ¤ò¸«½ª¤ï¤Ã¤¿Ä¾¸å¤Ë¤Ï¤â¤¦É¬Í×¤Ê¾ðÊó¤ÏÊ¬¤«¤Ã¤Æ¤¤¤ë¤«¤é¤À¡¥

¼¡¤Ï\verb@append1@¤È\verb@conc1@¤À¡¥
Î¾Êý¤È¤â¥ê¥¹¥È¤ÎËöÈø¤Ë¿·¤·¤¤Í×ÁÇ¤òÉÕ¤±²Ã¤¨¤ë¤¬¡¤¸å¼Ô¤ÏÇË²õÅª¤À¡¥
¤³¤ì¤é¤Î´Ø¿ô¤Ï¾®¤µ¤¤¤¬¡¤ÂçÊÑÉÑÈË¤Ë»È¤ï¤ì¤ë¤Î¤ÇÄêµÁ¤·¤Æ¤ª¤¯²ÁÃÍ¤Ï¤¢¤ë¡¥
¼ÂºÝ¡¤\verb@append1@¤Ï°ÊÁ°¤ÎLispÊý¸À¤Ç¤ÏÁÈ¤ß¹þ¤ß´Ø¿ô¤À¤Ã¤¿¡¥

\verb@mklist@¤â¡Ê¾¯¤Ê¤¯¤È¤â¡ËInterlisp¤Ç¤ÏÁÈ¤ß¹þ¤ß´Ø¿ô¤À¤Ã¤¿¡¥
¤³¤ì¤Ï°ú¿ô¤¬¥ê¥¹¥È¤Ç¤¢¤ë¤«¤É¤¦¤«¤ò³Î¤«¤á¤ë¡¥
Lisp¤Î´Ø¿ô¤ÎÂ¿¤¯¤Ï¡¤Ã±°ì¤ÎÃÍ¤ÈÊ£¿ô¤ÎÃÍ¤Î¥ê¥¹¥È¤Î¤É¤Á¤é¤«¤òÊÖ¤¹¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥
\verb@lookup@¤¬¤½¤ó¤Ê´Ø¿ô¤Ç¡¤
\verb@data@¤È¤¤¤¦¥ê¥¹¥È¤ÎÍ×ÁÇÁ´¤Æ¤Ë¤Ä¤¤¤Æ¤½¤ì¤ò¸Æ¤Ó½Ð¤·¤¿·ë²Ì¤ò½¸¤á¤¿¤¤¤È¤·¤è¤¦¡¥
¤½¤ì¤Ï¼¡¤Î¤è¤¦¤Ë¤¹¤ì¤Ð²ÄÇ½¤À¡§
\begin{verbatim}
(mapcan #'(lambda (d) (mklist (lookup d)))
        data)
\end{verbatim}
Âè\ref{fig:LargeF}¿Þ¤Ë¤Ï¥ê¥¹¥ÈÍÑ¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ÎÄ¹¤á¤ÎÎã¤¬¼¨¤µ¤ì¤Æ¤¤¤ë¡¥
1ÈÖÌÜ¤ÏÄ¹¤¤¤¬¡¤Ãê¾ÝÀ­¤â¤µ¤ë¤³¤È¤Ê¤¬¤é¸úÎ¨¤ÎÌÌ¤«¤é¸«¤Æ¤âÍ­±×¤Ê¤â¤Î¤À¡¥
¤½¤ì¤Ï2¸Ä¤ÎÏ¢Â³¹½Â¤(sequence)¤òÈæ³Ó¤·¡¤1ÈÖÌÜ¤ÎÊý¤¬Ä¹¤¤¤È¤­¤Î¤ß¿¿¤òÊÖ¤¹¡¥
2¸Ä¤Î¥ê¥¹¥È¤ÎÄ¹¤µ¤òÈæ³Ó¤·¤¿¤¤¤È¤­¡¤¤Ä¤¤¼¡¤Î¤è¤¦¤Ë¤·¤¿¤¯¤Ê¤ë¡§
\begin{verbatim}
(> (length x) (length y))
\end{verbatim}
¤³¤Î´·ÍÑË¡¤Ï¡¤Î¾Êý¤Î¥ê¥¹¥ÈÁ´ÂÎ¤òÃµº÷¤·¤Æ¤¤¤ë¤Î¤ÇÈó¸úÎ¨¤À¡¥
¤â¤·ÊÒÊý¤ÎÊý¤¬¤º¤Ã¤ÈÄ¹¤±¤ì¤Ð¡¤¤½¤Îº¹¤ÎÉôÊ¬¤òÃµº÷¤·¤¿¼ê´Ö¤ÏÌµÂÌ¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤¦¡¥
\verb@longer@¤Î¤è¤¦¤Ë2¸Ä¤Î¥ê¥¹¥È¤òÊÂ¹ÔÅª¤ËÃµº÷¤¹¤ëÊý¤¬Â®¤¤¡¥

\verb@longer@¤ÎÃæ¤Ë¤Ï2¸Ä¤Î¥ê¥¹¥È¤ÎÄ¹¤µ¤òÈæ¤Ù¤ëºÆµ¢´Ø¿ô¤¬Ëä¤á¹þ¤Þ¤ì¤Æ¤¤¤ë¡¥
\verb@longer@¤ÏÄ¹¤µ¤òÈæ¤Ù¤ë¤¿¤á¤Î¤â¤Î¤À¤«¤é¡¤
¤½¤ÎºÆµ¢´Ø¿ô¤Ï\verb@length@¤Î°ú¿ô¤ËÍ¿¤¨¤é¤ì¤ë¤â¤ÎÁ´¤Æ¤ËÂÐ¤·¤Æµ¡Ç½¤¹¤ë¤Ù¤­¤À¡¥
¤·¤«¤·ÊÂ¹ÔÅª¤ËÄ¹¤µ¤òÈæ³Ó¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¤Î¤Ï¥ê¥¹¥È¤ËÅ¬ÍÑ¤µ¤ì¤¿¤È¤­¤À¤±¤Ê¤Î¤Ç¡¤
ÆâÉô¤ÎºÆµ¢´Ø¿ô¤Ï°ú¿ô¤¬Î¾Êý¥ê¥¹¥È¤À¤Ã¤¿¤È¤­¤Î¤ß¸Æ¤Ó½Ð¤µ¤ì¤ë¡¥

¼¡¤Î´Ø¿ô\verb@filter@¤ÎÀ­¼Á¤Ï¡¤
\verb@find-if@¤ËÂÐ¤¹¤ë\verb@remove-if-not@¤ÎÀ­¼Á¤È»÷¤Æ¤¤¤ë¡¥

ÁÈ¤ß¹þ¤ß´Ø¿ô\verb@remove-if-not@¤ÎÊÖ¤êÃÍ¤Ï¡¤
\verb@find-if@¤Ë´Ø¿ô¤òÅÏ¤·¤Æ¥ê¥¹¥È¤ÎÏ¢Â³¤·¤¿cdrÉô¤ËÅ¬ÍÑ¤·¤¿¤È¤­¤ÎÊÖ¤êÃÍÁ´ÂÎ¤ÈÆ±¤¸¤À¡¥
¤½¤ì¤È»÷¤¿¤è¤¦¤Ë¡¤
\verb@filter@¤ÎÊÖ¤êÃÍ¤Ï¡¤¤¢¤ë´Ø¿ô¤¬¥ê¥¹¥È¤ÎÏ¢Â³¤·¤¿cdrÉô¤ËÂÐ¤·¤ÆÊÖ¤¹¤â¤Î¤ÈÆ±¤¸¤À¡§
\begin{verbatim}
> (filter #'(lambda (x) (if (numberp x) (1+ x)))
    '(a 1 2 b 3 c d 4))
(2 3 4 5)
\end{verbatim}
\verb@filter@¤Ï´Ø¿ô¤È1¸Ä¤Î¥ê¥¹¥È¤ò¼è¤ê¡¤
¤½¤Î´Ø¿ô¤¬¥ê¥¹¥È¤ËÅ¬ÍÑ¤µ¤ì¤¿¤È¤­¤ËÈónilÃÍ¤¬ÊÖ¤µ¤ì¤ë¤è¤¦¤ÊÍ×ÁÇÁ´¤Æ¤ò¥ê¥¹¥È¤Ë¤·¤ÆÊÖ¤¹¡¥

\verb@filter@¤Ï¡¤Âè2.8Àá¤ÎËöÈøºÆµ¢´Ø¿ô¤ÈÆ±ÍÍ¤ÊÁíÏÂÊÑ¿ô¤ò»È¤Ã¤Æ¤¤¤ëÅÀ¤ËÃí°Õ¤·¤ÆÍß¤·¤¤¡¥
¼ÂºÝ¡¤ËöÈøºÆµ¢´Ø¿ô¤ò½ñ¤¯¤³¤È¤ÎÁÀ¤¤¤Ï¡¤
¥³¥ó¥Ñ¥¤¥é¤Ë\verb@filter@¤ÈÆ±¤¸¹½Â¤¤Î¥³¡¼¥É¤òÀ¸À®¤µ¤»¤ë¤³¤È¤Ë¤¢¤ë¡¥
\verb@filter@¤ËÂÐ¤·¤Æ¤Ï¡¤È¿Éü¹½Â¤¤Ë¤è¤ëÄ¾ÀÜÅª¤ÊÄêµÁ¤ÎÊý¤¬ËöÈøºÆµ¢¤Ë¤è¤ë¤â¤Î¤è¤êÃ±½ã¤À¡¥
\verb@filter@¤ÎÄêµÁ¥³¡¼¥ÉÆâ¤Ç¤Î\verb@push@¤È\verb@nreverse@¤È¤ÎÁÈ¤ß¹ç¤ï¤»¤Ï¡¤
Lisp¤Ç¥ê¥¹¥È¤ÎÁíÏÂ¤òµá¤á¤ëºÝ¤Î°ìÈÌÅª¤Ê´·ÍÑË¡¤À¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defun longer (x y)
  (labels ((compare (x y)
                    (and (consp x)
                         (or (null y)
                             (compare (cdr x) (cdr y))))))
    (if (and (listp x) (listp y))
        (compare x y)
        (> (length x) (length y)))))

(defun filter (fn lst)
  (let ((acc nil))
    (dolist (x lst)
      (let ((val (funcall fn x)))
        (if val (push val acc))))
    (nreverse acc)))

(defun group (source n)
  (if (zerop n) (error "zero length"))
  (labels ((rec (source acc)
                (let ((rest (nthcdr n source)))
                  (if (consp rest)
                      (rec rest (cons (subseq source 0 n) acc))
                      (nreverse (cons source acc))))))
    (if source (rec source nil) nil)))
\end{FramedVerb}\end{center}
\caption{¥ê¥¹¥È¤ËºîÍÑ¤¹¤ë´Ø¿ô¤ÎÂçµ¬ÌÏ¤Ê¤â¤Î}
\label{fig:LargeF}
\end{figure}

Âè\ref{fig:LargeF}¿Þ¤ÎºÇ¸å¤Î´Ø¿ô¤Ï¡¤
¥ê¥¹¥È¤ò¿·¤·¤¤¥ê¥¹¥È¤ÎÉôÊ¬¥ê¥¹¥È¤È¤·¤Æ¤Þ¤È¤á¤ë¤â¤Î¤À¡¥
\verb@group@¤Ë¥ê¥¹¥È\verb@l@¤È¿ô\verb@n@¤òÍ¿¤¨¤ë¤È¿·¤·¤¤¥ê¥¹¥È¤¬ÊÖ¤µ¤ì¡¤
¤½¤ÎÃæ¤Ç¤Ï\verb@l@¤ÎÍ×ÁÇ¤ÏÄ¹¤µ\verb@n@¤ÎÉôÊ¬¥ê¥¹¥È¤Ë¤Þ¤È¤á¤é¤ì¤Æ¤¤¤ë¡¥
Í¾¤ê¤ÏºÇ¸å¤ÎÉôÊ¬¥ê¥¹¥È¤ËÆþ¤ë¡¥
¤À¤«¤éÂè2°ú¿ô¤Ë2¤òÍ¿¤¨¤ë¤È
\begin{verbatim}
> (group '(a b c d e f g) 2)
((A B) (C D) (E F) (G))
\end{verbatim}
¤È¤¤¤¦Ï¢ÁÛ¥ê¥¹¥È¤¬ÆÀ¤é¤ì¤ë¡¥
¤³¤Î´Ø¿ô¤Ï¡¤ËöÈøºÆµ¢·Á¼°¡ÊÂè2.8Àá¡Ë¤Ë¤¹¤ë¤¿¤á¤Ë¤«¤Ê¤êÆþ¤êÁÈ¤ó¤ÀÊýË¡¤Ç½ñ¤«¤ì¤Æ¤¤¤ë¡¥
¥é¥Ô¥Ã¥É¡¦¥×¥í¥È¥¿¥¤¥Ô¥ó¥°¤Î¸¶Â§¤Ï¡¤¥×¥í¥°¥é¥àÁ´ÂÎ¤ÈÆ±ÍÍ¤Ë¸Ä¡¹¤Î´Ø¿ô¤Ë¤âÅ¬ÍÑ¤Ç¤­¤ë¡¥
\verb@flatten@¤Î¤è¤¦¤Ê´Ø¿ô¤ò½ñ¤¯¤È¤­¡¤²ÄÇ½¤Ê¸Â¤êÃ±½ã¤Ê¼ÂÁõÊýË¡¤«¤é»Ï¤á¤ë¤Î¤¬¤¤¤¤¤À¤í¤¦¡¥
¤½¤·¤ÆÃ±½ã¤Ê¤â¤Î¤¬Àµ¤·¤¯Æ°ºî¤¹¤ì¤Ð¡¤
É¬Í×¤Ë±þ¤¸¤Æ¸úÎ¨Åª¤ÊËöÈøºÆµ¢ÈÇ¤äÈ¿ÉüÈÇ¤ËÊÑ¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
ºÇ½é¤Î¤â¤Î¤Ï¡Ê½½Ê¬Ã»¤±¤ì¤Ð¡Ë¥³¥á¥ó¥È¤È¤·¤Æ»Ä¤»¤Ð¡¤¸ò´¹¸å¤Î´Ø¿ô¤ÎÆ°ºî¤ÎÀâÌÀ¤Ë¤Ê¤ë¡¥
¡Ê\verb@group@¤äÂè\ref{fig:SmallF}¿Þ¤ÈÂè\ref{fig:LargeF}¿ÞÆâ¤ÎÂ¾¤Î´Ø¿ô¤ÎÃ±½ã¤Ê¼ÂÁõ¤Ï¡¤
Âèvaom¥Ú¡¼¥¸Æâ¤Înote¤Ë½ñ¤«¤ì¤Æ¤¤¤ë¡¥¡Ë

\begin{figure}\begin{center}\begin{FramedVerb}
(defun flatten (x)
  (labels ((rec (x acc)
                (cond ((null x) acc)
                      ((atom x) (cons x acc))
                      (t (rec (car x) (rec (cdr x) acc))))))
    (rec x nil)))

(defun prune (test tree)
  (labels ((rec (tree acc)
                (cond ((null tree) (nreverse acc))
                      ((consp (car tree))
                       (rec (cdr tree)
                            (cons (rec (car tree) nil) acc)))
                      (t (rec (cdr tree)
                              (if (funcall test (car tree))
                                acc
                                (cons (car tree) acc)))))))
    (rec tree nil)))
\end{FramedVerb}\end{center}
\caption{2½ÅºÆµ¢¤ò»È¤Ã¤¿¥ê¥¹¥È¡¦¥æ¡¼¥Æ¥£¥ê¥Æ¥£}
\label{fig:Doubly-recursive}
\end{figure}

\verb@group@¤ÎÄêµÁ¤ÏºÇÄã¤Ç¤â1¼ïÎà¤Î¥¨¥é¡¼¥Á¥§¥Ã¥¯¤ò¤¹¤ëÅÀ¤ÇÂ¾¤È°Û¤Ê¤Ã¤Æ¤¤¤ë¡§
Âè2°ú¿ô¤¬0¤Ç¤¢¤ë¤«¤É¤¦¤«¤À¡¥
¤½¤Î¾ì¹ç¡¤¥Á¥§¥Ã¥¯¤ò¤·¤Ê¤¤¤ÈÌµ¸Â¤ÎºÆµ¢¤Ë´Ù¤Ã¤Æ¤·¤Þ¤¦¡¥

¤³¤ÎËÜ¤ÎÃæ¤ÎÎã¤Ï¡¤¤¢¤ë1ÅÀ¤ÇÄÌ¾ï¤ÎLisp¤Î´·½¬¤«¤é³°¤ì¤Æ¤¤¤ë¡§
¤½¤ì¤¾¤ì¤Î¾Ï¤òÆÈÎ©¤µ¤»¤ë¤¿¤á¡¤¥³¡¼¥ÉÎã¤Ï²ÄÇ½¤Ê¸Â¤êÁÇ¤ÎLisp¤Ç½ñ¤«¤ì¤Æ¤¤¤ëÅÀ¤À¡¥
¤·¤«¤·\verb@group@¤ÏÎã³°¤À¡¥
¤³¤ì¤Ï¥Þ¥¯¥íÄêµÁ¤ËÂçÊÑÊØÍø¤Ê¤Î¤Ç¡¤¤³¤Î¸å¤Î¾Ï¤Ç¤â¿ô²óºÆÅÐ¾ì¤¹¤ë¡¥

Âè\ref{fig:LargeF}¿Þ¤Î´Ø¿ô¤Ï¡¤¤ß¤Ê¥ê¥¹¥È¤Î¥È¥Ã¥×¥ì¥Ù¥ë¹½Â¤¤Ë±è¤Ã¤ÆÆ°ºî¤¹¤ë¡¥
Âè\ref{fig:Doubly-recursive}¿Þ¤Ë¤ÏÆþ¤ì»Ò¤Ë¤Ê¤Ã¤¿¥ê¥¹¥ÈÆâ¤Ø²¼¤Ã¤Æ¤¤¤¯´Ø¿ô¤ÎÎã¤ò2¸Ä¼¨¤·¤¿¡¥
1ÈÖÌÜ¤Î\verb@flatten@¤âInterlisp¤Ç¤ÏÁÈ¤ß¹þ¤ß´Ø¿ô¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥
¤³¤ì¤Ï°ú¿ô¤Î¥ê¥¹¥È¤ÎÍ×ÁÇ¤Ç¤¢¤ë¤«¡¤Í×ÁÇ¤ÎÍ×ÁÇ¤Ç¤¢¤ë¤«¡¤¤½¤Î¤Þ¤¿Í×ÁÇ¤Î\dots
¤È¤¤¤Ã¤¿Á´¤Æ¤Î¥¢¥È¥à¤Î¥ê¥¹¥È¤òÊÖ¤¹¡¥
\begin{verbatim}
> (flatten '(a (b c) ((d e) f)))
(A B C D E F)
\end{verbatim}
Âè\ref{fig:Doubly-recursive}¿Þ¤Î2ÈÖÌÜ¤Î´Ø¿ô\verb@prune@¤È\verb@istoremove-if@¤È¤Î´Ø·¸¤Ï
\verb@copy-tree@¤È\verb@copy-list@¤È¤Î´Ø·¸¤È»÷¤Æ¤¤¤ë¡¥
¤Ä¤Þ¤ê¡¤ºÆµ¢Åª¤ËÉôÊ¬¥ê¥¹¥ÈÆâ¤Ø²¼¤Ã¤Æ¤¤¤¯¡§
\begin{verbatim}
> (prune #'evenp '(1 2 (3 (4 5) 6) 7 8 (9)))
(1 (3 (5)) 7 (9))
\end{verbatim}
°ú¿ô¤È¤·¤ÆÍ¿¤¨¤¿´Ø¿ô¤¬¿¿¤òÊÖ¤¹ÍÕ¤ÏÁ´¤Æ½ü¤«¤ì¤ë¡¥
%}}}
\subsection{¸¡º÷}   %{{{
¤³¤Î¾Ï¤Ç¤Ï¡¤¥ê¥¹¥È¤ò¸¡º÷¤¹¤ë´Ø¿ô¤ÎÎã¤ò´ö¤Ä¤«Í¿¤¨¤ë¡¥
Common Lisp¤Ë¤Ï¤½¤Î¤¿¤á¤ÎÁÈ¤ß¹þ¤ß¥ª¥Ú¥ì¡¼¥¿¤¬Ë­ÉÙ¤Ë¤¢¤ë¤¬¡¤
¤½¤ì¤Ç¤âº¤Æñ¤Ê\wadash ¾¯¤Ê¤¯¤È¤â¸úÎ¨Åª¤Ë¼Â¹Ô¤¹¤ë¤Î¤Ïº¤Æñ¤Ê\wadash ²ÝÂê¤Ï¤¢¤ë¡¥
¤³¤Î¤³¤È¤ÏÂèpump¥Ú¡¼¥¸¤ÇÀâÌÀ¤·¤¿²¾ÁÛÅª¤Ê¾õ¶·¤ÎÃæ¤Ç´û¤Ë¸«¤¿\note{HypotheticalCase}¡¥
Âè\ref{fig:SearchLists}¿Þ¤Î1ÈÖÌÜ¤Î´Ø¿ô\verb@find2@¤Ï¡¤¤½¤ì¤Ø¤Î²óÅú¤È¤·¤Æºî¤é¤ì¤¿¤â¤Î¤À¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defun find2 (fn lst)
  (if (null lst)
    nil
    (let ((val (funcall fn (car lst))))
      (if val
          (values (car lst) val)
          (find2 fn (cdr lst))))))

(defun before (x y lst &key (test #'eql))
  (and lst
       (let ((first (car lst)))
         (cond ((funcall test y first) nil)
               ((funcall test x first) lst)
               (t (before x y (cdr lst) :test test))))))

(defun after (x y lst &key (test #'eql))
  (let ((rest (before y x lst :test test)))
    (and rest (member x rest :test test))))

(defun duplicate (obj lst &key (test #'eql))
  (member obj (cdr (member obj lst :test test))
          :test test))

(defun split-if (fn lst)
  (let ((acc nil))
    (do ((src lst (cdr src)))
      ((or (null src) (funcall fn (car src)))
       (values (nreverse acc) src))
      (push (car src) acc))))
\end{FramedVerb}\end{center}
\caption{¥ê¥¹¥È¤ò¸¡º÷¤¹¤ë´Ø¿ô}
\label{fig:SearchLists}
\end{figure}

¼¡¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£\verb@before@¤Ï»÷¤¿°Õ¿Þ¤ò»ý¤Ã¤Æ½ñ¤«¤ì¤¿¡¥
¤³¤ì¤Ï¤¢¤ë¥ª¥Ö¥¸¥§¥¯¥È¤¬¥ê¥¹¥ÈÆâ¤ÇÊÌ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤è¤ê¤âÀè¤Ë¸½¤ì¤ë¤«¤É¤¦¤«¤òÄ´¤Ù¤ë¡§
\begin{verbatim}
> (before 'a 'b '(a b c d))
(B C D)
\end{verbatim}
¤³¤ì¤òÁÇ¤ÎLisp¤ò»È¤Ã¤Æ¶òÄ¾¤ËÄ´¤Ù¤ë¤³¤È¤â½½Ê¬´ÊÃ±¤À¡§
\begin{verbatim}
(< (position 'a '(a b c d)) (position 'b '(a b c d)))
\end{verbatim}
¤·¤«¤·¤³¤Î´·ÍÑË¡¤ÏÈó¸úÎ¨¤À¤·¡¤¥¨¥é¡¼¤Ë¤Ä¤Ê¤¬¤ê°×¤¤¡¥
Èó¸úÎ¨¤ÊÍýÍ³¤Ï¡¤¤³¤Î´Ø¿ô¤ÏËÜÅö¤ÏÎ¾Êý¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò¸«¤Ä¤±¤ëÉ¬Í×¤Ï¤Ê¤¯¡¤
Àè¤Ë¸½¤ì¤ë¤â¤Î¤À¤±¤ò¸«¤Ä¤±¤ì¤Ð¤¤¤¤¤«¤é¤À¡¥
¤Þ¤¿¥¨¥é¡¼¤Ë¤Ä¤Ê¤¬¤ë¤È¤¤¤¦¤Î¤Ï¡¤¥ª¥Ö¥¸¥§¥¯¥È¤¬¤É¤Á¤é¤â¥ê¥¹¥ÈÆâ¤Ë¤Ê¤¤¤È¤­¡¤
nil¤¬ \verb@<@ ¤Ë°ú¿ô¤È¤·¤ÆÅÏ¤µ¤ì¤Æ¤·¤Þ¤¦¤«¤é¤À¡¥
\verb@before@¤ò»È¤¨¤ÐÎ¾Êý¤ÎÌäÂê¤¬²ò·è¤¹¤ë¡¥

\verb@before@¤ÎÀº¿À¤Ï½¸¹ç¤Ø¤Î½êÂ°´Ø·¸¤òÄ´¤Ù¤ë¤³¤È¤Ë»÷¤Æ¤¤¤ë¤Î¤Ç¡¤
ÁÈ¤ß¹þ¤ß´Ø¿ô\verb@member@¤Ë»÷¤»¤Æ½ñ¤«¤ì¤¿¡¥
\verb@member@¤ÈÆ±ÍÍ¤ËÈæ³Ó´Ø¿ô¡Ê¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï\verb@eql@¡Ë¤ò¥ª¥×¥·¥ç¥Ê¥ë°ú¿ô¤È¤·¤Æ¼è¤ë¡¥
¤Þ¤¿¡¤¤¿¤Àt¤òÊÖ¤¹¤À¤±¤Ç¤Ê¤¯¡¤
Âè1°ú¿ô¤ÇÍ¿¤¨¤é¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¤Ç»Ï¤Þ¤ëcdrÉô¤È¤¤¤¦¡¤Í­±×¤Ê¾ðÊó¤ò´Þ¤ó¤ÀÃÍ¤òÊÖ¤¹¡§

\verb@before@¤¬¿¿¤òÊÖ¤¹¤Î¤Ï¡¤
Âè2°ú¿ô¤ò¸«¤Ä¤±¤ëÁ°¤ËÂè1°ú¿ô¤ò¸«¤Ä¤±¤¿¤È¤­¤À¤È¤¤¤¦¤³¤È¤ËÃí°Õ¡¥
¤½¤Î¤¿¤á¡¤Âè2°ú¿ô¤¬¥ê¥¹¥ÈÆâ¤ËÂ¸ºß¤·¤Ê¤¤¤È¤­¤Ë¤Ï¿¿¤¬ÊÖ¤µ¤ì¤ë¡§
\begin{verbatim}
> (before 'a 'b '(a))
(A)
\end{verbatim}
¤â¤Ã¤ÈÀºÌ©¤ËÄ´¤Ù¤ë¤Ë¤Ï¡¤\verb@after@
¡Ê°ú¿ô¤¬Î¾Êý¥ê¥¹¥ÈÆâ¤ËÂ¸ºß¤·¤Ê¤¤¤È¿¿¤òÊÖ¤µ¤Ê¤¤¡Ë¤ò»È¤¦¡§
\begin{verbatim}
> (after 'a 'b '(b a d))
(A D)
> (after 'a 'b '(a))
NIL
\end{verbatim}
\verb@(member o l)@¤¬¥ê¥¹¥È\verb@l@Æâ¤Ë\verb@o@¤ò¸«¤Ä¤±¤¿¤È¤­¡¤
¤¿¤À¤Ît¤Ç¤Ê¤¯\verb@o@¤Ç»Ï¤Þ¤ë\verb@l@¤ÎcdrÉô¤òÊÖ¤¹¡¥
¤³¤ÎÊÖ¤êÃÍ¤Ï¡¤Îã¤¨¤Ð½ÅÊ£¤·¤ÆÂ¸ºß¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¤òÄ´¤Ù¤ë¤¿¤á¤Ë»È¤¨¤ë¡¥
\verb@l@Æâ¤Ë\verb@o@¤¬½ÅÊ£¤·¤ÆÂ¸ºß¤·¤Æ¤¤¤ë¤È¡¤
¤½¤ì¤Ï\verb@member@¤ÎÊÖ¤·¤¿¥ê¥¹¥È¤ÎcdrÉôÆâ¤Ë¤âÂ¸ºß¤¹¤ë¡¥
¤³¤Î´·ÍÑË¡¤Ï¼¡¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£\verb@duplicate@Æâ¤ËËä¤á¹þ¤Þ¤ì¤Æ¤¤¤ë¡§
\begin{verbatim}
> (duplicate 'a '(a b c a d))
(A D)
\end{verbatim}
½ÅÊ£¤òÄ´¤Ù¤ë¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ÏÆ±¤¸¸¶Â§¤Ë´ð¤Å¤¤¤ÆÂ¾¤Ë¤âÄêµÁ¤Ç¤­¤ë¡¥
·éÊÊÀ­¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¥Ç¥¶¥¤¥Ê¤Ï¡¤
Common Lisp¤Ç¤Ï¡Öµ¶¡×¤È¡Ö¶õ¥ê¥¹¥È¡×¤ÎÎ¾Êý¤ònil¤ÇÉ½¤¹¤³¤È¤Ë¾×·â¤ò¼õ¤±¤ë¡¥
³Î¤«¤Ë¤½¤ì¤¬ÌäÂê¤òµ¯¤³¤¹¤³¤È¤â¤¢¤ë¡ÊÂè14.2¾Ï¤ò»²¾È¡Ë¤¬¡¤
\verb@duplicate@Åù¤Î´Ø¿ô¤Ç¤ÏÊØÍø¤À¡¥
Ï¢Â³¹½Â¤¤ÎÊñ´Þ´Ø·¸¤òÌä¤¦¤È¤­¡¤
µ¶¤Ç¤¢¤ë¤³¤È¤ò¶õ¤ÎÏ¢Â³¹½Â¤¤È¤·¤ÆÉ½¸½¤¹¤ë¤Î¤Ï¼«Á³¤Ë»×¤¨¤ë¡¥
Âè\ref{fig:SearchLists}¿Þ¤ÎºÇ¸å¤Î´Ø¿ô¤â¡¤\verb@member@¤Î°ìÈÌ²½¤Î°ì¼ï¤À¡¥
\verb@member@¤Ï¡¤¤½¤ì¤¬È¯¸«¤·¤¿Í×ÁÇ¤«¤é»Ï¤Þ¤ë¥ê¥¹¥È¤ÎcdrÉô¤òÊÖ¤¹¤Î¤ËÂÐ¤·¡¤
\verb@split-if@¤Ï¸µ¤Î¥ê¥¹¥È¤ÎÁ°È¾Ê¬¤â¤¢¤ï¤»¤ÆÊÖ¤¹¡¥
¤³¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¡¤¼ç¤Ë²¿¤«¤Î½çÈÖ¤ÇÀ°Îó¤µ¤ì¤¿¥ê¥¹¥È¤ËÂÐ¤·¤Æ»È¤ï¤ì¤ë¡§
\begin{verbatim}
> (split-if #'(lambda (x) (> x 4))
            '(1 2 3 4 5 6 7 8 9 10))
(1 2 3 4)
(5 6 7 8 9 10)
\end{verbatim}

\begin{figure}\begin{center}\begin{FramedVerb}
(defun most (fn lst)
  (if (null lst)
      (values nil nil)
      (let* ((wins (car lst))
             (max (funcall fn wins)))
        (dolist (obj (cdr lst))
          (let ((score (funcall fn obj)))
            (when (> score max)
              (setq wins obj
                    max score))))
        (values wins max))))

(defun best (fn lst)
  (if (null lst)
      nil
      (let ((wins (car lst)))
        (dolist (obj (cdr lst))
          (if (funcall fn obj wins)
              (setq wins obj)))
        wins)))

(defun mostn (fn lst)
  (if (null lst)
      (values nil nil)
      (let ((result (list (car lst)))
            (max (funcall fn (car lst))))
        (dolist (obj (cdr lst))
          (let ((score (funcall fn obj)))
            (cond ((> score max)
                   (setq max score
                         result (list obj)))
                  ((= score max)
                   (push obj result)))))
        (values (nreverse result) max))))
\end{FramedVerb}\end{center}
\caption{Í×ÁÇ¤òÈæ³Ó¤¹¤ë¸¡º÷´Ø¿ô}
\label{fig:CompareElements}
\end{figure}

Âè\ref{fig:CompareElements}¤Ë¤ÏÊÌ¤Î¼ïÎà¤Î¸¡º÷´Ø¿ô¤¬ºÜ¤Ã¤Æ¤¤¤ë¡§
Í×ÁÇÆ±»Î¤òÈæ³Ó¤¹¤ë´Ø¿ô¤À¡¥
ºÇ½é¤Î\verb@most@¤ÏÍ×ÁÇ¤ò1ÅÙ¤Ë1¸Ä¤º¤ÄÄ´¤Ù¤ë¡¥
¤³¤ì¤Ï¥ê¥¹¥È¤ÈÅÀ¿ôÉÕ¤±´Ø¿ô¤ò°ú¿ô¤Ë¼è¤ê¡¤ºÇ¹âÅÀ¤òÍ¿¤¨¤ëÍ×ÁÇ¤òÊÖ¤¹¡¥
Åù¤·¤¤ÅÀ¤òÍ¿¤¨¤ëÍ×ÁÇ¤¬¤¢¤Ã¤¿¤È¤­¤Ï¡¤¥ê¥¹¥ÈÆâ¤ÇºÇ½é¤Ë¸½¤ì¤¿¤â¤Î¤òÊÖ¤¹¡¥
\begin{verbatim}
> (most #'length '((a b) (a b c) (a) (e f g)))
(A B C)
3
\end{verbatim}
\verb@most@¤ÏÊÖ¤·¤¿Í×ÁÇ¤ÎÍ¿¤¨¤¿¡ÊºÇ¹â¡ËÅÀ¤âÊÖ¤¹¡Ê¤½¤ÎÊý¤¬ÊØÍø¤À¡Ë¡¥

¤â¤Ã¤È°ìÈÌÅª¤Ê¼ïÎà¤Î¸¡º÷¤Ë¤Ï\verb@best@¤ò»È¤¦¡¥
¤³¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤â´Ø¿ô¤È¥ê¥¹¥È¤ò°ú¿ô¤Ë¼è¤ë¤¬¡¤
¤³¤ì¤Ë»È¤¦´Ø¿ô¤Ï2¸Ä¤Î°ú¿ô¤ò¼è¤ë½Ò¸ì¤Ç¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¡¥
ÊÖ¤êÃÍ¤Ï1¸Ä¤ÎÍ×ÁÇ¤Ç¡¤½Ò¸ì¤¬¤½¤ÎÂ¾¤ÎÍ×ÁÇÁ´¤Æ¤ËÂÐ¤·¤Æ¾¡¤Ã¤Æ¤¤¤ë¤ÈÈ½ÃÇ¤¹¤ë¤â¤Î¤À¡¥
\begin{verbatim}
> (best #'> '(1 2 3 4 5))
5
\end{verbatim}
\verb@best@¤Ï\verb@sort@¤Î·ë²Ì¤ÎcarÉô¤È¸«¤ë¤³¤È¤â¤Ç¤­¤ë¤¬¡¤
¤³¤Á¤é¤ÎÊý¤¬¤º¤Ã¤È¸úÎ¨¤¬¤¤¤¤¡¥
¥ê¥¹¥ÈÆâ¤ÎÍ×ÁÇ¤Ë´°Á´¤Ê½ç°Ì¤òÄêµÁ¤¹¤ë½Ò¸ì¤òÄó¶¡¤¹¤ë¤«¤É¤¦¤«¤Ï¸Æ¤Ó½Ð¤·Â¦¼¡Âè¤À¡¥
¤½¤¦¤Ç¤Ê¤±¤ì¤ÐÍ×ÁÇ¤ÎÊÂ¤Ó½ç¤Ï·ë²Ì¤Ë±Æ¶Á¤·¡¤
\verb@most@¤ÈÆ±ÍÍ¡¤Åù¤·¤¤ÅÀ¤¬½Ð¤¿¤È¤­¤Ë¤ÏºÇ½é¤ÎÍ×ÁÇ¤¬ÊÖ¤µ¤ì¤ë¡¥

ºÇ¸å¤Î\verb@mostn@¤ÏÅÀ¿ôÉÕ¤±´Ø¿ô¤È¥ê¥¹¥È¤ò°ú¿ô¤Ë¼è¤ê¡¤
´Ø¿ô¤¬ºÇ¹âÅÀ¤òÉÕ¤±¤ëÍ×ÁÇÁ´¤Æ¤«¤éÀ®¤ë¥ê¥¹¥È¡Ê¤ÈºÇ¹âÅÀ¡Ë¤òÊÖ¤¹¡§
\begin{verbatim}
> (mostn #'length '((a b) (a b c) (a) (e f g)))
((A B C) (E F G))
3
\end{verbatim}
%}}}
\subsection{ÂÐ±þÉÕ¤±}   %{{{
¹­¤¯»È¤ï¤ì¤ëLisp¤Î´Ø¿ô¤Î¼ïÎà¤Ë¤Ï¡¤Â¾¤ËÂÐ±þÉÕ¤±´Ø¿ô\wadash
¤¢¤ë´Ø¿ô¤òÊ£¿ô¤Î°ú¿ô¤ËÅ¬ÍÑ¤¹¤ë¤â¤Î\wadash ¤¬¤¢¤ë¡¥
Âè\ref{fig:Mapping1},~\ref{fig:Mapping2}¿Þ¤Ë¤Ï¿·¤·¤¤ÂÐ±þÉÕ¤±´Ø¿ô¤ÎÎã¤ò¼¨¤·¤¿¡¥
ºÇ½é¤Î3¸Ä¤Ï´Ø¿ô¤ò¤¢¤ëÈÏ°Ï¤Î¿ô¤Ë¡Ê¤½¤ì¤é¤Î¿ô¤ò´Þ¤à¥ê¥¹¥È¤ò¥³¥ó¥·¥ó¥°¤»¤º¤Ë¡Ë
Å¬ÍÑ¤¹¤ë¤¿¤á¤Î¤â¤Î¤À¡¥
ºÇ½é¤Î2¸Ä¡¤\verb@map0-n@¤È\verb@map1-n@¤Ï¡¤Àµ¤ÎÀ°¿ô¤ÎÈÏ°Ï¤ÇÆ°ºî¤¹¤ë¡§
\begin{verbatim}
> (map0-n #'1+ 5)
(1 2 3 4 5 6)
\end{verbatim}
Î¾Êý¤È¤â¤µ¤é¤Ë°ìÈÌÅª¤Ê\verb@mapa-b@¡ÊÇ¤°Õ¤ÎÈÏ°Ï¤Î¿ô¤ËÂÐ¤·¤ÆÆ°ºî¤¹¤ë¡Ë
¤ò»È¤Ã¤ÆÄêµÁ¤µ¤ì¤Æ¤¤¤ë¡¥
\begin{verbatim}
> (mapa-b #'1+ -2 0 .5)
(-1 -0.5 0.0 0.5 1.0)
\end{verbatim}
\verb@mapa-b@¤Î¼¡¤Ï¤µ¤é¤Ë°ìÈÌÅª¤Ê\verb@map->@¤Ç¡¤
¤³¤ì¤ÏÇ¤°Õ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ÎÏ¢Â³¹½Â¤¤ËÂÐ¤·¤Æµ¡Ç½¤¹¤ë¡¥
Ï¢Â³¹½Â¤¤ÏÂè2°ú¿ô¤ÇÍ¿¤¨¤é¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¤«¤é»Ï¤Þ¤ê¡¤
Âè3°ú¿ô¤ÇÍ¿¤¨¤é¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¤Ç½ª¤ï¤Ã¤Æ¡¤
¤½¤Î´Ö¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ÏÂè4°ú¿ô¤ÇÍ¿¤¨¤é¤ì¤¿´Ø¿ô¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ë¡¥
\verb@map->@¤ò»È¤¦¤È¡¤¿ô¤ÎÏ¢Â³¤Ø¤ÎÁàºî¤ÈÆ±ÍÍ¤Ë¡¤Ç¤°Õ¤Î¥Ç¡¼¥¿¹½Â¤¤ò°·¤¦¤³¤È¤¬²ÄÇ½¤À¡¥
\verb@mapa-b@¤Ï\verb@map->@¤ò»È¤¦¤È¼¡¤Î¤è¤¦¤ËÄêµÁ¤Ç¤­¤ë¡§
\begin{verbatim}
(defun mapa-b (fn a b &optional (step 1))
  (map-> fn
         a
         #'(lambda (x) (> x b))
         #'(lambda (x) (+ x step))))
\end{verbatim}
ÁÈ¤ß¹þ¤ß´Ø¿ô\verb@mapcan@¤Ï¸úÎ¨¤Î¤¿¤á¤ËÇË²õÅª´Ø¿ô¤È¤·¤Æºî¤é¤ì¤Æ¤¤¤ë¡¥
¤½¤ì¤Ï¼¡¤Î¤è¤¦¤Ë¤·¤ÆÄêµÁ¤Ç¤­¤ë¡§
\begin{verbatim}
(defun our-mapcan (fn &rest lsts)
  (apply #'nconc (apply #'mapcar fn lsts)))
\end{verbatim}
\verb@mapcan@¤Ï\verb@nconc@¤ò»È¤Ã¤Æ¥ê¥¹¥È¤ò¤Ä¤Ê¤®¹ç¤ï¤»¤Æ¤¤¤ë¤Î¤Ç¡¤
Âè1°ú¿ô¤Ë¤è¤Ã¤ÆÊÖ¤µ¤ì¤ë¥ê¥¹¥È¤Ï¿·¤·¤¯ºî¤é¤ì¤¿¤â¤Î¤ÎÊý¤¬¤¤¤¤¡¥
¤½¤¦¤·¤Ê¤¤¤È¼¡¤Ë¤½¤Î¥ê¥¹¥È¤ò»È¤¦¤È¤­¤Ë¤ÏÊÑ¹¹¤ò¼õ¤±¤Æ¤¤¤ë¤³¤È¤À¤í¤¦¡¥
\verb@nicknames@¡Êdove¥Ú¡¼¥¸¡Ë¤¬¡¤
°¦¾Î¤Î¡Ö¥ê¥¹¥È¤òÀ¸À®¤¹¤ë¡×´Ø¿ô¤È¤·¤ÆÄêµÁ¤µ¤ì¤¿¤Î¤Ï¤½¤¦¤¤¤Ã¤¿ÍýÍ³¤Ë¤è¤ë¡¥
¤½¤ì¤¬¤¿¤À¤É¤³¤«¤ËÊÝ»ý¤µ¤ì¤¿¥ê¥¹¥È¤òÊÖ¤¹¤À¤±¤Ê¤é¡¤
\verb@mapcan@¤ò»È¤¦¤Î¤Ï°ÂÁ´¤Ç¤Ê¤¯¤Ê¤ë¤À¤í¤¦¡¥
Âå¤ï¤ê¤Ë¡¤ÊÖ¤µ¤ì¤¿¥ê¥¹¥È¤ò¤Ä¤Ê¤®¹ç¤ï¤»¤ë¤Î¤Ë¤Ï\verb@append@¤ò»È¤ï¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¯¤Ê¤ë¡¥
¤½¤Î¤è¤¦¤Ê¾ì¹ç¤Î¤¿¤á¡¤\verb@mappend@¤Ï¡ÖÈóÇË²õÅª¤Ê\verb@mapcan@¡×¤òÄó¶¡¤¹¤ë¡¥

¼¡¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£\verb@mapcars@¤¬»È¤ï¤ì¤ë¤Î¤Ï¡¤
\verb@mapcar@¤Ç´Ø¿ô¤òÅ¬ÍÑ¤·¤¿¤¤¥ê¥¹¥È¤¬Ê£¿ô¤¢¤ë¤È¤­¤À¡¥
¤³¤³¤Ç¿ô¤Î¥ê¥¹¥È¤¬2¸Ä¤¢¤ê¡¤Î¾Êý¤Î¥ê¥¹¥È¤ÎÍ×ÁÇ¤ÎÊ¿Êýº¬¤«¤éÀ®¤ë1¸Ä¤Î¥ê¥¹¥È¤¬Íß¤·¤¤¤È¤·¤è¤¦¡¥
ÁÇ¤ÎLisp¤ò»È¤Ã¤Æ
\begin{verbatim}
(mapcar #'sqrt (append list1 list2))
\end{verbatim}
¤È¤¹¤ì¤Ð¼Â¸½¤Ç¤­¤ë¤¬¡¤¤½¤¦¤¹¤ë¤ÈÉÔÉ¬Í×¤Ê¥³¥ó¥·¥ó¥°¤¬¹Ô¤ï¤ì¤Æ¤¤¤ë¡¥
\verb@list1@¤È\verb@list2@¤È¤ò¤Ä¤Ê¤®¹ç¤ï¤»¤Æ¤â¡¤¤½¤Î·ë²Ì¤Ï¤¹¤°¤Ë¼Î¤Æ¤é¤ì¤Æ¤·¤Þ¤¦¡¥
\verb@mapcars@¤ò»È¤¦¤È
\begin{verbatim}
(mapcars #'sqrt list1 list2)
\end{verbatim}
¤Ë¤è¤Ã¤ÆÆ±¤¸·ë²Ì¤¬ÆÀ¤é¤ì¡¤ÉÔÉ¬Í×¤Ê¥³¥ó¥·¥ó¥°¤Ï¹Ô¤ï¤ì¤Æ¤¤¤Ê¤¤¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defun map0-n (fn n)
  (mapa-b fn 0 n))

(defun map1-n (fn n)
(mapa-b fn 1 n))

(defun mapa-b (fn a b &optional (step 1))
  (do ((i a (+ i step))
       (result nil))
    ((> i b) (nreverse result))
    (push (funcall fn i) result)))

(defun map-> (fn start test-fn succ-fn)
  (do ((i start (funcall succ-fn i))
       (result nil))
    ((funcall test-fn i) (nreverse result))
    (push (funcall fn i) result)))
\end{FramedVerb}\end{center}
\caption{ÂÐ±þÉÕ¤±´Ø¿ô1}
\label{fig:Mapping1}
\end{figure}

\begin{figure}\begin{center}\begin{FramedVerb}
(defun mappend (fn &rest lsts)
  (apply #'append (apply #'mapcar fn lsts)))

(defun mapcars (fn &rest lsts)
  (let ((result nil))
    (dolist (lst lsts)
      (dolist (obj lst)
        (push (funcall fn obj) result)))
    (nreverse result)))

(defun rmapcar (fn &rest args)
  (if (some #'atom args)
      (apply fn args)
      (apply #'mapcar
             #'(lambda (&rest args)
                 (apply #'rmapcar fn args))
             args)))
\end{FramedVerb}\end{center}
\caption{ÂÐ±þÉÕ¤±´Ø¿ô2}
\label{fig:Mapping2}
\end{figure}

Âè\ref{fig:Mapping2}¿Þ¤ÎºÇ¸å¤Î´Ø¿ô¤Ï¡¤\verb@mapcar@¤Î¥Ä¥ê¡¼ÂÐ±þÈÇ¤À¡¥
\verb@rmapcar@¤È¤¤¤¦Ì¾Á°¤Ï``recursive¡ÊºÆµ¢Åª¡Ë mapcar''¤Î¾ÊÎ¬¤Ç¡¤
¤³¤ì¤Ï\verb@mapcar@¤¬Ã±ÁØ¥ê¥¹¥È¤ËÂÐ¤·¤Æ¹Ô¤¦Áàºî¤ò¥Ä¥ê¡¼¤ËÂÐ¤·¤Æ¹Ô¤¦¡§
\begin{verbatim}
> (rmapcar #'princ '(1 2 (3 4 (5) 6) 7 (8 9)))
123456789
(1 2 (3 4 (5)6)7 (8 9))
\end{verbatim}
¤³¤ì¤Ï\verb@mapcar@¤ÈÆ±ÍÍ¡¤Ê£¿ô¤Î¥ê¥¹¥È¤ò°ú¿ô¤Ë¼è¤ì¤ë¡¥
\begin{verbatim}
> (rmapcar #'+ '(1 (2 (3) 4)) '(10 (20 (30) 40)))
(11 (22 (33) 44))
\end{verbatim}
¤³¤Î¸å¤ÇÅÐ¾ì¤¹¤ë´Ø¿ô¤Î¤¦¤Á´ö¤Ä¤«¡ÊÂèprep¥Ú¡¼¥¸¤Î\verb@rep@Åù¡Ë¤Ï¡¤
ËÜÅö¤Ï\verb@rmapcar@¤ò»È¤¦¤Ù¤­¤â¤Î¤À¡¥

ÅÁÅýÅª¤Ê¥ê¥¹¥È¤ÎÂÐ±þÉÕ¤±´Ø¿ô¤Ï¡¤\textsf{CLtL2}¤ÇÆ³Æþ¤µ¤ì¤¿¿ôÎó¥Þ¥¯¥í¤Ë¤è¤ê¡¤
»þÂåÃÙ¤ì¤Ê¤â¤Î¤È¤·¤Æ¤¢¤ëÄøÅÙÃÖ¤­´¹¤¨¤é¤ì¤¿¡¥
Îã¤¨¤Ð
\begin{verbatim}
(mapa-b #'fn a b c)
\end{verbatim}
¤Ï¼¡¤Î¤è¤¦¤ËÊÑ¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡§
\begin{verbatim}
(collect (#Mfn (scan-range :from a :upto b :by c)))
\end{verbatim}
¤·¤«¤·ÂÐ±þÉÕ¤±´Ø¿ô¤Ø¤Î¼ûÍ×¤Ï¤Þ¤À¤¢¤ë¡¥
¾ì¹ç¤Ë¤è¤Ã¤Æ¤ÏÂÐ±þÉÕ¤±´Ø¿ô¤ÎÊý¤¬ÌÀ³Î¤Ç¥¨¥ì¥¬¥ó¥È¤Ê¤³¤È¤¬¤¢¤ë¡¥
\verb@map->@¤ÇÉ½¸½¤Ç¤­¤ë¤â¤Î¤â¿ôÎó¤Ç¤ÏÉ½¸½¤·¿É¤¤¤³¤È¤â¤¢¤ë¡¥
ºÇ¸å¤Ë¡¤ÂÐ±þÉÕ¤±´Ø¿ô¤Ï°ú¿ô¤È¤·¤ÆÅÏ¤¹¤³¤È¤¬¤Ç¤­¤ë¡Ê´Ø¿ô¤È¤·¤Æ¤ÎÀ­¼Á¡Ë¡¥
%}}}
\subsection{Æþ½ÐÎÏ} %{{{
\begin{figure}\begin{center}\begin{FramedVerb}
(defun readlist (&rest args)
  (values (read-from-string
            (concatenate 'string "("
                         (apply #'read-line args)
                         ")"))))

(defun prompt (&rest args)
  (apply #'format *query-io* args)
  (read *query-io*))

(defun break-loop (fn quit &rest args)
  (format *query-io* "Entering break-loop.~%")
  (loop
    (let ((in (apply #'prompt args)))
      (if (funcall quit in)
          (return)
          (format *query-io* "~A~%" (funcall fn in))))))
\end{FramedVerb}\end{center}
\caption{Æþ½ÐÎÏ´Ø¿ô}
\label{fig:IO}
\end{figure}

Âè\ref{fig:IO}¿Þ¤Ç¤Ï\textsf{I/O}¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ÎÎã¤ò3¸Ä¼¨¤·¤¿¡¥
¤³¤Î¼ï¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ø¤Î¼ûÍ×¤Ï¥×¥í¥°¥é¥àËè¤Ë¤Þ¤Á¤Þ¤Á¤À¡¥
Âè\ref{fig:IO}¿Þ¤Î¤â¤Î¤ÏÂåÉ½Åª¤ÊÎã¤Ë²á¤®¤Ê¤¤¡¥
1ÈÖÌÜ¤Î¤â¤Î¤Ï¥×¥í¥°¥é¥à¤Î¥æ¡¼¥¶¤Ë³ç¸Ì¤Ê¤·¤Ç¼°¤òÆþÎÏ¤µ¤»¤¿¤¤¤È¤­¤Ë»È¤¦¡¥
¤³¤ì¤Ï1¹ÔÊ¬¤ÎÆþÎÏ¤òÆÉ¤ß¼è¤ê¡¤¤½¤ì¤ò¥ê¥¹¥È¤È¤·¤ÆÊÖ¤¹¡§
\begin{verbatim}
> (readlist)
Call me "Ed"
(CALL ME "Ed")
\end{verbatim}
\verb@values@¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤ÇÊÖ¤êÃÍ¤ò1¸Ä¤Ë¸ÂÄê¤·¤Æ¤¤¤ë
(\verb@read-from-string@¼«¿È¡¤¤³¤³¤Ç¤ÏÌµÂÌ¤ÊÂè2ÃÍ¤òÊÖ¤¹¡Ë¡¥

´Ø¿ô\verb@prompt@¤Ï¼ÁÌä¤ÎÉ½¼¨¤È²óÅú¤ÎÆÉ¤ß¼è¤ê¤òÅý¹ç¤·¤¿¤â¤Î¤À¡¥
¤³¤ì¤Ï\verb@format@¤ËÂÐ¤¹¤ë°ú¿ô¤ÈÆ±¤¸¤â¤Î
¡Ê¤¿¤À¤·¥¹¥È¥ê¡¼¥à»ØÄêÍÑ¤ÎÂè1°ú¿ô°Ê³°¡Ë¤ò°ú¿ô¤Ë¼è¤ë¡¥
\begin{verbatim}
> (prompt "Enter a number between ~A and ~A.~%>> " 1 10)
Enter a number between 1 and 10.
>> 3
3
\end{verbatim}
ºÇ¸å¤Î\verb@break-loop@¤ò»È¤¦¤Î¤ÏLisp¤Î¥È¥Ã¥×¥ì¥Ù¥ë¤ò¿¿»÷¤¿¤¤¤È¤­¤À¡¥
¤³¤ì¤Ï°ú¿ô¤Ë2¸Ä¤Î´Ø¿ô¤È¥ì¥¹¥È°ú¿ô¡Ê¥×¥í¥ó¥×¥È¤È¤·¤Æ·«¤êÊÖ¤·ÅÏ¤µ¤ì¤ë¡Ë¤ò¼è¤ë¡¥
2ÈÖÌÜ¤Î´Ø¿ô¤¬ÆþÎÏ¤ËÂÐ¤·¤Æµ¶¤òÊÖ¤¹¸Â¤ê¡¤1ÈÖÌÜ¤Î´Ø¿ô¤¬ÆþÎÏ¤ËÅ¬ÍÑ¤µ¤ì¤ë¡¥
¤À¤«¤é¡¤Îã¤¨¤Ð¼ÂºÝ¤ÎLisp¤Î¥È¥Ã¥×¥ì¥Ù¥ë¤Ï¼¡¤Î¤è¤¦¤ËÌÏÊï¤Ç¤­¤ë¡§
\begin{verbatim}
> (break-loop #'eval #'(lambda (x) (eq x :q)) ">> ")
\end{verbatim}
¤¹¤ë¤È\verb@break-loop@¤ÎÃæ¤ËÆþ¤ë¡¥
\begin{verbatim}
>> (+ 2 3)
5
>> :q
:Q
\end{verbatim}
¤È¤³¤í¤Ç¡¤Common Lisp¤Î¥ô¥§¥ó¥À¤¬°ìÈÌÅª¤Ë¼Â¹Ô»þ¥é¥¤¥»¥ó¥¹¤ò¼çÄ¥¤¹¤ë¤Î¤Ï¤³¤ì¤¬ÍýÍ³¤À¡¥
¼Â¹Ô»þ¤Ë\verb@eval@¤ò¸Æ¤Ù¤Ð¡¤Ç¤°Õ¤ÎLisp¥×¥í¥°¥é¥à¤¬Lisp¼«¿È¤òÊñ´Þ¤Ç¤­¤ë¡¥
%}}}
\subsection{¥·¥ó¥Ü¥ë¤È¥¹¥È¥ê¥ó¥°}   %{{{
¥·¥ó¥Ü¥ë¤È¥¹¥È¥ê¥ó¥°¤ÏÂçÊÑ¶á¤¤´Ø·¸¤Ë¤¢¤ë¡¥
É½¼¨´Ø¿ô¤ÈÆÉ¤ß¼è¤ê´Ø¿ô¤Î¼êÃÊ¤È¤·¤Æ¡¤Æó¤Ä¤ÎÉ½¸½¤Ïº®ÍÑ¤Ç¤­¤ë¡¥
Âè\ref{fig:SymbolsAndStrings}¿Þ¤Ë¤Ï¤³¤Î¶­³¦¤ÇÆ°ºî¤¹¤ë¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ÎÎã¤ò¼¨¤·¤¿¡¥
ºÇ½é¤Î\verb@mkstr@¤ÏÇ¤°Õ¤Î¿ô¤Î°ú¿ô¤ò¼è¤ê¡¤
¤½¤ì¤é¤Î°õ»úÉ½¸½¤òÏ¢·ë¤·¤Æ¥¹¥È¥ê¥ó¥°¤È¤·¤ÆÊÖ¤¹¡§
\begin{verbatim}
> (mkstr pi " pieces of " 'pi)
"3.141592653589793 pieces of PI"
\end{verbatim}
\verb@symb@¤Ï¤½¤ì¤Ë´ð¤Å¤¤¤Æºî¤é¤ì¤¿¤â¤Î¤Ç¡¤¼ç¤Ë¥·¥ó¥Ü¥ë¤ÎÀ¸À®¤Ë»È¤ï¤ì¤ë¡¥
¤³¤ì¤Ï1¸Ä°Ê¾å¤Î°ú¿ô¤ò¼è¤ê¡¤¤½¤Î°õ»úÌ¾¤òÏ¢·ë¤·¤¿¤â¤Î¤ò°õ»úÌ¾¤È¤¹¤ë¥·¥ó¥Ü¥ë¤ò
¡ÊÉ¬Í×¤Ê¤é¤Ð¿·¤·¤¯À¸À®¤·¤Æ¡ËÊÖ¤¹¡¥
¤³¤ì¤Ï°õ»úÉ½¸½¤ò»ý¤ÄÇ¤°Õ¤Î¥ª¥Ö¥¸¥§¥¯¥È\wadash
¥·¥ó¥Ü¥ë¡¤¥¹¥È¥ê¥ó¥°¡¤¿ô¡¤¤µ¤é¤Ë¥ê¥¹¥È¤Þ¤Ç\wadash ¤ò°ú¿ô¤Ë¼è¤ì¤ë¡¥
\begin{verbatim}
> (symb 'ar "Madi" #\L #\L 0)
|ARMadiLL0|
\end{verbatim}
\verb@mkstr@¤ò¸Æ¤ó¤Ç°ú¿ô¤ò¤ß¤Ê1¸Ä¤Î¥¹¥È¥ê¥ó¥°¤ËÏ¢·ë¤·¤¿¸å¡¤
\verb@symb@¤Ï¤½¤ì¤ò\verb@intern@¤ËÁ÷¤ë¡¥
¤³¤ì¤ÏLisp¤ÎÅÁÅýÅª¤Ê¥·¥ó¥Ü¥ëÀ¸À®ÍÑ´Ø¿ô¤Ç¡¤
¥¹¥È¥ê¥ó¥°¤ò°ú¿ô¤Ë¼è¤ê¡¤¤½¤Î¥¹¥È¥ê¥ó¥°¤ÇÉ½¼¨¤µ¤ì¤ë¥·¥ó¥Ü¥ë¤òÊÖ¤¹¤«¡¤¿·¤·¤¯À¸À®¤¹¤ë¡¥
Ç¤°Õ¤Î¥¹¥È¥ê¥ó¥°¤¬¡Ê¾®Ê¸»ú¤ä¡¤³ç¸Ì¤Ê¤É¤Î¥Þ¥¯¥íÊ¸»ú¤ò´Þ¤à¤â¤Î¤Ç¤â¡Ë
¥·¥ó¥Ü¥ë¤Î°õ»úÌ¾¤È¤·¤Æ»È¤¨¤ë¡¥
¥·¥ó¥Ü¥ë¤ÎÌ¾Á°¤Ë¤½¤¦¤¤¤Ã¤¿ÊÑ¤ï¤Ã¤¿Ê¸»ú¤¬»È¤ï¤ì¤Æ¤¤¤ë¤È¤­¤Ï¡¤
Ì¾Á°¤Ï¾å¤Î¤è¤¦¤Ë½ÄËÀ¤Ë¶´¤Þ¤ì¤ÆÉ½¼¨¤µ¤ì¤ë¡¥
¥½¡¼¥¹¥³¡¼¥É¤Ç¤Ï¡¤¤½¤¦¤¤¤Ã¤¿¥·¥ó¥Ü¥ë¤Ï½ÄËÀ¤Î´Ö¤Ë¤¢¤ë¤«¡¤
``\hbox{\texttt{\rlap{Y}\hss=\hss}}''¤¬Ê¸»ú¤ÎÁ°¤ËÉÕ¤¤¤Æ¤¤¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¡§
\begin{verbatim}
> (let ((s (symb '(a b))))
(and (eq s '|(A B)|) (eq s '\(A\ B\))))
T
\end{verbatim}
¼¡¤Î´Ø¿ô\verb@reread@¤Ï¡¤\verb@symb@¤Î°ìÈÌ·Á¤À¡¥
¥ª¥Ö¥¸¥§¥¯¥È¤ÎÎó¤ò°ú¿ô¤Ë¼è¤ê¡¤¤½¤ì¤é¤òÉ½¼¨¤·¡¤ºÆ¤ÓÆÉ¤ß¹þ¤à¡¥
¤³¤ì¤Ï\verb@symb@¤ÈÆ±ÍÍ¤Ë¥·¥ó¥Ü¥ë¤òÊÖ¤»¤ë¤¬¡¤
Â¾¤Ë¤â\verb@read@¤¬ÊÖ¤»¤ë¤â¤Î¤Ê¤é²¿¤Ç¤âÊÖ¤»¤ë¡¥
¥ê¡¼¥É¥Þ¥¯¥í¤Ï¥·¥ó¥Ü¥ë¤ÎÌ¾Á°¤Î°ìÉô¤È¤·¤Æ¤Ï°·¤ï¤ì¤º¡¤ÂÐ±þ¤¹¤ë´Ø¿ô¤¬¸Æ¤Ó½Ð¤µ¤ì¤ë¡¥
¤Þ¤¿\verb@a:b@¤Ï¥«¥ì¥ó¥È¡¦¥Ñ¥Ã¥±¡¼¥¸¤Î\verb@|a:b|@¤È¤¤¤¦¥·¥ó¥Ü¥ë¤Ç¤Ï¤Ê¤¯¡¤
¥Ñ¥Ã¥±¡¼¥¸\verb@a@Æâ¤Î¥·¥ó¥Ü¥ë\verb@b@¤È¤·¤ÆÆÉ¤ß¹þ¤Þ¤ì¤ë
\footnote{¥Ñ¥Ã¥±¡¼¥¸¤Î¾Ò²ð¤Ï¡¤pow¥Ú¡¼¥¸¤«¤é»Ï¤Þ¤ëÉÕ¾Ï¤ò»²¾È¡¥}¡¥
°ìÈÌÅª¤Ê´Ø¿ô¤ÏÑÜÄ¢ÌÌ¤Ç¤â¤¢¤ë¡§
\verb@reread@¤Ï¡¤°ú¿ô¤¬Àµ¤·¤¤LispÊ¸Ë¡¤Ë½¾¤Ã¤Æ¤¤¤Ê¤¤¤È¥¨¥é¡¼¤òÈ¯À¸¤¹¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defun mkstr (&rest args)
  (with-output-to-string (s)
    (dolist (a args) (princ a s))))

(defun symb (&rest args)
  (values (intern (apply #'mkstr args))))

(defun reread (&rest args)
  (values (read-from-string (apply #'mkstr args))))

(defun explode (sym)
  (map 'list #'(lambda (c)
                 (intern (make-string 1
                                      :initial-element c)))
       (symbol-name sym)))
\end{FramedVerb}\end{center}
\caption{¥·¥ó¥Ü¥ë¤È¥¹¥È¥ê¥ó¥°¤ËºîÍÑ¤¹¤ë´Ø¿ô}
\label{fig:SymbolsAndStrings}
\end{figure}

Âè\ref{fig:SymbolsAndStrings}¿Þ¤ÎºÇ¸å¤Î´Ø¿ô¤Ï¡¤ÀÎ¤Î´ö¤Ä¤«¤ÎÊý¸À¤Ç¤ÏÁÈ¤ß¹þ¤ß´Ø¿ô¤À¤Ã¤¿¡§
\verb@explode@¤Ï¥·¥ó¥Ü¥ë¤ò°ú¿ô¤Ë¼è¤ê¡¤
¤½¤Î¥·¥ó¥Ü¥ë¤ÎÌ¾Á°¤Ë»È¤ï¤ì¤Æ¤¤¤ëÊ¸»ú¤«¤éºî¤é¤ì¤ë¥·¥ó¥Ü¥ë¤«¤éÀ®¤ë¥ê¥¹¥È¤òÊÖ¤¹¡¥
\begin{verbatim}
> (explode 'bomb)
(B O M B)
\end{verbatim}
¤³¤Î´Ø¿ô¤¬Common Lisp¤Ë´Þ¤Þ¤ì¤Ê¤«¤Ã¤¿¤Î¤Ï¶ö¡¹¤È¤¤¤¦Ìõ¤Ç¤Ï¤Ê¤¤¡¥
¥·¥ó¥Ü¥ë¤òÊ¬²ò¤·¤¿¤¤¤è¤¦¤Ê¤È¤­¤Ë¤Ï¡¤¤ª¤½¤é¤¯Èó¸úÎ¨Åª¤Êºî¶È¤ò¤·¤Æ¤¤¤ë¤Î¤À¡¥
¤·¤«¤·À½ÉÊ¤Ë¤¹¤ë¥½¥Õ¥È¥¦¥§¥¢¤Ç¤Ê¤¯¤Æ¤½¤Î¸¶·¿¤ÎÃæ¤Ê¤é¡¤
¤³¤ÎÎà¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò»È¤¦Í¾ÃÏ¤Ï¤¢¤ë¡¥
%}}}
\subsection{Ì©ÅÙ}   %{{{
¥³¡¼¥ÉÆâ¤ËÂ¿¤¯¤Î¿·¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò»È¤¦¤È¡¤Íý²ò¤·¿É¤¤¤È¸À¤Ã¤Æ¤¯¤ë¿Í¤¬¤¤¤ë¡¥
Lisp¤ò¤Þ¤À»È¤¤¤³¤Ê¤»¤Ê¤¤¿Í¤ÏÁÇ¤ÎLisp¤·¤«ÆÉ¤ß¤È¤ì¤Ê¤¤¡¥
¤½¤¦¤¤¤¦¿Í¤Ï³ÈÄ¥²ÄÇ½¤Ê¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¤¤¤¦¹Í¤¨¤¬Á´¤¯¿È¤ËÉÕ¤¤¤Æ¤¤¤Ê¤¤¤Î¤À¡¥
¤½¤¦¤¤¤¦¿Í¤¬¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò¤Õ¤ó¤À¤ó¤Ë»È¤Ã¤¿¥×¥í¥°¥é¥à¤òÌÜ¤Ë¤¹¤ë¤È¡¤
¤½¤Îºî¼Ô¤ÏÁ´¤¯ÊÑ¿Í¤Ç¡¤
¥×¥í¥°¥é¥à¤ò°ì¼ï¤Î¸Ä¿ÍÍÑ¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç½ñ¤¯¤³¤È¤Ë·è¤á¤Æ¤·¤Þ¤Ã¤¿¤È»×¤¦¤³¤È¤À¤í¤¦¡¥

¤½¤ì¤é¤Î¿·¥ª¥Ú¥ì¡¼¥¿¤Ï¡¤¤É¤ì¤â¡ÊµÄÏÀ¤ÎÍ¾ÃÏ¤Ï¤¢¤ë¤¬¡Ë¥×¥í¥°¥é¥à¤òÆÉ¤ß¿É¤¯¤·¤Æ¤·¤Þ¤¦¡¥
¥×¥í¥°¥é¥à¤òÆÉ¤ß¼è¤ì¤ë¤è¤¦¤Ë¤Ê¤ëÁ°¤Ë¡¤¤½¤ì¤é¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤òÁ´¤ÆÍý²ò¤·¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¡¥
¤³¤¦¤¤¤Ã¤¿¸ÀÌÀ¤¬¤Ê¤¼¸í²ò¤µ¤ì¤ë¤Î¤«¤Ë¤Ä¤¤¤Æ¤Ï¡¤
pop¥Ú¡¼¥¸¤ÇÀâÌÀ¤·¤¿Îã¡Ê°ìÈÖ¶á¤¤½ñÅ¹¤òÃµ¤·¤¿Îã¡Ë¤Î¤³¤È¤ò¹Í¤¨¤Æ¤ß¤ÆÍß¤·¤¤¡¥
¤½¤Î¥×¥í¥°¥é¥à¤ò\verb@find2@¤ò»È¤Ã¤Æ½ñ¤±¤Ð¡¤
¡Ö¥×¥í¥°¥é¥à¤òÆÉ¤ß¼è¤ì¤ë¤è¤¦¤Ë¤Ê¤ëÁ°¤Ë¡¤
¤³¤Î¿·¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ÎÄêµÁ¤òÍý²ò¤·¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¤¸¤ã¤Ê¤¤¤«¡¥¡×
¤ÈÉÔËþ¤ò¸À¤¦¿Í¤¬½Ð¤Æ¤¯¤ë¡¥
¤½¤ì¤Ç¤Ï¡¤\verb@find2@¤ò»È¤ï¤Ê¤«¤Ã¤¿¤È¤·¤Æ¤ß¤è¤¦¡¥
¤¹¤ë¤È\verb@find2@¤ÎÄêµÁ¤ÏÍý²ò¤·¤Ê¤¯¤Æ¤â¤¤¤¤¤¬¡¤
\verb@find-books@¤ÎÄêµÁ¤òÍý²ò¤·¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¡¥
¤½¤ÎÃæ¤Ç¤Ï\verb@find2@¤Î»Å»ö¤¬¡Ö½ñÅ¹¤ò¸«¤Ä¤±¤ë¡×¤È¤¤¤¦¸ÄÊÌ¤Î²ÝÂê¤Èº®¤¶¤Ã¤Æ¤¤¤ë¡¥
\verb@find2@¤òÍý²ò¤¹¤ë¤Î¤Ï¤»¤¤¤¼¤¤\verb@find-books@¤ÈÆ±¤¸¤¯¤é¤¤Æñ¤·¤¤¤À¤±¤À¡¥
¤Þ¤¿¡¤¤³¤³¤Ç¤Ï¿·¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï1²ó¤·¤«»È¤Ã¤Æ¤¤¤Ê¤¤¡¥
¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï·«¤êÊÖ¤·»È¤¦¤è¤¦°Õ¿Þ¤µ¤ì¤¿¤â¤Î¤À¡¥
¼ÂºÝ¤Î¥×¥í¥°¥é¥à¤Ç¤Ï¡¤\verb@find2@¤òÍý²ò¤·¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¤«¡¤
¤Þ¤¿¤Ï3, 4¸Ä¤ÎÆÃÄêÌÜÅª¤Î¸¡º÷¥ë¡¼¥Á¥ó¤òÍý²ò¤·¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¤«¤Î¡¤¤É¤Á¤é¤«¤ÎÁªÂò¤À¤í¤¦¡¥
Á°¼Ô¤ÎÊý¤¬³Î¼Â¤Ë´ÊÃ±¤À¡¥

¤½¤¦¡¤¥Ü¥È¥à¥¢¥Ã¥×·Á¼°¤Î¥×¥í¥°¥é¥à¤òÆÉ¤ß¼è¤ë¤Ë¤Ï¡¤
ºî¼Ô¤ÎÄêµÁ¤·¤¿¿·¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤òÁ´¤ÆÍý²ò¤·¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¡¥
¤·¤«¤·¤³¤ì¤Ë¤«¤«¤ëÏ«ÎÏ¤Ï¡¤
¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ê¤·¤Î¾ì¹ç¤ËÉ¬Í×¤Ê¥³¡¼¥É¤òÍý²ò¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤È¤­¤ÎÏ«ÎÏ¤è¤ê¤Ï¡¤
¤Û¤È¤ó¤É¾ï¤Ë¾¯¤Ê¤¤¤À¤í¤¦¡¥
¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò»È¤¦¤È¥³¡¼¥É¤¬ÆÉ¤ß¿É¤¯¤Ê¤ë¤È¸À¤¦¿Í¤¬¤¤¤¿¤È¤¹¤ì¤Ð¡¤
¤½¤Î¿ÍÃ£¤Ï¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò»È¤ï¤Ê¤¤¤È¥³¡¼¥É¤¬¤É¤ó¤Ê¤â¤Î¤Ë¤Ê¤ë¤«Íý²ò¤·¤Æ¤¤¤Ê¤¤¤Î¤À¤í¤¦¡¥
¥Ü¥È¥à¥¢¥Ã¥×¡¦¥×¥í¥°¥é¥ß¥ó¥°¤Ï¡¤¤½¤ì¤Ê¤·¤Ç¤ÏµðÂç¤Ê¥×¥í¥°¥é¥à¤Ë¤Ê¤Ã¤¿È¦¤Î¤â¤Î¤ò¡¤
¾®¤µ¤¯¤ÆÃ±½ã¤Ê¥×¥í¥°¥é¥à¤Ë¸«¤¨¤ë¤è¤¦¤ËÊÑ¤¨¤Æ¤¯¤ì¤ë¡¥
¤³¤¦¤¹¤ë¤È¤½¤Î¥×¥í¥°¥é¥à¤ÏÂç¤·¤¿ÎÌ¤Î½èÍý¤ò¹Ô¤Ã¤Æ¤¤¤Ê¤¤¤È¤Î°õ¾Ý¤òÍ¿¤¨¡¤
¤½¤Î¤¿¤áÍý²ò¤¬´ÊÃ±¤Ë¤Ê¤ëÈ¦¤À¡¥
Lisp¤ËÌ¤½Ï¤Ê¿Í¤¬¥³¡¼¥É¤ò¤è¤¯¸«¤Æ¡¤¼ÂºÝ¤Ï¤«¤Ê¤ê¤Î½èÍý¤ò¹Ô¤Ã¤Æ¤¤¤ë¤³¤È¤Ëµ¤ÉÕ¤¯¤È¡¤
ÏµÇâ¤¹¤ë¤Î¤À¡¥

Æ±¤¸¸½¾Ý¤ÏÊÌ¤ÎÊ¬Ìî¤Ç¤âÈ¯¸«¤Ç¤­¤ë¡§
¾å¼ê¤ËÀß·×¤µ¤ì¤¿µ¡³£¤ÎÉôÉÊ¤Ï¾¯¤Ê¤¤¤¬¡¤¤è¤êÊ£»¨¤Ë¸«¤¨¤ë¡¥
¤½¤ì¤ÏÉôÉÊ¤¬¶¹¤¤¶õ´Ö¤ËµÍ¤á¹þ¤Þ¤ì¤Æ¤¤¤ë¤«¤é¤À¡¥
¥Ü¥È¥à¥¢¥Ã¥×·Á¼°¤Î¥×¥í¥°¥é¥à¤Ï³µÇ°¤ÎÌ©ÅÙ¤¬¹â¤¤¡¥
¤½¤ì¤ÏÆÉ¤ß¼è¤ë¤Î¤ËÏ«ÎÏ¤¬É¬Í×¤«¤â¤·¤ì¤Ê¤¤¤¬¡¤
¤½¤ì¤Ï¥×¥í¥°¥é¥à¤¬¥Ü¥È¥à¥¢¥Ã¥×·Á¼°¤Ç½ñ¤«¤ì¤Æ¤¤¤Ê¤«¤Ã¤¿¤È¤­¤Ë
É¬Í×¤Ë¤Ê¤Ã¤¿È¦¤ÎÏ«ÎÏÄø¤Ç¤Ï¤Ê¤¤¡¥
¿µ½Å¤Ë¹Í¤¨¤¿¾å¤Ç¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Î»ÈÍÑ¤òÈò¤±¤¿Êý¤¬¤¤¤¤¾ì¹ç¤¬°ì¤Ä¤¢¤ë¡§
¥³¡¼¥É¤ÎÂçÉôÊ¬¤È¤ÏÆÈÎ©¤·¤ÆÇÛÉÛ¤¹¤ë¾®¤µ¤Ê¥×¥í¥°¥é¥à¤ò½ñ¤«¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¤È¤­¤À¡¥
¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤È¤¤¤¦¤â¤Î¤ÏÄÌ¾ï2, 3²ó»È¤Ã¤Æ»Ï¤á¤Æ¸µ¤¬¼è¤ì¤ë¤â¤Î¤À¤¬¡¤
¾®µ¬ÌÏ¤Ê¥×¥í¥°¥é¥à¤Ç¤Ï¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò´Þ¤á¤ë°ÕÌ£¤¬¤¢¤ëÄø¤Ë¤Ï»È¤¨¤Ê¤¤¤³¤È¤¬¤¢¤ë¡¥
%}}}
%}}}
\section{ÊÖ¤êÃÍ¤È¤·¤Æ¤Î´Ø¿ô}    %{{{
Á°¾Ï¤Ç¤Ï¡¤´Ø¿ô¤ò°ú¿ô¤È¤·¤ÆÅÏ¤»¤ë¤³¤È¤¬Ãê¾Ý²½¤Ø¤Î²ÄÇ½À­¤ò¤É¤ìÄøÂç¤­¤¯¤¹¤ë¤«¤ò¸«¤¿¡¥
´Ø¿ô¤ËÂÐ¤·¤Æ¹Ô¤¨¤ëÁàºî¤¬Ë­¤«¤ÊÄø¡¤¤½¤Î²ÄÇ½À­¤ò¿¼¤¯ÍøÍÑ¤Ç¤­¤ë¡¥
¿·¤·¤¤´Ø¿ô¤òÀ¸À®¤·¤ÆÊÖ¤¹´Ø¿ô¤òÄêµÁ¤¹¤ë¤³¤È¤Ç¡¤
´Ø¿ô¤ò°ú¿ô¤Ë¼è¤ë¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Î¸ú²Ì¤òÁýÉý¤Ç¤­¤ë¡¥

¤³¤Î¾Ï¤Ç¼¨¤¹¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï´Ø¿ô¤ËÂÐ¤·¤ÆÆ°ºî¤¹¤ë¡¥
Â¿¤¯¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò¼°¤ËÂÐ¤·¤ÆÆ°ºî¤¹¤ë¤è¤¦¤Ë½ñ¤¯Êý¤¬¡Ê¾¯¤Ê¤¯¤È¤âCommon Lisp¤Ç¤Ï¡Ë¼«Á³¤À¤í¤¦¡¥
¤Ä¤Þ¤ê¡¤¥Þ¥¯¥í¤È¤·¤Æ½ñ¤¯¤Î¤À¡¥
Âè15¾Ï¤Ç¤Ï¡¤¤³¤ì¤é¤Î¥ª¥Ú¥ì¡¼¥¿¤Î´ö¤Ä¤«¤Ë¥Þ¥¯¥í¤ÎÁØ¤¬ÁÞÆþ¤µ¤ì¤ë¡¥
¤·¤«¤·¤½¤ì¤é¤Î´Ø¿ô¤¬·ë¶É¤Ï¥Þ¥¯¥í¤òÄÌ¤¸¤Æ¤Î¤ß¸Æ¤Ó½Ð¤µ¤ì¤ë¤È¤·¤Æ¤â¡¤
µ¡Ç½¤Î¤É¤ÎÉôÊ¬¤¬´Ø¿ô¤Ç¼Â¸½¤Ç¤­¤ë¤Î¤«¤òÃÎ¤ë¤³¤È¤Ï½ÅÍ×¤Ê¤³¤È¤À¡¥
\subsection{Common Lisp¤Ï¿Ê²½¤¹¤ë}  %{{{
Common Lisp¤Ë¤Ï¸µ¡¹¥³¥ó¥×¥ê¥á¥ó¥È´Ø¿ô(complement function)¤ÎÂÐ¤¬´ö¤Ä¤«¤¢¤ë¡¥
´Ø¿ô\verb|remove-|\hspace{1sp}\verb|if|¤È
\verb|remove-|\hspace{1sp}\verb|if-|\hspace{1sp}\verb|not|¤â¤½¤¦¤¤¤Ã¤¿ÂÐ¤Î°ì¤Ä¤À¡¥
\verb@pred@¤¬°ú¿ô¤ò1¸Ä¼è¤ë½Ò¸ì¤À¤È¤¹¤ë¤È
\begin{verbatim}
(remove-if-not #'pred lst)
\end{verbatim}
¤È
\begin{verbatim}
(remove-if #'(lambda (x) (not (pred x))) lst)
\end{verbatim}
¤È¤ÏÅù²Á¤À¡¥

°ú¿ô¤È¤·¤ÆÅÏ¤µ¤ì¤¿´Ø¿ô¤ò¤½¤¦¤·¤¿´Ø¿ô¤ËÊÑ¤¨¤ë¤³¤È¤Ç¡¤¤â¤¦ÊÒÊý¤Îµ¡Ç½¤òÊ£À½¤Ç¤­¤ë¡¥
¤½¤Î¤È¤­¡¤¤É¤¦¤·¤ÆÎ¾Êý¤ÎÉ¬Í×¤¬¤¢¤ë¤À¤í¤¦¡©
\textsf{CLtL2}¤Ï¤½¤Î¤è¤¦¤Ê¾õ¶·¤ò°Õ¿Þ¤·¤¿´Ø¿ô¤ò¿·¤·¤¯´Þ¤ó¤Ç¤¤¤ë¡§
\verb@complement@¤Ï½Ò¸ì\verb@p@¤ò¼è¤ê¡¤¾ï¤ËÈ¿ÂÐ¤ÎÃÍ¤òÊÖ¤¹´Ø¿ô¤òÊÖ¤¹¡¥
\verb@p@¤¬¿¿¤òÊÖ¤¹¤È¤­¡¤¥³¥ó¥×¥ê¥á¥ó¥È´Ø¿ô¤Ïµ¶¤òÊÖ¤¹¡¥µÕ¤âÆ±¤¸¤À¡¥
¤¹¤ë¤È\verb@complement@¤ò»È¤¨¤Ð
\begin{verbatim}
(remove-if-not #'pred lst)
\end{verbatim}
¤ÏÅù²Á¤Ê
\begin{verbatim}
(remove-if (complement #'pred) lst)
\end{verbatim}
¤ÇÃÖ¤­´¹¤¨¤é¤ì¤ë¡¥
\verb@-if-not@¤ÎÎà¤Î´Ø¿ô¤ò»È¤¤Â³¤±¤ë¤³¤È¤òÀµÅö²½¤¹¤ëÍýÍ³¤Ï¤Û¤È¤ó¤É¤Ê¤¤
\footnote{\texttt{remove-if-not}¤ÏÊÌ¤À¤í¤¦¡¥
¤³¤ì¤Ï\texttt{remove-if}¤è¤ê¤â»È¤ï¤ì¤Æ¤¤¤ë¡¥}¡¥
¼ÂºÝ\CLtL2 (p. 391) ¤Ï¡¤¤½¤ì¤é¤Î»ÈÍÑ¤Ï¸½ºß¤Ç¤Ï¿ä¾©¤µ¤ì¤Ê¤¤¤Èµ­¤·¤Æ¤¤¤ë¡¥
¤½¤ì¤é¤¬Common Lisp¤Ë»Ä¤µ¤ì¤ë¤È¤·¤¿¤é¡¤¤½¤ÎÍýÍ³¤Ï¸ß´¹À­¤òÊÝ¤Ä¤¿¤á¤Ë²á¤®¤Ê¤¤¤À¤í¤¦¡¥

¿·¤·¤¤¥ª¥Ú¥ì¡¼¥¿\verb|complement|¤Ï½ÅÍ×¤Ê¼çÂê\wadash
´Ø¿ô¤òÊÖ¤¹´Ø¿ô\wadash ¤ÎÉ¹»³¤Î°ì³Ñ¤À¡¥
¤½¤ì¤ÏScheme¤Î´·ÍÑË¡¤ÎÃæ¤Ç¤ÏÄ¹¤é¤¯½ÅÍ×¤Ê°ÌÃÖ¤òÀê¤á¤Æ¤¤¤¿¡¥
Scheme¤Ï´Ø¿ô¤ò¥ì¥­¥·¥«¥ë¥¯¥í¡¼¥¸¥ã¤Ë¤·¤¿ºÇ½é¤ÎLisp¤Ç¡¤
ÊÖ¤êÃÍ¤Ë´Ø¿ô¤ò»È¤¦¤³¤È¤ò¶½Ì£¿¼¤¤¤â¤Î¤Ë¤·¤¿¤Î¤â¤½¤ì¤À¡¥

¥À¥¤¥Ê¥ß¥Ã¥¯¥¹¥³¡¼¥×¤ÎLisp¤Ç¤Ï´Ø¿ô¤òÊÖ¤»¤Ê¤¤Ìõ¤Ç¤Ï¤Ê¤¤¡¥
¼¡¤Î´Ø¿ô¤Ï¥À¥¤¥Ê¥ß¥Ã¥¯¥¹¥³¡¼¥×¤ÎLisp¤Ç¤â¥ì¥­¥·¥«¥ë¥¹¥³¡¼¥×¤ÎLisp¤Ç¤â
Æ±¤¸¤è¤¦¤ËÆ°ºî¤¹¤ë¤À¤í¤¦¡§
\begin{verbatim}
(defun joiner (obj)
  (typecase obj
    (cons #'append)
    (number #'+)))
\end{verbatim}
¤³¤ì¤Ï¥ª¥Ö¥¸¥§¥¯¥È¤ò°ú¿ô¤Ë¼è¤ê¡¤
¤½¤Î·¿¤Ë±þ¤¸¤Æ¤½¤ì¤é¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò²Ã¤¨¹ç¤ï¤»¤ë´Ø¿ô¤òÊÖ¤¹¡¥
¤³¤ì¤Ï¿ô¤ä¥ê¥¹¥È¤ËÂÐ¤·¤ÆÆ¯¤¯Â¿ÂÖÅª¤Ê(polymorphic)Ï¢·ë´Ø¿ô¤ÎÄêµÁ¤Ë»È¤¨¤ë¡§
\begin{verbatim}
(defun join (&rest args)
  (apply (joiner (car args)) args))
\end{verbatim}
¤·¤«¤·Í½¤á·è¤á¤¿Ãæ¤«¤éÁª¤ó¤Ç´Ø¿ô¤òÊÖ¤¹ÄøÅÙ¤¬¡¤
¥À¥¤¥Ê¥ß¥Ã¥¯¥¹¥³¡¼¥×¤Î²¼¤Ç¤Ç¤­¤ë¤³¤È¤Î¸Â³¦¤À¡¥
¼Â¹Ô»þ¤Ë´Ø¿ô¤òÀ¸À®¤¹¤ë¤³¤È¤Ï¡Ê¾å¼ê¤Ë¤Ï¡Ë¤Ç¤­¤Ê¤¤¡¥
\verb|joiner|¤Ï2¸Ä¤Î´Ø¿ô¤ÎÃæ¤É¤Á¤é¤«¤òÊÖ¤»¤ë¤¬¡¤ÊÖ¤»¤ë2¸Ä¤Ï¸ÇÄê¤µ¤ì¤Æ¤¤¤ë¡¥

¤³¤ì¤È¤ÏÊÌ¤Ëprop¥Ú¡¼¥¸¤Ç´Ø¿ô¤òÊÖ¤¹´Ø¿ô¤ò¸«¤¿¡¥
¤½¤ì¤Ï¥ì¥­¥·¥«¥ë¥¹¥³¡¼¥×¤Ë¤è¤ë¤â¤Î¤À¡§
\begin{verbatim}
(defun make-adder (n)
  #'(lambda (x) (+ x n)))
\end{verbatim}
\verb|make-adder|¤ò¸Æ¤Ö¤È¥¯¥í¡¼¥¸¥ã¤¬À¸À®¤µ¤ì¤ë¤¬¡¤
¤½¤Î¿¶¤ëÉñ¤¤¤Ï¸µ¡¹°ú¿ô¤È¤·¤ÆÍ¿¤¨¤é¤ì¤¿ÃÍ¤Ë°ÍÂ¸¤¹¤ë¡¥
\begin{verbatim}
> (setq add3 (make-adder 3))
#<Interpreted-Function BF1356>
> (funcall add3 2)
5
\end{verbatim}
¥ì¥­¥·¥«¥ë¥¹¥³¡¼¥×¤Î²¼¤Ç¤Ï¡¤ÁªÂò»è¤ÎÃæ¤«¤é¤É¤ì¤«¤Î´Ø¿ô¤òÁª¤Ö¤À¤±¤Ç¤Ê¤¯¡¤
¼Â¹Ô»þ¤Ë¥¯¥í¡¼¥¸¥ã¤òÀ¸À®¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
¥À¥¤¥Ê¥ß¥Ã¥¯¥¹¥³¡¼¥×¤Î²¼¤Ç¤Ï¤½¤Îµ»Ë¡¤ÏÉÔ²ÄÇ½¤À
\footnote{¥À¥¤¥Ê¥ß¥Ã¥¯¥¹¥³¡¼¥×¤Î²¼¤Ç¤â\texttt{make-adder}¤Î¤è¤¦¤Ê¤â¤Î¤òºî¤ì¤ë¤¬¡¤
¤½¤ì¤Ï¤Þ¤È¤â¤ËÆ°ºî¤·¤Ê¤¤¤À¤í¤¦¡¥
ÊÖ¤µ¤ì¤¿´Ø¿ô¤¬ºÇ½ªÅª¤Ë¸Æ¤Ó½Ð¤µ¤ì¤¿´Ä¶­¤Ë\texttt{n}¤ÎÂ«Çû¤¬º¸±¦¤µ¤ì¡¤
À©¸æ¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤¤¤À¤í¤¦¡¥}¡¥
\verb|complement|¤¬¤É¤Î¤è¤¦¤Ë½ñ¤«¤ì¤Æ¤¤¤ë¤«¤ò¹Í¤¨¤ì¤Ð¡¤
¤½¤ì¤¬¥¯¥í¡¼¥¸¥ã¤òÊÖ¤¹Â¾¤Ê¤¤¤È¤¤¤¦¤³¤È¤¬Ê¬¤«¤ë¡§
\begin{verbatim}
(defun complement (fn)
  #'(lambda (&rest args) (not (apply fn args))))
\end{verbatim}
\verb|complement|¤ÎÊÖ¤·¤¿´Ø¿ô¤Ï¡¤
\verb|complement|¤¬¸Æ¤Ð¤ì¤¿»þÅÀ¤Ç¤Î¥Ñ¥é¥á¡¼¥¿\verb|fn|¤ÎÃÍ¤ò»È¤Ã¤Æ¤¤¤ë¡¥
¤À¤«¤é¸ÇÄê¤µ¤ì¤¿ÁªÂò»è¤ÎÃæ¤«¤é´Ø¿ô¤òÁª¤Ö¤À¤±¤Ç¤Ê¤¯¡¤
\verb|complement|¤Ï¤É¤Î´Ø¿ô¤Î¥³¥ó¥×¥ê¥á¥ó¥È´Ø¿ô¤Ç¤âµá¤á¤Ë±þ¤¸¤ÆÀ¸À®¤Ç¤­¤ë¡§
\begin{verbatim}
> (remove-if (complement #'oddp) '(1 2 3 4 5 6))
(1 3 5)
\end{verbatim}

´Ø¿ô¤ò°ú¿ô¤È¤·¤ÆÅÏ¤»¤ë¤³¤È¤ÏÃê¾Ý²½¤Î¤¿¤á¤Î¶¯ÎÏ¤ÊÆ»¶ñ¤À¡¥
´Ø¿ô¤òÊÖ¤¹´Ø¿ô¤¬½ñ¤±¤ë¤³¤È¤Ç¡¤¤½¤ì¤òºÇÂç¸Â¤ËÍøÍÑ¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ë¡¥
»Ä¤ê¤ÎÀá¤Ç¤Ï´Ø¿ô¤òÊÖ¤¹¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ÎÎã¤ò´ö¤Ä¤«µó¤²¤ë¡¥
%}}}
\subsection{Ä¾¸òÀ­}  %{{{
Ä¾¸òÅª(orthogonal)¤Ê¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¤Ï¡¤
¾¯¿ô¤Î¥ª¥Ú¥ì¡¼¥¿¤òÂ¿¿ô¤ÎÍÍ¡¹¤ÊÊýË¡¤Ç·ë¹ç¤µ¤»¤ë¤³¤È¤Ç¡¤
Â¿ÍÍ¤Ê°ÕÌ£¤¬É½¸½¤Ç¤­¤ë¤â¤Î¤Î¤³¤È¤À¡¥
¤ª¤â¤Á¤ã¤Î¥Ö¥í¥Ã¥¯¤Ï¶Ë¤á¤ÆÄ¾¸òÅª¤À¤¬¡¤¥×¥é¥â¥Ç¥ë¤Ï¤Û¤È¤ó¤ÉÄ¾¸òÅª¤Ç¤Ê¤¤¡¥
\verb@complement@¤Î¼ç¤ÊÄ¹½ê¤Ï¡¤¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ò°ìÁØÄ¾¸òÅª¤Ë¤·¤Æ¤¤¤ë¤³¤È¤À¡¥
\verb|complement|¤ÎÅÐ¾ì°ÊÁ°¡¤
Common Lisp¤Ë¤Ï\verb@remove-if@¤È\verb@remove-if-not@¡¤
\verb@subst-if@¤È\verb@subst-if-not@Åù¤Î´Ø¿ô¤ÎÁÈ¤¬¤¢¤Ã¤¿¡¥
\verb@complement@¤¬¤¢¤ì¤Ð¡¤¤½¤ì¤é¤ÎÊÒÊý¤Ç»ö¤ÏÂ­¤ê¤ë¡¥

¥Þ¥¯¥í\verb@setf@¤âLisp¤ÎÄ¾¸òÀ­¤ò¹â¤á¤Æ¤¤¤ë¡¥
Lisp¤ÎÊý¸À¤Î¸Å¤¤¤â¤Î¤Ç¤Ï¡¤¥Ç¡¼¥¿¤òÆÉ¤à´Ø¿ô¤È½ñ¤¯´Ø¿ô¤ÎÁÈ¤¬¤¢¤Ã¤¿¤ê¤·¤¿¤â¤Î¤À¡¥
¤¹¤ë¤ÈÎã¤¨¤ÐÂ°À­¥ê¥¹¥È¤¬¤¢¤ì¤Ð¡¤
Â°À­¤òÀßÄê¤¹¤ë´Ø¿ô¤¬1¸Ä¡¤µá¤á¤ë´Ø¿ô¤¬¤â¤¦1¸ÄÉ¬Í×¤À¤í¤¦¡¥
Common Lisp¤Ë¤Ï¸å¼Ô¤ËÅö¤¿¤ë\verb@get@¤·¤«¤Ê¤¤¡¥
Â°À­¤òÀßÄê¤¹¤ë¤Ë¤Ï\verb|get|¤ò\verb@setf@¤ÈÁÈ¤ß¹ç¤ï¤»¤Æ»È¤¦¡§
\begin{verbatim}
(setf (get 'ball 'color) 'red)
\end{verbatim}

Common Lisp¤ÎÂÎ·Ï¤½¤Î¤â¤Î¤ò¾®¤µ¤¯¤¹¤ë¤³¤È¤ÏÆñ¤·¤¤¤¬¡¤Âå¤ï¤ê¤Ë¤¤¤¤ÊýË¡¤¬¤¢¤ë¡¥
Common Lisp¤Î¾®µ¬ÌÏ¤ÊÉôÊ¬½¸¹ç¤À¤±¤ò»È¤¦¤³¤È¤À¡¥
»äÃ£¤ò¤³¤Î¥´¡¼¥ë¤ØÆ³¤¤¤Æ¤¯¤ì¤ë¡¤
\verb@complement@¤ä\verb@setf@Åù¤Î¿·¤·¤¤¥ª¥Ú¥ì¡¼¥¿¤òÄêµÁ¤Ç¤­¤Ê¤¤¤â¤Î¤À¤í¤¦¤«¡©
´Ø¿ô¤òÁÈ¤Ë¤Þ¤È¤á¤é¤ì¤ëÊýË¡¤¬¾¯¤Ê¤¯¤È¤â°ì¤Ä¤¢¤ë¡¥
Â¿¤¯¤Î´Ø¿ô¤Ë¤ÏÅù²Á¤ÇÇË²õÅª¤ÊÊÌ¤Î´Ø¿ô¤¬¤¢¤ë¡¥
\verb@remove-if@¤È\verb@delete-if@¡¤\verb@reverse@¤È\verb@nreverse@¡¤
\verb@append@¤È\verb@nconc@Åù¤À¡¥
¤¢¤ë´Ø¿ô¤ÈÅù²Á¤ÇÇË²õÅª¤Ê´Ø¿ô¤òÊÖ¤¹¥ª¥Ú¥ì¡¼¥¿¤òÄêµÁ¤¹¤ë¤³¤È¤Ç¡¤
ÇË²õÅª¤Ê´Ø¿ô¤òÌÀ¼¨¤¹¤ëÉ¬Í×¤¬¤Ê¤¯¤Ê¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defvar *!equivs* (make-hash-table))

(defun ! (fn)
  (or (gethash fn *!equivs*) fn))

(defun def! (fn fn!)
  (setf (gethash fn *!equivs*) fn!))
\end{FramedVerb}\end{center}
\caption{Åù²Á¤ÇÇË²õÅª¤Ê´Ø¿ô¤òÊÖ¤¹¡¥}
\label{fig:DestructiveEquiv}
\end{figure}

Âè\ref{fig:DestructiveEquiv}¿Þ¤Ë¤Ï¡ÖÅù²Á¤ÇÇË²õÅª¤Ê´Ø¿ô¡×¤Î¹Í¤¨¤òÊä½õ¤¹¤ë¥³¡¼¥É¤ò¼¨¤·¤¿¡¥
¥°¥í¡¼¥Ð¥ë¤Ê¥Ï¥Ã¥·¥åÉ½\,\verb@*!equivs*@\,¤Ï¡¤
¤¢¤ë´Ø¿ô¤È¤½¤ì¤ËÅù²Á¤ÇÇË²õÅª¤Ê´Ø¿ô¤È¤ÎÂÐ±þÉÕ¤±¤ò¹Ô¤¦¡¥
\verb@def!@\,¤Ë¤è¤Ã¤ÆÅù²Á¤ÇÇË²õÅª¤Ê´Ø¿ô¤òÀßÄê¤·¡¤\verb@!@\,¤Ï¤½¤ì¤òÊÖ¤¹¡¥
¥ª¥Ú¥ì¡¼¥¿\hskip\xkanjiskip\verb@!@¡Ê¤Ó¤Ã¤¯¤ê¥Þ¡¼¥¯¡Ë¤Ï¡¤
Scheme¤ÇÉûºîÍÑ¤Î¤¢¤ë´Ø¿ô¤ÎÌ¾Á°¤Ë\,\verb@!@\,¤òÉÕ¤±²Ã¤¨¤ë´·½¬¤«¤é¼è¤Ã¤¿¡¥
\begin{verbatim}
(def! #'remove-if #'delete-if)
\end{verbatim}
¤µ¤Æ¾å¤Î¤è¤¦¤ËÄêµÁ¤·¤Æ¤·¤Þ¤¨¤Ð
\begin{verbatim}
(delete-if #'oddp lst)
\end{verbatim}
¤È¤¹¤ëÂå¤ï¤ê¤Ë
\begin{verbatim}
(funcall (! #'remove-if) #'oddp lst)
\end{verbatim}
¤È¤¹¤ì¤Ð¤¤¤¤¡¥
¤³¤³¤Ç¤ÏCommon Lisp¤ÎÂ¤¤ê¤¬¤Þ¤º¤¤¤»¤¤¤Ç¤³¤Î¹Í¤¨¤Î¸µ¡¹¤ÎÈþÅÀ¤¬±£¤ì¤Æ¤·¤Þ¤Ã¤Æ¤¤¤ë¤¬¡¤
Scheme¤Ç¤Ï¤â¤Ã¤È¤Ï¤Ã¤­¤ê¸«¤¨¤ë¡§
\begin{verbatim}
((! remove-if) oddp lst)
\end{verbatim}

Ä¾¸òÀ­¤Î¸þ¾å¤â¤µ¤ë¤³¤È¤Ê¤¬¤é¡¤¥ª¥Ú¥ì¡¼¥¿\,\verb@!@\,¤ÏÂ¾¤Ë¤â´ö¤Ä¤«¤ÎÍøÅÀ¤ò¤â¤¿¤é¤¹¡¥
\verb@(! #'foo)@¤Ï\verb@foo@¤ÈÅù²Á¤ÇÇË²õÅª¤Ê´Ø¿ô¤À¤È¸«¤Æ¤¹¤°Ê¬¤«¤ë¤Î¤Ç¡¤
¥×¥í¥°¥é¥à¤¬¤µ¤é¤Ë´Ê·é¤Ë¤Ê¤ë¡¥
¤Þ¤¿¡¤ÇË²õÅª¤ÊÁàºî¤¬¥½¡¼¥¹¥³¡¼¥ÉÆâ¤ÇÌÜÎ©¤Ã¤ÆÇ§¼±¤·¤ä¤¹¤¤·Á¤ò¼è¤ë¤è¤¦¤Ë¤Ê¤ë¡¥
¤½¤ì¤é¤Ï¥Ð¥°¤òÃµ¤¹¤È¤­¤ËÆÃÊÌ¤ÊÃí°Õ¤òÊ§¤¦¤Ù¤­¤â¤Î¤À¤«¤é¡¤¤³¤ì¤Ï¤¤¤¤¤³¤È¤À¡¥

¤¢¤ë´Ø¿ô¤È¤½¤ì¤ËÅù²Á¤ÇÇË²õÅª¤Ê´Ø¿ô¤È¤Î´Ø·¸¤Ï¡¤ÉáÄÌ¤Ï¼Â¹Ô¤¹¤ëÁ°¤ËÌÀ¤é¤«¤Ë¤Ê¤ë¤Î¤Ç¡¤
\verb@!@\,¤Ï¥Þ¥¯¥í¤È¤·¤ÆÄêµÁ¤¹¤ë¤Î¤¬°ìÈÖ¸úÎ¨Åª¤À¡¥
¤½¤Î¤¿¤á¤Î¥ê¡¼¥É¥Þ¥¯¥í¤òÄêµÁ¤·¤Æ¤â¤¤¤¤¤À¤í¤¦¡¥
%}}}
\subsection{´Ø¿ô¤ÎÃÍ¤Î¥á¥â¥ï¥¤¥º}  %{{{
·×»»¥³¥¹¥È¤Î¹â¤¤´Ø¿ô¤òÆ±¤¸°ú¿ô¤ÇÊ£¿ô²ó¸Æ¤Ó½Ð¤·¤¿¤¤¤È¤­¤¬¤¢¤ë¤Ê¤é¡¤
ÃÍ¤ò¥á¥â¥ï¥¤¥º(memoize)¤·¤Æ¤ª¤¯¤Î¤¬ÆÀ¤À¡¥
°ÊÁ°¤ÎÊÖ¤êÃÍ¤ò¤ß¤ÊÊÝ´É¤·¤Æ¤ª¤­¡¤
´Ø¿ô¤¬¸Æ¤Ó½Ð¤µ¤ì¤ëÅÙ¤Ë¤Þ¤ºÊÝ´É¾ì½ê¤ò¸«¤Æ¡¤ÃÍ¤¬´û¤ËÆÀ¤é¤ì¤Æ¤¤¤Ê¤¤¤«Ä´¤Ù¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defun memoize (fn)
  (let ((cache (make-hash-table :test #'equal)))
    #'(lambda (&rest args)
        (multiple-value-bind (val win) (gethash args cache)
          (if win
              val
              (setf (gethash args cache)
                    (apply fn args)))))))
\end{FramedVerb}\end{center}
\caption{¥á¥â¥ï¥¤¥º¥æ¡¼¥Æ¥£¥ê¥Æ¥£¡¥}
\label{fig:Memoizing}
\end{figure}

Âè\ref{fig:Memoizing}¿Þ¤Ë¤Ï°ìÈÌÅª¤Ê¥á¥â¥ï¥¤¥º¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò¼¨¤·¤¿¡¥
\verb|memoize|¤Ë´Ø¿ô¤òÅÏ¤¹¤È¡¤Åù²Á¤Ê¥á¥â¥ï¥¤¥ºµ¡Ç½ÉÕ¤­´Ø¿ô¤¬ÊÖ¤ë¡¥
¤½¤ì¤Ï°ÊÁ°¤ÎÊÖ¤êÃÍ¤òÃß¤¨¤ë¥Ï¥Ã¥·¥åÉ½¤ò»ý¤Ã¤¿¥¯¥í¡¼¥¸¥ã¤À¡¥
\begin{verbatim}
> (setq slowid (memoize #'(lambda (x) (sleep 5) x)))
#<Interpreted-Function C38346>
> (time (funcall slowid 1))
Elapsed Time = 5.15 seconds
1
> (time (funcall slowid 1))
Elapsed Time = 0.00 seconds
1
\end{verbatim}
¥á¥â¥ï¥¤¥ºµ¡Ç½ÉÕ¤­´Ø¿ô¤Ç¤Ï¡¤¸Æ¤Ó½Ð¤·¤Î·«¤êÊÖ¤·¤Ï¥Ï¥Ã¥·¥åÉ½¤Î¸¡º÷¤Ë²á¤®¤Ê¤¤¡¥
¤â¤Á¤í¤ó¿·¤·¤¤ÃÍ¤Ç¸Æ¤ó¤À¤È¤­¤Ë¤â¸¡º÷¤·¤Æ¤·¤Þ¤¦¤È¤¤¤¦Í¾Ê¬¤ÊÉé²Ù¤Ï¤¢¤ë¤¬¡¤
½½Ê¬·×»»¥³¥¹¥È¤Î¹â¤¤´Ø¿ô¤À¤±¤Ë¥á¥â¥ï¥¤¥ºµ¡Ç½¤òÉÕ¤±¤ë¤Î¤À¤«¤é¡¤
¤½¤ÎÉé²Ù¤ÏÈæ³Ó¤¹¤ì¤ÐÌµ»ë¤Ç¤­¤ë¤ÈÁÛÄê¤·¤Æ¤¤¤¤¤À¤í¤¦¡¥
¤µ¤Æ¾å¤Î\verb@memoize@¤Î¼ÂÁõÊýË¡¤ÏÂçÄñ¤Î¾ì¹ç¤Ë¤ÏÅ¬¤·¤Æ¤¤¤ë¤¬¡¤´ö¤Ä¤«À©¸Â¤â¤¢¤ë¡¥
¸Æ¤Ó½Ð¤·Êý¤òÆ±¤¸¤È¸«¤Ê¤¹¤Î¤Ï°ú¿ô¥ê¥¹¥È¤¬\verb@equal@¤Î¤È¤­¤À¤¬¡¤
¤³¤ì¤Ï´Ø¿ô¤¬¥­¡¼¥ï¡¼¥É°ú¿ô¤ò¼è¤ë¤È¤­¤Ë¤Ï¸·¤·¤¹¤®¤ë¤À¤í¤¦¡¥
¤Þ¤¿ÊÖ¤êÃÍ¤¬1¸Ä¤Î´Ø¿ô¤Î¤ß¤òÁÛÄê¤·¤Æ¤¤¤Æ¡¤Â¿ÃÍ¤òÃß¤¨¤¿¤êÊÖ¤·¤¿¤ê¤Ï¤Ç¤­¤Ê¤¤¡¥
%}}}
\subsection{´Ø¿ô¤ò¹çÀ®¤¹¤ë}  %{{{
´Ø¿ô$f$¤Î¥³¥ó¥×¥ê¥á¥ó¥È´Ø¿ô¤Ï$\sim\!\!f$¤ÈÉ½µ­¤µ¤ì¤ë¡¥
Âè5.1Àá¤Ç¤Ï$\sim$¤òLisp¤Î´Ø¿ô¤È¤·¤ÆÄêµÁ¤¹¤ë¥¯¥í¡¼¥¸¥ã¤ò¼¨¤·¤¿¡¥
´Ø¿ô¤ËÂÐ¤·¤Æ¤è¤¯»È¤ï¤ì¤ëÁàºî¤Ë¤ÏÂ¾¤Ë¹çÀ®¤¬¤¢¤ê¡¤$\circ$¤ÇÉ½µ­¤µ¤ì¤ë¡¥
$f$¤È$g$¤¬´Ø¿ô¤Ê¤é¤Ð$f\!\circ\!g$¤â´Ø¿ô¤Ç¡¤$f\!\circ\!g(x)=f(g(x))$¤Ç¤¢¤ë¡¥
¤³¤ì¤â¥¯¥í¡¼¥¸¥ã¤ÇLisp¤Î´Ø¿ô¤È¤·¤ÆÄêµÁ¤Ç¤­¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defun compose (&rest fns)
  (if fns
      (let ((fn1 (car (last fns)))
            (fns (butlast fns)))
        #'(lambda (&rest args)
                   (reduce #'funcall fns
                           :from-end t
                           :initial-value (apply fn1 args))))
      #'identity))
\end{FramedVerb}\end{center}
\caption{¹çÀ®´Ø¿ô¤Î¤¿¤á¤Î¥ª¥Ú¥ì¡¼¥¿¡¥}
\label{fig:FunctionalCompo}
\end{figure}

Âè\ref{fig:FunctionalCompo}¿Þ¤Ç¤Ï´Ø¿ô\verb@compose@¤òÄêµÁ¤·¤¿¡¥
¤³¤ì¤ÏÇ¤°Õ¤Î¿ô¤Î´Ø¿ô¤ò°ú¿ô¤Ë¼è¤ê¡¤¤½¤ì¤é¤Î¹çÀ®¤òÊÖ¤¹¡¥
Îã¤¨¤Ð
\begin{verbatim}
(compose #'list #'1+)
\end{verbatim}
¤¬ÊÖ¤¹¤Î¤Ï
\begin{verbatim}
#'(lambda (x) (list (1+ x)))
\end{verbatim}
¤ÈÅù²Á¤Ê´Ø¿ô¤À¡¥
\verb@compose@¤Î°ú¿ô¤ËÅÏ¤µ¤ì¤¿´Ø¿ô¤Ï¡¤
ºÇ¸å°Ê³°¤Ï¤ß¤Ê°ú¿ô¤¬1¸Ä¤Î´Ø¿ô¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤\note{last}¡¥
ºÇ¸å¤Î´Ø¿ô¤Ë¤ÏÀ©¸Â¤Ï²¿¤â¤Ê¤¯¡¤¤½¤ì¤¬¤É¤ó¤Ê°ú¿ô¤ò¼è¤Ã¤Æ¤â¡¤
\verb|compose|¤ÎÊÖ¤¹´Ø¿ô¤âÆ±¤¸°ú¿ô¤ò¼è¤ë¡¥
\begin{verbatim}
> (funcall (compose #'1+ #'find-if) #'oddp '(2 3 4))
4
\end{verbatim}
\verb|not|¤¬Lisp¤Î´Ø¿ô¤Ê¤Î¤Ç¡¤\verb|complement|¤Ï\verb|compose|¤ÎÆÃ¼ì·Á¤È¸À¤¨¤ë¡¥
¤½¤ì¤Ï
\begin{verbatim}
(defun complement (pred)
  (compose #'not pred))
\end{verbatim}
¤È¤·¤ÆÄêµÁ¤Ç¤­¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defun fif (if then &optional else)
  #'(lambda (x)
      (if (funcall if x)
          (funcall then x)
          (if else (funcall else x)))))

(defun fint (fn &rest fns)
  (if (null fns)
      fn
      (let ((chain (apply #'fint fns)))
        #'(lambda (x)
            (and (funcall fn x) (funcall chain x))))))

(defun fun (fn &rest fns)
  (if (null fns)
      fn
      (let ((chain (apply #'fun fns)))
        #'(lambda (x)
            (or (funcall fn x) (funcall chain x))))))
\end{FramedVerb}\end{center}
\caption{´Ø¿ôÀ¸À®ÊýË¡¤Î¹¹¤Ê¤ëÎã¡¥}
\label{fig:FunctionBuilders}
\end{figure}

´Ø¿ô¤ÎÁÈ¤ß¹ç¤ï¤»Êý¤Ï¹çÀ®¤À¤±¤Ç¤Ï¤Ê¤¤¡¥Îã¤¨¤Ð
\begin{verbatim}
(mapcar #'(lambda (x)
            (if (slave x)
                (owner x)
                (employer x)))
        people)
\end{verbatim}
¤Î¤è¤¦¤Ê¼°¤ò¤è¤¯¸«¤«¤±¤ë¡¥
¤³¤Î¤è¤¦¤Ê´Ø¿ô¤ò¼«Æ°Åª¤ËÀ¸À®¤¹¤ë¥ª¥Ú¥ì¡¼¥¿¤¬ÄêµÁ¤Ç¤­¤ë¡¥
Âè\ref{fig:FunctionBuilders}¿Þ¤Î\verb|fif|¤ò»È¤¤
\begin{verbatim}
(mapcar (fif #'slave #'owner #'employer)
        people)
\end{verbatim}
¤È¤¹¤ì¤ÐÆ±¤¸·ë²Ì¤Ë¤Ê¤ë¡¥

Âè\ref{fig:FunctionBuilders}¿Þ¤Ë¤Ï¤è¤¯»È¤ï¤ì¤ë¼ïÎà¤Î´Ø¿ô¤òÀ¸À®¤¹¤ë´Ø¿ô¤ò´ö¤Ä¤«¼¨¤·¤¿¡¥
2ÈÖÌÜ¤Î\verb|fint|¤ò»È¤¦¤Î¤Ï¼¡¤Î¤è¤¦¤Ê¤È¤­¤À¡§
\begin{verbatim}
(find-if #'(lambda (x)
             (and (signed x) (sealed x) (delivered x)))
         docs)
\end{verbatim}
\verb|find-if|¤ÎÂè2°ú¿ô¤ËÍ¿¤¨¤é¤ì¤¿½Ò¸ì¤¬¡¤
¤½¤ÎÆâÉô¤Ç¸Æ¤Ð¤ì¤Æ¤¤¤ë3¸Ä¤Î½Ò¸ì¤Î¶¦ÄÌÉôÊ¬¤òÄêµÁ¤·¤Æ¤¤¤ë¡¥
\verb|fint|¡Ê``function intersection''´Ø¿ô¤Î¶¦ÄÌÉôÊ¬¡Ë¤ò»È¤¨¤Ð
\begin{verbatim}
(find-if (fint #'signed #'sealed #'delivered) docs)
\end{verbatim}
¤È½ñ¤±¤ë¡¥
Æ±ÍÍ¤Ë¡¤´Ø¿ô½¸¹ç¤Î¹çÊ»¤òÊÖ¤¹¥ª¥Ú¥ì¡¼¥¿¤âÄêµÁ¤Ç¤­¤ë¡¥
´Ø¿ô\verb|fun|¤Ï\verb|fint|¤È»÷¤Æ¤¤¤ë¤¬¡¤\verb|and|¤Ç¤Ê¤¯\verb|or|¤ò»È¤Ã¤Æ¤¤¤ë¡¥
%}}}
\subsection{CdrÉô¤Ç¤ÎºÆµ¢}  %{{{
Lisp¤Î¥×¥í¥°¥é¥à¤Ç¤ÏºÆµ¢´Ø¿ô¤Ï¶Ë¤á¤Æ½ÅÍ×¤Ê¤Î¤Ç¡¤
¤½¤ì¤é¤òÀ¸À®¤¹¤ë¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤òÄêµÁ¤·¤Æ¤ª¤¤¤ÆÂ»¤Ï¤Ê¤¤¡¥
¤³¤Î¾Ï¤È¼¡¤Î¾Ï¤Ç¤Ï¡¤¤è¤¯»È¤ï¤ì¤ë2¼ïÎà¤ÎºÆµ¢´Ø¿ô¤òÀ¸À®¤¹¤ë´Ø¿ô¤Ë¤Ä¤¤¤ÆÀâÌÀ¤¹¤ë¡¥
¤¿¤ÀCommon Lisp¤Ç¤Ï¡¤¤³¤ì¤é¤Î´Ø¿ô¤ò»È¤¦¤Î¤Ï¤Þ¤º¤¤ÊýË¡¤À¡¥
ÏÃÂê¤¬¥Þ¥¯¥í¤Þ¤Ç¿Ê¤á¤Ð¡¤
¤³¤Î»ÅÁÈ¤ß¤Ë¤µ¤é¤Ë¤³¤Ê¤ì¤¿³°¸«¤òÍ¿¤¨¤ëÊýË¡¤òÃÎ¤ë¤³¤È¤Ë¤Ê¤ë¤À¤í¤¦¡¥
ºÆµ¢´Ø¿ô¤òÀ¸À®¤¹¤ë¥Þ¥¯¥í¤Ë¤Ä¤¤¤Æ¤ÏÂè15.2,~15.3¾Ï¤ÇµÄÏÀ¤¹¤ë¡¥

¥×¥í¥°¥é¥àÆâ¤Ë·«¤êÊÖ¤·¤¿·Á¤¬¸½¤ì¤ë¤Î¤Ï¡¤¤è¤ê¹â¤¤¥ì¥Ù¥ë¤ÎÃê¾ÝÅª¼êË¡¤¬»È¤¨¤ë¤³¤È¤Î°õ¤À¡¥
¤½¤¦¤¤¤¦·Á¤ÏLisp¥×¥í¥°¥é¥à¤ÎÃæ¤Ç¤Ï¼¡¤Î¤è¤¦¤Ê´Ø¿ô¤è¤êÉÑÈË¤Ë¸«¤é¤ì¤ë¡§
\begin{verbatim}
(defun our-length (lst)
  (if (null lst)
      0
      (1+ (our-length (cdr lst)))))
\end{verbatim}
¤Þ¤¿¤Ï
\begin{verbatim}
(defun our-every (fn lst)
  (if (null lst)
      t
      (and (funcall fn (car lst))
           (our-every fn (cdr lst)))))
\end{verbatim}
¤³¤ì¤é2¸Ä¤Ï¹½Â¤¤¬¤«¤Ê¤ê¶¦ÄÌ¤·¤Æ¤¤¤ë¡¥
¶¦¤Ë¥ê¥¹¥È¤ÎÏ¢Â³¤·¤¿cdrÉô¤ËºÆµ¢Åª¤ËºîÍÑ¤·¡¤Ëè²óÆ±¤¸¼°¤òÉ¾²Á¤·¤Æ¤¤¤ë¡¥
¥Ù¡¼¥¹¡¦¥±¡¼¥¹¤Ç¤ÏÊÌ¤Ç¡¤Â¾¤È¤Ï°ã¤Ã¤¿ÃÍ¤òÊÖ¤¹¡¥
¤³¤Î·Á¤ÏLisp¤Î¥×¥í¥°¥é¥àÆâ¤ÇÂçÊÑÉÑÈË¤Ë¸½¤ì¤ë¤Î¤Ç¡¤
·Ð¸³¤òÀÑ¤ó¤À¥×¥í¥°¥é¥Þ¤Ï»×¹Í¤òÃæÃÇ¤»¤º¤ËÆÉ¤ß¤³¤Ê¤·¤¿¤ê¿·¤·¤¤¤Î¤ò½ñ¤¤¤¿¤ê¤Ç¤­¤ë¡¥
¼ÂºÝ¡¤¤½¤¦¤¤¤Ã¤¿·Á¤ò¿·¤·¤¤Ãê¾Ý²½¹½Â¤¤ËÁÈ¤ß¹þ¤àÊýË¡¤Ï¤¹¤°¤ËÍý²ò¤Ç¤­¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defun lrec (rec &optional base)
  (labels ((self (lst)
                 (if (null lst)
                     (if (functionp base)
                         (funcall base)
                         base)
                     (funcall rec (car lst)
                              #'(lambda ()
                                  (self (cdr lst)))))))
    #'self))
\end{FramedVerb}\end{center}
\caption{Ê¿Ã³¤Ê¥ê¥¹¥È¤ËÂÐ¤¹¤ëºÆµ¢´Ø¿ô¤òÄêµÁ¤¹¤ë´Ø¿ô¡¥}
\label{fig:FlatListRecur}
\end{figure}

¤·¤«¤··Á¤½¤Î¤â¤Î¤Ï¤ß¤ÊÆ±¤¸¤À¡¥
¤³¤ì¤é¤Î´Ø¿ô¤ò¼ê¤Ç½ñ¤¯Âå¤ï¤ê¤Ë¡¤
¼«Ê¬¤Î¤¿¤á¤Ë¤½¤ì¤é¤òÀ¸À®¤·¤Æ¤¯¤ì¤ë´Ø¿ô¤ò½ñ¤±¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤ª¤¯¤Ù¤­¤À¡¥
Âè\ref{fig:FlatListRecur}¿Þ¤Ë¤Ï\verb|lrec| (``list recurser'') ¤È¤¤¤¦´Ø¿ôÀ¸À®´Ø¿ô¤ò¼¨¤·¤¿¡¥
¤³¤ì¤Ï¥ê¥¹¥È¤ÎÏ¢Â³¤·¤¿cdrÉô¤ËºÆµ¢Åª¤ËºîÍÑ¤¹¤ë´Ø¿ô¤Î¤Û¤È¤ó¤É¤òÀ¸À®¤·¤Æ¤¯¤ì¤ëÈ¦¤À¡¥
\verb|lrec|¤ÎÂè1°ú¿ô¤Ï¡¤¤½¤Î»þÅÀ¤Ç¤Î¥ê¥¹¥È¤ÎcarÉô¤È¡¤
ºÆµ¢¤òÂ³¤±¤ë¤¿¤á¤Ë¸Æ¤Ð¤ì¤ë´Ø¿ô¤È¤¤¤¦2¸Ä¤Î°ú¿ô¤ò¼è¤ë´Ø¿ô¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
\verb|lrec|¤ò»È¤¨¤Ð¡¤\verb|our-length|¤Ï
\begin{verbatim}
(lrec #'(lambda (x f) (1+ (funcall f))) 0)
\end{verbatim}
¤È¤·¤ÆÉ½¸½¤Ç¤­¤ë¡¥
¥ê¥¹¥È¤ÎÄ¹¤µ¤òÆÀ¤ë¤Ë¤ÏÍ×ÁÇ¤òÄ´¤Ù¤¿¤êÅÓÃæ¤Ç»ß¤Þ¤ëÉ¬Í×¤Ï¤Ê¤¤¤Î¤Ç¡¤
¥ª¥Ö¥¸¥§¥¯¥È\verb|x|¤Ï¾ï¤ËÌµ»ë¤·¤Æ¤è¤¯¡¤¾ï¤Ë´Ø¿ô\verb|f|¤ò¸Æ¤Ó½Ð¤»¤Ð¤è¤¤¡¥
¤·¤«¤·\verb|our-every|¤òÉ½¸½¤¹¤ë²ÄÇ½À­¤ÎÍøÅÀ¤ÏÎ¾Êý¤È¤â³èÍÑ¤¹¤ëÉ¬Í×¤¬¤¢¤ë¡¥
Îã¤¨¤Ð\verb|oddp|¤À
\footnote{¹­¤¯»È¤ï¤ì¤Æ¤¤¤ë¤¢¤ëCommon Lisp½èÍý·Ï¤Ç¤Ï¡¤
\texttt{functionp}¤Ï¸í¤Ã¤Æ\texttt{t}¤È\texttt{nil}¤Ë¿¿¤òÊÖ¤¹¡¥
¤½¤Î½èÍý·Ï¤Ç¤Ï\texttt{lrec}¤ÎÂè2°ú¿ô¤ËÅÏ¤·¤Æ¤âµ¡Ç½¤·¤Ê¤¤¤À¤í¤¦¡¥}¡§
\begin{verbatim}
(lrec #'(lambda (x f) (and (oddp x) (funcall f))) t)
\end{verbatim}
\verb|lrec|¤ÎÄêµÁ¤Ç¤Ï¡¤\verb|self|¤È¤¤¤¦¥í¡¼¥«¥ë¤ÊºÆµ¢´Ø¿ô¤òÀ¸À®¤¹¤ë¤¿¤á¤Ë\verb|labels|¤ò»È¤Ã¤¿¡¥
ºÆµ¢ÅÓÃæ¤Ë´Ø¿ô\verb|rec|¤ËÍ¿¤¨¤é¤ì¤ë°ú¿ô¤Ï¡¤
¤½¤Î»þÅÀ¤Ç¤Î¥ê¥¹¥È¤ÎcdrÉô¤ÈºÆµ¢¸Æ¤Ó½Ð¤·¤ò·ÁÀ®¤¹¤ë´Ø¿ô¤Î2¸Ä¤À¡¥
\verb|our-every|Åù¤ÎºÆµ¢¸Æ¤Ó½Ð¤·¤ò¹Ô¤¦ÉôÊ¬¤¬ºÇ¸å¤ËÍè¤ë´Ø¿ô¤Ë¤Ï¡¤
Âè1°ú¿ô¤¬µ¶¤òÊÖ¤·¤¿¤½¤Î»þÅÀ¤Ç»ß¤Þ¤Ã¤ÆÍß¤·¤¤¡¥
¤³¤ì¤ÏºÆµ¢¸Æ¤Ó½Ð¤·¤ËÅÏ¤µ¤ì¤¿°ú¿ô¤ÏÃÍ¤Ç¤Ê¤¯¡¤
É¬Í×¤¬¤¢¤ì¤Ð¸Æ¤Ó½Ð¤·¤ÆÃÍ¤òµá¤á¤é¤ì¤ë´Ø¿ô¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤È¤¤¤¦¤³¤È¤À¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
; copy-list
(lrec #'(lambda (x f) (cons x (funcall f))))
; remove-duplicates
(lrec #'(lambda (x f) (adjoin x (funcall f))))
; find-if, for some function fn
(lrec #'(lambda (x f) (if (fn x) x (funcall f))))
; some, for some function fn
(lrec #'(lambda (x f) (or (fn x) (funcall f))))
\end{FramedVerb}\end{center}
\caption{\texttt{lrec}¤ÇÉ½¸½¤µ¤ì¤¿´Ø¿ô¡¥}
\label{fig:lrec}
\end{figure}

Âè\ref{fig:lrec}¿Þ¤Ë¼¨¤·¤¿¤Î¤Ï¡¤´ûÂ¸¤ÎCommon Lisp¤Î´Ø¿ô¤ò\verb|lrec|¤ò»È¤Ã¤ÆÄêµÁ¤·¤¿¤â¤Î¤À
\footnote{½èÍý·Ï¤Ë¤è¤Ã¤Æ¤Ï¡¤¤³¤ì¤é¤Î´Ø¿ô¤òÉ½¼¨¤¹¤ëÁ°¤Ë
\,\texttt{*print-circle*}\,¤ò\texttt{t}¤ËÀßÄê¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤«¤â¤·¤ì¤Ê¤¤¡¥}¡¥

\verb|lrec|¤ò»È¤Ã¤Æ¤âµá¤á¤ë´Ø¿ô¤ÎºÇ¤â¸úÎ¨¤Î¤è¤¤¼ÂÁõÊýË¡¤ËÉ¬¤º¹Ô¤­Ãå¤¯Ìõ¤Ç¤Ï¤Ê¤¤¡¥
¼ÂºÝ¡¤¤³¤Î¾Ï¤ÇÄêµÁ¤µ¤ì¤¿¤è¤¦¤Ê\verb|lrec|¤ò»Ï¤á¤È¤¹¤ëºÆµ¢´Ø¿ôÀ¸À®´Ø¿ô¤Ï¡¤
ËöÈøºÆµ¢¤Ë¤è¤ëÊýË¡¤Ë°ìÊâµÚ¤Ð¤Ê¤¤¤³¤È¤¬Â¿¤¤¡¥
¤³¤Î¤¿¤á¤³¤ì¤é¤Ï¥×¥í¥°¥é¥à³«È¯¤Î½é´ü¤Î¤¦¤Á¤ä¡¤Â®ÅÙ¤¬½ÅÍ×¤Ç¤Ê¤¤²Õ½ê¤Ç»È¤¦¤Î¤¬°ìÈÖ¤À¡¥
%}}}
\subsection{ÉôÊ¬¥Ä¥ê¡¼¤Ç¤ÎºÆµ¢}  %{{{
\begin{figure}\begin{center}
\fbox{~\,\begin{minipage}{\FrameWidth}
\begin{center}
\begin{picture}(200,150)
\end{picture}\\
\hfill\texttt{(a.b)\hfill\hfill(a b c)\hfill\hfill(a b (c d))}\hfill~
\end{center}
\vspace{1.3em}
\end{minipage}~\,
}\end{center}
\caption{¥Ä¥ê¡¼¤È¤·¤Æ¤Î¥ê¥¹¥È¡¥}
\label{fig:ListsAsTrees}
\end{figure}

Lisp¥×¥í¥°¥é¥à¤Ë¤è¤¯¸«¤é¤ì¤ëºÆµ¢¤Î·Á¤Ë¤ÏÂ¾¤Î¤â¤Î¤â¤¢¤ë¡§ÉôÊ¬¥Ä¥ê¡¼¤ËÂÐ¤¹¤ëºÆµ¢¤À¡¥
¤³¤Î·Á¤Ï¡Ê¤ª¤½¤é¤¯Æþ¤ì»Ò¤Ë¤Ê¤Ã¤¿¡Ë¥ê¥¹¥È¤Ë¤Ä¤¤¤Æ¡¤
¤½¤ÎcarÉô¤ÈcdrÉô¤ÎÎ¾Êý¤òºÆµ¢Åª¤Ë²¼¤Ã¤Æ¤¤¤­¤¿¤¤¾ì¹ç¤Ë¸«¤é¤ì¤ë¡¥

Lisp¤Î¥ê¥¹¥È¤ÏÂ¿ÌÜÅª¤Ê¹½Â¤ÂÎ¤Ç¡¤
Ï¢Â³¹½Â¤¡¤½¸¹ç¡¤ÂÐ±þ¡¤ÇÛÎó¡¤¥Ä¥ê¡¼¤ò´Þ¤à¿§¡¹¤Ê¤â¤Î¤òÉ½¸½¤Ç¤­¤ë¡¥
¥ê¥¹¥È¤ò¥Ä¥ê¡¼¤È¤·¤Æ²ò¼á¤¹¤ëÊýË¡¤Ï´ö¤Ä¤«¤¢¤ë¡¥
°ìÈÖ¤è¤¯»È¤ï¤ì¤ë¤Î¤Ï¡¤¥ê¥¹¥È¤òÆóÊ¬¥Ä¥ê¡¼¡Êbinary tree¡Ë¤Ë¡¤
carÉô¤ÈcdrÉô¤ò¤½¤ì¤¾¤ìº¸±¦¤Î»Þ¤Ë¸«¤Ê¤¹ÊýË¡¤À¡¥
¡Ê¼ÂºÝ¡¤¥ê¥¹¥È¤ÎÆâÉôÉ½¸½¤ÏÂçÄñ¤½¤¦¤À¡¥¡Ë
Âè\ref{fig:ListsAsTrees}¿Þ¤Ë¤Ï¥ê¥¹¥È¤È¤½¤ì¤¬É½¸½¤¹¤ë¥Ä¥ê¡¼¤ÎÎã¤ò3¸Ä¼¨¤·¤¿¡¥
¤½¤¦¤¤¤¦¥Ä¥ê¡¼¤ÎÆâÉôÀáÅÀ¤Ï¥É¥Ã¥ÈÂÐ¡Êdotted-pair¡ËÉ½¸½¤·¤¿¥ê¥¹¥È¤ÎÅÀ¤ËÂÐ±þ¤¹¤ë¤Î¤Ç¡¤
¥ê¥¹¥È¤ò¤½¤Î·Á¼°¤Ç¹Í¤¨¤ì¤Ð¥Ä¥ê¡¼¤Î¹½Â¤¤Ï²ò¼á¤·¤ä¤¹¤¤¤À¤í¤¦¡§
\begin{verbatim}
(a b c) = (a . (b . (c . nil)))
(a b (c d)) = (a . (b . ((c . (d . nil)) . nil)))
\end{verbatim}
¤É¤Î¥ê¥¹¥È¤âÆóÊ¬¥Ä¥ê¡¼¤È¤·¤Æ²ò¼á¤Ç¤­¤ë¡¥
¤½¤Î¤¿¤á\verb|copy-list|¤È\verb|copy-tree|Åù¤ÎCommon Lisp¤Î´Ø¿ô¤ÎÁÈ¤¬¤¢¤ë¡¥
Á°¼Ô¤Ï¥ê¥¹¥È¤òÏ¢Â³¹½Â¤¤È¤·¤Æ¥³¥Ô¡¼¤¹¤ë¡¥
¥ê¥¹¥È¤¬ÉôÊ¬¥ê¥¹¥È¤ò´Þ¤à¤È¤­¡¤¤½¤ì¤ÏÏ¢Â³¹½Â¤¤ÎÍ×ÁÇ¤Ë²á¤®¤Ê¤¤¤Î¤Ç¥³¥Ô¡¼¤µ¤ì¤Ê¤¤¡§
\begin{verbatim}
> (setq x '(a b)
        listx (list x 1))
((A B) 1)
> (eq x (car (copy-list listx)))
T
\end{verbatim}
¤½¤ì¤È¤ÏÂÐ¾ÈÅª¤Ë¡¤\verb|copy-tree|¤Ï¥ê¥¹¥È¤ò¥Ä¥ê¡¼¤È¤·¤Æ¥³¥Ô¡¼¤¹¤ë¡¥
ÉôÊ¬¥ê¥¹¥È¤ÏÉôÊ¬¥Ä¥ê¡¼¤Ê¤Î¤Ç¡¤¤ä¤Ï¤ê¥³¥Ô¡¼¤µ¤ì¤ë¡§
\begin{verbatim}
> (eq x (car (copy-tree listx)))
NIL
\end{verbatim}
\verb|copy-tree|¤Ï¼¡¤Î¤è¤¦¤ËÄêµÁ¤Ç¤­¤ë¡§
\begin{verbatim}
(defun our-copy-tree (tree)
  (if (atom tree)
      tree
      (cons (our-copy-tree (car tree))
            (if (cdr tree) (our-copy-tree (cdr tree))))))
\end{verbatim}
¤³¤ÎÄêµÁ¤Ï¼Â¤Ï¹­¤¯»È¤ï¤ì¤ë·Á¤Î°ì¤Ä¤À¤È¤¤¤¦¤³¤È¤¬Ê¬¤«¤ë¡¥
¡Ê¤³¤Î¸å½Ð¤Æ¤¯¤ë´Ø¿ô¤Ï·Á¤ò¤Ï¤Ã¤­¤ê¤µ¤»¤ë¤¿¤á¤Ë¾¯¤·Ì¯¤ÊÊýË¡¤Ç½ñ¤«¤ì¤Æ¤¤¤ë¡¥¡Ë
Îã¤¨¤Ð¥Ä¥ê¡¼¤ÎÍÕ¤ò¿ô¤¨¤ë¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò¹Í¤¨¤Æ¤ß¤è¤¦¡§
\begin{verbatim}
(defun count-leaves (tree)
  (if (atom tree)
      1
      (+ (count-leaves (car tree))
         (or (if (cdr tree) (count-leaves (cdr tree)))
             1))))
\end{verbatim}
¥Ä¥ê¡¼¤Î»ý¤ÄÍÕ¤Î¿ô¤Ï¡¤¥ê¥¹¥È¤È¤·¤ÆÉ½¸½¤µ¤ì¤¿¤È¤­¤Ë¸«¤¨¤ë¥¢¥È¥à¤Î¿ô¤è¤êÂ¿¤¤¡§
\begin{verbatim}
> (count-leaves '((a b (c d)) (e) f))
10
\end{verbatim}
¥Ä¥ê¡¼¤Î»ý¤ÄÍÕ¤È¤Ï¡¤¥Ä¥ê¡¼¤ò¥É¥Ã¥ÈÂÐÉ½¸½¤Ç¸«¤¿¤È¤­¤Ë¸«¤¨¤ë¥¢¥È¥à¤ÎÁ´¤Æ¤À¡¥
¥É¥Ã¥ÈÂÐÉ½¸½¤Ç¤Ï\verb|((a b (c d)) (e) f)|¤Ï4¸Ä¤Înil¤ò´Þ¤à¤¬¡¤
¥ê¥¹¥ÈÉ½¸½¤Ç¤Ï¤½¤ì¤é¤Ï¸«¤¨¤Ê¤¤¡Ê³ç¸Ì1ÁÈ¤Ë¤Ä¤­1¸Ä¤¢¤ë¤Î¤À¤¬¡Ë¡¥
¤À¤«¤é\verb|count-leaves|¤Ï10¤òÊÖ¤¹¡¥

Á°¤Î¾Ï¤Ç¤Ï¡¤¥Ä¥ê¡¼¤ËºîÍÑ¤¹¤ë¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò´ö¤Ä¤«ÄêµÁ¤·¤¿¡¥
Îã¤¨¤Ð\verb|flatten|¡Êjoo¥Ú¡¼¥¸¡Ë¤Ï¥Ä¥ê¡¼¤ò°ú¿ô¤Ë¼è¤ê¡¤
¤½¤ÎÃæ¤ÎÁ´¤Æ¤Î¥¢¥È¥à¤ò¥ê¥¹¥È¤Ë³ç¤Ã¤ÆÊÖ¤¹¡¥
¤Ä¤Þ¤ê\verb|flatten|¤ËÆþ¤ì»Ò¤Ë¤Ê¤Ã¤¿¥ê¥¹¥È¤òÅÏ¤¹¤È¡¤
°ìÈÖ³°Â¦°Ê³°¤Î³ç¸Ì¤¬Ìµ¤¯¤Ê¤Ã¤¿¤À¤±¤Î¤è¤¦¤Ê¥ê¥¹¥È¤¬ÊÖ¤ë¡§
\begin{verbatim}
> (flatten '((a b (c d)) (e) f ()))
(A B C D E F)
\end{verbatim}
¤³¤Î´Ø¿ô¤Ï¡Ê¤«¤Ê¤êÈó¸úÎ¨Åª¤À¤¬¡Ë¼¡¤Î¤è¤¦¤Ë¤âÄêµÁ¤Ç¤­¤ë¡§
\begin{verbatim}
(defun flatten (tree)
  (if (atom tree)
      (mklist tree)
      (nconc (flatten (car tree))
             (if (cdr tree) (flatten (cdr tree))))))
\end{verbatim}
ºÇ¸å¤Ë\verb|find-if|¤ÎºÆµ¢ÈÇ¤Ç¤¢¤ê¡¤
Ê¿Ã³¤Ê¥ê¥¹¥È¤À¤±¤Ç¤Ê¤¯¥Ä¥ê¡¼¤Ë¤âºîÍÑ¤Ç¤­¤ë\verb|rfind-if|¤Ë¤Ä¤¤¤Æ¹Í¤¨¤è¤¦¡§
\begin{verbatim}
(defun rfind-if (fn tree)
  (if (atom tree)
      (and (funcall fn tree) tree)
      (or (rfind-if fn (car tree))
          (if (cdr tree) (rfind-if fn (cdr tree))))))
\end{verbatim}
\verb|find-if|¤ò¥Ä¥ê¡¼¤Ë¤âºîÍÑ¤¹¤ë¤è¤¦¤Ë°ìÈÌ²½¤¹¤ë¤Ë¤Ï¡¤
ÍÕ¤Î¤ß¤ò¸¡º÷¤¹¤ë¤Î¤«¡¤¤½¤ì¤È¤âÉôÊ¬¥Ä¥ê¡¼Á´ÂÎ¤ò¸¡º÷¤¹¤ë¤Î¤«¤ò·è¤á¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤³¤³¤Ç¤Î\verb|rfind-if|¤ÏÁ°¼Ô¤òºÎ¤ë¤³¤È¤Ë¤¹¤ë¡¥
¤Ä¤Þ¤ê¸Æ¤Ó½Ð¤·Â¦¤ÏÂè1°ú¿ô¤È¤·¤ÆÅÏ¤µ¤ì¤¿´Ø¿ô¤Ï¥¢¥È¥à¤Ë¤Î¤ßÅ¬ÍÑ¤µ¤ì¤ë¤È¹Í¤¨¤Æ¤è¤¤¡§
\begin{verbatim}
> (rfind-if (fint #'numberp #'addp) '(2 (3 4) 5))
3
\end{verbatim}
\verb|copy-tree|¡¤\verb|count-leaves|¡¤\verb|flatten|¤Ë\verb|rfind-if|¤È¤¤¤Ã¤¿
4¸Ä¤Î´Ø¿ô¤Î¹½Â¤¤Ï¡¤²¿¤È»÷¤Æ¤¤¤ë¤³¤È¤À¤í¤¦¡ª
¼ÂºÝ¡¤¤½¤ì¤é¤Ï¤ß¤ÊÉôÊ¬¥Ä¥ê¡¼¤ËºîÍÑ¤¹¤ë´Ø¿ô¤ÎÅµ·¿Åª¤ÊÎã¤À¡¥
cdrÉô¤Ç¤ÎºÆµ¢¤â¤½¤¦¤À¤¬¡¤¤³¤¦¤¤¤¦¤â¤Î¤Î¸¶·¿¤òÛ£Ëæ¤Ê¤Þ¤Þ¤ËÊü¤Ã¤Æ¤ª¤¯»ö¤Ï¤Ê¤¤\wadash
¤½¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òÀ¸À®¤¹¤ë´Ø¿ô¤ò½ñ¤¯¤³¤È¤¬¤Ç¤­¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defun ttrav (rec &optional (base #'identity))
  (labels ((self (tree)
                 (if (atom tree)
                     (if (functionp base)
                         (funcall base tree)
                         base)
                     (funcall rec (self (car tree))
                              (if (cdr tree)
                                  (self (cdr tree)))))))
    #'self))
\end{FramedVerb}\end{center}
\caption{¥Ä¥ê¡¼¤ËÂÐ¤¹¤ëºÆµ¢´Ø¿ô¡¥}
\label{fig:RecurOnTree}
\end{figure}

¸¶·¿¤½¤Î¤â¤Î¤òÄÏ¤à¤¿¤á¡¤¤½¤ì¤é¤Î´Ø¿ô¤ò¤è¤¯¸«¤Æ²¿¤¬Äê·¿¤Ç¤Ê¤¤¤Î¤«¤ËÃíÌÜ¤·¤è¤¦¡¥
\verb|our-copy-tree|¤ÏËÜ¼ÁÅª¤Ë¤Ï2¸Ä¤Î»ö¼Â¤òÉ½¤¹¡§
\begin{enumerate}
\item ºÆµ¢¤Î´ðÄì¤Ç¤Ï°ú¿ô¤ò¤½¤Î¤Þ¤ÞÊÖ¤¹¡¥
\item ºÆµ¢¤ÎÅÓÃæ¤Ç¤Ï¡¤º¸¤ÎÉôÊ¬¥Ä¥ê¡¼¡ÊcarÉô¡Ë¤Ç¤ÎºÆµ¢·ë²Ì¤È
    ±¦¤ÎÉôÊ¬¥Ä¥ê¡¼¡ÊcdrÉô¡Ë¤Ç¤ÎºÆµ¢·ë²Ì¤Ë\verb|cons|¤òÅ¬ÍÑ¤¹¤ë¡¥
\end{enumerate}
¤½¤Î¤¿¤á¡¤¤³¤ì¤Ï2¸Ä¤Î°ú¿ô¤ò¼è¤ë´Ø¿ôÀ¸À®´Ø¿ô¤Î¸Æ¤Ó½Ð¤·¤È¤·¤ÆÉ½¸½¤Ç¤­¤ë¡§
\begin{verbatim}
(ttrav #'cons #'identity)
\end{verbatim}
\verb|ttrav| (``tree traverser'')¤ÎÄêµÁ¤ÏÂè\ref{fig:RecurOnTree}¿Þ¤Ë¼¨¤·¤¿¡¥
ºÆµ¢¸Æ¤Ó½Ð¤·¤Î¤È¤­¤ÏÅÏ¤¹ÃÍ¤Ï1¸Ä¤Ç¤Ê¤¯2¸Ä¤Ç¡¤
¤½¤ì¤¾¤ìº¸¤ÎÉôÊ¬¥Ä¥ê¡¼¤È±¦¤ÎÉôÊ¬¥Ä¥ê¡¼¤ËÂÐ¤·¤ÆºÆµ¢¤ò¹Ô¤¦¡¥
ºÆµ¢¤Î´ðÄì¤¬´Ø¿ô¤Î¤È¤­¤Ï¡¤
¤½¤Î´Ø¿ô¤Ï¤½¤Î»þÅÀ¤Ç¤ÎÍÕ¤ËÂÐ¤·¤Æ¸Æ¤Ð¤ì¤ë¡¥
Ê¿Ã³¥ê¥¹¥È¤ËÂÐ¤¹¤ëºÆµ¢¤Ç¤Ï´ðÄì¤ÎÃÍ¤ÏÉ¬¤ºnil¤À¤¬¡¤
¥Ä¥ê¡¼¤ËÂÐ¤¹¤ëºÆµ¢¤Ç¤Ï´ðÄì¤ÎÃÍ¤ÏÍ­ÍÑ¤Ç¤¢¤ë¤³¤È¤¬¤¢¤ê¡¤
¤½¤ì¤ò»È¤¤¤¿¤¯¤Ê¤ë¤³¤È¤â¤¢¤ë¤«¤â¤·¤ì¤Ê¤¤¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
; our-copy-tree
(ttrav #'cons)
; count-leaves
(ttrav #'(lambda (l r) (+ l (or r 1))) 1)
; flatten
(ttrav #'nconc #'mklist)
\end{FramedVerb}\end{center}
\caption{\texttt{ttrav}¤ÇÉ½¸½¤µ¤ì¤¿´Ø¿ô¡¥}
\label{fig:Byttrav}
\end{figure}

\verb|ttrav|¤ò»È¤¦¤È¡¤¤³¤ì¤Þ¤ÇÀâÌÀ¤·¤¿´Ø¿ô¤Ï\verb|rfind-if|°Ê³°¤ß¤ÊÉ½¸½¤Ç¤­¤ë¡¥
¡ÊÂè\ref{fig:Byttrav}¿Þ¤Ë¼¨¤·¤¿¡¥¡Ë
\verb|rfind-if|¤òÄêµÁ¤¹¤ë¤Ë¤Ï¡¤
¤¤¤Ä¡¤¤É¤Î¾ì¹ç¤ËºÆµ¢¸Æ¤Ó½Ð¤·¤¬¹Ô¤ï¤ì¤ë¤«¤òÀ©¸æ¤µ¤»¤Æ¤¯¤ì¤ë¤è¤¦¤Ê¡¤
¤µ¤é¤Ë°ìÈÌÅª¤Ê¥Ä¥ê¡¼ÍÑºÆµ¢´Ø¿ôÀ¸À®´Ø¿ô¤¬Í×¤ë¡¥
\verb|ttrav|¤ÎÂè1°ú¿ô¤Ë¤Ï¡¤ºÆµ¢¸Æ¤Ó½Ð¤·¤Î·ë²Ì¤ò¼è¤ë´Ø¿ô¤òÍ¿¤¨¤¿¡¥
°ìÈÌÅª¤Ê¾õ¶·¤Ë¤ª¤¤¤Æ¤Ï¡¤Âå¤ï¤ê¤Ë¡¤
ºÆµ¢¸Æ¤Ó½Ð¤·¤½¤Î¤â¤Î¤òÂåÉ½¤¹¤ë2¸Ä¤Î¥¯¥í¡¼¥¸¥ã¤ò¼è¤ë´Ø¿ô¤ò»È¤¦¡¥
¤¹¤ë¤È¥Ä¥ê¡¼¤ÎÇ¤°Õ¤Î¿¼¤µ¤Þ¤Ç¤Î¤ß¤òÃµº÷¤¹¤ëºÆµ¢´Ø¿ô¤¬½ñ¤±¤ë¡¥

\verb|ttrav|¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤¿´Ø¿ô¤ÏÉ¬¤º¥Ä¥ê¡¼Á´ÂÎ¤òÃµº÷¤¹¤ë¡¥
\verb|count-leaves|¤ä\verb|flatten|¤Ï
¤È¤Ë¤«¤¯¥Ä¥ê¡¼Á´ÂÎ¤òÃµº÷¤»¤¶¤ë¤òÆÀ¤Ê¤¤¤Î¤Ç¤½¤ì¤Ç¤¤¤¤¤¬¡¤
\verb|rfind-if|¤Ë¤ÏÃµ¤¹ÂÐ¾Ý¤¬¸«¤Ä¤«¤Ã¤¿»þÅÀ¤ÇÃµº÷¤ò»ß¤á¤ÆÍß¤·¤¤¡¥
¤½¤ì¤Ë¤Ï¤µ¤é¤Ë°ìÈÌÅª¤Ê\verb|trec|¡ÊÂè\ref{fig:RecurOnTree}¿Þ¡Ë¤ò»È¤ï¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
\verb|trec|¤ÎÂè2°ú¿ô¤Ï´Ø¿ô¤Ç¡¤
ºÆµ¢ÅÓÃæ¤Î»þÅÀ¤Ç¤Î¥ª¥Ö¥¸¥§¥¯¥È¤È2¸Ä¤ÎºÆµ¢´Ø¿ô¤È¤¤¤¦3¸Ä¤Î°ú¿ô¤ò¼è¤ë¡¥
¤½¤ì¤é¤ÎºÆµ¢´Ø¿ô¤Ï¤½¤ì¤¾¤ìº¸±¦¤ÎÉôÊ¬¥Ä¥ê¡¼¤ËÂÐ¤¹¤ëºÆµ¢¤òÂåÉ½¤¹¤ë¥¯¥í¡¼¥¸¥ã¤À¡¥
\verb|trec|¤ò»È¤¦¤È\verb|flatten|¤Ï¤³¤Î¤è¤¦¤ËÄêµÁ¤Ç¤­¤ë¡§
\begin{verbatim}
(trec #'(lambda (o l r) (nconc (funcall l) (funcall r)))
      #'mklist)
\end{verbatim}
°Ê¾å¤è¤ê\verb|rfind-if|¤Ï\verb|oddp|¤Ë¤è¤Ã¤Æ°Ê²¼¤Î¤è¤¦¤ËÉ½¸½¤Ç¤­¤ë¡§
\begin{verbatim}
(trec #'(lambda (o l r) (or (funcall l) (funcall r)))
      #'(lambda (tree) (and (oddp tree) tree)))
\end{verbatim}

\begin{figure}\begin{center}\begin{FramedVerb}
(defun trec (rec &optional (base #'identity))
  (labels
    ((self (tree)
           (if (atom tree)
               (if (functionp base)
                   (funcall base tree)
                   base)
               (funcall rec tree
                        #'(lambda ()
                            (self (car tree)))
                        #'(lambda ()
                            (if (cdr tree)
                                (self (cdr tree))))))))
    #'self))
\end{FramedVerb}\end{center}
\caption{¥Ä¥ê¡¼¤ËÂÐ¤·¤ÆºÆµ¢¤ò¹Ô¤¦¤¿¤á¤Î´Ø¿ô¡¥}
\label{fig:RecurOnTree2}
\end{figure}
%}}}
\subsection{¤¤¤Ä´Ø¿ô¤òºî¤ë¤Ù¤­¤«}  %{{{
»ÄÇ°¤Ê¤³¤È¤Ë´Ø¿ô¤òÉ½¸½¤¹¤ë¤Î¤Ë´Ø¿ôÀ¸À®´Ø¿ô¤ò¸Æ¤Ö¤Î¤Ï¡¤
¥·¥ã¡¼¥×¥¯¥©¡¼¥ÈÉÕ¤­¤Î$\lambda$¼°¤ò¸Æ¤Ö¤Î¤ËÈæ¤Ù¡¤¼Â¹Ô»þ¤ËÉÔÉ¬Í×¤ÊÉé²Ù¤¬¤«¤«¤ë¡¥
¥·¥ã¡¼¥×¥¯¥©¡¼¥È¤ÎÉÕ¤¤¤¿$\lambda$¼°¤Ï¸ÇÄê¤µ¤ì¤¿¥Ç¡¼¥¿¤À¤¬¡¤
À¸À®´Ø¿ô¤Î¸Æ¤Ó½Ð¤·¤Ï¼Â¹Ô»þ¤ËÉ¾²Á¤µ¤ì¤ë¡¥
ËÜÅö¤Ë¼Â¹Ô»þ¤ËÀ¸À®´Ø¿ô¤ò¸Æ¤Ð¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤Ê¤é¡¤
¤½¤ì¤ò»È¤Ã¤Æ¤â¤è¤¤¤³¤È¤Ï¤Ê¤¤¡¥
¤·¤«¤·¡¤¾¯¤Ê¤¯¤È¤â¤¢¤ë¾ì¹ç¤Ë¤ÏÀ¸À®´Ø¿ô¤òÍ½¤á¸Æ¤Ö¤³¤È¤¬¤Ç¤­¤ë¡¥
¥ê¡¼¥É¥Þ¥¯¥í\,\verb|#.|¡Ê¥·¥ã¡¼¥×¡¦¥É¥Ã¥È¡¤¥·¥ã¡¼¥×ÅÀ¡Ë¤ò»È¤¦¤È¡¤
¥½¡¼¥¹ÆÉ¤ß¹þ¤ß»þ¤Ë¿·¤·¤¤´Ø¿ô¤òÀ¸À®¤Ç¤­¤ë¡¥
¤½¤Î¼°¤¬ÆÉ¤ß¹þ¤Þ¤ì¤¿¤È¤­¤Ë\verb|compose|¤È¤½¤Î°ú¿ô¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤ë¸Â¤ê¡¤Îã¤¨¤Ð
\begin{verbatim}
(find-if #.(compose #'oddp #'truncate) lst)
\end{verbatim}
¤È¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
¤³¤ì¤Ê¤é\verb|compose|¤Î¸Æ¤Ó½Ð¤·¤ÏLisp¥ê¡¼¥À¤Ë¤è¤Ã¤ÆÉ¾²Á¤µ¤ì¡¤
À¸À®¤µ¤ì¤¿´Ø¿ô¤Ï¸ÇÄêÅª¥Ç¡¼¥¿¤È¤·¤Æ¥³¡¼¥ÉÆâ¤ËÁÞÆþ¤µ¤ì¤ë¡¥
\verb|oddp|¤È\verb|truncate|¤Ï¶¦¤ËÁÈ¤ß¹þ¤ß´Ø¿ô¤Ê¤Î¤Ç¡¤
\verb|compose|¤ÎÄêµÁ¤¬´û¤ËÆÉ¤ß¹þ¤Þ¤ì¤Æ¤¤¤ë¸Â¤ê¡¤
\verb|compose|¤Î¸Æ¤Ó½Ð¤·¤ÏÆÉ¤ß¹þ¤ß»þ¤ËÉ¾²Á¤µ¤ì¤ë¤È»×¤Ã¤Æ¤¤¤¤¤À¤í¤¦¡¥

°ìÈÌÅª¤Ë¸À¤Ã¤Æ¡¤
´Ø¿ô¤Î¹çÀ®¤ÈÁÈ¤ß¹ç¤ï¤»¤Ï¥Þ¥¯¥í¤ò»È¤¨¤Ð°ìÁØ´ÊÃ±¤«¤Ä¸úÎ¨Åª¤Ë¼Â¸½¤Ç¤­¤ë¡¥
´Ø¿ô¤ÎÌ¾Á°¶õ´Ö¤¬Ê¬Î¥¤·¤Æ¤¤¤ëCommon Lisp¤Ç¤ÏÆÃ¤Ë¸ú²Ì¤¬¸²Ãø¤À¡¥
¥Þ¥¯¥í¤ÎÆ³Æþ¸å¡¤Âè15¾Ï¤Ç¡¤¤³¤³¤Ç¤ÎÏÃÂê¤ÎÂçÈ¾¤ò¤â¤Ã¤È¹ë²Ú¤Ê´ï¤ò»È¤Ã¤Æ°·¤¦¡¥
%}}}
%}}}
\section{É½¸½¤È¤·¤Æ¤Î´Ø¿ô}  %{{{
°ìÈÌÅª¤Ë¸À¤Ã¤Æ¡¤¥Ç¡¼¥¿¹½Â¤¤Ï²¿¤«¤òÉ½¸½¤¹¤ë¤¿¤á¤Ë»È¤ï¤ì¤ë¡¥
ÇÛÎó¤Ï´ö²¿³ØÅªÊÑ´¹¤òÉ½¸½¤Ç¤­¤ë¡¥
¥Ä¥ê¡¼¤ÏÌ¿Îá¤Î¥Ò¥¨¥é¥ë¥­¡¼¤òÉ½¸½¤Ç¤­¤ë¡¥
¥°¥é¥Õ¤ÏÅ´Æ»¥Í¥Ã¥È¥ï¡¼¥¯¤òÉ½¸½¤Ç¤­¤ë¡¥
Lisp¤Ç¤Ï¥¯¥í¡¼¥¸¥ã¤¬É½¸½¼êÃÊ¤Ë»È¤ï¤ì¤ë¤³¤È¤¬¤¢¤ë¡¥
¥¯¥í¡¼¥¸¥ãÆâ¤Ç¤ÏÊÑ¿ôÂ«Çû¤Ï¾ðÊó¤òÃß¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¤·¡¤
Ê£»¨¤Ê¥Ç¡¼¥¿¹½Â¤¤ò¹½ÃÛ¤¹¤ë¤È¤­¤Î¥Ý¥¤¥ó¥¿¤ÎÌòÌÜ¤ò²Ì¤¿¤¹¤³¤È¤â¤Ç¤­¤ë¡¥
Â«Çû¤ò¶¦Í­¤¹¤ë¤«¤Þ¤¿¤Ï¸ß¤¤¤ò»²¾È¤Ç¤­¤ë¥¯¥í¡¼¥¸¥ã¤Î¥°¥ë¡¼¥×¤òºî¤ë¤³¤È¤Ç¡¤
¥Ç¡¼¥¿¹½Â¤¤È¥×¥í¥°¥é¥à¤ÎÄ¹½ê¤òÊ»¤»»ý¤Ã¤¿¥Ï¥¤¥Ö¥ê¥Ã¥É¡¦¥ª¥Ö¥¸¥§¥¯¥È¤òÁÏ¤ì¤ë¡¥

¤½¤ÎÆâÉô¤Ç¤Ï¶¦Í­¤µ¤ì¤¿Â«Çû¤¬¥Ý¥¤¥ó¥¿¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥
¥¯¥í¡¼¥¸¥ã¤Ë¤Ï¥Ý¥¤¥ó¥¿¤ò¹âÅÙ¤ËÃê¾Ý²½¤·¤Æ°·¤¦ÍøÅÀ¤¬¤¢¤ë¡¥
ÀÅÅª¤Ê¥Ç¡¼¥¿¹½Â¤¤ÇÉ½¸½¤¹¤ëÈ¦¤ÎÊª¤òÉ½¸½¤¹¤ë¥¯¥í¡¼¥¸¥ã¤ò»È¤¦¤³¤È¤Ç¡¤
¤·¤Ð¤·¤ÐÍ¥²í¤µ¤È¸úÎ¨¤¬Âç¤­¤¯¸þ¾å¤¹¤ë¤Î¤ò´üÂÔ¤Ç¤­¤ë¡¥
\subsection{¥Í¥Ã¥È¥ï¡¼¥¯}   %{{{
¥¯¥í¡¼¥¸¥ã¤Ë¤Ï3¸Ä¤ÎÊØÍø¤ÊÀ­¼Á¤¬¤¢¤ë¡¥
¥¢¥¯¥Æ¥£¥Ö¤Ç¡¤¥í¡¼¥«¥ë¤Ê¾õÂÖ¤òÊÝ»ý¤·¤Æ¤¤¤Æ¡¤Ê£¿ô¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤òÂ¤¤ì¤ë¤³¤È¤À¡¥
¥¢¥¯¥Æ¥£¥Ö¤Ç¥í¡¼¥«¥ë¤Ê¾õÂÖ¤ò»ý¤Ã¤¿¥ª¥Ö¥¸¥§¥¯¥È¤ÎÊ£¿ô¤Î¥³¥Ô¡¼¤ò»È¤¦¤Ù¤­½ê¤È¤Ï¤É¤³¤À¤í¤¦¡©
²¿¤è¤ê¤â¥Í¥Ã¥È¥ï¡¼¥¯¤Ë´Ø¤ï¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤¬µó¤²¤é¤ì¤ë¡¥
Â¿¤¯¤Î¾ì¹ç¥Í¥Ã¥È¥ï¡¼¥¯¤ÎÀáÅÀ¤Ï¥¯¥í¡¼¥¸¥ã¤È¤·¤ÆÉ½¸½¤Ç¤­¤ë¡¥
¥¯¥í¡¼¥¸¥ã¤Ï¤½¤ì¼«¿È¤Î¥í¡¼¥«¥ë¤Ê¾õÂÖ¤òÊÝ»ý¤Ç¤­¤ë¤À¤±¤Ç¤Ê¤¯¡¤ÊÌ¤Î¥¯¥í¡¼¥¸¥ã¤ò»²¾È¤Ç¤­¤ë¡¥
¤À¤«¤é¥Í¥Ã¥È¥ï¡¼¥¯Æâ¤ÎÀáÅÀ¤òÉ½¸½¤¹¤ë¥¯¥í¡¼¥¸¥ã¤Ï¡¤
½ÐÎÏ¤òÁ÷¤ë¤Ù¤­´ö¤Ä¤«¤ÎÀáÅÀ¡Ê¥¯¥í¡¼¥¸¥ã¡Ë¤Î¾õÂÖ¤òÍý²ò¤Ç¤­¤ë¡¥
¤³¤ì¤Ï¤¢¤ë¼ï¤Î¥Í¥Ã¥È¥ï¡¼¥¯¤Ê¤é¤½¤Î¤Þ¤Þ¥³¡¼¥É¤ËÊÑ´¹¤Ç¤­¤ë¤È¤¤¤¦¤³¤È¤À¡¥

¤³¤Î¾Ï¤È¼¡¾Ï¤Ç¤Ï¡¤¥Í¥Ã¥È¥ï¡¼¥¯¤òÃµº÷¤¹¤ëÊýË¡¤òÆó¤Ä¸¡Æ¤¤¹¤ë¡¥
¤Þ¤º¡¤¹½Â¤ÂÎ¤È¤·¤ÆÄêµÁ¤µ¤ì¤¿ÀáÅÀ¤È¡¤
¥Í¥Ã¥È¥ï¡¼¥¯¤òÃµº÷¤¹¤ëÊÌ¤Î¥³¡¼¥É¤ò»È¤¦ÅÁÅýÅª¤ÊÊýË¡¤òÄÉ¤Ã¤Æ¤ß¤ë¡¥
¤½¤·¤Æ¼¡¾Ï¤Ç¡¤Æ±¤¸¥×¥í¥°¥é¥à¤òÃ±°ì¤ÎÃê¾Ý²½¼êË¡¤Çºî¤ëÊýË¡¤ò¼¨¤¹¡¥

Îã¤È¤·¤Æ¡¤²ÄÇ½¤ÊÃæ¤ÇºÇ¤âÃ±½ã¤Ê±þÍÑÊýË¡¤ò»È¤¦¡¥
¡Ö20¤Î¼ÁÌä¡×¤ò¹Ô¤¦Îà¤Î¤¢¤ì¤À¡¥
¤³¤³¤Ç»È¤¦¥Í¥Ã¥È¥ï¡¼¥¯¤ÏÆóÊ¬¥Ä¥ê¡¼¤Ç¡¤ÍÕ¤Ç¤Ê¤¤ÀáÅÀ¤ÏÆóÂò¼°¤Î¼ÁÌä¤òÊÝ»ý¤·¡¤
¼ÁÌä¤Ø¤ÎÅú¤¨¤Ë±þ¤¸¤Æ±¦¤«º¸¤ÎÉôÊ¬¥Ä¥ê¡¼¤Ø²¼¤Ã¤ÆÃµº÷¤·¤Æ¹Ô¤¯¡¥
ÍÕ¤ÎÀáÅÀ¤ÏÊÖ¤êÃÍ¤òÊÝ»ý¤¹¤ë¡¥
Ãµº÷¤¬ÍÕ¤ËÅþÃ£¤¹¤ë¤È¡¤¤½¤ÎÃÍ¤ÏÃµº÷·ë²Ì¤È¤·¤ÆÊÖ¤µ¤ì¤ë¡¥
¤³¤Î¥×¥í¥°¥é¥à¤Î¼Â¹Ô·ë²Ì¤ÏÂè\ref{fig:TwentyQuestions}¿Þ¤Ë¼¨¤·¤¿¤è¤¦¤Ë¤Ê¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
> (run-node 'people)
Is the person a man?
>> yes
Is he living?
>> no
Was he American?
>> yes
Is he on a coin?
>> yes
Is the coin a penny?
>> yes
LINCOLN
\end{FramedVerb}\end{center}
\caption{¡Ö20¤Î¼ÁÌä¡×¤Î¼Â¹ÔÎã¡¥}
\label{fig:TwentyQuestions}
\end{figure}

ÅÁÅýÅª¤ÊÊýË¡¤ÏÀáÅÀ¤òÉ½¸½¤¹¤ë¤¿¤á¤Î²¿¤é¤«¤Î¥Ç¡¼¥¿¹½Â¤¤òÄêµÁ¤¹¤ë¤³¤È¤À¤í¤¦¡¥
ÀáÅÀ¤Ï´ö¤Ä¤«¤Î¾ðÊó¤ò»ý¤¿¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡§¤½¤ì¤¬ÍÕ¤Ç¤¢¤ë¤«¤É¤¦¤«¡¥
¤½¤¦¤Ê¤éÊÖ¤¹ÃÍ¤Ï²¿¤«¡¥¤½¤¦¤Ç¤Ê¤¤¤Ê¤é¼ÁÌä¤Ï²¿¤Ç¡¤Åú¤¨¤Ë±þ¤¸¤Æ¤É¤Á¤é¤Ø¿Ê¤à¤«¡¥
¤½¤ì¤ò¼Â¸½¤¹¤ë¤Î¤Ë½½Ê¬¤Ê¥Ç¡¼¥¿¹½Â¤¤òÂè\ref{fig:ReprDefNode}¿Þ¤Ë¼¨¤·¤¿¡¥
¤½¤ì¤ÏºÇ¾®¸Â¤Î¹½Â¤¤ò»ý¤Ã¤Æ¤¤¤ë¡¥
\verb|contents|Íó¤Ï¼ÁÌä¤Þ¤¿¤ÏÊÖ¤êÃÍ¤òÊÝ»ý¤¹¤ë¡¥
ÀáÅÀ¤¬ÍÕ¤Ç¤Ê¤¤¤Ê¤é¡¤
\verb|yes|Íó¤È\verb|no|Íó¤ÇÅú¤¨¤Ë±þ¤¸¤Æ¤É¤ÎÀáÅÀ¤Ë¿Ê¤à¤«¤ò»ØÄê¤¹¤ë¡¥
ÍÕ¤Ç¤¢¤ë¤Ê¤é¡¤¤½¤ì¤é¤¬¶õ¤Ç¤Ê¤Î¤Ç¤½¤Î¤³¤È¤¬Ê¬¤«¤ë¡¥
\verb|*nodes*|\,¤Ï¥°¥í¡¼¥Ð¥ë¤Ê¥Ï¥Ã¥·¥åÉ½¤Ç¡¤¤³¤ì¤ËÀáÅÀÌ¾¤Î°ìÍ÷¤òºÜ¤»¤ë¡¥
ºÇ¸å¤Ë\verb|defnode|¤Ï¿·¤·¤¤ÀáÅÀ¡ÊÍÕ¤Ç¤¢¤Ã¤Æ¤â¤½¤¦¤Ç¤Ê¤¯¤Æ¤â¤¤¤¤¡Ë¤òÁÏ¤ê¡¤
¤½¤ì¤ò\,\verb|*nodes*|\,¤ËÃß¤¨¤ë¡¥
¤³¤ì¤é¤ÎÁÇºà¤ò»È¤Ã¤Æ¥Ä¥ê¡¼¤ÎºÇ½é¤ÎÀáÅÀ¤¬ÄêµÁ¤Ç¤­¤ë¡§
\begin{verbatim}
(defnode 'people "Is the person a man?"
         'male 'female)
\end{verbatim}
Âè\ref{fig:SampleNetwork}¿Þ¤Ë¤Ï¡¤
Âè\ref{fig:TwentyQuestions}¿Þ¤Î¤ä¤ê¤È¤ê¤ò¼Â¸½¤¹¤ë¤Î¤ËÉ¬Í×¤Ê¤À¤±¤Î¥Í¥Ã¥È¥ï¡¼¥¯¤ò¼¨¤·¤¿¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defstruct node contents yes no)

(defvar *nodes* (make-hash-table))

(defun defnode (name conts &optional yes no)
  (setf (gethash name *nodes*)
        (make-node :contents conts
                   :yes yes
                   :no no)))
\end{FramedVerb}\end{center}
\caption{ÀáÅÀ¤ÎÉ½¸½¤ÈÄêµÁ¡¥}
\label{fig:ReprDefNode}
\end{figure}

\begin{figure}\begin{center}\begin{FramedVerb}
(defnode 'people "Is the person a man?" 'male 'female)
(defnode 'male "Is he living?" 'liveman 'deadman)
(defnode 'deadman "Was he American?" 'us 'them)
(defnode 'us "Is he on a coin?" 'coin 'cidence)
(defnode 'coin "Is the coin a penny?" 'penny 'coins)
(defnode 'penny 'lincoln)
\end{FramedVerb}\end{center}
\caption{¥Í¥Ã¥È¥ï¡¼¥¯¤ÎÎã¡¥}
\label{fig:SampleNetwork}
\end{figure}

¤½¤¦¤Ê¤ì¤ÐÉ¬Í×¤Ê¤Î¤Ï¤³¤Î¥Í¥Ã¥È¥ï¡¼¥¯¤òÃµº÷¤·¡¤
¼ÁÌä¤òÉ½¼¨¤·¡¤¼¨¤µ¤ì¤¿·ÐÏ©¤òÃ©¤ë´Ø¿ô¤ò½ñ¤¯¤³¤È¤À¤±¤À¡¥
¤½¤Î´Ø¿ô\verb|run-node|¤ÏÂè\ref{fig:TraverseNetwork}¿Þ¤Ë¼¨¤·¤¿¡¥
Ì¾Á°¤¬Í¿¤¨¤é¤ì¤ë¤È¡¤ÂÐ±þ¤¹¤ëÀáÅÀ¤òÃµ¤¹¡¥
¤½¤ì¤¬ÍÕ¤Ç¤Ê¤¤¤Ê¤é\verb|contents|Íó¤Î¼ÁÌä¤ò¹Ô¤¤¡¤
Åú¤¨¤Ë±þ¤¸¤ÆÆó¤Ä¤Î²ÄÇ½¤Ê¹Ô¤­Àè¤ÎÃæ¤«¤éÁª¤ó¤ÇÃµº÷¤òÂ³¤±¤ë¡¥
ÀáÅÀ¤¬ÍÕ¤Ç¤¢¤ë¤Ê¤é¡¤\verb|run-node|¤Ï\verb|contents|Íó¤ÎÆâÍÆ¤òÊÖ¤¹¤À¤±¤À¡¥
¤³¤Î´Ø¿ô¤ÏÂè\ref{fig:SampleNetwork}¿Þ¤ÇÄêµÁ¤µ¤ì¤¿¥Í¥Ã¥È¥ï¡¼¥¯¤ò»È¤¤¡¤
Âè\ref{fig:TwentyQuestions}¿Þ¤Ë¼¨¤·¤¿½ÐÎÏ¤ò¹Ô¤¦¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defun run-node (name)
  (let ((n (gethash name *nodes*)))
    (cond ((node-yes n)
           (format t "~A~%>> " (node-contents n))
           (case (read)
             (yes (run-node (node-yes n)))
             (t (run-node (node-no n)))))
          (t (node-contents n)))))
\end{FramedVerb}\end{center}
\caption{¥Í¥Ã¥È¥ï¡¼¥¯Ãµº÷¤Î¤¿¤á¤Î´Ø¿ô¡¥}
\label{fig:TraverseNetwork}
\end{figure}
%}}}
\subsection{¥Í¥Ã¥È¥ï¡¼¥¯¤Î¥³¥ó¥Ñ¥¤¥ë}   %{{{
Á°¾Ï¤Ç½ñ¤¤¤¿¥Í¥Ã¥È¥ï¡¼¥¯¡¦¥×¥í¥°¥é¥à¤Ï¡¤
¤É¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤â½ñ¤±¤ë¤è¤¦¤Ê¤â¤Î¤À¤Ã¤¿¡¥
¤¢¤Î¥×¥í¥°¥é¥à¤ÏÁ´¤¯Ã±½ã¤Ê¤â¤Î¤Ç¡¤Â¾¤Î½ñ¤­Êý¤¬¤¢¤ë¤Ê¤É¤È¤Ï¤Ê¤«¤Ê¤«»×¤¨¤Ê¤¤¡¥
¤·¤«¤·¤½¤ì¤¬¤¢¤ë¤Î¤À\wadash ¼ÂºÝ¡¤ÍÚ¤«¤ËÃ±½ã¤Ë½ñ¤­Ä¾¤»¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defvar *nodes* (make-hash-table))

(defun defnode (name conts &optional yes no)
  (setf (gethash name *nodes*)
        (if yes
            #'(lambda ()
                (format t "~A~%>> " conts)
                (case (read)
                  (yes (funcall (gethash yes *nodes*)))
                  (t (funcall (gethash no *nodes*)))))
            #'(lambda () conts))))
\end{FramedVerb}\end{center}
\caption{¥¯¥í¡¼¥¸¥ã¤Ø¤È¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë¥Í¥Ã¥È¥ï¡¼¥¯¡¥}
\label{fig:CompiledNetwork}
\end{figure}

Âè\ref{fig:CompiledNetwork}¿Þ¤Ë¼¨¤·¤¿¥³¡¼¥É¤Ï¤½¤ÎÅÀ¤òÀâÌÀ¤·¤Æ¤¤¤ë¡¥
¤³¤ì¤¬¤¢¤Î¥Í¥Ã¥È¥ï¡¼¥¯¤òµ¡Ç½¤µ¤»¤ë¤Î¤ËÉ¬Í×¤ÊÁ´¤Æ¤À¡¥
ÀáÅÀ¤ò¥Ç¡¼¥¿¹½Â¤¤È¤·¤ÆÉ½¤·¡¤¤½¤ì¤òÃµº÷¤¹¤ëÊÌ¤Î´Ø¿ô¤òÁÏ¤ëÂå¤ï¤ê¤Ë¡¤
¤³¤³¤Ç¤ÏÀáÅÀ¤ò¥¯¥í¡¼¥¸¥ã¤È¤·¤ÆÉ½¸½¤·¤¿¡¥
Á°¤ÎÎã¤Ç¤Ï¹½Â¤ÂÎ¤ÎÃæ¤ËÃß¤¨¤é¤ì¤Æ¤¤¤¿¥Ç¡¼¥¿¤Ï¥¯¥í¡¼¥¸¥ãÆâ¤ÎÊÑ¿ôÂ«Çû¤ËÃß¤¨¤é¤ì¤Æ¤¤¤ë¡¥
ÀáÅÀ¼«¿È¤ÎÃæ¤Ë\verb|run-node|¤Îµ¡Ç½¤¬ÁÈ¤ß¹þ¤Þ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¤¤â¤¦¤½¤ì¤ÏÉ¬Í×¤Ê¤¤¡¥
Ãµº÷¤ò»Ï¤á¤ë¤Ë¤Ï¡¤»Ï¤á¤¿¤¤ÀáÅÀ¤Ç\verb|funcall|¤ò¸Æ¤Ö¤À¤±¤À¡§
\begin{verbatim}
(funcall (gethash 'people *nodes*))
Is the person a man?
>>
\end{verbatim}
¤½¤ì¤«¤éÀè¤Î¼Â¹Ô·ë²Ì¤ÏÁ°¤Î¼ÂÁõË¡¤ÈÁ´¤¯ÊÑ¤ï¤ê¤Ê¤¤¡¥

ÀáÅÀ¤ò¥¯¥í¡¼¥¸¥ã¤È¤·¤ÆÉ½¸½¤¹¤ë¤³¤È¤Ç¡¤
¡Ö20¤Î¼ÁÌä¡×¤Ç»È¤¦¥Í¥Ã¥È¥ï¡¼¥¯Á´ÂÎ¤ò¥³¡¼¥É¤ËÊÑ´¹¤Ç¤­¤¿Ìõ¤À¡¥
¸«¤¿ÄÌ¤ê¡¤¾å¤Î¥³¡¼¥É¤Ç¤Ï¼Â¹Ô»þ¤ËÌ¾Á°¤Ë¤è¤Ã¤ÆÀáÅÀ¤Î¥¯¥í¡¼¥¸¥ã¤òÃµ¤µ¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤·¤«¤·¥Í¥Ã¥È¥ï¡¼¥¯¤¬¼Â¹ÔÃæ¤ËºÆÄêµÁ¤µ¤ì¤ë¤³¤È¤¬¤Ê¤¤¤ÈÊ¬¤«¤Ã¤Æ¤¤¤ë¤Ê¤é¡¤
¹¹¤Ë³ÈÄ¥¤ò²Ã¤¨¤é¤ì¤ë¡¥
ÀáÅÀ¤Î¥¯¥í¡¼¥¸¥ã¤¬¥Ï¥Ã¥·¥åÉ½¤ò²ð¤µ¤º¡¤»Ò¤òÄ¾ÀÜ¸Æ¤Ö¤è¤¦¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defvar *nodes* nil)

(defun defnode (&rest args)
  (push args *nodes*)
  args)

(defun compile-net (root)
  (let ((node (assoc root *nodes*)))
    (if (null node)
        nil
        (let ((conts (second node))
              (yes (third node))
              (no (fourth node)))
          (if yes
              (let ((yes-fn (compile-net yes))
                    (no-fn (compile-net no)))
                #'(lambda ()
                    (format t "~A~%>> " conts)
                    (funcall (if (eq (read) 'yes)
                                 yes-fn
                                 no-fn))))
              #'(lambda () conts))))))
\end{FramedVerb}\end{center}
\caption{ÀÅÅª»²¾È¤Ë¤è¤ë¥³¥ó¥Ñ¥¤¥ë¡¥}
\label{fig:CompileWithStaticRef}
\end{figure}

Âè\ref{fig:CompileWithStaticRef}¿Þ¤Ë¤Ï¿·¤·¤¤ÄêµÁ¤ò¼¨¤·¤¿¡¥
¤³¤³¤Ç¤Ï\,\verb|*nodes*|\,¤Ï¥Ï¥Ã¥·¥åÉ½¤Ç¤Ï¤Ê¤¯¼Î¤Æ¤Æ¤â¤¤¤¤¥ê¥¹¥È¤À¡¥
ÀáÅÀ¤ÏÁ°¤ÈÆ±¤¸¤¯\verb|defnode|¤ÇÄêµÁ¤¹¤ë¤¬¡¤¤³¤Î»þÅÀ¤Ç¤Ï¥¯¥í¡¼¥¸¥ã¤ÏÀ¸À®¤µ¤ì¤Ê¤¤¡¥
Á´¤Æ¤ÎÀáÅÀ¤ÎÄêµÁ¸å¡¤
\verb|compile-net|¤ò¸Æ¤ó¤Ç¥Í¥Ã¥È¥ï¡¼¥¯Á´ÂÎ¤ò°ìÅÙ¤Ë¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¡¥
¤³¤Î´Ø¿ô¤ÏºÆµ¢Åª¤Ë¥Ä¥ê¡¼¤ÎÍÕ¤Þ¤Ç²¼¤ê¡¤
Ìá¤ê¤Ê¤¬¤é³ÆÀáÅÀ¤ÇÆó¤Ä¤ÎÉôÊ¬¥Ä¥ê¡¼¤½¤ì¤¾¤ì¤ËÂÐ±þ¤¹¤ëÀáÅÀ¡¿¥¯¥í¡¼¥¸¥ã¤òÊÖ¤¹
\footnote{¤³¤Î¼ÂÁõË¡¤Ç¤Ï¥Í¥Ã¥È¥ï¡¼¥¯¤¬¥Ä¥ê¡¼¤À¤È²¾Äê¤·¤Æ¤¤¤ë¡¥
¤³¤Î¾Ï¤Ç¤Î¼ÂÁõË¡¤Ç¤Ï¤½¤¦¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥}¡¥
¤À¤«¤éÁ´¤Æ¤ÎÀáÅÀ¤ÏÆó¤Ä¤Î»Ò¤ÎÌ¾Á°¤òÇÄ°®¤·¤Æ¤¤¤ë¤À¤±¤Ê¤Î¤Ç¤Ï¤Ê¤¯¡¤
¤½¤ì¤é¤òÄ¾¤ËÀ©¸æ¤Ç¤­¤ë¡¥
\verb|compile-net|¤Î¸µ¤Î¸Æ¤Ó½Ð¤·¤¬ÊÖ¤ë¤È¡¤
¥Í¥Ã¥È¥ï¡¼¥¯¤Î¥³¥ó¥Ñ¥¤¥ë¤·¤¿ÉôÊ¬¤ËÂÐ±þ¤¹¤ë´Ø¿ô¤¬ÆÀ¤é¤ì¤ë¡¥
\begin{verbatim}
> (setq n (compile-net 'people))
#<Compiled-Function BF3C06>
> (funcall n)
Is the person a man?
>>
\end{verbatim}
\verb|compile-net|¤ÏÆó¤Ä¤Î°ÕÌ£¤Ç¡Ö¥³¥ó¥Ñ¥¤¥ë¡×¤ò¹Ô¤¦¤³¤È¤ËÃí°Õ¤·¤è¤¦¡¥
¤Þ¤º¥Í¥Ã¥È¥ï¡¼¥¯¤ÎÃê¾ÝÅªÉ½¸½¤ò¥³¡¼¥É¤ËÊÑ´¹¤¹¤ë¤È¤¤¤¦°ìÈÌÅª¤Ê°ÕÌ£¤Î¥³¥ó¥Ñ¥¤¥ë¤ò¹Ô¤¦¡¥
¤µ¤é¤Ë\verb|compile-net|¼«¿È¤¬½èÍý·Ï¤Ë¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Æ¤¤¤ì¤Ð¡¤
ÊÖ¤µ¤ì¤ë´Ø¿ô¤â¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¤â¤Î¤À¡¥
¡Êwowow¥Ú¡¼¥¸¤ò»²¾È¡¥¡Ë

¥Í¥Ã¥È¥ï¡¼¥¯¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤¿¸å¤Ï\verb|defnode|¤Îºî¤Ã¤¿¥ê¥¹¥È¤Ï¤â¤¦Í×¤é¤Ê¤¤¤Î¤Ç¡¤
¼Î¤Æ¤Æ¤·¤Þ¤Ã¤Æ¡ÊÎã¤¨¤Ð\,\verb|*nodes*|\,¤Ënil¤òÂåÆþ¤¹¤ë¡Ë
¥¬¡¼¥Ù¥¸¡¦¥³¥ì¥¯¥¿¤ËÇ¤¤»¤ì¤Ð¤è¤¤¡¥
%}}}
\subsection{Á°¤ò¸þ¤¯}   %{{{
¥Í¥Ã¥È¥ï¡¼¥¯¤Ë´Ø¤ï¤ëÂ¿¤¯¤Î¥×¥í¥°¥é¥à¤¬¡¤
ÀáÅÀ¤ò¥¯¥í¡¼¥¸¥ã¤Ë¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤³¤È¤Ç¼ÂÁõ¤Ç¤­¤ë¡¥
¥¯¥í¡¼¥¸¥ã¤Ï¥Ç¡¼¥¿¡¦¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤¢¤ê¡¤¹½Â¤ÂÎ¤¬É½¸½¤Ç¤­¤ë¤â¤Î¤òÉ½¸½¤¹¤ë¤Î¤Ë»È¤¨¤ë¡¥
¤½¤¦¤¹¤ë¤Ë¤Ï¸«¤«¤±¤¿¤³¤È¤Î¤Ê¤¤»×¹ÍË¡¤¬´ö¤é¤«Í×¤ë¤¬¡¤
¸«ÊÖ¤ê¤Ë¤Ï¹âÂ®¤ÇÍ¥²í¤Ê¥×¥í¥°¥é¥à¤¬ÆÀ¤é¤ì¤ë¡¥

¥Þ¥¯¥í¤Ï¥¯¥í¡¼¥¸¥ã¤ò¥Ç¡¼¥¿É½¸½¤Ë»È¤¦¤È¤­¤ËÂç¤­¤Ê½õ¤±¤Ë¤Ê¤ë¡¥
¡Ö¥¯¥í¡¼¥¸¥ã¤ÇÉ½¸½¤¹¤ë¡×¤È¸À¤¦¤Î¤Ï¡Ö¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¡×¤ò¸À¤¤Ä¾¤·¤¿¤Ë²á¤®¤Ê¤¤¡¥
¥Þ¥¯¥í¤Ï¥³¥ó¥Ñ¥¤¥ë»þ¤Ë»Å»ö¤ò¤³¤Ê¤¹¤Î¤À¤«¤é¡¤¤³¤Îµ»Ë¡¤Ë¤È¤Ã¤ÆÁ´¤¯¼«Á³¤Ê¼êÃÊ¤Ê¤Î¤À¡¥
¥Þ¥¯¥í¤ÎÆ³Æþ¸å¡¤Âè23,~24¾Ï¤Ç¡¤
¤³¤³¤Ç»È¤Ã¤¿ÀïÎ¬¤Ë´ð¤Å¤¤¤¿¤º¤Ã¤ÈÂçµ¬ÌÏ¤Ê¥×¥í¥°¥é¥à¤òÄó¼¨¤¹¤ë¡¥
%}}}
%}}}
\section{¥Þ¥¯¥í}    %{{{
Lisp¤Î¥Þ¥¯¥íµ¡Ç½¤ò»È¤¦¤È¡¤¥³¡¼¥É¤ÎÊÑ´¹¤Ë¤è¤Ã¤Æ¥ª¥Ú¥ì¡¼¥¿¤ò¼ÂÁõ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
¥Þ¥¯¥íÄêµÁ¤È¤Ï¼Â¼ÁÅª¤ËLisp¥³¡¼¥É¤òÀ¸À®¤¹¤ë´Ø¿ô¤À\wadash
¤Ä¤Þ¤ê¥×¥í¥°¥é¥à¤ò½ñ¤¯¥×¥í¥°¥é¥à¤À¡¥
¤³¤Î°ìÊâ¤«¤é»Ï¤á¤Æ¡¤Âç¤­¤Ê²ÄÇ½À­¤ÈÍ½´ü¤»¤Ì´í¸±¤ËÂ­¤òÆ§¤ßÆþ¤ì¤Æ¤¤¤¯¡¥
Âè7¾Ï¤«¤éÂè10¾Ï¤Ï¥Þ¥¯¥í¤Î´ðÁÃ¹ÖºÂ¤À¡¥
¤³¤Î¾Ï¤Ç¤Ï¥Þ¥¯¥í¤¬¤É¤Î¤è¤¦¤ËÆ°ºî¤¹¤ë¤Î¤«¤òÀâÌÀ¤·¡¤
¥Þ¥¯¥í¤ò½ñ¤¤¤¿¤êÆ°ºî¤ò³Î¤«¤á¤ë¤È¤­¤Î¥Æ¥¯¥Ë¥Ã¥¯¤ò¼¨¤·¡¤
¥Þ¥¯¥í¤ò½ñ¤¯¥¹¥¿¥¤¥ë¤Ë¤Ä¤¤¤Æ¤ÎÏÃÂê¤Ë¿Ê¤à¡¥
\subsection{¥Þ¥¯¥í¤Ï¤É¤Î¤è¤¦¤ËÆ°ºî¤¹¤ë¤«}   %{{{
¥Þ¥¯¥í¤Ï¸Æ¤Ó½Ð¤»¤ë¤·ÃÍ¤òÊÖ¤»¤ë¤Î¤Ç¡¤´Ø¿ô¤È°ì½ï¤¯¤¿¤Ë¤µ¤ì¤¬¤Á¤À¡¥
¥Þ¥¯¥íÄêµÁ¤Ï´Ø¿ôÄêµÁ¤Ë»÷¤Æ¤¤¤ë¤³¤È¤â¤¢¤ë¤·¡¤
¼ÂºÝ¤Ï¥Þ¥¯¥í¤Ç¤¢¤ë\verb|do|¤òÉáÃÊ¡ÖÁÈ¤ß¹þ¤ß´Ø¿ô¡×¤È¸Æ¤Ö¿Í¤âÂ¿¤¤¡¥
¤·¤«¤·¤³¤ÎÓÈ¤¨¤òÆÍ¤­µÍ¤á¤¹¤®¤ë¤Èº®Íð¤Î¸µ¤Ë¤Ê¤ë¡¥
¥Þ¥¯¥í¤ÎÆ°ºî¤ÏÉáÄÌ¤Î´Ø¿ô¤È¤Ï°ã¤Ã¤Æ¤¤¤ë¡¥
¥Þ¥¯¥í¤Ï¤É¤Î¤è¤¦¤Ë¡¤¤½¤·¤Æ¤Ê¤¼°ã¤¦¤Î¤«¤òÃÎ¤ë¤³¤È¤Ï¡¤¥Þ¥¯¥í¤òÀµ¤·¤¯»È¤¦¤¿¤á¤Î¸°¤À¡¥
´Ø¿ô¤Ï\emph{·ë²Ì}¤òÀ¸¤à¤¬¡¤¥Þ¥¯¥í¤Ï\emph{¼°}¤òÀ¸¤à\wadash
¤½¤·¤Æ¤³¤Î¼°¤¬É¾²Á¤µ¤ì¤ë¤È·ë²Ì¤òÀ¸¤à¡¥

½¬¤¤»Ï¤á¤ë¤Î¤Ë°ìÈÖÎÉ¤¤ÊýË¡¤Ï¡¤¼ÂÎã¤ËÅö¤¿¤ë¤³¤È¤À¡¥
¤³¤³¤Ç¤Ï°ú¿ô¤ònil¤ËÀßÄê¤¹¤ë¥Þ¥¯¥í\verb|nil!|¤ò½ñ¤­¤¿¤¤¤È¤·¤è¤¦¡¥
\verb|(nil!  x)|¤È¤·¤¿¤È¤­\verb|(setq x nil)|¤ÈÆ±¤¸¸ú²Ì¤¬Íß¤·¤¤¤Î¤À¡¥
¤½¤ì¤Ë¤Ï\verb|nil!|¤ò¡¤¤¢¤ë·Á¤ò»ý¤Ã¤¿¼°¤òÊÌ¤Î·Á¤Î¼°¤ËÊÑ¤¨¤ë¥Þ¥¯¥í¤È¤·¤ÆÄêµÁ¤¹¤ë¡¥
\begin{verbatim}
> (defmacro nil! (var)
    (list 'setq var nil))
NIL!
\end{verbatim}
¿Í´Ö¸ì¤ËÄ¾¤»¤Ð¡¤¤³¤ÎÄêµÁ¤ÏLisp¤Ë
¡Ö\verb|(nil! var)|¤Î·Á¤Î¼°¤ò¸«¤¿¤é¡¤
É¬¤ºÉ¾²ÁÁ°¤Ë\verb|(setq var nil)|¤Î·Á¤ËÊÑ¤¨¤ë¤³¤È¡¥¡×
¤ÈÌ¿¤¸¤Æ¤¤¤ë¡¥

¥Þ¥¯¥í¤ÎÀ¸À®¤·¤¿¼°¤Ï¸µ¤Î¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Î¾ì½ê¤ÇÉ¾²Á¤µ¤ì¤ë¡¥
¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤È¤ÏÂè1Í×ÁÇ¤¬¥Þ¥¯¥í¤ÎÌ¾Á°¤Ç¤¢¤ë¥ê¥¹¥È¤À¡¥
¥Þ¥¯¥í¸Æ¤Ó½Ð¤·\verb|(nil!  x)|¤ò¥È¥Ã¥×¥ì¥Ù¥ë¤ËÂÇ¤Á¹þ¤ó¤À¤é²¿¤¬µ¯¤­¤ë¤À¤í¤¦¤«¡©
Lisp¤Ï\verb|nil!|¤¬¥Þ¥¯¥í¤ÎÌ¾Á°¤Ç¤¢¤ë¤³¤È¤Ëµ¤ÉÕ¤­¡¤
\begin{enumerate}
\item Í¿¤¨¤¿ÄêµÁ¤Î»ØÄê¤·¤¿¼°¤òÀ¸À®¤·¡¤
\item ¤½¤Î¼°¤ò¸µ¤Î¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Î¾ì½ê¤ÇÉ¾²Á¤¹¤ë¡¥
\end{enumerate}

¿·¤·¤¤¼°¤òÀ¸À®¤¹¤ë¹©Äø¤Ï¥Þ¥¯¥íÅ¸³«¤È¸Æ¤Ð¤ì¤ë¡¥
Lisp¤Ï\verb|nil!|¤ÎÄêµÁ¤òÃµ¤¹¤¬¡¤
¤½¤³¤Ë¤Ï¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤òÃÖ¤­´¹¤¨¤ë¼°¤ÎÀ¸À®Ë¡¤¬ºÜ¤Ã¤Æ¤¤¤ë¡¥
\verb|nil!|¤ÎÄêµÁ¤¬¡¤
¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Î°ú¿ô¤È¤·¤ÆÍ¿¤¨¤é¤ì¤¿¼°¤ËÂÐ¤·¤Æ´Ø¿ô¤Î¤è¤¦¤ËÅ¬ÍÑ¤µ¤ì¤ë¡¥
¤½¤ì¤Ï3¸Ä¤ÎÍ×ÁÇ¡Ê\verb|setq|¡¤¥Þ¥¯¥í¤Ë°ú¿ô¤È¤·¤ÆÍ¿¤¨¤é¤ì¤¿¼°¡¤nil¡Ë
¤«¤éÀ®¤ë¥ê¥¹¥È¤òÊÖ¤¹¡¥
¤³¤Î¾ì¹ç\verb|nil!|¤Î°ú¿ô¤Ï\verb|x|¤À¤«¤é¡¤¥Þ¥¯¥íÅ¸³«¤Î·ë²Ì¤Ï\verb|(setq x nil)|¤À¡¥

¥Þ¥¯¥íÅ¸³«¤Î¸å¡¤Âè2¹©Äø¤¹¤Ê¤ï¤ÁÉ¾²Á¤¬¹Ô¤ï¤ì¤ë¡¥
Lisp¤ÏÅ¸³«·ë²Ì\verb|(setq x nil)|¤ò¡¤»Ï¤á¤Î¾ì½ê¤ËÄ¾ÀÜ½ñ¤¤¤Æ¤¢¤Ã¤¿¤«¤Î¤è¤¦¤ËÉ¾²Á¤¹¤ë¡¥
É¬¤º¤·¤â¥È¥Ã¥×¥ì¥Ù¥ë¤Î¤È¤­¤Î¤è¤¦¤ËÉ¾²Á¤¬Å¸³«Ä¾¸å¤Ë¹Ô¤ï¤ì¤ëÌõ¤Ç¤Ï¤Ê¤¤¡¥
´Ø¿ôÄêµÁÆâ¤Î¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ï´Ø¿ô¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¤È¤­¤ËÅ¸³«¤µ¤ì¤ë¤¬¡¤
Å¸³«·Á¡Ê¤Þ¤¿¤Ï¤½¤ì¤Ë´ð¤Å¤¯¥ª¥Ö¥¸¥§¥¯¥È¡¦¥³¡¼¥É¡Ë¤Ï
¤½¤Î´Ø¿ô¤¬¸Æ¤Ó½Ð¤µ¤ì¤ë¤Þ¤ÇÉ¾²Á¤µ¤ì¤Ê¤¤¡¥

¥Þ¥¯¥í¤Ë´Ø¤·¤Æ½Ð²ñ¤¦ÌäÂê¤ÎÂ¿¤¯¤Ï¡¤
¥Þ¥¯¥íÅ¸³«¤ÈÉ¾²Á¤ò¤­¤Á¤ó¤È¶èÊÌ¤¹¤ë¤³¤È¤ÇÈò¤±¤é¤ì¤ë¡¥
¥Þ¥¯¥í¤ò½ñ¤¯¤È¤­¤Ï¡¤Å¸³«»þ¤ÈÉ¾²Á»þ¤Ë¡¤
¤½¤ì¤¾¤ì¤É¤Î¤è¤¦¤ÊÆ°ºî¤ò¤¹¤ë¤Î¤«¤·¤Ã¤«¤êÍý²ò¤¹¤ë¤³¤È¡¥
¤Ê¤¼¤Ê¤éÆó¤Ä¤Î¹©Äø¤Ï°ìÈÌÅª¤ËÊÌ¤Î¼ïÎà¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ËÂÐ¤·¤ÆºîÍÑ¤¹¤ë¤«¤é¤À¡§
¥Þ¥¯¥íÅ¸³«¤Ï¼°¤ò°·¤¤¡¤É¾²Á¤Ï¤½¤ÎÃÍ¤ò°·¤¦¡¥

¥Þ¥¯¥íÅ¸³«¤Ï\verb|nil!|¤Î¾ì¹ç¤è¤êÊ£»¨¤Ë¤Ê¤ë¤³¤È¤¬¤¢¤ë¡¥
\verb|nil!|¤ÎÅ¸³«·Á¤ÏÁÈ¤ß¹þ¤ßÆÃ¼ì¥ª¥Ú¥ì¡¼¥¿¤Î¸Æ¤Ó½Ð¤·¤À¤Ã¤¿¤¬¡¤
Å¸³«·Á¤¬ÊÌ¤Î¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ë¤Ê¤ë¤³¤È¤â¤¢¤ë¡¥
¤Á¤ç¤¦¤É¥í¥·¥¢¿Í·Á¤ÎÃæ¤ËÊÌ¤Î¿Í·Á¤¬Æþ¤Ã¤Æ¤¤¤ë¤è¤¦¤Ê¤â¤Î¤À¡¥
¤½¤Î¤è¤¦¤Ê¤È¤­¡¤¥Þ¥¯¥íÅ¸³«¤Ï¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ç¤Ê¤¤¼°¤ËÅþÃ£¤¹¤ë¤Þ¤ÇÂ³¤¯¡¥
¤³¤Î²áÄø¤¬ºÇ½ªÅª¤Ë½ª¤ï¤ë¤Þ¤Ç¤Ë¤Ï¡¤Ç¤°Õ¤ÎÄ¹¤µ¤ÎÃÊ³¬¤òÍ×¤¹¤ë¡¥

Â¿¤¯¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ï²¿¤é¤«¤Î¼ïÎà¤Î¥Þ¥¯¥í¤òÈ÷¤¨¤Æ¤¤¤ë¤¬¡¤
Lisp¤Î¥Þ¥¯¥í¤ÏÊÂ³°¤ì¤Æ¶¯ÎÏ¤À¡¥
Lisp¥³¡¼¥É¤Î¥Õ¥¡¥¤¥ë¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë¤È¤­¡¤
¥Ñ¡¼¥µ¤¬¥½¡¼¥¹¤òÆÉ¤ó¤Ç½ÐÎÏ¤ò¥³¥ó¥Ñ¥¤¥é¤ËÁ÷¤ë¡¥
Âç»ö¤Ê¤Î¤Ï¼¡¤À¡¥
¥Ñ¡¼¥µ¤Î½ÐÎÏ¤ÏLisp¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Î¥ê¥¹¥È¤«¤éÀ®¤ë¡¥
¥Þ¥¯¥í¤ò»È¤¨¤Ð¡¤
¥×¥í¥°¥é¥à¤¬¥Ñ¡¼¥µ¤È¥³¥ó¥Ñ¥¤¥é¤Î´Ö¤ÎÃæ´Ö·Á¼°¤Î¤È¤­¤ËÁàºî¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
É¬Í×¤Ê¤é¤Ð¤½¤ÎÁàºî¤ÇLisp¤Î³ÈÄ¥¤â¹Ô¤¨¤ë¡¥
Å¸³«·Á¤òÀ¸¤ß½Ð¤¹¥Þ¥¯¥í¤ÏLisp¤ÎÎÏ¤ÎÁ´¤Æ¤ò°®¤Ã¤Æ¤¤¤ë¡¥
¤½¤ì¤Ï¥Þ¥¯¥í¤¬À¸¤Þ¤ì»ý¤Ã¤¿À­¼Á¤À¡¥
¼ÂºÝ¡¤¥Þ¥¯¥í¤ÏLisp¤Î´Ø¿ô¤À\wadash ¤¿¤Þ¤¿¤Þ¼°¤òÊÖ¤¹¤À¤±¤Î¤³¤È¤À¡¥
\verb|nil!|¤ÎÄêµÁ¤Ç¤Ï\verb|list|¤¬»È¤ï¤ì¤¿¤À¤±¤À¤Ã¤¿¤¬¡¤
ÊÌ¤Î¥Þ¥¯¥í¤Ç¤ÏÅ¸³«»þ¤ËÂç¤­¤Ê¥µ¥Ö¥ë¡¼¥Á¥ó¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤â¤¢¤ë¡¥

¥³¥ó¥Ñ¥¤¥é¤¬ÆÉ¤à¾ðÊó¤ò½ñ¤­´¹¤¨¤é¤ì¤ë¤È¤¤¤¦¤Î¤Ï
¥³¥ó¥Ñ¥¤¥é¤ò½ñ¤­´¹¤¨¤é¤ì¤ë¤Î¤È¤Û¤È¤ó¤ÉÆ±¤¸¤À¡¥
´ûÂ¸¤Î¥Ç¡¼¥¿¹½Â¤¤òÊÑ·Á¤¹¤ë¤³¤È¤ÇÄêµÁ¤Ç¤­¤ë¤è¤¦¤Ê¥Ç¡¼¥¿¹½Â¤¤Ê¤é²¿¤Ç¤âLisp¤ËÄÉ²Ã¤Ç¤­¤ë¡¥
%}}}
\subsection{µÕ¥¯¥©¡¼¥È}   %{{{
µÕ¥¯¥©¡¼¥È¡Ê¥Ð¥Ã¥¯¥¯¥©¡¼¥È¡¤backquote¡Ë¤ÏÆÃÊÌ¤Ê¥¯¥©¡¼¥È¤Ç¡¤
Lisp¤Î¼°¤Î¿÷·Á¤òºî¤ë¤Î¤Ë»È¤¨¤ë¡¥
¤½¤ì¤¬°ìÈÖ¤è¤¯»È¤ï¤ì¤ë¤Î¤Ï¥Þ¥¯¥íÄêµÁ¤ÎÃæ¤À¡¥

µÕ¥¯¥©¡¼¥È\,\verb|`|\,¤Ï¡¤ÉáÄÌ¤Î¥¯¥©¡¼¥È\,\verb|'|¤òµÕ¤µ¤Ë¤·¤¿·Á¤Ê¤Î¤Ç¤½¤¦¸Æ¤Ð¤ì¤ë¡¥
µÕ¥¯¥©¡¼¥È¤¬¼°¤ÎÁ°¤ËÉÕ¤¤¤Æ¤¤¤ë¤À¤±¤Î¤È¤­¤Ï¡¤Æ¯¤­¤Ï¥¯¥©¡¼¥È¤ÈÊÑ¤ï¤é¤Ê¤¤¡§
\begin{center}
\verb|`(a b c)|¤Ï\,\verb|'(a b c)|¤ÈÅù²Á¤Ç¤¢¤ë¡¥
\end{center}

µÕ¥¯¥©¡¼¥È¤¬ÊØÍø¤Ê¤Î¤Ï¡¤
¥«¥ó¥Þ\,\verb|,|¤ä¥«¥ó¥Þ¡¦¥¢¥Ã¥È\,\verb|,@|\,¤ÈÁÈ¤ß¹ç¤ï¤»¤Æ»È¤¦¤È¤­¤À¡¥
µÕ¥¯¥©¡¼¥È¤¬¥ê¥¹¥È¤Î¿÷·Á¤Ë¤Ê¤ë¤È¤­¡¤¥«¥ó¥Þ¤Ï¤½¤ÎÃæ¤ËÃÍ¤òÁÞÆþ¤¹¤ë¡¥
µÕ¥¯¥©¡¼¥ÈÉÕ¤­¥ê¥¹¥È¤Ï¡¤³ÆÍ×ÁÇ¤Ë¥¯¥©¡¼¥È¤òÉÕ¤±¤Æ\verb|list|¤ò¸Æ¤Ö¤Î¤ÈÅù²Á¤À¡¥
¤Ä¤Þ¤ê
\begin{center}
\verb|`(a b c)|¤Ï\verb|(list 'a 'b 'c)|¤ÈÅù²Á¤Ç¤¢¤ë¡¥
\end{center}
µÕ¥¯¥©¡¼¥È¤Î¥¹¥³¡¼¥×Æâ¤Ç¤Ï¡¤¥«¥ó¥Þ¤ÏLisp¤Ë¡ÖÉ¾²Á¤ÎÊÝ¸î¤ò»ß¤á¤í¡×¤ÈÌ¿¤¸¤ë¡¥
¥«¥ó¥Þ¤¬¥ê¥¹¥È¤Î¤¢¤ëÍ×ÁÇ¤ÎÁ°¤ËÉÕ¤¯¤È¡¤
¤½¤³¤Ë²¾ÁÛÅª¤ËÉÕ¤±¤é¤ì¤Æ¤¤¤ë¥¯¥©¡¼¥È¤Î¸ú²Ì¤òÂÇ¤Á¾Ã¤¹¡¥
¤À¤«¤é
\begin{center}
\verb|`(a ,b c ,d)|¤Ï\verb|(list 'a b 'c d)|¤ÈÅù²Á¤Ç¤¢¤ë¡¥
\end{center}
¥·¥ó¥Ü¥ë\verb|b|¤ÎÂå¤ï¤ê¤Ë¤½¤ÎÃÍ¤¬ÁÞÆþ¤µ¤ì¤¿¥ê¥¹¥È¤¬ºî¤é¤ì¤ë¡¥
¤É¤ìÄø¿¼¤¯Æþ¤ì»Ò¤Ë¤Ê¤Ã¤¿¥ê¥¹¥ÈÆâ¤Ç¤â¥«¥ó¥Þ¤Ïµ¡Ç½¤¹¤ë¡§
\begin{verbatim}
> (setq a 1 b 2 c 3)
3
> `(a ,b c)
(A 2 C)
> `(a (,b c))
(A (2 C))
\end{verbatim}
¤Þ¤¿¥«¥ó¥Þ¤ÎÁ°¤Ë¥¯¥©¡¼¥È¤¬ÉÕ¤¤¤Æ¤â¤è¤¤¤·¡¤¥¯¥©¡¼¥ÈÉÕ¤­¤ÎÉôÊ¬¥ê¥¹¥ÈÆâ¤Ç»È¤Ã¤Æ¤â¤è¤¤¡§
\begin{verbatim}
> `(a b ,c (',(+ a b c)) (+ a b) 'c '((,a ,b)))
(A B 3 ('6) (+ A B) 'C '((1 2)))
\end{verbatim}

1¸Ä¤Î¥«¥ó¥Þ¤Ï1¸Ä¤ÎµÕ¥¯¥©¡¼¥È¤Î¸ú²Ì¤òÂÇ¤Á¾Ã¤¹¤Î¤À¤«¤é¡¤
¥«¥ó¥Þ¤ÏµÕ¥¯¥©¡¼¥È¤ÈÂÐ±þ¤¬¼è¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤¢¤ëÆÃÄê¤Î¥ª¥Ú¥ì¡¼¥¿¤¬¥«¥ó¥Þ¤ÎÁ°¤ËÉÕ¤¯¤«¡¤¥«¥ó¥Þ¤ò´Þ¤à¼°¤ÎÁ°¤ËÉÕ¤¤¤Æ¤¤¤ë¤È¤­¡¤
¡Ö¥«¥ó¥Þ¤Ï¤½¤Î¥ª¥Ú¥ì¡¼¥¿¤Ë°Ï¤Þ¤ì¤Æ¤¤¤ë¡×¤È¸À¤¦¤³¤È¤Ë¤·¤è¤¦¡¥
Îã¤¨¤Ð\verb|`(,a ,(b `,c)))|¤Ç¤Ï¡¤ºÇ¸å¤Î¥«¥ó¥Þ¤Ï¥«¥ó¥Þ1¸Ä¤ÈµÕ¥¯¥©¡¼¥È2¸Ä¤Ë°Ï¤Þ¤ì¤Æ¤¤¤ë¡¥
°ìÈÌÅª¤Ë¸À¤¦¤È¡§$n$¸Ä¤Î¥«¥ó¥Þ¤Ë°Ï¤Þ¤ì¤¿¥«¥ó¥Þ¤Ï
ºÇÄã$n+1$¸Ä¤ÎµÕ¥¯¥©¡¼¥È¤Ë°Ï¤Þ¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤½¤ì¤«¤éÌÀ¤é¤«¤ËÊ¬¤«¤ë¤Î¤Ï¡¤
¥«¥ó¥Þ¤ÏµÕ¥¯¥©¡¼¥È¤ÎÉÕ¤¤¤¿¼°¤Î³°Â¦¤Ë¤¢¤Ã¤Æ¤Ï¤Ê¤é¤Ê¤¤¤È¤¤¤¦¤³¤È¤À¡¥
µÕ¥¯¥©¡¼¥È¤È¥«¥ó¥Þ¤Ï¡¤¾å¤Îµ¬Â§¤Ë½¾¤¦¸Â¤êÆþ¤ì»Ò¤Ë¤Ê¤Ã¤Æ¤â¤è¤¤¡¥
¼¡¤Î¼°¤Ï¥È¥Ã¥×¥ì¥Ù¥ë¤ËÂÇ¤Á¹þ¤ó¤À¤é¤É¤ì¤â¥¨¥é¡¼¤Ë¤Ê¤ë¡§
\begin{verbatim}
,x   `(a ,,b c)   `(a ,(b ,c) d)   `(,,`a)
\end{verbatim}
µÕ¥¯¥©¡¼¥È¤ÎÃæ¤ÎµÕ¥¯¥©¡¼¥È¤Ï¡¤¥Þ¥¯¥í¤òÄêµÁ¤¹¤ë¥Þ¥¯¥í°Ì¤Ç¤·¤«»È¤ï¤ì¤Ê¤¤¡¥
¤É¤Á¤é¤ÎÅÀ¤Ë¤Ä¤¤¤Æ¤âÂè16¾Ï¤ÇµÄÏÀ¤¹¤ë¡¥

µÕ¥¯¥©¡¼¥È¤ÏÂçÄñ¥ê¥¹¥È¤òºî¤ë¤Î¤Ë»È¤ï¤ì¤ë
\footnote{µÕ¥¯¥©¡¼¥È¤Ï¥Ù¥¯¥¿¤òºî¤ë¤Î¤Ë¤â»È¤¨¤ë¤¬¡¤
¥Þ¥¯¥íÄêµÁÆâ¤Ç¤ÏÌÇÂ¿¤Ë¤½¤¦¤¤¤¦¤³¤È¤Ï¤·¤Ê¤¤¡¥}¡¥
µÕ¥¯¥©¡¼¥È¤Îºî¤ë¥ê¥¹¥È¤Ï\verb|list|¤ÈÉáÄÌ¤Î¥¯¥©¡¼¥È¤ò»È¤Ã¤Æºî¤ë¤³¤È¤â¤Ç¤­¤ë¡¥
µÕ¥¯¥©¡¼¥È¤ò»È¤¦¤³¤È¤ÎÍøÅÀ¤Ï¡¤
µÕ¥¯¥©¡¼¥ÈÉÕ¤­¤Î¼°¤Ï¤½¤ì¤ÎÀ¸À®¤¹¤ë¼°¤È»÷¤Æ¤¤¤ë¤Î¤Ç¼°¤òÆÉ¤ß°×¤¯¤Ç¤­¤ë¤³¤È¤À¡¥
Á°¾Ï¤Ç\verb|nil!|¤ò¼¡¤Î¤è¤¦¤ËÄêµÁ¤·¤¿¡§
\begin{verbatim}
(defmacro nil! (var)
  (list 'setq var nil))
\end{verbatim}
µÕ¥¯¥©¡¼¥È¤ò»È¤¦¤È¡¤Æ±¤¸¥Þ¥¯¥í¤¬¼¡¤Î¤è¤¦¤ËÄêµÁ¤Ç¤­¤ë¡§
\begin{verbatim}
(defmacro nil! (var)
  `(setq ,var nil))
\end{verbatim}
¤³¤Î¾ì¹ç¤Ç¤Ï°ã¤¤¤Ï¤¢¤Þ¤ê¤Ê¤¤¤¬¡¤
¥Þ¥¯¥íÄêµÁ¤¬Ä¹¤¯¤Ê¤ì¤ÐµÕ¥¯¥©¡¼¥È¤ò»È¤¦½ÅÍ×À­¤ÏÁý¤¹¡¥
Âè\ref{fig:Backquote}¤Ë¤Ï¡¤
¿ô¤ÎÉä¹æ¤Ë¤Ä¤¤¤Æ\verb|if|Ê¬´ô¤ò¹Ô¤¦¥Þ¥¯¥í\verb|nif|¤ÎÄêµÁ¤Î¸õÊä¤òÆó¤Ä¼¨¤·¤¿
\footnote{¤³¤Î¥Þ¥¯¥íÄêµÁ¤Ïgensym¤Î»ÈÍÑ¤òÈò¤±¤ë¤¿¤á¤ËÊÑ¤Ê¤ä¤êÊý¤ò¤·¤Æ¤¤¤ë¡¥
¤è¤¤ÄêµÁÊýË¡¤Ïzip¥Ú¡¼¥¸¤Ç¼¨¤¹¡¥}¡¥

Âè1°ú¿ô¤ÏÉ¾²Á¤µ¤ì¤ë¤È¿ô¤Ë¤Ê¤é¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤½¤·¤Æ¤½¤Î¿ô¤«Àµ¤«$0$¤«Éé¤«¤Ë±þ¤¸¤Æ¤½¤ì¤¾¤ìÂè2¡¤3¡¤4°ú¿ô¤¬É¾²Á¤µ¤ì¤ë¡§
\begin{verbatim}
> (mapcar #'(lambda (x)
              (nif x 'p 'z 'n))
          '(0 2.5 -8))
(Z P N)
\end{verbatim}

\begin{figure}\begin{center}
\fbox{~\,\begin{minipage}{\FrameWidth}\narrowbaselines
\vspace{3pt}\hspace{4zw}µÕ¥¯¥©¡¼¥È¤ò»È¤¦¡§
\begin{center}\begin{minipage}{240pt}\texttt{%
(defmacro nif (expr pos zero neg)\\
~~`(case (truncate (signum ,expr))\\
~~~~~(1 ,pos)\\
~~~~~(0 ,zero)\\
~~~~~(-1 ,neg)))
}\end{minipage}\end{center}
\hspace{4zw}µÕ¥¯¥©¡¼¥È¤ò»È¤ï¤Ê¤¤¡§
\begin{center}\begin{minipage}{240pt}\texttt{%
(defmacro nif (expr pos zero neg)\\
~~(list 'case\\
~~~~~~~~(list 'truncate (list 'signum expr))\\
~~~~~~~~(list 1 pos)\\
~~~~~~~~(list 0 zero)\\
~~~~~~~~(list -1 neg)))
}\end{minipage}\end{center}
\vspace{1.3em}\end{minipage}~\,}\end{center}
\caption{¥Þ¥¯¥íÄêµÁ¤ËµÕ¥¯¥©¡¼¥È¤ò»È¤Ã¤¿Îã¤È»È¤ï¤Ê¤¤Îã¡¥}
\label{fig:Backquote}
\end{figure}

Âè\ref{fig:Backquote}¿Þ¤ÎÆó¤Ä¤Î¥Þ¥¯¥íÄêµÁ¤ÏÆ±¤¸¥Þ¥¯¥í¤òÄêµÁ¤·¤Æ¤¤¤ë¡¥
¤¿¤À1ÈÖÌÜ¤ÏµÕ¥¯¥©¡¼¥È¤ò»È¤Ã¤Æ¤¤¤ë¤¬¡¤
2ÈÖÌÜ¤Ç¤Ï\verb|list|¤òÍÛ¤Ë¸Æ¤Ö¤³¤È¤ÇÅ¸³«·Á¤òºî¤Ã¤Æ¤¤¤ë¡¥
ºÇ½é¤ÎÄêµÁ¤«¤é¤Ï¡¤Îã¤¨¤Ð\verb|(nif x 'p 'z 'n)|¤¬
\begin{verbatim}
(case (truncate (signum x))
  (1 'p)
  (0 'z)
  (-1 'n))
\end{verbatim}
¤ËÅ¸³«¤µ¤ì¤ë¤Î¤Ï¤¹¤°Ê¬¤«¤ë¡¥
¥Þ¥¯¥íÄêµÁËÜÂÎ¤Î·Á¤¬¡¤À¸À®¤µ¤ì¤ëÅ¸³«·Á¤Ë¤½¤Ã¤¯¤ê¤À¤«¤é¤À¡¥
µÕ¥¯¥©¡¼¥È¤Î¤Ê¤¤2ÈÖÌÜ¤ÎÄêµÁ¤òÍý²ò¤¹¤ë¤Ë¤Ï¡¤
Å¸³«¤Î²áÄø¤òÆ¬¤ÎÃæ¤ÇÄÉ¤Ã¤Æ¤¤¤«¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥

¥«¥ó¥Þ¡¦¥¢¥Ã¥È\,\verb|,@|\,¤Ï¥«¥ó¥Þ¤ÎÊÑ¼ï¤Ç¡¤µ¡Ç½¤Ï¥«¥ó¥Þ¤ÈÆ±¤¸¤À¤¬°ã¤¤¤¬1ÅÀ¤¢¤ë¡§
¼¡¤ËÂ³¤¯¼°¤ÎÃÍ¤ò¥«¥ó¥Þ¤Î¤è¤¦¤Ë¤½¤Î¤Þ¤ÞÁÞÆþ¤¹¤ë¤Î¤Ç¤Ê¤¯¡¤
¥«¥ó¥Þ¡¦¥¢¥Ã¥È¤ÏÀÚ¤êÄ¥¤êÁàºî¤ò¹Ô¤¦¡¥
¤Ä¤Þ¤ê1ÈÖ³°Â¦¤Î³ç¸Ì¤ò¼è¤ê½ü¤¤¤ÆÁÞÆþ¤¹¤ë¡§
\begin{verbatim}
> (setq b '(1 2 3))
(1 2 3)
> `(a ,b c)
(A (1 2 3) C)
> `(a ,@b c)
(A 1 2 3 C)
\end{verbatim}
¥«¥ó¥Þ¤Ï¥ê¥¹¥È\verb|(1 2 3)|¤ò\verb|b|¤Î½ê¤ËÁÞÆþ¤¹¤ë¤¬¡¤
¥«¥ó¥Þ¡¦¥¢¥Ã¥È¤Ï¤½¤³¤Ë¥ê¥¹¥È¤ÎÍ×ÁÇ¤òÁÞÆþ¤¹¤ë¡¥
¥«¥ó¥Þ¡¦¥¢¥Ã¥È¤ò»È¤¦¤Ë¤Ï´ö¤Ä¤«À©¸Â¤¬¤¢¤ë¡§
\begin{enumerate}
\item °ú¿ô¤ËÀÚ¤êÄ¥¤êÁàºî¤ò¹Ô¤¦¤Î¤Ç¡¤¥«¥ó¥Þ¡¦¥¢¥Ã¥È¤ÏÏ¢Â³¹½Â¤Æâ¤Ë¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
    \verb|`,@b|Åù¤È¤¹¤ë¤Î¤Ï¸í¤ê¤À¡¥
    \verb|b|¤ÎÃÍ¤òÄ¥¤êÉÕ¤±¤ëÀè¤¬¤Ê¤¤¤«¤é¤À¡¥
\item ÀÚ¤êÄ¥¤ê¤µ¤ì¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Ï¡¤ºÇ¸å¤ËÍè¤Ê¤¤¸Â¤ê¥ê¥¹¥È¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
    ¼°\,\verb|`(a ,@1)|¤¬É¾²Á¤µ¤ì¤ë¤È\verb|(a . 1)|¤È¤Ê¤ë¤¬¡¤
    \verb|`(a ,@1 b)|Åù¤È¤·¤Æ¡¤
    ¥¢¥È¥à¤ò¥ê¥¹¥È¤ÎÃæ¤ËÀÚ¤êÄ¥¤ê¤·¤è¤¦¤È¤¹¤ë¤È¥¨¥é¡¼¤Ë¤Ê¤ë¡¥
\end{enumerate}

¥«¥ó¥Þ¡¦¥¢¥Ã¥È¤¬»È¤ï¤ì¤ë¤Î¤Ï¡¤
ÉÔÄê¸Ä¤Î°ú¿ô¤ò¼è¤ê¡¤¤ä¤Ï¤êÉÔÄê¸Ä¤Î°ú¿ô¤ò¼è¤ë´Ø¿ô¤ä¥Þ¥¯¥í¤ËÅÏ¤¹¥Þ¥¯¥í¤ÎÃæ¤¬Â¿¤¤¡¥
ÉáÄÌ¤³¤Î¾õ¶·¤Ï°ÅÌÛ¤Î¥Ö¥í¥Ã¥¯¤ò¼ÂÁõ¤¹¤ë¤È¤­¤Ë¸½¤ì¤ë¡¥
Common Lisp¤Ë¤Ï\verb|block|¡¤\verb|tagbody|¡¤\verb|progn|Åù¡¤
¥³¡¼¥É¤ò¥Ö¥í¥Ã¥¯¤Ë¤Þ¤È¤á¤ë¥ª¥Ú¥ì¡¼¥¿¤¬´ö¤Ä¤«¤¢¤ë¡¥
¤³¤ì¤é¤Î¥ª¥Ú¥ì¡¼¥¿¤Ï¥½¡¼¥¹¡¦¥³¡¼¥ÉÆâ¤Ë¤ÏÌÇÂ¿¤Ë½Ð¤ÆÍè¤Ê¤¤¡¥
¤½¤ì¤é¤Ï°ÅÌÛ¤Ë»È¤ï¤ì¤ë\wadash ¤Ä¤Þ¤ê¡¤¥Þ¥¯¥í¤Ë±£¤µ¤ì¤Æ¤¤¤ë¡¥

°ÅÌÛ¤Î¥Ö¥í¥Ã¥¯¤Ï¼°¤ò¼Â¹ÔËÜÂÎ¤È¤·¤Æ»ý¤Æ¤ëÁÈ¤ß¹þ¤ß¥Þ¥¯¥í¤Ç¤ÏÉ¬¤º»È¤ï¤ì¤Æ¤¤¤ë¡¥
Îã¤¨¤Ð\verb|let|¤È\verb|cond|¤Ë¤Ï°ÅÌÛ¤Î\verb|progn|¤¬»È¤ï¤ì¤Æ¤¤¤ë¡¥
¤½¤ó¤ÊÃæ¤ÇºÇ¤âÃ±½ã¤ÊÁÈ¤ß¹þ¤ß¥Þ¥¯¥í¤Ï\verb|when|¤À¤í¤¦¡§
\begin{verbatim}
(when (eligible obj)
  (do-this)
  (do-that)
  obj)
\end{verbatim}
\verb|(eligible obj)|¤¬¿¿¤òÊÖ¤¹¤È¤­»Ä¤ê¤Î¼°¤¬É¾²Á¤µ¤ì¡¤
\verb|when|¤¬¼°¤È¤·¤ÆÊÖ¤¹ÃÍ¤Ï¤½¤Î¤¦¤ÁºÇ¸å¤Î¼°¤ÎÃÍ¤À¡¥
¥³¥ó¥Þ¡¦¥¢¥Ã¥È¤ò»È¤Ã¤¿Îã¤È¤·¤Æ¡¤¤³¤³¤Ë\verb|when|¤ÎÄêµÁÊýË¡¤Î°ìÎã¤ò¼¨¤¹¡§
\begin{verbatim}
(defmacro our-when (test &body body)
  `(if ,test
       (progn
         ,@body)))
\end{verbatim}
¤³¤ÎÄêµÁ¤Ï\,\verb|&body|²¾°ú¿ô¤ò»È¤Ã¤Æ¤¤¤ë¤¬¡¤
¤³¤ì¤ÏÉ½¼¨À°·Á(pretty-printing)¤Î¸ú²Ì¤ò½ü¤¤¤Æ\,\verb|&rest|¤ÈÆ±¤¸¤Ç¡¤
Ç¤°Õ¸Ä¤Î°ú¿ô¤¬¼è¤ì¤ë¤è¤¦¤Ë¤·¤Æ¤¤¤ë¡¥
¤Þ¤¿¤½¤ì¤é¤ò¼°\verb|progn|¤ÎÃæ¤ËÀÚ¤êÄ¥¤ê¤¹¤ë¤¿¤á¤Ë¥«¥ó¥Þ¡¦¥¢¥Ã¥È¤ò»È¤Ã¤Æ¤¤¤ë¡¥
¾å¤Î¸Æ¤Ó½Ð¤·¤Ç¤ÎÅ¸³«·Á¤Ç¤Ï¡¤ËÜÂÎ¤Î3¸Ä¤Î¼°¤Ï1¸Ä¤Î\verb|progn|¤ÎÃæ¤Ë¸½¤ì¤ë¡§
\begin{verbatim}
(if (eligible obj)
    (progn (do-this)
           (do-that)
           obj))
\end{verbatim}
·«¤êÊÖ¤·¤ò¹Ô¤¦¥Þ¥¯¥í¤ÎÂçÈ¾¤Ï»÷¤¿ÊýË¡¤Ç°ú¿ô¤òÀÚ¤êÄ¥¤ê¤¹¤ë¡¥

¥«¥ó¥Þ¡¦¥¢¥Ã¥È¤Î¸ú²Ì¤ÏµÕ¥¯¥©¡¼¥È¤ò»È¤ï¤Ê¤¯¤Æ¤â¼Â¸½¤Ç¤­¤ë¡¥
Îã¤¨¤Ð¼°\,\verb|`(a ,@b c)|¤Ï\verb|(cons 'a|  \verb|(append b|  \verb|(list 'c)))|¤ÈÅù²Á¤À¡¥
¥«¥ó¥Þ¡¦¥¢¥Ã¥È¤ÎÂ¸ºßÍýÍ³¤Ï¾å¤Î¤è¤¦¤Ë¼°¤òÀ¸À®¤¹¤ë¼°¤òÆÉ¤ß°×¤¯¤¹¤ë¤³¤È¤À¤±¤À¡¥

¥Þ¥¯¥íÄêµÁ¤Ï¡ÊÉáÄÌ¡Ë¥ê¥¹¥È¤òÀ¸À®¤¹¤ë¡¥
¥Þ¥¯¥íÅ¸³«¤Ï´Ø¿ô¥ê¥¹¥È¤ò»È¤Ã¤Æ¤âºî¤ì¤ë¤¬¡¤
µÕ¥¯¥©¡¼¥È¤ò»È¤Ã¤¿¥ê¥¹¥È¤Î¿÷·Á¤Ï»Å»ö¤ò¿ïÊ¬³Ú¤Ë¤·¤Æ¤¯¤ì¤ë¡¥
\verb|defmacro|¤ÈµÕ¥¯¥©¡¼¥È¤ÇÄêµÁ¤·¤¿¥Þ¥¯¥í¤Ï¡¤
É½ÌÌÅª¤Ë¤Ï\verb|defun|¤ÇÄêµÁ¤·¤¿´Ø¿ô¤Ë»÷¤Æ¤¤¤ë¡¥
¤³¤ÎÎà»÷À­¤Ë¥ß¥¹¥ê¡¼¥É¤µ¤ì¤Ê¤¤¸Â¤ê¡¤
µÕ¥¯¥©¡¼¥È¤Ë¤è¤Ã¤Æ¥Þ¥¯¥í¤ò½ñ¤¯¤Î¤âÆÉ¤à¤Î¤â³Ú¤Ë¤Ê¤ë¡¥

µÕ¥¯¥©¡¼¥È¤Ï¥Þ¥¯¥íÄêµÁ¤ÎÃæ¤ÇÈó¾ï¤Ë¤è¤¯»È¤ï¤ì¤ë¤Î¤Ç¡¤
\verb|defmacro|¤Î°ìÉô¤À¤È»×¤Ã¤Æ¤¤¤ë¿Í¤â¤¤¤ë¡¥
µÕ¥¯¥©¡¼¥È¤Ë¤Ä¤¤¤ÆËº¤ì¤Æ¤Ï¤¤¤±¤Ê¤¤¤³¤È¤ÎºÇ¸å¤Ï¡¤
¤½¤ì¤¬¥Þ¥¯¥íÆâ¤Ç¤ÎÌò³ä¤È¤ÏÊÌ¤Ë¼«Ê¬¼«¿È¤ÎÀ¸¤­Êý¤¬¤¢¤ë¤È¤¤¤¦¤³¤È¤À¡¥
Ï¢Â³¹½Â¤¤òÀ¸À®¤¹¤ëÉ¬Í×¤Î¤¢¤ë¤È¤­¤Ë¤Ï¡¤¤¤¤Ä¤Ç¤âµÕ¥¯¥©¡¼¥È¤¬»È¤¨¤ë¡§
\begin{verbatim}
(defun greet (name)
  `(hello ,name))
\end{verbatim}
%}}}
\subsection{Ã±½ã¤Ê¥Þ¥¯¥í¤ÎÄêµÁ}   %{{{
¥×¥í¥°¥é¥ß¥ó¥°¤Î³Ø½¬¤Ç¤Ï¡¤
¤Ç¤­¤ë¤À¤±Áá¤¯¼Â¸³¤¹¤ë¤³¤È¤¬°ìÈÖ¤ÎÊýË¡¤Ç¤¢¤ë¤³¤È¤¬Â¿¤¤¡¥
ÍýÏÀÅª¤Ë´°Á´¤ËÍý²ò¤¹¤ë¤Î¤Ï¸å¤Ç¤â¤¤¤¤¡¥
¤½¤ì¤Ë½¾¤Ã¤Æ¡¤¤³¤Î¾Ï¤Ç¤Ï¥Þ¥¯¥í¤ò¤¹¤°¤Ë½ñ¤­»Ï¤á¤ëÊýË¡¤òÄó¼¨¤¹¤ë¡¥
¤½¤ÎÊýË¡¤¬»È¤¨¤ëÈÏ°Ï¤Ï¹­¤¯¤Ï¤Ê¤¤¤¬¡¤²ÄÇ½¤Ê¤È¤³¤í¤Ç¤Ïµ¡³£Åª¤ËÅ¬ÍÑ¤Ç¤­¤ë¡¥
¡Ê¤â¤¦¥Þ¥¯¥í¤ò½ñ¤¤¤¿·Ð¸³¤¬¤¢¤ë¤Î¤Ê¤é¡¤¤³¤Î¾Ï¤ÏÈô¤Ð¤·¤Æ¤â¤è¤¤¡¥¡Ë

Îã¤È¤·¤ÆCommon Lisp¤ÎÁÈ¤ß¹þ¤ß´Ø¿ô\verb|member|¤ÎÊÑ¼ï¤ò½ñ¤¯ÊýË¡¤Ë¤Ä¤¤¤Æ¹Í¤¨¤ë¡¥
ÉáÄÌ\verb|member|¤Ï2¸Ä¤Î¥ª¥Ö¥¸¥§¥¯¥È¤¬Åù¤·¤¤¤«¤É¤¦¤«Ä´¤Ù¤ë¤Î¤Ë\verb|eql|¤ò»È¤¦¡¥
\verb|eq|¤ò»È¤Ã¤Æ½êÂ°´Ø·¸¤òÄ´¤Ù¤¿¤¤¤È¤­¤Ë¤Ï¡¤¤ï¤¶¤ï¤¶»ØÄê¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡§
\begin{verbatim}
(member x choices :test #'eq)
\end{verbatim}
¤³¤ì¤ò²¿ÅÙ¤â·«¤êÊÖ¤¹¤³¤È¤¬¤¢¤ë¤Ê¤é¡¤
É¬¤º\verb|eq|¤ò»È¤¦\verb|member|¤ÎÊÑ¼ï¤ò½ñ¤¤¤Æ¤â¤¤¤¤¤À¤í¤¦¡¥
´ö¤Ä¤«¤ÎÀÎ¤ÎLispÊý¸À¤Ë¤Ï¤½¤ó¤Ê´Ø¿ô¤¬¤¢¤ê¡¤\verb|memq|¤È¸Æ¤Ð¤ì¤Æ¤¤¤¿¡§
\begin{verbatim}
(memq x choices)
\end{verbatim}
ÉáÄÌ\verb|memq|¤Ï¥¤¥ó¥é¥¤¥ó´Ø¿ô¤È¤·¤ÆÄêµÁ¤µ¤ì¤ë¤¬¡¤
¥Þ¥¯¥í¤ÎÎã¤ò¼¨¤¹¤¿¤á¡¤¤³¤³¤Ç¤Ï¥Þ¥¯¥í¤È¤·¤ÆÉü³è¤µ¤»¤ë¡¥

\begin{figure}\begin{center}
\fbox{~\,\begin{minipage}{\FrameWidth}\begin{center}
\vspace*{3pt}¸Æ¤Ó½Ð¤·¡§\texttt{(memq x choices)}\\[3pt]
¤½¤ÎÅ¸³«·Á¡§\texttt{(member x choices :test \#'eq)}%
\begin{picture}(1,1)
\put(-106,6){\line(3,2){16}}
\put(-76,6){\line(3,2){16}}
\end{picture}
\end{center}\vspace{1.3em}\end{minipage}~\,}\end{center}
\caption{\texttt{memq}¤ò½ñ¤¯¤Î¤Ë»È¤ï¤ì¤¿Àþ¿Þ¡¥}
\label{fig:DiagramMemq}
\end{figure}

¤µ¤ÆÊýË¡¤È¤Ï¡§
¤Þ¤ºÄêµÁ¤·¤¿¤¤¥Þ¥¯¥í¤ÎÅµ·¿Åª¤Ê¸Æ¤Ó½Ð¤·Êý¤«¤é»Ï¤á¤ë¡¥
¥á¥âÍÑ»æ¤Ë¤½¤ì¤ò½ñ¤­¡¤¤½¤Î²¼¤Ë¤½¤ì¤¬Å¸³«¤µ¤ì¤Æ¤Ç¤­¤ëÈ¦¤Î¼°¤ò½ñ¤¯¡¥
Âè\ref{fig:DiagramMemq}¿Þ¤Ë¤½¤Î¤è¤¦¤Ê2¸Ä¤Î¼°¤ÎÎã¤ò¼¨¤·¤¿¡¥
¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ë½¾¤¤¡¤¤³¤ì¤«¤é½ñ¤¯¥Þ¥¯¥í¤Î²¾°ú¿ô¥ê¥¹¥È¤òºî¤ë¡¥
°ú¿ô¤½¤ì¤¾¤ì¤Ë¤Ä¤¤¤ÆÅ¬Åö¤Ê²¾°ú¿ôÌ¾¤ò¹Í¤¨¤ë¡¥
¤³¤Î¾ì¹ç°ú¿ô¤¬2¸Ä¤¢¤ë¤Î¤Ç²¾°ú¿ô¤ò2¸Ä»È¤¦¡¥
¤½¤ì¤é¤ò\verb|obj|¤È\verb|lst|¤È¸Æ¤Ü¤¦¡§
\begin{verbatim}
(defmacro memq (obj lst)
\end{verbatim}
¤½¤·¤ÆÀèÄø½ñ¤¤¤¿2¸Ä¤Î¼°¤ËÌá¤ë¡¥
¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤ÎÃæ¤Î°ú¿ô¤½¤ì¤¾¤ì¤«¤é¡¤
²¼¤ÎÅ¸³«·Á¤ÎÃæ¤Ç»È¤ï¤ì¤Æ¤¤¤ë¾ì½ê¤Þ¤ÇÀþ¤ò°ú¤¯¡¥
Âè\ref{fig:DiagramMemq}¿Þ¤Ë¤ÏÊ¿¹Ô¤Ê2ËÜ¤ÎÀþ¤¬°ú¤¤¤Æ¤¢¤ë¡¥
¥Þ¥¯¥íËÜÂÎ¤ò½ñ¤¯¤Ë¤ÏÅ¸³«·Á¤ËÃí°Õ¤ò¸þ¤±¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¡¥
¤Þ¤ºµÕ¥¯¥©¡¼¥È¤«¤éËÜÂÎ¤ò½ñ¤­»Ï¤á¤ë¡¥
¼¡¤ËÅ¸³«·Á¤ò¼°Ëè¤Ë¶èÀÚ¤Ã¤ÆÆÉ¤ó¤Ç¤¤¤¯¡¥
¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Î°ú¿ô¤Î°ìÉô¤Ç¤Ê¤¤³ç¸Ì¤ò¸«¤Ä¤±¤¿¤é¡¤¥Þ¥¯¥íÄêµÁÆâ¤Ë¤â³ç¸Ì¤ò½ñ¤¯¡¥
¤¹¤ë¤ÈµÕ¥¯¥©¡¼¥È¤Î¼¡¤Ë¤Ïº¸³ç¸Ì¤¬Íè¤ë¡¥
¤½¤¦¤·¤¿¤éÅ¸³«·Á¤Î¼°¤½¤ì¤¾¤ì¤Ë¤Ä¤¤¤Æ
\begin{enumerate}
\item ¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤ÈÀþ¤Ç¤Ä¤Ê¤¬¤Ã¤Æ¤Ê¤±¤ì¤Ð¡¤¤½¤Î¼°¤½¤Î¤â¤Î¤ò½ñ¤¯¡¥
\item ¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Î°ú¿ô¤Î°ì¤Ä¤È¤Ä¤Ê¤¬¤Ã¤Æ¤¤¤ì¤Ð¡¤
    ¥Þ¥¯¥í¤Î²¾°ú¿ô¥ê¥¹¥ÈÆâ¤ÇÂÐ±þ¤¹¤ë¥·¥ó¥Ü¥ë¤ò½ñ¤­¡¤¤½¤ÎÁ°¤Ë¥«¥ó¥Þ¤òÉÕ¤±¤ë¡¥
\end{enumerate}
Âè1Í×ÁÇ\verb|member|¤Ï¤É¤³¤Ë¤â¤Ä¤Ê¤¬¤Ã¤Æ¤¤¤Ê¤¤¤Î¤Ç¡¤
\verb|member|¤½¤Î¤â¤Î¤ò»È¤¦¡§
\begin{verbatim}
(defmacro memq (obj lst)
  `(member
\end{verbatim}
¤·¤«¤·\verb|x|¤«¤é¤Ï¸µ¤Î¼°¤ÎÂè1°ú¿ô¤ËÀþ¤¬°ú¤¤¤Æ¤¢¤ë¤Î¤Ç¡¤
¥Þ¥¯¥íËÜÂÎ¤ÎÃæ¤Ë¥«¥ó¥Þ¤òÉÕ¤±¤¿Âè1°ú¿ô¤òÃÖ¤¯¡§
\begin{verbatim}
(defmacro memq (obj lst)
  `(member ,obj
\end{verbatim}
¤³¤ÎÍ×ÎÎ¤ÇÂ³¤±¤Æ¤¤¤¯¤È¼¡¤Î¤è¤¦¤Ê¥Þ¥¯¥íÄêµÁ¤¬´°À®¤¹¤ë¡§
\begin{verbatim}
(defmacro memq (obj lst)
  `(member ,obj ,lst :test #'eq))
\end{verbatim}

¤³¤ì¤Þ¤Ç¤Î¤È¤³¤í¡¤·è¤Þ¤Ã¤¿¿ô¤Î°ú¿ô¤ò¼è¤ë¥Þ¥¯¥í¤À¤±¤ò½ñ¤¤¤Æ¤­¤¿¡¥
¤µ¤Æº£½ñ¤­¤¿¤¤¤Î¤Ï\verb|while|¤À¤È¤·¤è¤¦¡¥
¤³¤ì¤Ï¥Æ¥¹¥È¼°¤ÈËÜÂÎ¤È¤Ê¤ë´ö¤é¤«¤Î¼°¤ò°ú¿ô¤Ë¼è¤ê¡¤
¥Æ¥¹¥È¼°¤¬¿¿¤òÊÖ¤¹¸Â¤ê¤½¤Î¼°¤ò·«¤êÊÖ¤·¼Â¹Ô¤¹¤ë¡¥
Âè\ref{fig:DiagramWhile}¿Þ¤ËÇ­¤Î¿¶¤ëÉñ¤¤¤òÉÁ¼Ì¤·¤¿\verb|while|¥ë¡¼¥×¤ÎÎã¤ò¼¨¤·¤¿¡¥

\begin{figure}\begin{center}
\fbox{~\,\begin{minipage}{\FrameWidth}\begin{center}
\vspace*{3pt}\begin{minipage}{120pt}\narrowbaselines
\texttt{(while hungry\\
~~(stare-intently)\\
~~(meow)\\
~~(rub-against-legs))}\\
\begin{picture}(1,1)% ¹ÔÁ÷¤ê¤Ï12pt¤Ë¤Ê¤Ã¤Æ¤ë
\put(69,50){\line(1,0){26}}
\put(95,14){\oval(40,72)[r]}
\put(95,-22){\line(-1,0){21}}
\put(15,26){\line(-1,0){10}}% ¤³¤³¤«¤éº¸
\put(15,26){\oval(22,24)[l]}
\put(5,-10){\oval(40,72)[l]}
\put(15,-46){\oval(22,24)[l]}
\put(5,-46){\line(1,0){10}}
\end{picture}\\
\texttt{(do ()\\
~~((not hungry))\\
~~(stare-intently)\\
~~(meow)\\
~~(rub-against-legs))}
\end{minipage}
\end{center}\vspace{1.3em}\end{minipage}~\,}\end{center}
\caption{\texttt{while}¤ò½ñ¤¯¤Î¤Ë»È¤ï¤ì¤¿Àþ¿Þ¡¥}
\label{fig:DiagramWhile}
\end{figure}

¤½¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤ò½ñ¤¯¤Ë¤Ï¡¤ÀèÄø¤ÎÊýË¡¤ò¾¯¤·½¤Àµ¤¹¤ëÉ¬Í×¤¬¤¢¤ë¡¥
¤Þ¤ºÁ°¤ÈÆ±¤¸¤è¤¦¤Ë¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤ÎÎã¤ò½ñ¤¯¤³¤È¤«¤é»Ï¤á¤ë¡¥
¤½¤ì¤«¤é¥Þ¥¯¥í¤Î²¾°ú¿ô¥ê¥¹¥È¤ò½ñ¤¯¤Î¤À¤¬¡¤
Ç¤°Õ¸Ä¤Î°ú¿ô¤ò¼è¤ê¤¿¤¤¤È¤³¤í¤Ç¤Ï
\,\verb|&rest|¤Þ¤¿¤Ï\,\verb|&body|¤Î¼¡¤Ë²¾°ú¿ô¤òÃÖ¤¯¡§
\begin{verbatim}
(defmacro while (test &body body)
\end{verbatim}
¤µ¤ÆÅ¸³«¤µ¤ì¤ëÈ¦¤Î·Á¤ò¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Î²¼¤Ë½ñ¤­¡¤
Á°¤ÈÆ±¤¸¤è¤¦¤Ë¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Î°ú¿ô¤òÅ¸³«·ÁÆâ¤Î¾ì½ê¤Þ¤Ç¤Ä¤Ê¤°Àþ¤ò°ú¤³¤¦¡¥
¤·¤«¤·´ö¤Ä¤«¤Î°ú¿ô¤¬
Ã±°ì¤Î\verb|&rest|¤Þ¤¿¤Ï\verb|&body|²¾°ú¿ô¤È¤·¤ÆµÍ¤á¹þ¤Þ¤ì¤ë¤È¤­¤Ï¡¤
¤½¤ì¤é¤ò²ô¤È¤·¤Æ°·¤¤¡¤°ú¤¯Àþ¤Ï¤½¤ì¤éÁ´ÂÎ¤ËÂÐ¤·¤Æ1ËÜ¤Ë¤¹¤ë¡¥
·ë²Ì¤ÎÀþ¿Þ¤ÏÂè\ref{fig:DiagramWhile}¿Þ¤Ë¼¨¤·¤¿¡¥

¤½¤·¤Æ¥Þ¥¯¥íÄêµÁ¤ÎËÜÂÎ¤ò½ñ¤¯¤Ë¤ÏÅ¸³«·Á¤ò»²¹Í¤ËÁ°¤ÈÆ±¤¸¤³¤È¤ò¤¹¤ë¤¬¡¤
ÀèÄø¤Î2¸Ä¤Ë²Ã¤¨¤â¤¦1¸Ä¤Îµ¬Â§¤¬É¬Í×¤À¡§
\begin{enumerate}
\setcounter{enumi}{2}
\item Å¸³«·ÁÆâ¤Î´ö¤Ä¤«¤Î¼°¤«¤é¥Þ¥¯¥í¸Æ¤Ó½Ð¤·Æâ¤Î´ö¤Ä¤«¤Î°ú¿ô¤Ø¤Ä¤Ê¤¬¤ëÀþ¤¬¤¢¤ì¤Ð¡¤
    ÂÐ±þ¤¹¤ë\,\verb|&rest|¡Ê¤Þ¤¿¤Ï\,\verb|&body|¡Ë²¾°ú¿ô¤ò½ñ¤­¡¤
    ¤½¤ÎÁ°¤Ë¥«¥ó¥Þ¡¦¥¢¥Ã¥È¤òÃÖ¤¯¡¥
\end{enumerate}
·ë¶É¥Þ¥¯¥íÄêµÁ¤Ï°Ê²¼¤Î¤è¤¦¤Ë¤Ê¤ë¡§
\begin{verbatim}
(defmacro while (test &body body)
  `(do ()
     ((not ,test))
     ,@body))
\end{verbatim}
¼°¤òËÜÂÎ¤È¤·¤Æ»ý¤Ä¥Þ¥¯¥í¤ò½ñ¤¯¤Ë¤Ï¡¤´ö¤Ä¤«¤Î²¾°ú¿ô¤¬Ï³ÅÍ¤È¤·¤ÆÆ¯¤¯É¬Í×¤¬¤¢¤ë¡¥
¤³¤³¤Ç¤Ï¥Þ¥¯¥í¸Æ¤Ó½Ð¤·Æâ¤ÎÊ£¿ô¤Î°ú¿ô¤¬ËÜÂÎ¤Ë¤Þ¤È¤á¤é¤ì¡¤
ËÜÂÎ¤¬Å¸³«·Á¤ÎÃæ¤ËÀÚ¤êÄ¥¤ê¤µ¤ì¤ë¤È¤­¤ËºÆ¤ÓÊ¬²ò¤µ¤ì¤Æ¤¤¤ë¡¥

¤³¤Î¾Ï¤ÇÀâÌÀ¤·¤¿¼êË¡¤ò»È¤¨¤Ð¡¤ºÇ¤âÃ±½ã¤Ê¥Þ¥¯¥í\wadash
²¾°ú¿ô¤òÊÂ¤ÓÂØ¤¨¤ë¤À¤±¤Î¤â¤Î\wadash ¤ò½ñ¤¯¤³¤È¤¬¤Ç¤­¤ë¡¥
¤·¤«¤·¥Þ¥¯¥í¤ÎÎÏ¤Ï¤½¤ó¤Ê¤â¤Î¤Ç¤Ï¤Ê¤¤¡¥
Âè7.7Àá¤Ç¤Ï¡¤Å¸³«·Á¤¬¤¿¤À¤ÎµÕ¥¯¥©¡¼¥ÈÉÕ¤­¥ê¥¹¥È¤Ç¤ÏÉ½¸½¤Ç¤­¤Ê¤¤¤è¤¦¤ÊÎã¤ò¼¨¤¹¡¥
¤½¤¦¤¤¤¦¥Þ¥¯¥í¤òÅ¸³«¤¹¤ë¤Ë¤Ï¥Þ¥¯¥í¼«¿È¤¬¥×¥í¥°¥é¥à¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
%}}}
\subsection{¥Þ¥¯¥íÅ¸³«¤Î³ÎÇ§}   %{{{
¥Þ¥¯¥í¤ò½ñ¤¯¤Î¤¬½ª¤ï¤Ã¤¿¤é¡¤¤É¤¦¤ä¤Ã¤Æ¤½¤ÎÆ°ºî¤ò³Î¤«¤á¤è¤¦¡©
\verb|memq|¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤ÏÃ±½ã¤À¤«¤é¡¤¤Á¤ç¤Ã¤È¸«¤ì¤Ð¤½¤ÎÆ°ºî¤¬Ê¬¤«¤ë¡¥
¹¹¤ËÊ£»¨¤Ê¥Þ¥¯¥í¤ò½ñ¤¯¤È¤­¤Ï¡¤¤½¤ì¤¬Àµ¤·¤¯Å¸³«¤µ¤ì¤ë¤Î¤«³ÎÇ§¤Ç¤­¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
> (defmacro while (test &body body)
    `(do ()
       ((not ,test))
       ,@body))
WHILE
> (pprint (macroexpand '(while (able) (laugh))))
(BLOCK NIL
       (LET NIL
            (TAGBODY
              #:G61
              (IF (NOT (ABLE)) (RETURN NIL))
              (LAUGH)
              (GO #:G61))))
T
> (pprint (macroexpand-1 '(while (able) (laugh))))
(DO NIL
    ((NOT (ABLE)))
    (LAUGH))
T
\end{FramedVerb}\end{center}
\caption{1¸Ä¤Î¥Þ¥¯¥í¤È¤½¤Î2ÃÊ³¬¤ÎÅ¸³«¡¥}
\label{fig:Macroexpand}
\end{figure}

Âè\ref{fig:Macroexpand}¿Þ¤Ë¤Ï¡¤1¸Ä¤Î¥Þ¥¯¥íÄêµÁ¤È¤½¤Î2ÄÌ¤ê¤ÎÅ¸³«·Á¤ò¼¨¤·¤¿¡¥
ÁÈ¤ß¹þ¤ß´Ø¿ô\verb|macroexpand|¤Ï»Ø´ø¤ò°ú¿ô¤Ë¼è¤ê¡¤¤½¤ì¤ò¥Þ¥¯¥íÅ¸³«¤·¤¿¤â¤Î¤òÊÖ¤¹¡¥
¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤ò\verb|macroexpand|¤ËÅÏ¤¹¤È¡¤
¤½¤ì¤¬É¾²ÁÁ°¤ËºÇ½ªÅª¤Ë¤É¤Î¤è¤¦¤ËÅ¸³«¤µ¤ì¤ë¤Î¤«¤¬Ê¬¤«¤ë¡¥
¤·¤«¤·´°Á´¤ÊÅ¸³«·Á¤Ï¥Þ¥¯¥í¤Î³ÎÇ§¤Ç¤ÏÉ¬¤º¤·¤âË¾¤Þ¤·¤¤¤â¤Î¤Ç¤Ï¤Ê¤¤¡¥
ÌäÂê¤Î¥Þ¥¯¥í¤¬ÊÌ¤Î¥Þ¥¯¥í¤ò»È¤Ã¤Æ¤¤¤ë¤ÈÅ¸³«¤¬¿Ê¤ß¤¹¤®¤Æ¤·¤Þ¤¦¤Î¤Ç¡¤
´°Á´¤ÊÅ¸³«·Á¤ÏÆÉ¤ß¤Å¤é¤¤¤³¤È¤¬¤¢¤ë¡¥

Âè\ref{fig:Macroexpand}¿Þ¤Î1ÈÖÌÜ¤Î¼°¤«¤é¤Ï¡¤
\verb|while|¤¬°Õ¿Þ¤·¤¿ÄÌ¤ê¤ËÅ¸³«¤µ¤ì¤¿¤«¤É¤¦¤«¤ÏÈ½ÃÇ¤·¿É¤¤¡¥
ÁÈ¤ß¹þ¤ß¥Þ¥¯¥í¤Î\verb|do|¤¬\verb|prog|¤ËÅ¸³«¤µ¤ì¡¤¤µ¤é¤Ë¤½¤ì¤âÅ¸³«¤µ¤ì¤Æ¤¤¤ë¤«¤é¤À¡¥
¤³¤³¤ÇÉ¬Í×¤Ê¤Î¤Ï1ÃÊ³¬¤À¤±Å¸³«¤·¤¿·ë²Ì¤ò¸«¤ëÊýË¡¤À¡¥
¤½¤ì¤¬2ÈÖÌÜ¤ÎÎã¤Ë¼¨¤·¤¿ÁÈ¤ß¹þ¤ß´Ø¿ô\verb|macroexpand-1|¤ÎÌÜÅª¤À¡¥
\verb|macroexpand-1|¤Ï1ÃÊ³¬¤À¤±¥Þ¥¯¥í¤òÅ¸³«¤¹¤ë¤È¡¤
¤½¤ì¤¬°ÍÁ³¤È¤·¤Æ¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ç¤¢¤Ã¤Æ¤âÆ°ºî¤ò»ß¤á¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro mac (expr)
  `(pprint (macroexpand-1 ',expr)))
\end{FramedVerb}\end{center}
\caption{¥Þ¥¯¥íÅ¸³«³ÎÇ§ÍÑ¤Î¥Þ¥¯¥í¡¥}
\label{fig:TestExpand}
\end{figure}

¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤ÎÅ¸³«·Á¤ò¸«¤¿¤¤¤È¤­¡¤¤¤¤Ä¤â
\begin{verbatim}
(pprint (macroexpand-1 '(or x y)))
\end{verbatim}
¤ÈÂÇ¤Á¹þ¤à¤Î¤ÏÇÏ¼¯¤é¤·¤¤¡¥
Âè\ref{fig:TestExpand}¿Þ¤Î¿·¤·¤¤¥Þ¥¯¥í¤ò»È¤¦¤Ê¤é¡¤Âå¤ï¤ê¤Ë¤³¤¦¤¹¤ì¤Ð¤è¤¤¡§
\begin{verbatim}
(mac (or x y))
\end{verbatim}

¥Ç¥Ð¥Ã¥°¤ò¿Ê¤á¤ë¤È¤­¤ÎÄêÀÐ¤Ï¡¤´Ø¿ô¤Ï¸Æ¤Ó½Ð¤¹¤³¤È¡¤¥Þ¥¯¥í¤ÏÅ¸³«¤¹¤ë¤³¤È¤À¡¥
¤·¤«¤·¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ï2ÁØ¤ËÅÏ¤ëÌ¿Îá¤¬´Ø¤ï¤ë¤Î¤Ç¡¤¸í¤ê¤Îµ¯¤­¤ë¾ì½ê¤â2²Õ½ê¤¢¤ë¡¥
¥Þ¥¯¥í¤ÎÆ°ºî¤¬¤ª¤«¤·¤¤¤È¤­¤Ï¡¤ÂçÄñ¤ÏÅ¸³«·Á¤ò¸«¤ë¤À¤±¤Ç´Ö°ã¤¤¤¬¸«¤Ä¤«¤ë¡¥
¤·¤«¤·¡¤´õ¤ËÅ¸³«·Á¤Ë¤ÏÌäÂê¤Ê¤¤¤è¤¦¤Ë¸«¤¨¤Æ¡¤
ÌäÂê¤¬¤É¤³¤Çµ¯¤­¤ë¤Î¤«¤ò¸«¤ë¤¿¤á¤Ë¤½¤ì¤òÉ¾²Á¤·¤¿¤¤¤È¤­¤â¤¢¤ë¡¥
Å¸³«·Á¤Ë¥Õ¥ê¡¼ÊÑ¿ô¤¬´Þ¤Þ¤ì¤ë¤È¤­¤Ï¡¤Àè¤Ë¤½¤ì¤é¤òÀßÄê¤·¤¿¤¤¤³¤È¤â¤¢¤ë¤À¤í¤¦¡¥
½èÍý·Ï¤Ë¤è¤Ã¤Æ¤Ï¡¤Å¸³«·Á¤ò¥³¥Ô¡¼¤·¤Æ¥È¥Ã¥×¥ì¥Ù¥ë¤ËÅ½¤êÉÕ¤±¤¿¤ê¡¤
Å¸³«·Á¤òÁªÂò¤·¤Æ¥á¥Ë¥å¡¼¤«¤é\verb|eval|¤òÁª¤ó¤ÇÉ¾²Á¤µ¤»¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
¤É¤¦¤·¤Æ¤âÌäÂê¤¬ÄÏ¤á¤Ê¤¤¤È¤­¤Ï¡¤Å¬Åö¤ÊÊÑ¿ô¤ò\verb|macroexpand-1|¤ÎÊÖ¤¹¥ê¥¹¥È¤ËÀßÄê¤·¡¤
¤½¤ì¤ËÂÐ¤·¤Æ\verb|eval|¤ò¸Æ¤Ö¤³¤È¡§
\begin{verbatim}
> (setq exp (macroexpand-1 '(memq 'a '(a b c))))
(MEMBER (QUOTE A) (QUOTE (A B C)) :TEST (FUNCTION EQ))
> (eval exp)
(A B C)
\end{verbatim}

ºÇ¸å¤Ë¡¤¥Þ¥¯¥íÅ¸³«¤ÏÃ±¤Ê¤ë¥Ç¥Ð¥Ã¥°¤ÎÊä½õ¼êÃÊ¤Ç¤Ï¤Ê¤¯¡¤
¥Þ¥¯¥í¤Î½ñ¤­Êý¤ÎÊÙ¶¯¼êÃÊ¤Ç¤â¤¢¤ë¤³¤È¤ò¸À¤Ã¤Æ¤ª¤­¤¿¤¤¡¥
Common Lisp¤Ë¤Ï100°Ê¾å¤ÎÁÈ¤ß¹þ¤ß¥Þ¥¯¥í¤¬¤¢¤ê¡¤Ãæ¤Ë¤ÏÂçÊÑÊ£»¨¤Ê¤â¤Î¤â¤¢¤ë¡¥
¤½¤ó¤Ê¥Þ¥¯¥í¤ÎÅ¸³«·Á¤ò¸«¤ë¤³¤È¤Ç¡¤¤½¤ì¤é¤¬¤É¤¦½ñ¤«¤ì¤¿¤Î¤«¤¬Ê¬¤«¤ë¤³¤È¤âÂ¿¤¤¡¥
%}}}
\subsection{°ú¿ô¥ê¥¹¥È¤Î¹½Â¤²½ÂåÆþ}   %{{{
¹½Â¤²½ÂåÆþ(destructuring)¤È¤Ï¡¤´Ø¿ô¸Æ¤Ó½Ð¤·¤Ë¤è¤Ã¤Æ¹Ô¤ï¤ì¤ë°ì¼ï¤ÎÂåÆþ
\footnote{¹½Â¤²½ÂåÆþ¤ÏÂçÄñ¡¤ÂåÆþ¤ò¹Ô¤¦¤Î¤Ç¤Ê¤¯Â«Çû¤òºî¤ë¥ª¥Ú¥ì¡¼¥¿¤Ç¸«¤é¤ì¤ë¡¥
¤·¤«¤·³µÇ°Åª¤Ë¤Ï¹½Â¤²½ÂåÆþ¤ÏÃÍ¤ÎÂåÆþ¤Î°ì¼êË¡¤Ç¤¢¤Ã¤Æ¡¤
¿·¤·¤¤ÊÑ¿ô¤À¤±¤Ç¤Ê¤¯´ûÂ¸¤ÎÊÑ¿ô¤ËÂÐ¤·¤Æ¤âµ¡Ç½¤¹¤ë¡¥
¤Ä¤Þ¤ê¹½Â¤²½ÂåÆþ·¿\texttt{setq}¤ò½ñ¤¤¤Æ°­¤¤¤³¤È¤Ï¤Ê¤¤¡¥}¤Î°ìÈÌ²½¤À¡¥
´ö¤Ä¤«¤Î°ú¿ô¤ò¼è¤ë´Ø¿ô¤òÄêµÁ¤·¤¿¤È¤­
\begin{verbatim}
(defun foo (x y z)
  (+ x y z))
\end{verbatim}
¤½¤Î´Ø¿ô¤¬¸Æ¤Ð¤ì¤ë¤È
\begin{verbatim}
(foo 1 2 3)
\end{verbatim}
´Ø¿ô¤Î²¾°ú¿ô¤Ë¤Ï½çÈÖ¤Ë½¾¤Ã¤Æ°ú¿ô¤¬ÂåÆþ¤µ¤ì¤ë¡§
\verb|x|¤Ë¤Ï1¡¤\verb|y|¤Ë¤Ï2¡¤¤½¤·¤Æ\verb|z|¤Ë¤Ï3¤È¤¤¤¦É÷¤Ë¡¥
¹½Â¤²½ÂåÆþ¤È¤Ï¡¤¤³¤Î¤è¤¦¤Ê°ú¿ô¤Î¾ì½ê¤Ë½¾¤Ã¤Æ¹Ô¤ï¤ì¤ëÂåÆþ¤¬¡¤
Ç¤°Õ¤Î¥ê¥¹¥È¹½Â¤¤ËÂÐ¤·¤Æ\verb|(x y z)|¤ÈÆ±ÍÍ¤Ë¹Ô¤ï¤ì¤ë¤³¤È¤À¡¥

Common Lisp¤Î¥Þ¥¯¥í\verb|destructuring-bind|¡Ê\textsf{CLtL2}¤Ç¿·¤·¤¯Æ³Æþ¤µ¤ì¤¿¡Ë¤Ï¡¤
¥Ñ¥¿¡¼¥ó¡¤¥ê¥¹¥È¤ËÉ¾²Á¤µ¤ì¤ë°ú¿ôµÚ¤ÓËÜÂÎ¤È¤Ê¤ë¼°¤ò°ú¿ô¤Ë¼è¤ê¡¤
¥Ñ¥¿¡¼¥óÆâ¤Î²¾°ú¿ô¤ò¥ê¥¹¥ÈÆâ¤ÎÂÐ±þ¤¹¤ëÍ×ÁÇ¤ËÂ«Çû¤·¤¿¾õÂÖ¤Ç¼°¤òÉ¾²Á¤¹¤ë¡§
\begin{verbatim}
> (destructuring-bind (x (y) . z) '(a (b) c d)
    (list x y z))
(A B (C D))
\end{verbatim}
¤³¤Î¿·¥ª¥Ú¥ì¡¼¥¿¤È¤½¤ÎÃç´Ö¤¬Âè18¾Ï¤Î¼çÂê¤Ë¤Ê¤ë¡¥

¹½Â¤²½ÂåÆþ¤Ï¥Þ¥¯¥í¤Î²¾°ú¿ô¥ê¥¹¥È¤Ç¤â»È¤¨¤ë¡¥
Common Lisp¤Î\verb|defmacro|¤Ç¤Ï²¾°ú¿ô¥ê¥¹¥È¤ÏÇ¤°Õ¤Î¥ê¥¹¥È¹½Â¤¤Ç¤¢¤Ã¤Æ¤è¤¤¡¥
¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤¬Å¸³«¤µ¤ì¤¿¤È¤­¡¤
¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Îcomponents¤Ï¥Þ¥¯¥í¤Î²¾°ú¿ô¤Ë
\verb|destructuring-bind|¤ÈÆ±ÍÍ¤ËÂåÆþ¤µ¤ì¤ë¡¥
ÁÈ¤ß¹þ¤ß¥Þ¥¯¥í\verb|dolist|¤Ï²¾°ú¿ô¥ê¥¹¥È¤Î¹½Â¤²½ÂåÆþ¤ò³èÍÑ¤·¤Æ¤¤¤ë¡¥
¼¡¤Î¤è¤¦¤Ê¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ç¤Ï¡§
\begin{verbatim}
(dolist (x '(a b c))
  (print x))
\end{verbatim}
Å¸³«¤µ¤ì¤ÆÀ¸¤Þ¤ì¤ë´Ø¿ô¤Ï¡¤Âè1°ú¿ô¤È¤·¤ÆÍ¿¤¨¤é¤ì¤¿¥ê¥¹¥È¤ÎÃæ¤«¤é
\verb|x|¤È\verb|'(a b c)|¤ò¼è¤ê½Ð¤µ¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤½¤ì¤Ï\verb|dolist|¤ËÅ¬ÀÚ¤Ê²¾°ú¿ô¥ê¥¹¥È¤òÍ¿¤¨¤ë¤³¤È¤Ç°ÅÌÛ¤ÎÃæ¤Ë¼Â¸½¤µ¤ì¤¿
\footnote{¸å¤ËÆ³Æþ¤¹¤ëgensym¤Î»ÈÍÑ¤òÈò¤±¤ë¤¿¤á¡¤
¤³¤³¤Ç¤Ï¤ª¤«¤·¤ÊÊýË¡¤ÇÄêµÁ¤·¤Æ¤¤¤ë¡¥}¡§
\begin{verbatim}
(defmacro our-dolist ((var list &optional result) &body body)
  `(progn
     (mapc #'(lambda (,var) ,@body)
           ,list)
     (let ((,var nil))
       ,result)))
\end{verbatim}
Common Lisp¤Ç¤Ï¡¤ÉáÄÌ\verb|dolist|¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤Ï
¼Â¹ÔËÜÂÎ¤Ç¤Ê¤¤°ú¿ô¤ò¥ê¥¹¥ÈÆâ¤Ë¤Þ¤È¤á¹þ¤ó¤Ç¤¤¤ë¡¥
\verb|dolist|¤Ï¤½¤ì¤¬ÊÖ¤¹·ë²Ì¤Ë¤Ê¤ëÉÕ²ÃÅª¤Ê°ú¿ô¤ò¼è¤ë¤Î¤Ç¡¤
²¿¤Ë¤»¤è1¼ïÎàÌÜ¤Î°ú¿ô¤òÆÈÎ©¤·¤¿¥ê¥¹¥È¤Ë¤Þ¤È¤á¤Ê¤ì¤±¤Ð¤Ê¤é¤Ê¤¤¡¥
¤·¤«¤·Í¾Ê¬¤Ê¥ê¥¹¥È¹½Â¤¤¬É¬Í×¤Ç¤Ê¤¯¤Æ¤â¡¤
¤½¤ì¤Ë¤è¤Ã¤Æ\verb|dolist|¤Î¸Æ¤Ó½Ð¤·¤¬ÆÉ¤ß°×¤¯¤Ê¤ë¡¥
¤³¤³¤Ç\verb|when|¤Ë»÷¤¿¥Þ¥¯¥í\verb|when-bind|¤òÄêµÁ¤·¤¿¤¤¤È¤·¤è¤¦¡¥
¤¿¤À¤·¤³¤ì¤ÏÄ´¤Ù¤ë¼°¤ÎÊÖ¤¹ÃÍ¤Ë²¿¤«¤ÎÊÑ¿ô¤òÂ«Çû¤¹¤ë¤â¤Î¤È¤¹¤ë¡¥
¤³¤Î¥Þ¥¯¥í¤ÏÆþ¤ì»Ò¤Ë¤Ê¤Ã¤¿²¾°ú¿ô¥ê¥¹¥È¤ò»È¤¦¤È°ìÈÖ¾å¼ê¤¯¼ÂÁõ¤Ç¤­¤ë¤À¤í¤¦¡§
\begin{verbatim}
(defmacro when-bind ((var expr) &body body)
  `(let ((,var ,expr))
     (when ,var
       ,@body)))
\end{verbatim}
¤³¤ì¤Ï¼¡¤Î¤è¤¦¤Ë¸Æ¤Ó½Ð¤»¤Ð¤è¤¯¡¤
\begin{verbatim}
(when-bind (input (get-user-input))
           (process input))
\end{verbatim}
¤³¤¦¤·¤Ê¤¯¤Æ¤â¤¤¤¤¡§
\begin{verbatim}
(let ((input (get-user-input)))
  (when input
    (process input)))
\end{verbatim}
Used sparingly,
²¾°ú¿ô¥ê¥¹¥È¤Î¹½Â¤²½ÂåÆþ¤ÏÌÀ³Î¤Ê¥³¡¼¥É¤Ë¤Ä¤Ê¤¬¤ë¡¥
¾¯¤Ê¤¯¤È¤â¡¤
2¸Ä°Ê¾å¤Î°ú¿ô¤ÈËÜÂÎ¤È¤Ê¤ë¼°¤ò¼è¤ë\verb|when-bind|¤ä\verb|dolist|Åù¤Î¥Þ¥¯¥í¤Ç»È¤¨¤ë¡¥
%}}}
\subsection{¥Þ¥¯¥í¤Î¥â¥Ç¥ë}   %{{{
¥Þ¥¯¥í¤¬²¿¤ò¤¹¤ë¤Î¤«¤ò·Á¼°Åª¤ËÀâÌÀ¤·¤Æ¤â¡¤Ä¹¤¯¡¤¤ä¤ä¤³¤·¤¯¤Ê¤ë¤À¤±¤À¤í¤¦¡¥
·Ð¸³¤òÀÑ¤ó¤ÀLisp¥×¥í¥°¥é¥Þ¤ÎÆ¬¤ÎÃæ¤Ë¤â¤½¤ó¤ÊÀâÌÀ¤¬¤¢¤ëÌõ¤Ç¤Ï¤Ê¤¤¡¥
\verb|defmacro|¤ÎÄêµÁÊýË¡¤òÁÛÁü¤¹¤ë¤³¤È¤Ç¡¤¤½¤ì¤¬²¿¤ò¤¹¤ë¤Î¤«¤ò³Ð¤¨¤¿Êý¤¬ÊØÍø¤À¡¥

Lisp¤Ë¤Ï¤½¤Î¤è¤¦¤ÊÀâÌÀ¤ò»È¤¦Ä¹¤¤ÅÁÅý¤¬¤¢¤ë¡¥
1962Ç¯½éÈÇ¤Î\emph{The Lisp 1.5 Programmer's Manual}\note{Lisp1.5}¤â¡¤
»²¹Í¤Î¤¿¤á¤ËLisp¤Ç½ñ¤«¤ì¤¿\verb|eval|¤ÎÄêµÁ¤òºÜ¤»¤Æ¤¤¤ë¡¥
\verb|defmacro|¼«¿È¤¬¥Þ¥¯¥í¤Ê¤Î¤Ç¡¤Æ±¤¸°·¤¤¤¬¤Ç¤­¤ë¡¥
ÄêµÁ¤ÏÂè\ref{fig:SketchDefmacro}¿Þ¤Ë¼¨¤·¤¿¡¥
¤½¤³¤Ç¤Ï¤Þ¤À°·¤Ã¤Æ¤¤¤Ê¤¤µ»Ë¡¤ò´ö¤Ä¤«»È¤Ã¤Æ¤¤¤ë¤Î¤Ç¡¤
»²¹Í¤Ë¤¹¤ë¤Î¤Ï¸å¤Ë¤·¤¿¤¤¤È»×¤ï¤ì¤ëÊý¤â¤¤¤ë¤À¤í¤¦¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro our-expander (name) `(get ,name 'expander))

(defmacro our-defmacro (name parms &body body)
  (let ((g (gensym)))
    `(progn
       (setf (our-expander ',name)
             #'(lambda (,g)
                 (block ,name
                        (destructuring-bind ,parms (cdr ,g)
                          ,@body))))
       ',name)))

(defun our-macroexpand-1 (expr)
  (if (and (consp expr) (our-expander (car expr)))
      (funcall (our-expander (car expr)) expr)
      expr))
\end{FramedVerb}\end{center}
\caption{\texttt{defmacro}¤Î³µ·Á¡¥}
\label{fig:SketchDefmacro}
\end{figure}

Âè\ref{fig:SketchDefmacro}¿Þ¤Ë¼¨¤·¤¿ÄêµÁ¤Ï¡¤
¥Þ¥¯¥í¤¬²¿¤ò¤¹¤ë¤Î¤«¤Ë¤Ä¤¤¤Æ¤«¤Ê¤êÀµ³Î¤Ê´¶³Ð¤òÍ¿¤¨¤Æ¤¯¤ì¤ë¤¬¡¤
Ë°¤¯¤Þ¤Ç¤â³µ·Á¤Ê¤Î¤ÇÉÔ´°Á´¤Ê½ê¤â¤¢¤ë¡¥
¤³¤ì¤Ï\,\verb|&whole|¥­¡¼¥ï¡¼¥É¤òÅ¬ÀÚ¤Ë°·¤¨¤Ê¤¤¡¥
¤Þ¤¿\verb|defmacro|¤¬Âè1°ú¿ô¤Ë¥Þ¥¯¥í´Ø¿ô¤È¤·¤Æ¼ÂºÝ¤ËÊÝ»ý¤µ¤»¤ë¤â¤Î¤Ï2°ú¿ô¤Î´Ø¿ô¤Ç¡¤
¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤È¡¤¤½¤ì¤¬¸Æ¤Ó½Ð¤µ¤ì¤¿¥ì¥­¥·¥«¥ë´Ä¶­¤ò°ú¿ô¤Ë¼è¤ë¡¥
¤·¤«¤·¤½¤ì¤é¤ÎÀ­¼Á¤¬»È¤ï¤ì¤ë¤Î¤ÏºÇ¹âÅÙ¤ËÆñ²ò¤Ê¥Þ¥¯¥í¤À¤±¤À¡¥
¥Þ¥¯¥í¤¬Âè\ref{fig:SketchDefmacro}¿Þ¤Î¤è¤¦¤Ë¼ÂÁõ¤µ¤ì¤Æ¤¤¤ë¤È»×¤Ã¤Æ¤¤¤ì¤Ð¡¤
´Ö°ã¤¦¤³¤È¤Ï¤Þ¤ºÌµ¤¤¤À¤í¤¦¡¥
Îã¤¨¤Ð¤³¤ÎËÜ¤ÎÃæ¤ÇÄêµÁ¤µ¤ì¤¿¥Þ¥¯¥í¤Ï¤½¤ì¤ò»È¤Ã¤Æ¤âÁ´¤ÆÀµ¤·¤¯µ¡Ç½¤¹¤ë¡¥

Âè\ref{fig:SketchDefmacro}¿Þ¤ÎÄêµÁ¤¬À¸¤ß½Ð¤¹Å¸³«·Á¤Î´Ø¿ô¤Ï¡¤
¥·¥ã¡¼¥×¥¯¥©¡¼¥ÈÉÕ¤­¤Î$\lambda$¼°¤À¡¥
¤Ä¤Þ¤ê¤½¤ì¤Ï¥¯¥í¡¼¥¸¥ã¤Ç¤¢¤ëÈ¦¤À¡¥
¥Þ¥¯¥íÄêµÁÆâ¤Î¤É¤ó¤Ê¥Õ¥ê¡¼¥·¥ó¥Ü¥ë¤â
\verb|defmacro|¤Î¸Æ¤Ó½Ð¤µ¤ì¤¿´Ä¶­Æâ¤ÎÊÑ¿ô¤ò»²¾È¤Ç¤­¤ë¡¥
¤À¤«¤é¼¡¤Î¤è¤¦¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤ëÈ¦¤À¡§
\begin{verbatim}
(let ((op 'setq))
  (defmacro our-setq (var val)
    (list op var val)))
\end{verbatim}
\textsf{CLtL2}¤Ç¤Ï¡¤³Î¤«¤Ë²ÄÇ½¤À¡¥
¤·¤«¤·\textsf{CLtL1}¤Ç¤Ï¡¤¥Þ¥¯¥íÅ¸³«´Ø¿ô¤Ï¶õ¥ì¥­¥·¥«¥ë´Ä¶­¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤¿¤Î¤Ç
\footnote{¤³¤Î¶èÊÌ¤¬ÌäÂê¤Ë¤Ê¤ë¥Þ¥¯¥í¤ÎÎã¤Ë¤Ä¤¤¤Æ¤Ï¡¤Âèpom¥Ú¡¼¥¸¤ÎÃí¤ò»²¾È¡¥}¡¤
¸Å¤¤½èÍý·Ï¤Ç¤Ï¾å¤Î\verb|our-setq|¤ÏÆ°ºî¤·¤Ê¤¤¤«¤â¤·¤ì¤Ê¤¤¡¥
%}}}
\subsection{¥×¥í¥°¥é¥à¤È¤·¤Æ¤Î¥Þ¥¯¥í}   %{{{
¥Þ¥¯¥íÄêµÁ¤ÏÉ¬¤º¤·¤âÃ±¤Ê¤ëµÕ¥¯¥©¡¼¥ÈÉÕ¤­¥ê¥¹¥È¤Ç¤Ê¤¯¤Æ¤â¤è¤¤¡¥
¥Þ¥¯¥í¤Ï¤¢¤ë¼ï¤Î¼°¤òÊÌ¤Î·Á¤ËÊÑ·Á¤¹¤ë´Ø¿ô¤À¡¥
¤½¤Î´Ø¿ô¤Ï·ë²Ì¤òÀ¸À®¤¹¤ë¤¿¤á¤Ë\verb|list|¤ò¸Æ¤ó¤Ç¤â¤¤¤¤¤¬¡¤
¿ôÉ´¹Ô¤Î¥³¡¼¥É¤«¤éÀ®¤ëÉû¥×¥í¥°¥é¥à¤ò´Ý¤´¤È¸Æ¤ó¤Ç¤â¤¤¤¤¡¥

Âè7.3Àá¤Ç¤Ï¡¤¥Þ¥¯¥í¤ò´ÊÃ±¤Ë½ñ¤¯ÊýË¡¤ò¼¨¤·¤¿¡¥
¤½¤ÎÊýË¡¤Ë¤è¤Ã¤Æ¡¤Å¸³«·Á¤¬¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤ÎÃæ¤ÈÆ±¤¸¼°¤ò´Þ¤à¥Þ¥¯¥í¤ò½ñ¤¯¤³¤È¤¬¤Ç¤­¤ë¡¥
¤·¤«¤·»ÄÇ°¤Ê¤³¤È¤Ë¡¤¤½¤Î¾ò·ï¤òËþ¤¿¤¹¤Î¤Ï°ìÈÖÃ±½ã¤Ê¼ïÎà¤Î¥Þ¥¯¥í¤À¤±¤À¡¥
Ê£»¨¤Ê¥Þ¥¯¥í¤ÎÎã¤È¤·¤Æ¡¤ÁÈ¤ß¹þ¤ß¥Þ¥¯¥í\verb|do|¤Ë¤Ä¤¤¤Æ¹Í¤¨¤Æ¤ß¤è¤¦¡¥
\verb|do|¤Ï°ú¿ô¤òÊÂ¤ÓÂØ¤¨¤ë¤À¤±¤Î¥Þ¥¯¥í¤È¤·¤ÆÄêµÁ¤¹¤ë¤³¤È¤ÏÉÔ²ÄÇ½¤À¡¥
¤½¤ÎÅ¸³«»þ¤Ë¤Ï¡¤¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ë¤Ï·è¤·¤Æ½Ð¤ÆÍè¤Ê¤¤Ê£»¨¤Ê¼°¤òÀ¸À®¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥

¥Þ¥¯¥í¤ò½ñ¤¯¤È¤­¤Î¹¹¤Ë°ìÈÌÅª¤Ê¼êË¡¤È¤Ï¡¤
»È¤¨¤ë¤è¤¦¤Ë¤·¤¿¤¤¼°¤Î¼ïÎà¤È¡¤¤½¤ì¤¬¤É¤Î¤è¤¦¤ËÅ¸³«¤µ¤ì¤ë¤«¤Ë¤Ä¤¤¤Æ¹Í¤¨¡¤
»È¤¤¤¿¤¤¼°¤òÅ¸³«·Á¤ËÊÑ·Á¤¹¤ë¥×¥í¥°¥é¥à¤ò½ñ¤¯¤³¤È¤À¡¥
¥Þ¥¯¥í¤ÎÎã¤ò¼ê¤ÇÅ¸³«¤·¤Æ¤ß¤Æ¡¤
¤¢¤ë·Á¤¬ÊÑ·Á¤µ¤ì¤ë¤È¤­¤Ë¤Ï²¿¤¬µ¯¤­¤Æ¤¤¤ë¤Î¤«¤ò¸«¤ë¤ÈÎÉ¤¤¡¥
Îã¤ËÊï¤¦¤³¤È¤Ç¡¤¼«Ê¬¤Îµá¤á¤ë¥Þ¥¯¥í¤Ë¤Ï²¿¤¬É¬Í×¤Ê¤Î¤«¤òÄÏ¤à¤³¤È¤¬¤Ç¤­¤ë¡¥

\begin{figure}\begin{center}
\fbox{~\,\begin{minipage}{\FrameWidth}\begin{center}
\begin{minipage}{210pt}\vspace*{4pt}\narrowbaselines
\texttt{(do ((w 3)\\
~~~~~(x 1 (1+ x))\\
~~~~~(y 2 (1+ y))\\
~~~~~(z))\\
~~((> x 10) (princ z) y)\\
~~(princ x)\\
~~(princ y))}\\[4pt]
¤³¤ì¤Ï¼¡¤Î¤è¤¦¤Ê¤â¤Î¤ËÅ¸³«¤µ¤ì¤ÆÍß¤·¤¤¡§\\
\texttt{(prog ((w 3) (x 1) (y 2) (z nil))\\
~~~~~~foo\\
~~~~~~(if (> x 10)\\
~~~~~~~~~~(return (progn (princ z) y)))\\
~~~~~~(princ x)\\
~~~~~~(princ y)\\
~~~~~~(psetq x (1+ x) y (1+ y))\\
~~~~~~(go foo))}
\end{minipage}
\end{center}\vspace{1.3em}\end{minipage}~\,}\end{center}
\caption{\texttt{do}¤ÎË¾¤Þ¤·¤¤Å¸³«ÊýË¡¡¥}
\label{fig:DesiredExpansionDo}
\end{figure}

Âè\ref{fig:DesiredExpansionDo}¿Þ¤Ë¼¨¤·¤¿¤Î¤Ï¡¤\verb|do|¤Î»ÈÍÑÎã¤È¡¤
¤½¤ì¤¬Å¸³«¤µ¤ì¤ÆÀ¸¤Þ¤ì¤ëÈ¦¤Î¼°¤À¡¥
¼«Ê¬¤Î¼ê¤ÇÅ¸³«¤·¤Æ¤ß¤ë¤Î¤Ï¥Þ¥¯¥í¤¬¤É¤Î¤è¤¦¤ËÆ¯¤¯¤Ù¤­¤«¤òÌÀ³Î¤Ë¤¹¤ë¤Î¤ËÎÉ¤¤ÊýË¡¤À¡¥
Îã¤¨¤Ð¡¤Å¸³«·Á¤ò¼ê¤Ç½ñ¤«¤Ê¤¤¤È¡¤
¥í¡¼¥«¥ëÊÑ¿ô¤Î¹¹¿·¤Ë\verb|psetq|¤ò»È¤ï¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤³¤È¤ÏÌÀ¤é¤«¤Ç¤Ï¤Ê¤¤¤À¤í¤¦¡¥

ÁÈ¤ß¹þ¤ß¥Þ¥¯¥í\verb|psetq|¡Ê``parallel \verb|setq|''¤Ä¤Þ¤ê¡ÖÊÂÎó\verb|setq|¡×¡Ë
¤ÎÆ°ºî¤Ï\verb|setq|¤È»÷¤Æ¤¤¤ë¤¬¡¤
Á´¤Æ¤Î¡Ê¶ö¿ôÈÖÌÜ¤Î¡Ë°ú¿ô¤¬¤É¤ÎÂåÆþ¤è¤ê¤âÁ°¤ËÉ¾²Á¤µ¤ì¤ëÅÀ¤¬°ã¤¦¡¥
ÉáÄÌ¤Î\verb|setq|¤¬2¸Ä¤è¤êÂ¿¤¤°ú¿ô¤ò¼è¤ë¤È¤­¡¤
Âè1°ú¿ô¤Î¿·¤·¤¤ÃÍ¤ÏÂè4°ú¿ô¤ÎÉ¾²ÁÃæ¤Ë¸«¤¨¤Æ¤¤¤ë¡§
\begin{verbatim}
> (let ((a 1))
    (setq a 2 b a)
    (list a b))
(2 2)
\end{verbatim}
¤³¤³¤Ç¤Ï\verb|a|¤¬ºÇ½é¤ËÀßÄê¤µ¤ì¤¿¤Î¤Ç¡¤\verb|b|¤Ï\verb|a|¤Î¿·¤·¤¤ÃÍ¤Î2¤òÆÀ¤¿¡¥
\verb|psetq|¤Ï¤½¤Î°ú¿ô¤¬ÊÂÎóÅª¤ËÂåÆþ¤µ¤ì¤¿¤«¤Î¤è¤¦¤Ëµ¡Ç½¤¹¤ë¤â¤Î¤À¡§
\begin{verbatim}
> (let ((a 1))
(psetq a 2 b a)
(list a b))
(2 1)
\end{verbatim}
¤½¤Î¤¿¤á¡¤¤³¤³¤Ç¤Ï\verb|b|¤Ï\verb|a|¤Î¸Å¤¤ÃÍ¤òÆÀ¤Æ¤¤¤ë¡¥
¥Þ¥¯¥í\verb|psetq|¤Ï¡¤\verb|do|Åù¡¤
°ú¿ô¤Î´ö¤Ä¤«¤òÊÂÎóÅª¤ËÉ¾²Á¤¹¤ëÉ¬Í×¤Î¤¢¤ë¥Þ¥¯¥í¤ÎÊä½õ¤Î¤¿¤á¤ËÆÃ¤ËÄó¶¡¤µ¤ì¤¿¤â¤Î¤À¡¥
¡Ê\verb|setq|¤ò»È¤Ã¤Æ¤¤¤¿¤é¡¤\verb|do*|\,¤ÎÄêµÁ¤Ë¤Ê¤Ã¤Æ¤¤¤¿¡¥¡Ë

Å¸³«·Á¤ò¸«¤ì¤Ð¡¤\verb|foo|¤ò¥ë¡¼¥×ÍÑ¥é¥Ù¥ë¤Ë»È¤¦¤Î¤ÏËÜÅö¤Ï¤Þ¤º¤¤¤³¤È¤âÌÀ¤é¤«¤À¡¥
\verb|foo|¤¬\verb|do|¤Î¼Â¹ÔËÜÂÎ¤Î¥ë¡¼¥×ÍÑ¥é¥Ù¥ë¤Ë»È¤ï¤ì¤Æ¤¤¤¿¤é¤É¤¦¤¹¤ë¤Î¤«¡©
Âè9¾Ï¤Ç¡¤¤³¤ÎÌäÂê¤ò¾ÜºÙ¤Ë¼è¤ê°·¤¦¡§
º£¤Î½ê¤Ï¡¤¥Þ¥¯¥íÅ¸³«¤Ç¤Ï\verb|foo|¤Ç¤Ï¤Ê¤¯¡¤
´Ø¿ô\verb|gensym|¤ÎÊÖ¤¹ÆÃÊÌ¤ÊÌµÌ¾¥·¥ó¥Ü¥ë¤ò»È¤ï¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¤¤È³Ð¤¨¤Æ¤ª¤±¤Ð¤è¤¤¡¥

\verb|do|¤ò½ñ¤¯¤Ë¤Ï¡¤Âè\ref{fig:DesiredExpansionDo}¿Þ¤Î¾å¤Î¼°¤ò
²¼¤Î·Á¤ËÊÑ·Á¤¹¤ë¤Ë¤Ï²¿¤¬É¬Í×¤«¤ò¹Í¤¨¤ë¤³¤È¤Ë¤Ê¤ë¡¥
¤½¤Î¤è¤¦¤ÊÊÑ·Á¤ò¹Ô¤¦¤Ë¤Ï¡¤
µÕ¥¯¥©¡¼¥ÈÉÕ¤­¥ê¥¹¥È¤ÎÀµ¤·¤¤°ÌÃÖ¤Ë¥Þ¥¯¥í¤Î²¾°ú¿ô¤òÆþ¤ì¤ë¤À¤±¤Ç¤ÏºÑ¤Þ¤Ê¤¤¡¥
ÀèÆ¬¤Î\verb|prog|¤Î¼¡¤Î¥ê¥¹¥È¤Ï¥·¥ó¥Ü¥ë¤È¤½¤Î½é´üÃÍ¤«¤éÀ®¤ë¤¬¡¤
¤½¤ì¤é¤Ï\verb|do|¤ÎÂè2°ú¿ô¤ÎÃæ¤«¤éÃê½Ð¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
Âè\ref{fig:ImplementDo}¿Þ¤Î\verb|make-initforms|¤Ï¤½¤ó¤Ê¥ê¥¹¥È¤òÊÖ¤¹¡¥
¤½¤ì¤«¤é\verb|psetq|¤Î¤¿¤á¤Ë°ú¿ô¤Î¥ê¥¹¥È¤òºî¤é¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤¬¡¤
¹¹¿·¤¹¤Ù¤­¥·¥ó¥Ü¥ë¤ÏÁ´Éô¤Ç¤Ï¤Ê¤¤¤Î¤Ç¡¤¤³¤Á¤é¤Î½èÍý¤ÏÊ£»¨¤Ë¤Ê¤ë¡¥
Âè\ref{fig:ImplementDo}¿Þ¤Î\verb|make-stepforms|¤Ï¡¤\verb|psetq|¤ËÅÏ¤¹°ú¿ô¤òÊÖ¤¹¡¥
¤³¤ì¤é2¸Ä¤Î´Ø¿ô¤ò»È¤¦¤È¡¤»Ä¤ê¤ÎÄêµÁ¤Ë¤Ï¹þ¤ßÆþ¤Ã¤¿µ»¤ÏÍ×¤é¤Ê¤¤¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro our-do (bindforms (test &rest result) &body body)
  (let ((label (gensym)))
    `(prog ,(make-initforms bindforms)
           ,label
           (if ,test
               (return (progn ,@result)))
           ,@body
           (psetq ,@(make-stepforms bindforms))
           (go ,label))))

(defun make-initforms (bindforms)
  (mapcar #'(lambda (b)
              (if (consp b)
                  (list (car b) (cadr b))
                  (list b nil)))
          bindforms))

(defun make-stepforms (bindforms)
  (mapcan #'(lambda (b)
              (if (and (consp b) (third b))
                  (list (car b) (third b))
                  nil))
          bindforms))
\end{FramedVerb}\end{center}
\caption{\texttt{do}¤Î¼ÂÁõÎã¡¥}
\label{fig:ImplementDo}
\end{figure}

Âè\ref{fig:ImplementDo}¿Þ¤Î¥³¡¼¥É¤Ï¡¤¼ÂºÝ¤Î½èÍý·Ï¤Ç\verb|do|¤Ë»È¤ï¤ì¤Æ¤¤¤ëÄêµÁ¤Ç¤Ï¤Ê¤¤¡¥
Å¸³«Ãæ¤Ë¹Ô¤ï¤ì¤ë½èÍý¤ò¶¯Ä´¤¹¤ë¤¿¤á¡¤
\verb|make-initforms|¤È\verb|make-stepforms|¤ÏÆÈÎ©¤·¤¿´Ø¿ô¤È¤·¤ÆÊ¬¤±¤Æ¤ª¤¤¤¿¡¥
¤¤¤º¤ì¤½¤ó¤Ê¥³¡¼¥É¤âÂçÄñ¤Ï\verb|defmacro|Æâ¤Ë»Ä¤¹¤è¤¦¤Ë¤Ê¤ë¤À¤í¤¦¡¥

¤³¤Î¥Þ¥¯¥í¤ÎÄêµÁ¤Ë¤è¤ê¡¤¥Þ¥¯¥í¤Ë²¿¤¬¤Ç¤­¤ë¤Î¤«¤¬¸«¤¨¤Æ¤­¤¿¡¥
¥Þ¥¯¥í¤ÏLisp¤Î¼°¤òºî¤ëÇ½ÎÏ¤òºÇÂç¸Â¤ËÀ¸¤«¤·¤Æ¤¤¤ë¡¥
¥Þ¥¯¥í¤ÎÅ¸³«·Á¤òºî¤ë¥³¡¼¥É¤Ï¤½¤ì¼«¿È¤¬¥×¥í¥°¥é¥à¤Ç¤¢¤Ã¤Æ¤âÎÉ¤¤¤Î¤À¡¥
%}}}
\subsection{¥Þ¥¯¥í¤Î¥¹¥¿¥¤¥ë}   %{{{
ÎÉ¤¤¥¹¥¿¥¤¥ë¤Ï¥Þ¥¯¥í¤Ë¤Ä¤¤¤Æ¤Ï°ÕÌ£¤¬°ã¤Ã¤Æ¤¯¤ë¡¥
¥¹¥¿¥¤¥ë¤¬ÌäÂê¤Ë¤Ê¤ë¤Î¤Ï¥³¡¼¥É¤¬¿Í´Ö¤ËÆÉ¤Þ¤ì¤ë¤«¡¤Lisp¤ËÉ¾²Á¤µ¤ì¤ë¤È¤­¤À¡¥
¥Þ¥¯¥í¤Î¾ì¹ç¡¤¤½¤ÎÎ¾Êý¤¬ÉáÄÌ¤È¤Ï¾¯¤·°ã¤Ã¤¿¾õ¶·¤Ç¹Ô¤ï¤ì¤ë¡¥

¥Þ¥¯¥íÄêµÁ¤Ë´Ø¤ï¤ë¥³¡¼¥É¤Ë¤Ï¼ïÎà¤Î°Û¤Ê¤ë2¸Ä¤¬¤¢¤ë¡§
Å¸³«¥³¡¼¥É¡¤¤Ä¤Þ¤ê¥Þ¥¯¥í¤¬Å¸³«·Á¤òÀ¸À®¤¹¤ë¤¿¤á¤Ë»È¤¦¥³¡¼¥É¤È¡¤
ÈïÅ¸³«¥³¡¼¥É¡¤¤Ä¤Þ¤êÅ¸³«·Á¤½¤Î¤â¤Î¤Ë¸½¤ì¤ë¥³¡¼¥É¤À¡¥
¥¹¥¿¥¤¥ë¤Î¸¶Â§¤Ï¤½¤ì¤¾¤ì°ã¤Ã¤Æ¤¤¤ë¡¥
°ìÈÌÅª¤Ë¸À¤Ã¤Æ¡¤¥×¥í¥°¥é¥à¤ÎÎÉ¤¤¥¹¥¿¥¤¥ë¤È¤ÏÌÀ³Î¤Ç¸úÎ¨Åª¤Ç¤¢¤ë¤³¤È¤À¡¥
¤³¤ì¤é¤Î¸¶Â§¤Ï2¼ïÎà¤Î¥Þ¥¯¥í¤Î¥³¡¼¥É¤Ë¤ª¤¤¤Æ¤ÏÊÌ¡¹¤ÎÊý¸þ¤Ë¸þ¤«¤Ã¤Æ¶¯Ä´¤µ¤ì¤ë¡§
Å¸³«¥³¡¼¥É¤Ï¸úÎ¨¤è¤êÌÀ³Î¤µ¤òÍ¥Àè¤·¡¤ÈïÅ¸³«¥³¡¼¥É¤ÏÌÀ³Î¤µ¤è¤ê¸úÎ¨¤òÍ¥Àè¤¹¤ë¡¥

¸úÎ¨À­¤¬°ìÈÖÌäÂê¤Ë¤Ê¤ë¤Î¤Ï¥³¥ó¥Ñ¥¤¥ëºÑ¤ß¥³¡¼¥É¤Ç¤¢¤ëÌõ¤À¤¬¡¤
¥³¥ó¥Ñ¥¤¥ëºÑ¤ß¥³¡¼¥É¤ÎÃæ¤Ç¤Ï¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ï´û¤ËÅ¸³«ºÑ¤ß¤À¡¥
Å¸³«¥³¡¼¥É¤¬¸úÎ¨Åª¤Ê¤é¥³¥ó¥Ñ¥¤¥ë¤¬´öÊ¬Áá¤¯ºÑ¤à¤À¤í¤¦¤¬¡¤
¥×¥í¥°¥é¥à¤ÎÆ°ºî¤Î¸úÎ¨¤Ë¤Ï°ìÀÚ°ã¤¤¤Ï¤Ê¤¤¡¥
¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤ÎÅ¸³«¤Ï¥³¥ó¥Ñ¥¤¥é¤Î»Å»ö¤Î¤¦¤Á¶Ï¤«¤ÎÉôÊ¬¤Ë²á¤®¤Ê¤¤¤³¤È¤¬Â¿¤¤¤Î¤Ç¡¤
¸úÎ¨Åª¤ËÅ¸³«¤µ¤ì¤ë¥Þ¥¯¥í¤È¤¤¤¦¤Î¤âÉáÄÌ¤Ï¥³¥ó¥Ñ¥¤¥ëÂ®ÅÙ¤Ë¤âÂç¤·¤¿±Æ¶Á¤òµÚ¤Ü¤µ¤Ê¤¤¡¥
¤À¤«¤éÂçÄñ¡¤Å¸³«¥³¡¼¥É¤Ï¥×¥í¥°¥é¥à¤Î½é´ü¥ô¥¡¡¼¥¸¥ç¥ó¤ò¼êÁá¤¯½ñ¤¯´¶¤¸¤Ç½ñ¤¯¤³¤È¤¬¤Ç¤­¤ë¡¥
Å¸³«¥³¡¼¥É¤¬ÉÔÉ¬Í×¤Ê½èÍý¤ò¤·¤¿¤ê¥³¥ó¥·¥ó¥°¤òÂ¿¤¯µ¯¤³¤·¤¿¤«¤é¤È¤¤¤Ã¤Æ¡¤²¿¤À¤È¸À¤¦¤Î¤«¡©
¥×¥í¥°¥é¥Þ¤Î»þ´Ö¤Ï¥×¥í¥°¥é¥à¤ÎÊÌ¤Î¾ì½ê¤ò²þÎÉ¤¹¤ë¤Î¤ËÈñ¤ä¤·¤¿Êý¤¬¸­¤¤¡¥
Å¸³«¥³¡¼¥É¤Ë¤ª¤¤¤ÆÌÀ³Î¤µ¤È¸úÎ¨¤Î¤É¤Á¤é¤«¤òÁª¤Ö¤³¤È¤¬¤¢¤Ã¤¿¤é¡¤ÌÀ³Î¤µ¤òÍ¥Àè¤¹¤Ù¤­¤À¡¥
¥Þ¥¯¥íÄêµÁ¤Ï°ìÈÌÅª¤Ë´Ø¿ôÄêµÁ¤è¤ê¤âÆÉ¤ß²¼¤·¤Å¤é¤¤¤¬¡¤
¤½¤ì¤ÏÊÌ¡¹¤ÎÆó¤Ä¤Î»þÅÀ¤ÇÉ¾²Á¤µ¤ì¤ë¼°¤¬º®¤¸¤Ã¤Æ¤¤¤ë¤«¤é¤À¡¥
Å¸³«¥³¡¼¥É¤Î¸úÎ¨À­¤ÎÂå¤ï¤ê¤Ë¤³¤Îº®Íð¤¬¸º¤é¤»¤ë¤Î¤Ê¤é¡¤¤ªÆÀ¤Ê¼è°ú¤È¸À¤¨¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro our-and (&rest args)
  (case (length args)
    (0 t)
    (1 (car args))
    (t `(if ,(car args)
            (our-and ,@(cdr args))))))

(defmacro our-andb (&rest args)
  (if (null args)
      t
      (labels ((expander (rest)
                         (if (cdr rest)
                             `(if ,(car rest)
                                  ,(expander (cdr rest)))
                             (car rest))))
        (expander args))))
\end{FramedVerb}\end{center}
\caption{\texttt{and}¤ÈÅù²Á¤Ê¥Þ¥¯¥í¤ÎÎã2¸Ä¡¥}
\label{fig:AndEquivs}
\end{figure}

Îã¤¨¤Ð°ì¼ï¤Î\verb|and|¤ò¥Þ¥¯¥í¤È¤·¤ÆÄêµÁ¤·¤¿¤¤¤È¤·¤è¤¦¡¥
\verb|(and a b c)|¤Ï\verb|(if a (if b c))|¤ÈÅù²Á¤À¤«¤é¡¤
Âè\ref{fig:AndEquivs}¿Þ¤Î¾å¤ÎÄêµÁ¤Î¤è¤¦¤Ë¡¤\verb|and|¤Ï\verb|if|¤òÍøÍÑ¤·¤Æ½ñ¤±¤ë¡¥
ÉáÄÌ¤Î¥³¡¼¥É¤ò¿³ºº¤¹¤ë´ð½à¤«¤é¤¹¤ì¤Ð¡¤\verb|our-and|¤ÎÄêµÁ¤Ï¤Þ¤º¤¤¡¥
Å¸³«¥³¡¼¥É¤¬ºÆµ¢Åª¤Ç¡¤
ºÆµ¢¤Î¤½¤ì¤¾¤ì¤ÎÃÊ³¬¤ÇÆ±¤¸¥ê¥¹¥È¤ÎÏ¢Â³¤·¤¿\verb|cdr|Éô¤ÎÄ¹¤µ¤òµá¤á¤Æ¤¤¤ë¡¥
¤³¤Î¥³¡¼¥É¤¬¼Â¹Ô»þ¤ËÉ¾²Á¤µ¤ì¤ë¤Ê¤é¡¤
¤³¤Î¥Þ¥¯¥í¤ÏÆ±¤¸Å¸³«¤ò°ìÀÚÌµÂÌ¤Ê¤¯¹Ô¤¦\verb|our-andb|¤Î¤è¤¦¤ËÄêµÁ¤¹¤ëÊý¤¬ÎÉ¤¤¤À¤í¤¦¡¥
¤·¤«¤·¥Þ¥¯¥íÄêµÁ¤È¤·¤Æ¤Ï\verb|our-and|¤Ï¡Ê¾¡¤Ã¤Æ¤¤¤ë¤È¤Ï¸À¤¨¤Ê¤¤¤¬¡ËÆ±ÄøÅÙ¤Î½ÐÍè¤À¡¥
ºÆµ¢¤Î¤½¤ì¤¾¤ì¤ÎÃÊ³¬¤Ç\verb|length|¤ò¸Æ¤Ö¤Î¤ÏÈó¸úÎ¨Åª¤À¤í¤¦¤¬¡¤
¤½¤Î¹½À®¤ÏÅ¸³«·Á¤¬¾ò·ï¤Î¿ô¤Ë°ÍÂ¸¤¹¤ëÍÍ»Ò¤ò¤Ï¤Ã¤­¤êÉ½¤·¤Æ¤¤¤ë¡¥

²¿¤Ç¤â¤½¤¦¤À¤¬¡¤Îã³°¤â¤¢¤ë¡¥
Lisp¤Ç¤Ï¥³¥ó¥Ñ¥¤¥ë»þ´Ö¤È¼Â¹Ô»þ´Ö¤Î¶èÊÌ¤Ï×ó°ÕÅª¤Ê¤â¤Î¤Ç¡¤
¤½¤Î¶èÊÌ¤Ë´ð¤Å¤¯Ë¡Â§¤Ï¤É¤ì¤â¤ä¤Ï¤ê×ó°ÕÅª¤Ê¤â¤Î¤À¡¥
¥×¥í¥°¥é¥à¤Ë¤è¤Ã¤Æ¤Ï¡¤¥³¥ó¥Ñ¥¤¥ë»þ´Ö¤¬¼Â¹Ô»þ´Ö¤Ê¤Î¤À¡¥
¥×¥í¥°¥é¥à¤Î¼çÌÜÅª¤¬²¿¤é¤«¤Î·Á¼°¤ÎÊÑ´¹¤Ç¡¤¥Þ¥¯¥í¤ò¤½¤Î¤¿¤á¤ËÍøÍÑ¤·¤Æ¤¤¤ë¤Ê¤é¡¤
ÏÃ¤ÏÁ´¤¯°ã¤Ã¤Æ¤¯¤ë¡§
Å¸³«¥³¡¼¥É¤¬¥×¥í¥°¥é¥à¤ÎÃæ¿´¤Ë¡¤Å¸³«·Á¤¬¤½¤Î½ÐÎÏ¤Ë¤Ê¤ë¡¤
¤â¤Á¤í¤ó¤½¤ó¤Ê¾õ¶·¤Ç¤ÏÅ¸³«¥³¡¼¥É¤Ï¸úÎ¨À­¤òÇ°Æ¬¤ËÃÖ¤¤¤Æ½ñ¤«¤ì¤ë¤Ù¤­¤À¡¥
¤·¤«¤·ÂçÄñ¤ÎÅ¸³«¥³¡¼¥É¤Ï
¡Ê¥¢¡Ë¥³¥ó¥Ñ¥¤¥ëÂ®ÅÙ¤Ë¤Î¤ß±Æ¶Á¤·¡¤¡Ê¥¤¡Ë¤½¤Î±Æ¶Á¤âÂç¤·¤¿¤³¤È¤Ï¤Ê¤¤\wadash
¤Ä¤Þ¤êÌÀ³Î¤µ¤¬¤Û¤ÜÉ¬¤º°ìÈÖ½ÅÍ×¤À¡¥

ÈïÅ¸³«¥³¡¼¥É¤Ë¤Ä¤¤¤Æ¤Ï¡¤Á´¤¯µÕ¤Ë¤Ê¤ë¡¥
¥Þ¥¯¥í¤ÎÅ¸³«·Á¤Ï¡ÊÆÃ¤ËÂ¾¿Í¤Ë¤Ï¡ËÆÉ¤Þ¤ì¤ë¤³¤È¤Ï¤Þ¤ºÌµ¤¤¤Î¤Ç¡¤ÌÀ³Î¤µ¤ÏÂç¤·¤¿ÌäÂê¤Ç¤Ï¤Ê¤¤¡¥
¶ØÃÇ¤Î\verb|goto|¤âÅ¸³«·Á¤Ç¤ÏÉ¬¤º¤·¤â¶Ø¤¸¤é¤ì¤Æ¤ª¤é¤º¡¤
É¾È½¤Î°­¤¤\verb|setq|¤â¤½¤ìÄø·ù¤¬¤é¤ì¤Ê¤¤¡¥

¹½Â¤²½¥×¥í¥°¥é¥ß¥ó¥°¤Î¿ä¿Ê¼ÔÃ£¤¬\verb|goto|¤òÁþ¤à¤Î¤Ï¡¤
¤½¤ì¤¬¥½¡¼¥¹¡¦¥³¡¼¥É¤ËµÚ¤Ü¤·¤¿±Æ¶Á¤Î¤»¤¤¤À¡¥
Èà¤é¤¬Í­³²¤À¤È¸«¤Ê¤¹¤Î¤Ï¥Þ¥·¥ó¸ì¤Î¥¸¥ã¥ó¥×Ì¿Îá¤Ç¤Ï¤Ê¤¤\wadash
¥½¡¼¥¹¡¦¥³¡¼¥ÉÆâ¤ÇÃê¾ÝÅª¹½Â¤¤Ë±£¤µ¤ì¤Æ¤¤¤ë¸Â¤ê¤ÏÌäÂê¤Ë¤Ê¤é¤Ê¤¤¤Î¤À¡¥
\verb|goto|¤¬Lisp¤ÇÈóÆñ¤ÎÂÐ¾Ý¤Ë¤Ê¤Ã¤Æ¤¤¤ëÍýÍ³¤Ï¡¤³Ú¤Ë±£ÊÃ¤Ç¤­¤ë¤«¤é¤ËÂ¾¤Ê¤é¤Ê¤¤¡§
Âå¤ï¤ê¤Ë\verb|do|¤ò»È¤¨¤ë¤·¡¤\verb|do|¤¬È÷¤ï¤Ã¤Æ¤¤¤Ê¤¯¤È¤â¼«Ê¬¤Ç½ñ¤¯¤³¤È¤¬¤Ç¤­¤ë¡¥
¤â¤Á¤í¤ó¿·¤·¤¤Ãê¾ÝÅª¹½Â¤¤ò\verb|goto|¤Î¾å¤Ë¹½ÃÛ¤¹¤ë¤Ê¤é¡¤
¤É¤³¤«¤Ë\verb|goto|¤¬Â¸ºß¤»¤¶¤ë¤òÆÀ¤Ê¤¤¡¥
¤À¤«¤é¿·¤·¤¤¥Þ¥¯¥í¤ÎÄêµÁ¤Ë\verb|go|¤ò»È¤¦¤Î¤Ï¡¤
´ûÂ¸¤Î¥Þ¥¯¥í¤¬Âå¤ï¤ê¤Ë»È¤¨¤Ê¤¤¤È¤­¤Ê¤é¡¤É¬¤º¤·¤â°­¤¤¤³¤È¤Ç¤Ï¤Ê¤¤¡¥

»÷¤¿¤è¤¦¤Ë\verb|setq|¤â¡¤ÊÑ¿ô¤¬¤É¤³¤ÇÃÍ¤òÆÀ¤¿¤Î¤«¤¬È½¤ê¿É¤¯¤Ê¤ë¤Î¤ÇÇò¤¤ÌÜ¤Ç¸«¤é¤ì¤ë¡¥
¤·¤«¤·¥Þ¥¯¥íÅ¸³«¤ÏÂ¿¤¯¤Î¿Í¤¬ÆÉ¤à¤â¤Î¤Ç¤Ï¤Ê¤¤¤Î¤Ç¡¤
ÉáÄÌ¤Ï¥Þ¥¯¥íÅ¸³«¤ÎÃæ¤ÇÁÏ¤é¤ì¤¿ÊÑ¿ô¤Ë\verb|setq|¤ò»È¤¦¤³¤È¤Ë³²¤Ï¾¯¤Ê¤¤¡¥
´ö¤Ä¤«¤ÎÁÈ¤ß¹þ¤ß¥Þ¥¯¥í¤ÎÅ¸³«·Á¤ò¸«¤Æ¤ß¤ì¤Ð¡¤\verb|setq|¤¬»³Äø¤¢¤ë¤À¤í¤¦¡¥

¾õ¶·¤Ë¤è¤Ã¤Æ¤ÏÅ¸³«·Á¥³¡¼¥É¤Ç¤ÎÌÀ³Î¤µ¤¬°ìÁØÂç»ö¤Ë¤Ê¤ë¤³¤È¤¬¤¢¤ë¡¥
Ê£»¨¤Ê¥Þ¥¯¥í¤ò½ñ¤¯¤È¤­¤Ï¡Ê¾¯¤Ê¤¯¤È¤â¥Ç¥Ð¥Ã¥°Ãæ¤Ë¡Ë·ë¶ÉÅ¸³«·Á¤òÆÉ¤à±©ÌÜ¤Ë¤Ê¤ë¡¥
¤Þ¤¿Ã±½ã¤Ê¥Þ¥¯¥í¤Ç¤â¡¤Å¸³«¥³¡¼¥É¤ÈÈïÅ¸³«¥³¡¼¥É¤Î¶èÊÌ¤ÏÃ±¤Ê¤ëµÕ¥¯¥©¡¼¥È¤Ê¤Î¤Ç¡¤
¤½¤ó¤Ê¥Þ¥¯¥í¤¬³Ê¹¥°­¤¤Å¸³«·Á¤òÀ¸À®¤¹¤ë¤Î¤Ê¤é¡¤
¥½¡¼¥¹¡¦¥³¡¼¥ÉÆâ¤Ç¤â³Ê¹¥°­¤µ¤¬¤Ï¤Ã¤­¤ê¸«¤¨¤Æ¤·¤Þ¤¦¤À¤í¤¦¡¥
¤·¤«¤·ÈïÅ¸³«¥³¡¼¥É¤ÎÌÀ³Î¤µ¤¬ÌäÂê¤Ë¤Ê¤ë¤È¤­¤Ç¤â¡¤¸úÎ¨À­¤¬°ÍÁ³¤È¤·¤ÆÍ¥Àè¤¹¤ë¤Ù¤­¤À¡¥
¥×¥í¥°¥é¥à¼Â¹Ô»þ¤ËÉ¾²Á¤µ¤ì¤ëÂçÉôÊ¬¤Î¥³¡¼¥É¤ÎÃæ¤Ç¤Ï¡¤¸úÎ¨À­¤¬½ÅÍ×¤Ê¤Î¤À¡¥
¥Þ¥¯¥íÅ¸³«¤Ç¤ÏÆó¤Ä¤ÎÍýÍ³¤«¤é¤½¤ì¤¬ºÝÎ©¤Ä¡§
¥Þ¥¯¥í¤¬¤É¤³¤Ç¤Ç¤â»È¤ï¤ì¤ë¤»¤¤¤È¡¤¥Þ¥¯¥í¤¬ÉÔ²Ä»ë¤Ê¤»¤¤¤À¡¥
¥Þ¥¯¥í¤Ï¤·¤Ð¤·¤Ð°ìÈÌÍÑÅÓ¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò¼ÂÁõ¤¹¤ë¤Î¤Ë»È¤ï¤ì¤ë¤¬¡¤
¤½¤ì¤é¤Ï¥×¥í¥°¥é¥à¤Î¤¢¤é¤æ¤ë½ê¤Ç¸Æ¤Ó½Ð¤µ¤ì¤ë¤â¤Î¤À¡¥
¤½¤ìÄøÉÑÈË¤Ë»È¤ï¤ì¤ë¤â¤Î¤ÏÈó¸úÎ¨Åª¤Ê¤Þ¤Þ¤ÇÊü¤Ã¤ÆÃÖ¤¯Ìõ¤Ë¤Ï¤¤¤«¤Ê¤¤¡¥
Ìµ³²¤Ç¾®¤µ¤Ê¥Þ¥¯¥í¤Ë¸«¤¨¤ë¤â¤Î¤¬¡¤Á´¤ÆÅ¸³«¤µ¤ì¤¿¸å¤Ë¤Ï¡¤
¥×¥í¥°¥é¥àÆâ¤ÇÌµ»ë¤Ç¤­¤Ê¤¤Ê¬ÎÌ¤òÀê¤á¤ë¡¥
¤½¤ó¤Ê¥Þ¥¯¥í¤Ë¤Ï¡¤Ä¹¤µ¤«¤éÈ½ÃÇ¤·¤ÆÉ¬Í×¤È»×¤¨¤ë¤è¤ê¤âÂ¿¤¯¤ÎÃí°Õ¤¬É¬Í×¤À¡¥
ÆÃ¤Ë¥³¥ó¥·¥ó¥°¤òÈò¤±¤ë¤³¤È¡¥
ÉÔÉ¬Í×¤Ê¥³¥ó¥·¥ó¥°¤òµ¯¤³¤¹¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¡¤
¤½¤ì¤µ¤¨¤Ê¤±¤ì¤Ð¸úÎ¨Åª¤Ê¥×¥í¥°¥é¥à¤ÎÆ°ºî¤òÆß²½¤µ¤»¤ë¤³¤È¤Ë¤â¤Ê¤ê¤«¤Í¤Ê¤¤¡¥

Å¸³«·Á¥³¡¼¥É¤Î¸úÎ¨À­¤ËÌÜ¤ò¸þ¤±¤ëÍýÍ³¤Î¤â¤¦°ì¤Ä¤Ï¡¤¤½¤ì¤¬Èó¾ï¤Ë¸«¤¨¿É¤¤ÅÀ¤À¡¥
´Ø¿ô¤Î¼ÂÁõÊýË¡¤¬²¼¼ê¤Ç¤â¡¤¤½¤Î´Ø¿ô¤¬¥×¥í¥°¥é¥Þ¤ÎÌÜ¤ËÆþ¤ëÅÙ¤Ë¤½¤Î»ö¼Â¤Ï°Õ¼±¤µ¤ì¤ë¡¥
¤·¤«¤·¥Þ¥¯¥í¤Ï¤½¤¦¤Ç¤Ï¤Ê¤¤¡¥¥Þ¥¯¥íÄêµÁ¤«¤é¤ÏÅ¸³«·Á¤Î¸úÎ¨¤Î°­¤µ¤ÏÌÀ¤é¤«¤Ç¤Ê¤¤¤³¤È¤â¤¢¤ë¡¥
Å¸³«·Á¥³¡¼¥É¤ÎÈó¸úÎ¨À­¤ÏÌÀ¤é¤«¤Ë¤Ê¤é¤Ê¤¤¤«¤âÃÎ¤ì¤Ê¤¤¤Î¤Ç¡¤°ìÁØÃí°Õ¤·¤Æ¸«¤ë¤Ù¤­¤Ê¤Î¤À¡¥
%}}}
\subsection{¥Þ¥¯¥í¤Ø¤Î°ÍÂ¸}   %{{{
´Ø¿ôÄêµÁ¤ò½ñ¤­Ä¾¤¹¤È¡¤¤½¤ì¤ò¸Æ¤Ó½Ð¤¹´Ø¿ô¤Ï¼«Æ°Åª¤Ë¹¹¿·¸å¤Î´Ø¿ô¤ò»È¤¦¤è¤¦¤Ë¤Ê¤ë
\footnote{¥¤¥ó¥é¥¤¥ó¤Ç¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿´Ø¿ô¤ÏÊÌ¤Ç¡¤
ºÆÄêµÁ¤Ë´Ø¤·¤Æ¥Þ¥¯¥í¤ÈÆ±ÍÍ¤ÎÀ©¸Â¤òÉé¤Ã¤Æ¤¤¤ë¡¥}¡¥
¤¿¤À¤·¥Þ¥¯¥í¤Ë¤Ä¤¤¤Æ¤ÏÉ¬¤º¤·¤âÆ±¤¸¤è¤¦¤Ë¤Ï¹Ô¤«¤Ê¤¤¡¥
´Ø¿ôÄêµÁÆâ¤Ë¤¢¤ë¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ï´Ø¿ô¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë¤È¤­¤ËÅ¸³«·Á¤ËÃÖ´¹¤µ¤ì¤ë¡¥
¥Þ¥¯¥í¤ò¸Æ¤Ó½Ð¤¹´Ø¿ô¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¸å¤Ë¤½¤Î¥Þ¥¯¥í¤òºÆÄêµÁ¤·¤¿¤é¤É¤¦¤Ê¤ë¤À¤í¤¦¤«¡©
¸µ¡¹¤Î¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Î·ÁÀ×¤Ï»Ä¤Ã¤Æ¤¤¤Ê¤¤¤Î¤Ç¡¤´Ø¿ôÆâ¤ÎÅ¸³«·Á¤Ï¹¹¿·¤µ¤ì¤Ê¤¤¡¥
´Ø¿ô¤ÎÆ°ºî¤Ï¸Å¤¤¥Þ¥¯¥íÄêµÁ¤òÈ¿±Ç¤·Â³¤±¤ë¤³¤È¤Ë¤Ê¤ë¡§
\begin{verbatim}
> (defmacro mac (x) `(1+ ,x))
MAC
> (setq fn (compile nil `(lambda (y) (mac y))))
#<Compiled-Function BF7E7E>
> (defmacro mac (x) `(+ ,x 100))
MAC
> (funcall fn 1)
2
\end{verbatim}

¥Þ¥¯¥í¤ò¸Æ¤Ö¥³¡¼¥É¤¬¥Þ¥¯¥í¤½¤Î¤â¤Î¤ÎÄêµÁÁ°¤Ë¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë¤È»÷¤¿ÌäÂê¤¬µ¯¤³¤ë¡¥
\CLtL2¤Ë¤Ï
¡Ö¥Þ¥¯¥íÄêµÁ¤Ï¡¤¥Þ¥¯¥í¤ÎºÇ½é¤Î»ÈÍÑ¤è¤ê¤âÀè¤Ë¥³¥ó¥Ñ¥¤¥é¤ËÆÉ¤Þ¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡×
¤È¤¢¤ë¡¥
¹¬±¿¤Ê¤³¤È¤Ë¤É¤Á¤é¤ÎÌäÂê¤âÈò¤±¤ë¤Î¤ÏÍÆ°×¤À¡¥
°Ê²¼¤ÎÆó¤Ä¤Î¸¶Â§¤òËº¤ì¤Ê¤±¤ì¤Ð¡¤
¸Å¤«¤Ã¤¿¤êÂ¸ºß¤·¤Ê¤¤¥Þ¥¯¥íÄêµÁ¤Ë¤Ä¤¤¤Æ»×¤¤Çº¤à¤³¤È¤Ï¤Ê¤¤¡§
\begin{enumerate}
    \item ¥Þ¥¯¥í¤Ï¤½¤ì¤ò¸Æ¤Ó½Ð¤¹´Ø¿ô¡Ê¤Þ¤¿¤Ï¥Þ¥¯¥í¡Ë¤ÎÁ°¤ÇÄêµÁ¤¹¤ë¡¥
    \item ¥Þ¥¯¥í¤¬ºÆÄêµÁ¤µ¤ì¤¿¤È¤­¤Ï¡¤
        ¤½¤ì¤ò¡ÊÄ¾ÀÜ¤Þ¤¿¤Ï´ÖÀÜÅª¤Ë¡Ë¸Æ¤Ó½Ð¤·¤Æ¤¤¤ë´Ø¿ô¤È¥Þ¥¯¥í¤òÁ´¤ÆºÆ¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¡¥
\end{enumerate}

¥Þ¥¯¥íÄêµÁ¤¬³Î¤«¤ËºÇ½é¤Ë¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë¤è¤¦¤Ë¤¹¤ë¤¿¤á¡¤
°ì¤Ä¤Î¥×¥í¥°¥é¥àÆâ¤Ç»È¤ï¤ì¤ë¥Þ¥¯¥í¤òÁ´¤ÆÆÈÎ©¤·¤¿¥Õ¥¡¥¤¥ë¤ËÊ¬¤±¤ëÊýË¡¤¬
¤³¤ì¤Þ¤ÇÄó°Æ¤µ¤ì¤Æ¤­¤¿¡¥
¤·¤«¤·¤½¤ì¤Ï¤ä¤ê²á¤®¤À¡¥
\verb|while|¤Î¤è¤¦¤ÊÈÆÍÑ¥Þ¥¯¥í¤òÆÈÎ©¤·¤¿¥Õ¥¡¥¤¥ë¤ËÊ¬¤±¤ë¤Î¤ÏÍý¤ËÅ¬¤Ã¤Æ¤¤¤ë¤¬¡¤
ÈÆÍÑ¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï´Ø¿ô¤Ç¤¢¤ì¥Þ¥¯¥í¤Ç¤¢¤ì¡¤
¥×¥í¥°¥é¥à¤ÎÂ¾¤ÎÉôÊ¬¤È¤ÏÊ¬¤±¤Æ¤ª¤¯Êý¤¬¤è¤¤¡¥

¥Þ¥¯¥í¤Ë¤Ï¥×¥í¥°¥é¥à¤Î¤¢¤ëÆÃÄê¤ÎÉôÊ¬¤Î¤¿¤á¤À¤±¤Ë½ñ¤«¤ì¤¿¤â¤Î¤â¤¢¤ë¤Î¤Ç¡¤
¤½¤ì¤é¤Ï»È¤¦Â¦¤Î¥³¡¼¥É¤È°ì½ï¤ËÄêµÁ¤µ¤ì¤ë¤Ù¤­¤À¡¥
¥Þ¥¯¥íÄêµÁ¤¬¸Æ¤Ó½Ð¤·¤Î¤É¤ì¤è¤ê¤âÁ°¤Ë¸½¤ì¤ë¸Â¤ê¥³¥ó¥Ñ¥¤¥ë¤Ï¾å¼ê¤¯¹Ô¤¯¡¥
¥Þ¥¯¥í¤Ï´Ø¿ô¤È°ã¤¦¤«¤é¤È¤¤¤¦¤À¤±¤ÎÍýÍ³¤ÇÁ´¤Æ°ì½ï¤Ë¤·¤Æ¤ª¤¤¤Æ¤â¡¤
¥³¡¼¥É¤¬ÆÉ¤ß¿É¤¯¤Ê¤ë¤À¤±¤Î¤³¤È¤À¡¥
%}}}
\subsection{´Ø¿ô¤«¤é¥Þ¥¯¥í¤Ø}   %{{{
¤³¤Î¾Ï¤Ç¤Ï´Ø¿ô¤ò¥Þ¥¯¥í¤ËËÝÌõ¤¹¤ëÊýË¡¤ò°·¤¦¡¥
ºÇ½é¤Î1Êâ¤Ï¡¤ËÜÅö¤Ë¤½¤ÎÉ¬Í×¤¬¤¢¤ë¤«¤É¤¦¤«¼«Ìä¤¹¤ë¤³¤È¤À¡¥
´Ø¿ô¤ò¥¤¥ó¥é¥¤¥óÀë¸À¤¹¤ë¤À¤±¤ÇºÑ¤à¤Î¤Ç¤Ê¤¤¤À¤í¤¦¤«(p. 26)¡©

¤·¤«¤·´Ø¿ô¤ò¥Þ¥¯¥í¤ËËÝÌõ¤¹¤ëÊýË¡¤ò¹Í¤¨¤ë¤³¤È¤Ë¤Ï¤·¤Ã¤«¤ê¤·¤¿ÍýÍ³¤¬¤¢¤ë¡¥
¥Þ¥¯¥í¤ò½ñ¤­¤Ï¤¸¤á¤ë¤È¡¤´Ø¿ô¤ò½ñ¤¤¤Æ¤¤¤ë¤è¤¦¤Êµ¤¤¬¤·¤Æ¤¯¤ë¤³¤È¤¬¤¢¤ë¡¥
ÉáÄÌ¤³¤Î¥¢¥×¥í¡¼¥Á¤Ç¤Ï´°àú¤Ê¥Þ¥¯¥í¤Ï½ñ¤±¤Ê¤¤¤¬¡¤¾¯¤Ê¤¯¤È¤â¤³¤Î´¶¤¸¤Ï¼ê¤¬¤«¤ê¤Ë¤Ê¤ë¡¥
¥Þ¥¯¥í¤È´Ø¿ô¤Î´Ø·¸¤òÍý²ò¤·¤Æ¤ª¤­¤¿¤¤ÍýÍ³¤Ë¤Ï¡¤Â¾¤Ë¤â¡¤¤½¤ì¤é¤Î°ã¤¤¤òÍý²ò¤·¤¿¤¤¤È¤¤¤¦¤Î¤â¤¢¤ë¡¥
ºÇ¸å¤Ë¡¤Lisp¥×¥í¥°¥é¥Þ¤Ë¤Ï¤È¤Ë¤«¤¯´Ø¿ô¤ò¥Þ¥¯¥í¤Ë½ñ¤­´¹¤¨¤¿¤¤¤³¤È¤¬»þ¡¹¤¢¤ë¤â¤Î¤Ê¤Î¤À¡¥


´Ø¿ô¤ò¥Þ¥¯¥í¤ËËÝÌõ¤¹¤ë¤³¤È¤ÎÆñ¤·¤µ¤Ï¡¤¤½¤Î´Ø¿ô¤Î»ý¤ÄÀ­¼Á¤Î¿ô¤Ë¤è¤ë¡¥
ºÇ¤âËÝÌõ¤¬´ÊÃ±¤ÊÉôÎà¤Î´Ø¿ô¤Ï
\begin{enumerate}
\item ËÜÂÎ¤¬Ã±°ì¤Î¼°¤«¤éÀ®¤Ã¤Æ¤¤¤Æ
\item ²¾°ú¿ô¥ê¥¹¥È¤Ë¤Ï²¾°ú¿ô¤ÎÌ¾Á°¤Î¤ß¤¬´Þ¤Þ¤ì
\item ¡Ê²¾°ú¿ô°Ê³°¤Ë¡Ë¿·¤·¤¤ÊÑ¿ô¤òÁÏ¤é¤º
\item ºÆµ¢Åª¤Ç¤Ê¤¯¡Ê¤Þ¤¿Áê¸ßºÆµ¢Åª¤Ê´Ø¿ô¤Î¥°¥ë¡¼¥×¤Ë¤â´Þ¤Þ¤ì¤º¡Ë
\item ËÜÂÎÆâ¤ÇÊ£¿ô²ó»È¤ï¤ì¤ë²¾°ú¿ô¤ò»ý¤¿¤º
\item ²¾°ú¿ô¥ê¥¹¥ÈÆâ¤ÇÀè¤Ë¸½¤ì¤ë²¾°ú¿ô¤ÎÃÍ¤è¤ê¡¤
    ¸å¤Ë¸½¤ì¤ë²¾°ú¿ô¤ÎÃÍ¤ÎÊý¤¬ËÜÂÎÆâ¤ÇÀè¤Ë»È¤ï¤ì¤ë¤³¤È¤¬¤Ê¤¯
\item ¥Õ¥ê¡¼ÊÑ¿ô¤ò´Þ¤Þ¤Ê¤¤
\end{enumerate}
¤â¤Î¤À¡¥
¤³¤ì¤é¤Î¸¶Â§¤òËþ¤¿¤¹´Ø¿ô¤ÎÎã¤ÏCommon Lisp¤ÎÁÈ¤ß¹þ¤ß´Ø¿ô\verb|second|¤Ç¡¤
¤³¤ì¤Ï¥ê¥¹¥È¤ÎÂè2Í×ÁÇ¤òÊÖ¤¹¡¥
¤½¤Î´Ø¿ô¤Ï¤³¤¦ÄêµÁ¤¹¤ì¤Ð¤è¤¤¡§
\begin{verbatim}
(defun second (x) (cadr x))
\end{verbatim}
¤³¤Î¾ì¹ç´Ø¿ôÄêµÁ¤Ï¾å¤Î¾ò·ï¤òÁ´¤ÆËþ¤¿¤·¤Æ¤¤¤ë¤Î¤Ç¡¤Åù²Á¤Ê¥Þ¥¯¥íÄêµÁ¤ËËÝÌõ¤¹¤ë¤Î¤Ï´ÊÃ±¤À¡¥
µÕ¥¯¥©¡¼¥È¤ò´Ø¿ôËÜÂÎ¤ÎÁ°¤ËÉÕ¤±¡¤
²¾°ú¿ô¥ê¥¹¥È¤Ë´Þ¤Þ¤ì¤Æ¤¤¤¿¥·¥ó¥Ü¥ë¤¬½Ð¤ÆÍè¤ëÅÙ¤Ë¥³¥ó¥Þ¤òÉÕ¤±¤ë¤À¤±¤Ç¤è¤¤¡§
\begin{verbatim}
(defmacro second (x) `(cadr ,x))
\end{verbatim}
¤â¤Á¤í¤ó¤³¤Î¥Þ¥¯¥í¤Ï´Ø¿ô¤È¤Þ¤Ã¤¿¤¯Æ±¤¸¾ò·ï¤Ç¸Æ¤Ó½Ð¤¹¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡¥
\verb|apply|¤ä\verb|funcall|¤ÎÂè1°ú¿ô¤È¤·¤Æ¤ÏÅÏ¤»¤Ê¤¤¤·¡¤
¸Æ½ÐÂ¦¤Î´Ø¿ô¤¬¿·¤¿¤Ê¥í¡¼¥«¥ë¤ÊÂ«Çû¤òÀ¸¤à¤è¤¦¤Ê´Ä¶­¤Ç¤Ï»È¤¦¤Ù¤­¤Ç¤Ê¤¤¡¥
¤½¤ì¤Ç¤âÉáÄÌ¤Î¥¤¥ó¥é¥¤¥ó¸Æ¤Ó½Ð¤·¤Ç¤Ï¡¤
¥Þ¥¯¥í\verb|second|¤Ï´Ø¿ô\verb|second|¤ÈÆ±¤¸Æ°ºî¤ò¤¹¤ë¤Ï¤º¤À¡¥

¥Þ¥¯¥í¤ÏÃ±°ì¤Î¼°¤ËÅ¸³«¤µ¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤Î¤Ç¡¤
ËÜÂÎ¤ËÊ£¿ô¤Î¼°¤¬´Þ¤Þ¤ì¤ë¤È¤­¤Ë¤Ï¾¯¤·°ã¤¦ÊýË¡¤ò»È¤¦¡¥
¾ò·ï1¤¬Ëþ¤¿¤µ¤ì¤Ê¤¤¤È¤­¤Ë¤Ï\verb|progn|¤òÄÉ²Ã¤¹¤ì¤Ð¤è¤¤¡¥
¤Ä¤Þ¤ê´Ø¿ô\verb|noisy-second|¤Ï¡§
\begin{verbatim}
(defun noisy-second (x)
  (princ "Someone is taking a cadr!")
  (cadr x))
\end{verbatim}
¼¡¤Î¥Þ¥¯¥íÄêµÁ¤È¤·¤ÆËÝÌõ¤Ç¤­¤ë¡§
\begin{verbatim}
(defmacro noisy-second (x)
  `(progn
     (princ "Someone is taking a cadr!")
     (cadr ,x)))
\end{verbatim}

´Ø¿ô¤¬\verb|&rest|¤Þ¤¿¤Ï\verb|&body|²¾°ú¿ô¤ò»È¤Ã¤Æ¤¤¤Æ¾ò·ï2¤¬Ëþ¤¿¤µ¤ì¤Ê¤¤¤È¤­¤Ï¡¤
²¾°ú¿ô¤Ë´Ø¤·¤Æ¤À¤±ÊýË¡¤òÊÑ¤¨¤ë¡¥
¤¿¤À¥³¥ó¥Þ¤òÁ°¤ËÉÕ¤±¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¤
²¾°ú¿ô¤ÎÃæ¿È¤¬\verb|list|¤Î¸Æ¤Ó½Ð¤·¤ÎÃæ¤ËÀÚ¤êÅ½¤ê¤µ¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤è¤Ã¤Æ
\begin{verbatim}
(defun sum (&rest args)
  (apply #'+ args))
\end{verbatim}
¤Ï
\begin{verbatim}
(defmacro sum (&rest args)
  `(apply #'+ (list ,@args)))
\end{verbatim}
¤È¤Ê¤ë¤¬¡¤¤³¤Î¾ì¹ç¤Ï¼¡¤Î¤è¤¦¤Ë¤·¤¿Êý¤¬¤è¤¤¡§
\begin{verbatim}
(defmacro sum (&rest args)
  `(+ ,@args))
\end{verbatim}

¾ò·ï3¤¬Ëþ¤¿¤µ¤ì¤Ê¤¤¤È¤­\wadash ´Ø¿ôËÜÂÎÆâ¤Ç¿·¤·¤¤ÊÑ¿ô¤¬ÁÏ¤é¤ì¤ë¤È¤­\wadash ¤Ï¡¤
¥³¥ó¥Þ¤òÉÕ¤±¤ëÊýË¡¤ò½¤Àµ¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
²¾°ú¿ô¥ê¥¹¥È¤Ë´Þ¤Þ¤ì¤ë¥·¥ó¥Ü¥ëÁ´¤Æ¤ÎÁ°¤Ë¥³¥ó¥Þ¤òÉÕ¤±¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¤
²¾°ú¿ô¤ò»²¾È¤·¤Æ¤¤¤ë¤â¤Î¤Ë¤Î¤ß¥³¥ó¥Þ¤òÉÕ¤±¤ë¡¥
Îã¤¨¤Ð¼¡¤ÎÎã¤Ç¤Ï
\begin{verbatim}
(defun foo (x y z)
  (list x (let ((x y))
            (list x z))))
\end{verbatim}
\verb|x|¤ÎÆâ¸å¤í¤ÎÆó¤Ä¤Ï²¾°ú¿ô¤Î\verb|x|¤ò»²¾È¤·¤Æ¤¤¤Ê¤¤¡¥
2ÈÖÌÜ¤Î\verb|x|¤Ï°ìÀÚÉ¾²Á¤ÎÂÐ¾Ý¤Ë¤Ê¤é¤º¡¤
3ÈÖÌÜ¤Ï\verb|let|¤ÎÁÏ¤ê½Ð¤·¤¿¿·¤·¤¤ÊÑ¿ô¤ò»²¾È¤·¤Æ¤¤¤ë¡¥
¤À¤«¤é1ÈÖÌÜ¤Ë¤À¤±¥³¥ó¥Þ¤òÉÕ¤±¤ë¡§
\begin{verbatim}
(defmacro foo (x y z)
  `(list ,x (let ((x ,y))
              (list x ,z))))
\end{verbatim}
¾ò·ï4¡Á6¤¬Ëþ¤¿¤µ¤ì¤Ê¤¯¤È¤â´Ø¿ô¤ò¥Þ¥¯¥í¤ËËÝÌõ¤Ç¤­¤ë¤³¤È¤â¤¢¤ë¤¬¡¤
¤³¤ì¤é¤ÎÆâÍÆ¤Ï¸å¤ÇÆÈÎ©¤·¤Æ°·¤¦¡¥
¥Þ¥¯¥í¤Ë¤ª¤±¤ëºÆµ¢¤Ë¤Ä¤¤¤Æ¤ÏÂè10.4¾Ï¤Ç¡¤
É¾²Á¤Î½ÅÊ£¤ÈÉ¾²Á½ç¤Îº®Íð¤Î´í¸±À­¤Ë¤Ä¤¤¤Æ¤Ï¤½¤ì¤¾¤ìÂè10.1¾Ï¤È10.2¾Ï¤Ç°·¤¦¡¥

¾ò·ï7¤Ë¤Ä¤¤¤Æ¤Ï¡¤xien¥Ú¡¼¥¸¤Ç¿¨¤ì¤¿¥¨¥é¡¼¤Ë»÷¤¿µ»¤ò»È¤Ã¤Æ¥¯¥í¡¼¥¸¥ã¤ò¥Þ¥¯¥í¤Ç¿¿»÷¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
¤·¤«¤·¤³¤ì¤ÏÄøÅÙ¤ÎÄã¤¤µ»¤Ç¤¢¤ê¡¤¤³¤ÎËÜ¤Î´ðÄ´¤ËÆëÀ÷¤Þ¤Ê¤¤¤Î¤Ç¡¤
¾Ü¤·¤¯°·¤¦¤³¤È¤Ï¤·¤Ê¤¤¡¥
%}}}
\subsection{¥·¥ó¥Ü¥ë¡¦¥Þ¥¯¥í}   %{{{
\CLtL2¤ÇCommon Lisp¤Ë¿·¼ï¤Î¥Þ¥¯¥í¤¬Æ³Æþ¤µ¤ì¤¿\wadash ¥·¥ó¥Ü¥ë¡¦¥Þ¥¯¥í¤À¡¥
ÉáÄÌ¤Î¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Î¸«³Ý¤±¤¬´Ø¿ô¸Æ¤Ó½Ð¤·¤Ë»÷¤Æ¤¤¤ë¤Î¤ËÂÐ¤·¤Æ¡¤
¥·¥ó¥Ü¥ë¡¦¥Þ¥¯¥í¤Î¡Ö¸Æ¤Ó½Ð¤·¡×¤Î¸«³Ý¤±¤Ï¥·¥ó¥Ü¥ë¤Ë»÷¤Æ¤¤¤ë¡¥

¥·¥ó¥Ü¥ë¡¦¥Þ¥¯¥í¤Ï¥í¡¼¥«¥ë¤Ë¤Î¤ßÄêµÁ¤Ç¤­¤ë¡¥
¥¹¥Ú¥·¥ã¥ë¼°\verb|symbol-macrolet|¤ò»È¤¦¤È¡¤
¤½¤ÎËÜÂÎÆâ¤Ç¤ÏÍ£¤Î¥·¥ó¥Ü¥ë¤¬¼°¤Î¤è¤¦¤Ë¿¶¤ëÉñ¤¦¤è¤¦¤Ë¤Ê¤ë¡§
\begin{verbatim}
> (symbol-macrolet ((hi (progn (print "Howdy")
                               1)))
                   (+ hi 2))
"Howdy"
3
\end{verbatim}
\verb|symbol-macrolet|¤ÎËÜÂÎ¤Ï°ú¿ô¤Î¾ì½ê¤Ë¤¢¤ë\verb|hi|¤¬
Á´¤Æ\verb|(progn (print "Howdy") 1)|¤ÇÃÖ¤­´¹¤¨¤é¤ì¤¿¤«¤Î¤è¤¦¤ËÉ¾²Á¤µ¤ì¤ë¡¥

³µÇ°Åª¤Ë¤Ï¡¤¥·¥ó¥Ü¥ë¡¦¥Þ¥¯¥í¤Ï°ú¿ô¤ò¤È¤é¤Ê¤¤¥Þ¥¯¥í¤Ë»÷¤Æ¤¤¤ë¡¥
°ú¿ô¤¬¤Ê¤±¤ì¤Ð¡¤¥Þ¥¯¥í¤Ï¸«³Ý¤±¾å¤Î¾ÊÎ¬·Á¤Ë²á¤®¤Ê¤¤¡¥
¤·¤«¤·¥·¥ó¥Ü¥ë¡¦¥Þ¥¯¥í¤¬Ìµ±×¤À¤È¸À¤¤¤¿¤¤¤Î¤Ç¤Ï¤Ê¤¤¡¥
¤½¤ì¤ÏÂè15¾Ï¤ÈÂè18¾Ï¤Ç»È¤ï¤ì¤Æ¤¤¤ë¤¬¡¤¸å¼Ô¤Ç¤ÏÉ¬Í×ÉÔ²Ä·ç¤ÊÌòÌÜ¤ò»ý¤Ã¤Æ¤¤¤ë¡¥
%}}}

%}}}
\section{¤¤¤Ä¥Þ¥¯¥í¤ò»È¤¦¤Ù¤­¤«} %{{{
¤¢¤ë´Ø¿ô¤¬¡¤ËÜÅö¤Ë¥Þ¥¯¥í¤Ç¤¢¤ë¤è¤ê¤â´Ø¿ô¤Ç¤¢¤Ã¤¿Êý¤¬ÎÉ¤¤¤È¤¤¤¦¤Î¤Ï¡¤
¤É¤¦¤·¤¿¤éÊ¬¤«¤ë¤À¤í¤¦¤«¡©
¥Þ¥¯¥í¤¬É¬Í×¤Ê¾ì¹ç¤È¤½¤¦¤Ç¤Ê¤¤¾ì¹ç¤Î´Ö¤Ë¤Ï¡¤ÂçÄñÌÀ³Î¤Ê¶èÊÌ¤¬¤¢¤ë¡¥
´ðËÜÅª¤Ë¤Ï´Ø¿ô¤ò»È¤¦¤Ù¤­¤À¡§
´Ø¿ô¤Ç´Ö¤Ë¹ç¤¦½ê¤Ë¥Þ¥¯¥í¤ò»È¤¦¤Î¤Ï¥¨¥ì¥¬¥ó¥È¤Ç¤Ê¤¤¡¥
¥Þ¥¯¥í¤¬²¿¤«ÆÃÄê¤ÎÍø±×¤òÍ¿¤¨¤ë¤È¤­¤Î¤ß¤½¤ì¤ò»È¤¦¤Ù¤­¤Ê¤Î¤À¡¥

¥Þ¥¯¥í¤¬Íø±×¤òÍ¿¤¨¤ë¤È¤­¤È¤Ï¤¤¤Ä¤À¤í¤¦¤«¡©
¤½¤ì¤¬¤³¤Î¾Ï¤Î¼çÂê¤À¡¥
ÉáÄÌ¤³¤Îµ¿Ìä¤Ï¡¤²þÎÉ¤òÌÜ»Ø¤¹¤È¤­¤Ç¤Ê¤¯É¬Í×¤ËÇ÷¤é¤ì¤¿¾å¤ÇÈ¯¤»¤é¤ì¤ë¡¥
¥Þ¥¯¥í¤Ç¼Â¸½¤Ç¤­¤ë¤³¤È¤ÎÂçÉôÊ¬¤Ï¡¤´Ø¿ô¤Ç¤Ï¤Ç¤­¤Ê¤¤¡¥
Âè8.1Àá¤Ç¤Ï¥Þ¥¯¥í¤È¤·¤Æ¤Î¤ß¼ÂÁõ¤Ç¤­¤ë¥ª¥Ú¥ì¡¼¥¿¤Î¼ïÎà¤òÎóµó¤¹¤ë¡¥
¤À¤¬¶­³¦Àþ¾å¤ËÎ©¤Ä¤è¤¦¤Ê¾ì¹ç¤â¤ï¤º¤«¤Ë¤¢¤ë¡Ê¤·¤«¤·¤³¤ì¤Ï¶½Ì£¿¼¤¤¡Ë¡¥
¤Ä¤Þ¤ê¥ª¥Ú¥ì¡¼¥¿¤ò´Ø¿ô¤Ç½ñ¤¤¤Æ¤â¥Þ¥¯¥í¤Ç½ñ¤¤¤Æ¤â¤è¤¤¤è¤¦¤Ê¾õ¶·¤À¡¥
¤½¤Î¤è¤¦¤Ê¾õ¶·¤Ë¤Ä¤¤¤Æ¡¤Âè8.2Àá¤Ç¤Ï¥Þ¥¯¥í¤Ë¤Ä¤¤¤Æ¤Î»¿ÈÝÎ¾ÏÀ¤òµó¤²¤ë¡¥
ºÇ¸å¤Ë¡¤¥Þ¥¯¥í¤Ë²¿¤¬¤Ç¤­¤ë¤Î¤«¤ò¹ÍÎ¸¤·¤¿¾å¤Ç¡¤
Âè8.3Àá¤Ç¤Ï´ØÏ¢¤·¤¿µ¿Ìä¤Ë¤Ä¤¤¤Æ¹Í¤¨¤ë¡¥
¿Í¤Ï¥Þ¥¯¥í¤Ç¤É¤ó¤Ê¤³¤È¤ò¹Ô¤¦¤â¤Î¤Ê¤Î¤À¤í¤¦¤«¡©
\subsection{Â¾¤Ë²¿¤â´Ø·¸¤·¤Ê¤¤¤È¤­}   %{{{
¥×¥í¥°¥é¥àÆâ¤Î¿ô¸Ä½ê¤Ë»÷ÄÌ¤Ã¤¿¥³¡¼¥É¤¬É½¤ì¤Æ¤¤¤ë¤È¤­¡¤¥µ¥Ö¥ë¡¼¥Á¥ó¤ò½ñ¤­¡¤
¤½¤ì¤é¤ò¥µ¥Ö¥ë¡¼¥Á¥ó¸Æ½Ð¤·¤ÇÃÖ¤­´¹¤¨¤ë¤Î¤Ï¡¤¤è¤¤¥Ç¥¶¥¤¥ó¤Î¤¿¤á¤Î°ìÈÌ¸¶Â§¤À¡¥
¤³¤Î¸¶Â§¤òLisp¥×¥í¥°¥é¥à¤ËÅ¬ÍÑ¤¹¤ë¤È¤­¡¤
¡Ö¥µ¥Ö¥ë¡¼¥Á¥ó¡×¤ò´Ø¿ô¤Ë¤¹¤Ù¤­¤«¥Þ¥¯¥í¤Ë¤¹¤Ù¤­¤«·è¤á¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥

´Ø¿ô¤Ç¤Ï¤Ê¤¯¥Þ¥¯¥í¤ò½ñ¤³¤¦¤ÈÍÑ°Õ¤Ë·è¿´¤Ç¤­¤ë¤³¤È¤¬¤¢¤ë¡¥
¥Þ¥¯¥í¤Î¤ß¤¬É¬Í×¤Ê¤³¤È¤ò¼Â¸½¤Ç¤­¤ë¤È¤­¤À¡¥
\verb|1+| ¤Î¤è¤¦¤Ê´Ø¿ô¤Ï¡¤´Ø¿ô¤È¤·¤Æ¤â¥Þ¥¯¥í¤È¤·¤Æ¤â½ñ¤±¤ë¤«¤â¤·¤ì¤Ê¤¤¡¥
\begin{verbatim}
(defun 1+ (x) (+ 1 x))

(defmacro 1+ (x) `(+ 1 ,x))
\end{verbatim}
¤·¤«¤·Âè7.3Àá¤Î\verb|while|¤Ï¡¤¥Þ¥¯¥í¤Ç¤Ê¤¤¤ÈÄêµÁ¤Ç¤­¤Ê¤¤¡§
\begin{verbatim}
(defmacro while (test &body body)
  `(do ()
             ((not ,test))
          ,@body))
\end{verbatim}
¤³¤Î¥Þ¥¯¥í¤ÎÆ°ºî¤ò´Ø¿ô¤Ç¿¿»÷¤ëÊýË¡¤Ï¤Ê¤¤¡¥
\verb|while|¤ÎÄêµÁ¤Ç¤Ï¡¤ËÜÂÎ¤È¤·¤ÆÅÏ¤µ¤ì¤¿¼°¤ò\verb|do|¤ÎËÜÂÎÆâ¤ËÄ¥¤ê¹þ¤à¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤¬¡¤
¤³¤ì¤Ï¥Æ¥¹¥È¼°¤¬\verb|nil|¤òÊÖ¤·¤¿¤È¤­¤Î¤ßÉ¾²Á¤µ¤ì¤ë¡¥
¤É¤ó¤Ê´Ø¿ô¤Ë¤â¤½¤ì¤ÏÌµÍý¤À¡§
´Ø¿ô¸Æ¤Ó½Ð¤·¤Ç¤Ï¡¤Á´¤Æ¤Î°ú¿ô¤Ï´Ø¿ô¤Î¸Æ¤Ó½Ð¤·¤è¤ê¤âÁ°¤ËÉ¾²Á¤µ¤ì¤ë¤«¤é¤À¡¥

³Î¤«¤Ë¥Þ¥¯¥í¤¬É¬Í×¤È¤¤¤¦¤È¤­¡¤¥Þ¥¯¥í¤Ë²¿¤òµá¤á¤Æ¤¤¤ë¤Î¤À¤í¤¦¤«¡©
¥Þ¥¯¥í¤Ë¤Ç¤­¤Æ´Ø¿ô¤Ë¤Ç¤­¤Ê¤¤¤³¤È¤Ï2¤Ä¤¢¤ë¡§
¥Þ¥¯¥í¤Ï°ú¿ô¤ÎÉ¾²Á¤òÀ©¸æ¡Ê¤Þ¤¿¤ÏÍÞÀ©¡Ë¤Ç¤­¡¤
¤Þ¤¿¸Æ¤Ó½Ð¤·Â¦¤Î¥½¡¼¥¹¥³¡¼¥É¤½¤Î¤â¤Î¤Ø¤ÈÅ¸³«¤µ¤ì¤ë¡¥
·ë¶É¡¤¥Þ¥¯¥í¤¬É¬Í×¤Ê¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ë¤Ï¡¤¤³¤ì¤é¤ÎÀ­¼Á¤ÎÊÒÊý¤Þ¤¿¤ÏÎ¾Êý¤òÉ¬Í×¤Ê¤Î¤À¡¥

´ÊÃ±¤ËÀâÌÀ¤¹¤ë¤È¤­¤Î¡Ö¥Þ¥¯¥í¤Ï°ú¿ô¤òÉ¾²Á¤·¤Ê¤¤¡×¤È¤¤¤¦¤Î¤Ï¾¯¤·´Ö°ã¤Ã¤Æ¤¤¤Æ¡¤
¤³¤¦¸À¤¦¤ÈÀµ³Î¤Ë¤Ê¤ë¡¥
¥Þ¥¯¥í¤Ï¥Þ¥¯¥í¸Æ¤Ó½Ð¤·Æâ¤Î°ú¿ô¤ÎÉ¾²Á¤òÀ©¸æ¤¹¤ë¡¥
É¾²Á²ó¿ô¤Ï°ú¿ô¤¬¥Þ¥¯¥í¤ÎÅ¸³«¥³¡¼¥É¤Î¤É¤³¤ËÃÖ¤«¤ì¤ë¤«¤Ë¤è¤ë¤¬¡¤
1²ó¤Ç¤âÊ£¿ô²ó¤Ç¤âÎÉ¤¤¤·¡¤Á´¤¯É¾²Á¤·¤Ê¤¤¤³¤È¤â¤¢¤ë¡¥
¥Þ¥¯¥í¤Ç¤Î¤³¤ÎÀ©¸æ¤Î»È¤ï¤ìÊý¤Ï¼ç¤Ë¼¡¤Î4ÄÌ¤ê¤À¡§

\begin{enumerate}
\item ÊÑ·Á¡¥
Common Lisp¤Î¥Þ¥¯¥í\verb|setf|¤Ï°ú¿ô¤òÉ¾²ÁÁ°¤Ë¼è¤ê½Ð¤¹Îà¤Î¤â¤Î¤À¡¥
ÁÈ¤ß¹þ¤ß¤Î¥¢¥¯¥»¥¹´Ø¿ô¤Ë¤Ï¡¤¤·¤Ð¤·¤ÐµÕ¤ÎÆ°ºî¤ò¹Ô¤¦´Ø¿ô¤¬¤¢¤ë¡¥
¤½¤ÎÌÜÅª¤Ï¥¢¥¯¥»¥¹´Ø¿ô¤¬¼è¤Ã¤Æ¤­¤¿¤â¤Î¤òÀßÄê¤¹¤ë¤³¤È¤À¡¥
\verb|car|¤Ë¤Ä¤¤¤Æ¤Ï\verb|rplaca|¡¤\verb|ofcdr|¡¤\verb|rplacd|Åù¤¬Åö¤Æ¤Ï¤Þ¤ë¡£
\verb|setf|¤ò»È¤¦¤È¡¤¤½¤¦¤¤¤Ã¤¿¥¢¥¯¥»¥¹´Ø¿ô¤òÀßÄê¤µ¤ì¤ë¤Ù¤­ÊÑ¿ô¤ÈÆ±¤¸¤è¤¦¤Ë¸Æ¤Ó½Ð¤»¤ë¡¥
Îã¤¨¤Ð\verb|(setf (car x) 'a)|¤Ï\verb|(progn (rplaca x 'a) 'a)|¤ËÅ¸³«¤µ¤ìÆÀ¤ë¡¥

¤³¤Îµ»¤ò¼Â¸½¤¹¤ë¤Ë¤Ï¡¤\verb|setf|¤Ï¤½¤ÎÂè1°ú¿ô¤ÎÆâÉô¤ò¸«¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¾å¤Î¾ì¹ç¤Ç\verb|rplaca|¤¬É¬Í×¤À¤ÈÃÎ¤ë¤¿¤á¤Ë¤Ï¡¤
\verb|setf|¤Ë¤ÏÂè1°ú¿ô¤¬\verb|car|¤Ç»Ï¤Þ¤ë¼°¤Ç¤¢¤ë¤³¤È¤¬¸«¤¨¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤è¤Ã¤Æ\verb|setf|¤ò»Ï¤á¤È¤¹¤ë¡¤°ú¿ô¤ÎÊÑ·Á¤ò¹Ô¤¦¥ª¥Ú¥ì¡¼¥¿¤Ï¡¤
¤É¤ì¤â¥Þ¥¯¥í¤È¤·¤Æ½ñ¤«¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
\item ÊÑ¿ôÂ«Çû¡¥
¥ì¥­¥·¥«¥ëÊÑ¿ô¤Ï¥½¡¼¥¹¥³¡¼¥ÉÆâ¤ËÄ¾ÀÜ½ñ¤«¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
Îã¤¨¤Ð\verb|setq|¤ÎÂè1°ú¿ô¤ÏÉ¾²Á¤µ¤ì¤Ê¤¤¤Î¤Ç¡¢
\verb|setq|¤Î¾å¤Ë¹½ÃÛ¤µ¤ì¤¿¤â¤Î¤ÏÁ´¤Æ\verb|setq|¤Ø¤ÈÅ¸³«¤µ¤ì¤ë¥Þ¥¯¥í¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
\verb|setq|¤ò¸Æ¤Ó½Ð¤¹´Ø¿ô¤Ç¤Ï¤À¤á¤À¡¥
¤½¤ì¤Ï°ú¿ô¤¬$\lambda$¼°¤Î²¾°ú¿ô¤È¤·¤Æ¸½¤ì¤ë\verb|let|¤Ê¤É¤Î¥ª¥Ú¥ì¡¼¥¿¤ä¡¤
\verb|lets|¤Ø¤ÈÅ¸³«¤µ¤ì¤ë\verb|do|Åù¤Î¥Þ¥¯¥í¤Ë¤Ä¤¤¤Æ¤âÆ±ÍÍ¤À¡£
°ú¿ô¤Î¥ì¥­¥·¥«¥ë¤ÊÂ«Çû¤òÊÑ¹¹¤¹¤ë¤¿¤á¤Î¿·¥ª¥Ú¥ì¡¼¥¿¤Ï¡¤
¤¤¤º¤ì¤â¥Þ¥¯¥í¤È¤·¤Æ½ñ¤«¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
\item ¾ò·ïÊ¬´ô¤Ë¤è¤ëÉ¾²Á¡¥
´Ø¿ô¤Î°ú¿ô¤ÏÁ´¤ÆÉ¾²Á¤µ¤ì¤ë¡¥
\verb|when|¤Î¤è¤¦¤ÊÀ©¸æ¹½Ê¸¤Ç¤Ï¡¤¤¢¤ë°ú¿ô¤ÏÆÃÄê¤Î¾ò·ï²¼¤Ç¤Î¤ßÉ¾²Á¤µ¤ì¤ë¡¥
¤½¤Î¤è¤¦¤Ê½ÀÆðÀ­¤Ï¥Þ¥¯¥í¤Ç¤Î¤ßÆÀ¤é¤ì¤ë¡¥
\item Ê£¿ô²ó¤ÎÉ¾²Á¡¥
´Ø¿ô¤Î°ú¿ô¤ÏÁ´¤ÆÉ¾²Á¤µ¤ì¤ë¤À¤±¤Ç¤Ê¤¯¡¤¤­¤Ã¤«¤ê1²óÉ¾²Á¤µ¤ì¤ë¡¥
¥Þ¥¯¥í¤Ï\verb|do|¤Î¤è¤¦¤ÊÀ©¸æ¹½Ê¸¤ÎÄêµÁ¤Ë»È¤ï¤ì¤ë¤¬¡¤¤³¤Î¾ì¹ç¡¤
¤¢¤ë°ú¿ô¤Ï·«¤êÊÖ¤·É¾²Á¤µ¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
\end{enumerate}
¥Þ¥¯¥í¤Î¥¤¥ó¥é¥¤¥óÅ¸³«¤ò³èÍÑ¤¹¤ëÊýË¡¤â¤¤¤¯¤Ä¤«¤¢¤ë¡£
¤½¤³¤ÇÅ¸³«·Á¤ÏÎã¤¨¤Ð¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Î¥ì¥­¥·¥«¥ë¥³¥ó¥Æ¥­¥¹¥ÈÆâ¤Ë¸½¤ì¤ë¤³¤È¤ò¶¯Ä´¤·¤¿¤¤¡¥
¤Ê¤¼¤Ê¤é3ÄÌ¤ê¤Î¤¦¤Á2ÄÌ¤ê¤Î¥Þ¥¯¥í¤¬¤½¤Î»ö¼Â¤Ë°Íµò¤·¤Æ¤¤¤ë¤«¤é¤À¡¥
¤¹¤Ê¤ï¤Á¡¢
\begin{enumerate}
\setcounter{enumi}{4}
\item ¸Æ¤Ó½Ð¤·Â¦´Ä¶­¤òÍøÍÑ¤¹¤ë¡¥
¥Þ¥¯¥í¤Ï¡¤¸Æ¤Ó½Ð¤·Â¦¤Î¥³¥ó¥Æ¥­¥¹¥È¤ËÂ«Çû¤µ¤ì¤¿ÊÑ¿ô¤ò´Þ¤àÅ¸³«·Á¤òÀ¸À®¤Ç¤­¤ë¡¥
²¼¤Î¥Þ¥¯¥í¤ÎÆ°ºî¤Ï¡¤\verb|foo|¤¬¸Æ¤Ð¤ì¤¿¾ì½ê¤Ç¤Î\verb|y|¤ÎÂ«Çû¤Ë°ÍÂ¸¤¹¤ë¡¥
\begin{verbatim}
(defmacro foo (x)
  `(+ ,x y))
\end{verbatim}
ÉáÄÌ¤³¤ÎÎà¤Î¥ì¥­¥·¥«¥ë¤Ê·ë¤ÓÉÕ¤­¤Ï´î¤Ó¤Î¸»¤È¤¤¤¦¤è¤ê¤âÅÁÀ÷ÉÂ¤Î´¶À÷¸»¤È¤·¤Æ¸«¤Ê¤µ¤ì¤ë¡¥
ÄÌ¾ï¡¤¤½¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤ò½ñ¤¯¤Î¤Ï°­¤¤¥¹¥¿¥¤¥ë¤À¡¥
´Ø¿ô¥×¥í¥°¥é¥ß¥ó¥°¤ÎÍýÁÛ¤Ï¥Þ¥¯¥í¤Ë¤âÆ±ÍÍ¤ËÅ¬ÍÑ¤µ¤ì¤ë¡§
¥Þ¥¯¥í¤Ï°ú¿ô¤òÄÌ¤¸¤ÆÁê¸ßºîÍÑ¤¹¤ë¤³¤È¤¬Ë¾¤Þ¤·¤¤¡¥
¼ÂºÝ¡¤¸Æ½ÐÂ¦´Ä¶­¤òÍøÍÑ¤¹¤ë¤³¤È¤ÏÌÇÂ¿¤ËÉ¬Í×¤Ë¤Ê¤é¤º¡¤
¤½¤Î¤è¤¦¤Ê¾õ¶·¤¬µ¯¤­¤¿¤È¤·¤Æ¤â¡¤¤½¤ì¤ÏÂçÄñ¸í¤ê¤Ë¤è¤ë¤â¤Î¤À¡ÊÂè9¾Ï¤ò»²¾È¡Ë¡¥
¤³¤ÎËÜ¤ÎÃæ¤ÎÁ´¤Æ¤Î¥Þ¥¯¥í¤Î¤¦¤Á¡¤·ÑÂ³¤òÅÏ¤¹¥Þ¥¯¥í¡ÊÂè20¾Ï¡Ë¤ÈATN¥³¥ó¥Ñ¥¤¥é¡ÊÂè23¾Ï¡Ë¤Î¤ß¤¬
¤½¤ÎÊýË¡¤Ç¸Æ¤Ó½Ð¤·Â¦´Ä¶­¤òÍøÍÑ¤·¤Æ¤¤¤ë¡¥
\item ¿·¤·¤¤´Ä¶­¤òÊñ¤ß¹þ¤à¡¥
¥Þ¥¯¥í¤Ï°ú¿ô¤ò¿·¤¿¤Ê¥ì¥­¥·¥«¥ë´Ä¶­¤ÇÉ¾²Á¤µ¤»¤ë¤³¤È¤â¤Ç¤­¤ë¡¥
¸ÅÅµÅª¤ÊÎã¤Ï\verb|let|¤Ç¡¤\verb|lambda|¤Î¾å¤Ë¥Þ¥¯¥í¤òÈï¤»¤ë¤³¤È¤Ç¼ÂÁõ¤Ç¤­¤ë¡Êpenpen¥Ú¡¼¥¸¡Ë¡¥
\verb|(let ((y 2)) (+ x y))|Åù¤Î¼°¤Î¼Â¹ÔÉôËÜÂÎ¤ÎÃæ¤Ç¤Ï¡¤
\verb|y|¤Ï¿·¤·¤¤ÊÑ¿ô¤ò»Ø¤¹¤³¤È¤Ë¤Ê¤ë¡¥
\item ´Ø¿ô¸Æ¤Ó½Ð¤·¤òÀáÌó¤¹¤ë¡¥
¥Þ¥¯¥í¤ÎÅ¸³«·ë²Ì¤ò¥¤¥ó¥é¥¤¥óÁÞÆþ¤¹¤ë¤³¤È¤Î3¤ÄÌÜ¤Î·ë²Ì¤Ï¡¤
¥³¥ó¥Ñ¥¤¥ë¸å¤Î¥³¡¼¥É¤Ç¤Ï¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ë´Ø¤ï¤ë¥ª¡¼¥ô¥¡¥Ø¥Ã¥É¤¬°ìÀÚ¤Ê¤¤¤³¤È¤À¡¥
¼Â¹Ô»þ¤Ë¤Ï¡¤¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤ÏÅ¸³«·Á¤ËÃÖ¤­´¹¤¨ºÑ¤ß¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥
(¸¶Â§Åª¤Ë¤Ï¥¤¥ó¥é¥¤¥óÀë¸À¤µ¤ì¤¿´Ø¿ô¤Ç¤âÆ±¤¸¤³¤È¤À¤¬)
\end{enumerate}

¶Ã¤¤¤¿¤³¤È¤ËÂè5ÈÖÌÜ¤ÈÂè6ÈÖÌÜ¤ÎÍÑË¡¤Ï¡¤
°Õ¿Þ¤»¤º¤Ë»È¤ï¤ì¤¿¤È¤­¤Ï¡¤ÊÑ¿ôÊáÂª¤ÎÌäÂê¤ò°ú¤­µ¯¤³¤¹¡¥
¤³¤ì¤Ï¥Þ¥¯¥í¤ò½ñ¤¯¤È¤­¤Ë¶²¤é¤¯°ìÈÖ¶²¤í¤·¤¤¤³¤È¤À¡¥
ÊÑ¿ôÊáÂª¤Ë¤Ä¤¤¤Æ¤ÏÂè9¾Ï¤ÇÏÀ¤¸¤ë¡¥

¥Þ¥¯¥í¤ÎÍøÍÑË¡¤Ë¤Ï7ÄÌ¤ê¤¢¤ë¤È¸À¤¦Âå¤ï¤ê¤Ë¡¤6ÄÌ¤êÈ¾¤¢¤ë¤È¸À¤Ã¤¿Êý¤¬¤è¤¤¤À¤í¤¦¡¥
ÍýÁÛ¤ÎÀ¤³¦¤Ç¤ÏÁ´¤Æ¤ÎCommon Lisp¥³¥ó¥Ñ¥¤¥é¤¬¥¤¥ó¥é¥¤¥óÀë¸À¤Ë½¾¤¤¡¤
´Ø¿ô¸Æ¤Ó½Ð¤·¤ÎÀáÌó¤Ï¥Þ¥¯¥í¤Ç¤Ï¤Ê¤¯¥¤¥ó¥é¥¤¥ó´Ø¿ô¤Î»Å»ö¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤³¤È¤À¤í¤¦¡¥
ÍýÁÛ¤ÎÀ¤³¦¤ÏÆÉ¼Ô¤Ø¤Î²ÝÂê¤È¤·¤Æ»Ä¤·¤Æ¤ª¤¯¡¥
%}}}
\subsection{¥Þ¥¯¥í¤È´Ø¿ô¤É¤Á¤é¤¬¤è¤¤¡©}   %{{{
Á°Àá¤Ç¤ÏÈ½ÃÇ¤ÎÍÆ°×¤Ê¥±¡¼¥¹¤ò°·¤Ã¤¿¡£
°ú¿ô¤Ë¡¢É¾²ÁÁ°¤Ë¥¢¥¯¥»¥¹¤¹¤ë¥ª¥Ú¥ì¡¼¥¿¤ÏÁ´¤Æ¥Þ¥¯¥í¤Ç½ñ¤«¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡£
Â¾¤ËÁªÂò»è¤Ï¤Ê¤¤¤«¤é¤À¡£
¤½¤ì¤Ç¤Ï¥Þ¥¯¥í¤Ç¤â´Ø¿ô¤Ç¤â½ñ¤±¤ë¤è¤¦¤Ê¥ª¥Ú¥ì¡¼¥¿¤Ï¤É¤¦¤À¤í¤¦¤«¡©
Îã¤¨¤Ð°ú¿ô¤ÎÊ¿¶ÑÃÍ¤òÊÖ¤¹¥ª¥Ú¥ì¡¼¥¿\verb|avg|¤ò¹Í¤¨¤Æ¤ß¤è¤¦¡¥
¼¡¤Î¤è¤¦¤Ë´Ø¿ô¤È¤·¤Æ½ñ¤¯¤³¤È¤¬¤Ç¤­¤ë¡¥
\begin{verbatim}
(defun avg (&rest args)
  (/ (apply #'+ args) (length args)))
\end{verbatim}
¤·¤«¤·¼¡¤Î¤è¤¦¤Ë¥Þ¥¯¥í¤È¤·¤Æ½ñ¤¤¤¿Êý¤¬¤è¤¤¡¥
\begin{verbatim}
(defmacro avg (&rest args)
  `(/ (+ ,@args) ,(length args)))
\end{verbatim}
´Ø¿ôÈÇ\verb|avg|¤Ï¸Æ¤Ð¤ì¤ëÅÙ¤Ë\verb|length|¤ò¸Æ¤Ö¤¬¡¤¤½¤ì¤ÏÉÔÉ¬Í×¤À¡¥
¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¤Ï°ú¿ô¤ÎÃÍ¤Þ¤Ç¤ÏÉÔÌÀ¤«¤â¤·¤ì¤Ê¤¤¤¬¡¤¤½¤ì¤¬´ö¤Ä¤¢¤ë¤«¤ÏÊ¬¤«¤ë¡¥
¤è¤Ã¤Æ\verb|length|¤Î¸Æ¤Ó½Ð¤·¤Ï¤½¤Î¤È¤­¤ËºÑ¤Þ¤»¤¿Êý¤¬¤è¤¤¡¥
»÷¤¿¤è¤¦¤ÊÁªÂò¤òÇ÷¤é¤ì¤¿¤È¤­¤Ë¹ÍÎ¸¤¹¤Ù¤­ÅÀ¤Ï°Ê²¼¤ÎÄÌ¤ê¤À¡¥

\begin{center}¥Þ¥¯¥í¤ÎÄ¹½ê\end{center}
\begin{enumerate}
\item ¥³¥ó¥Ñ¥¤¥ë»þ¤Î·×»»¡¥
¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ë¤Ï¡¤2¤Ä¤Î»þÅÀ¤Ç¤Î½èÍý¤¬´Ø¤ï¤Ã¤Æ¤¯¤ë¡¥
¥Þ¥¯¥í¤ÎÅ¸³«»þ¤È¡¤Å¸³«·Á¤ÎÉ¾²Á»þ¤À¡¥
Lisp¥×¥í¥°¥é¥à¤Ç¤Î¥Þ¥¯¥íÅ¸³«¤ÏÁ´¤Æ¥×¥í¥°¥é¥à¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¤È¤­¤Ë¹Ô¤ï¤ì¡¤
¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¼Â¹Ô¤Ç¤­¤ë¤É¤Î¤è¤¦¤Ê·×»»¤â¡¤¼Â¹Ô»þ¤Ë¥×¥í¥°¥é¥à¤òÃÙ¤¯¤¹¤ë¤³¤È¤Ï¤Ê¤¤¡¥
¥ª¥Ú¥ì¡¼¥¿¤¬»Å»ö¤Î°ìÉô¤ò¥Þ¥¯¥íÅ¸³«¤ÎÃÊ³¬¤ÇºÑ¤Þ¤»¤ë¤è¤¦¤Ë½ñ¤±¤ë¤Ê¤é¡¤
¥Þ¥¯¥í¤È¤·¤Æ½ñ¤¯Êý¤¬¸úÎ¨¤¬¤è¤¤¤À¤í¤¦¡¥
¸­¤¤¥³¥ó¥Ñ¥¤¥é¤Ç¤â¤Ç¤­¤Ê¤¤¤è¤¦¤Ê¤³¤È¤¬¤¢¤ì¤Ð¡¤
·ë¶É¼Â¹Ô»þ¤Ë´Ø¿ô¤¬¤³¤Ê¤¹¤³¤È¤Ë¤Ê¤ë¤Î¤À¤«¤é¡¥
Âè13¾Ï¤Ç¤Ï\verb|avg|¤Î¤è¤¦¤ËÅ¸³«»þ¤Ë»Å»ö¤ò¹Ô¤¦¥Þ¥¯¥í¤Ë¤Ä¤¤¤ÆÀâÌÀ¤¹¤ë¡¥
\item Lisp¤È¤Î¶ÛÌ©¤ÊÏ¢·È¡¥
´Ø¿ô¤Ç¤Ï¤Ê¤¯¥Þ¥¯¥í¤ò»È¤¦¤È¡¤¥×¥í¥°¥é¥à¤òLisp¤È¶ÛÌ©¤ËÏ¢·È¤µ¤»¤é¤ì¤ë¤³¤È¤¬¤¢¤ë¡¥
¤¢¤ëÌäÂê¤ò²ò¤¯¥×¥í¥°¥é¥à¤ò½ñ¤¯Âå¤ï¤ê¤Ë¡¤
¥Þ¥¯¥í¤ò»È¤Ã¤Æ¤½¤ÎÌäÂê¤òLisp¤¬´û¤Ë²òË¡¤òÃÎ¤Ã¤Æ¤¤¤ë¤è¤¦¤ÊÌäÂê¤ØÊÑ·Á¤Ç¤­¤ë¤È¤­¤¬¤¢¤ë¡¥
¤³¤Î¥¢¥×¥í¡¼¥Á¤¬²ÄÇ½¤Ê¤È¤­¤Ï¡¤ÂçÄñ¥×¥í¥°¥é¥à¤Ï¾®¤µ¤¯¤«¤Ä¸úÎ¨Åª¤Ë¤Ê¤ë¡§
Lisp¤¬½èÍý¤òÂå¤ï¤ê¤Ë¹Ô¤Ã¤Æ¤¯¤ì¤ë¤Î¤Ç¾®¤µ¤¯¤Ê¤ê¡¤
Lisp½èÍý·Ï¤ÎÀ½ÉÊ¤Ï°ìÈÌÅª¤Ë¥æ¡¼¥¶¤Î¥×¥í¥°¥é¥à¤è¤êÌµÂÌ¤òºï¤¤¤Ç¤¢¤ë¤«¤é¸úÎ¨¤¬¤è¤¯¤Ê¤ë¡¤¤È¤¤¤¦Ìõ¤À¡¥
¤³¤ÎÄ¹½ê¤Ï¼ç¤ËËä¤á¹þ¤ß¸À¸ì¤ÇÌÀ¤é¤«¤Ë¤Ê¤ë¤¬¡¤¤½¤ì¤Ë¤Ä¤¤¤Æ¤ÎÀâÌÀ¤ÏÂè19¾Ï¤«¤é»Ï¤Þ¤ë¡¥
\item ´Ø¿ô¸Æ¤Ó½Ð¤·¤ÎÀáÌó¡¥
¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ï¡¤½ñ¤«¤ì¤¿½ê¤ËÄ¾ÀÜÅ¸³«¤µ¤ì¤ë¡¥
¤À¤«¤é¤è¤¯»È¤ï¤ì¤ë¥³¡¼¥É¤Î¤Þ¤È¤Þ¤ê¤ò¥Þ¥¯¥í¤È¤·¤ÆÄêµÁ¤·¤Æ¤ª¤±¤Ð¡¤
¤½¤ì¤¬»È¤ï¤ì¤ëÅÙ¤Ë´Ø¿ô¤ò¸Æ¤Ó½Ð¤µ¤Ê¤¯¤È¤â¤è¤¤¡¥
Lisp¤Î¸Å¤¤Êý¸À¤Ç¤Ï¡¤¥×¥í¥°¥é¥Þ¤Ï¼Â¹Ô»þ¤Î´Ø¿ô¸Æ¤Ó½Ð¤·¤òÀáÌó¤¹¤ë¤¿¤á¤Ë¡¤
¥Þ¥¯¥í¤Î¤³¤ÎÀ­¼Á¤ò³èÍÑ¤·¤Æ¤¤¤¿¡¥
Common Lisp¤Ç¤Ï¡¤¤³¤Î»Å»ö¤Ï¥¤¥ó¥é¥¤¥óÀë¸À¤µ¤ì¤¿´Ø¿ô¤¬Âå¤ï¤ê¤Ë¹Ô¤¦¤â¤Î¤È¤µ¤ì¤Æ¤¤¤ë¡¥

´Ø¿ô¤ò¥¤¥ó¥é¥¤¥óÀë¸À¤¹¤ë¤³¤È¤Ç¡¤
¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¤é¸Æ½ÐÂ¦¥³¡¼¥É¤ÎÃæ¤ËËä¤á¹þ¤Þ¤ì¤ë¤è¤¦»Ø¼¨¤Ç¤­¤ë¡¥
¥Þ¥¯¥í¤ÈÁ´¤¯Æ±¤¸¤À¡¥
¤·¤«¤·¡¤¤³¤³¤Ç¤ÏÍýÁÛ¤È¸½¼Â¤Î¥®¥ã¥Ã¥×¤¬½Ð¤Æ¤¯¤ë¡¥
\CLtL2 (p. 229)¤Ë¤Ï¡Ö¥³¥ó¥Ñ¥¤¥é¤¬¤³¤ÎÀë¸À¤òÌµ»ë¤¹¤ë¤Î¤Ï¥Õ¥ê¡¼¤Ç¤¢¤ë¡×¤È¤¢¤ê¡¤
´ö¤Ä¤«¤ÎCommon Lisp¥³¥ó¥Ñ¥¤¥é¤Ï³Î¤«¤ËÌµ»ë¤·¤Æ¤¤¤ë¡¥
¤½¤Î¤è¤¦¤Ê¥³¥ó¥Ñ¥¤¥é¤ò»È¤ï¤¶¤ë¤òÆÀ¤Ê¤¤¤Î¤Ê¤é¡¤
´Ø¿ô¸Æ¤Ó½Ð¤·¤ÎÀáÌó¤Ë¥Þ¥¯¥í¤ò»È¤¦¤Î¤âÇ§¤á¤é¤ì¤ë¤À¤í¤¦¡¥
\end{enumerate}
¸úÎ¨¤ÈLisp¤È¤Î¶ÛÌ©¤ÊÏ¢·È¤È¤ÎÄ¹½ê¤¬ÁêÐØ¤Ã¤Æ¡¤
¥Þ¥¯¥í¤ò»È¤ª¤¦¤È¤¤¤¦¹Í¤¨¤¬¶¯¤¤ÀâÆÀÎÏ¤ò»ý¤Ä¾ì¹ç¤¬¤¢¤ë¡¥
Âè19¾Ï¤Î¥¯¥¨¥ê¡¦¥³¥ó¥Ñ¥¤¥é¤Ç¤Ï¡¤¥³¥ó¥Ñ¥¤¥ë»þ¤Ë°Ü¤»¤ë·×»»¤ÎÎÌ¤¬¤È¤Æ¤âÂç¤­¤¤¤Î¤Ç¡¤
¥×¥í¥°¥é¥àÁ´ÂÎ¤ò1¤Ä¤ÎµðÂç¤Ê¥Þ¥¯¥í¤ËÊÑ¤¨¤Æ¤·¤Þ¤Ã¤Æ¤è¤¤¤È¤¤¤¨¤ë¡¥
¤³¤ÎÊÑ´¹¤Ï¥¹¥Ô¡¼¥É¤Î¤¿¤á¤Ë¹Ô¤ï¤ì¤¿¤Î¤À¤¬¡¤
¥×¥í¥°¥é¥à¤òLisp¤È¶ÛÌ©¤Ë¤¹¤ë¤³¤È¤Ë¤â¤Ä¤Ê¤¬¤Ã¤Æ¤¤¤ë¡¥
¿·¤·¤¤¥ô¥¡¡¼¥¸¥ç¥ó¤Ç¤Ï¥¯¥¨¥ê¤ÎÃæ¤Ç¿ôÃÍÉ¾²Á¤Ê¤É¤ÎLisp¤Î¼°¤ò´ÊÃ±¤Ë»È¤¨¤ë¤Î¤À¡¥

\begin{center}¥Þ¥¯¥í¤ÎÃ»½ê\end{center}
\begin{enumerate}
\item ´Ø¿ô¤Ï¥Ç¡¼¥¿¤À¤¬¡¤¥Þ¥¯¥í¤Ï¥³¥ó¥Ñ¥¤¥é¤Ø¤Î»Ø¼¨¤Ë¶á¤¤¡¥
´Ø¿ô¤Ï¡ÊÎã¤¨¤Ð\verb|apply|¤Ë¡Ë°ú¿ô¤È¤·¤ÆÅÏ¤¹¤³¤È¤â¡¤´Ø¿ô¤«¤éÊÖ¤¹¤³¤È¤â¡¤
¥Ç¡¼¥¿¹½Â¤Æâ¤Ë³ÊÇ¼¤¹¤ë¤³¤È¤â¤Ç¤­¤ë¡¥
¥Þ¥¯¥í¤Ç¤Ï¤½¤ì¤é¤Ï¤É¤ì¤âÉÔ²ÄÇ½¤À¡¥
¤³¤ì¤é¤Ï¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤ò$\lambda$¼°¤ÇÊñ¤à¤³¤È¤Ç¼Â¸½¤Ç¤­¤ë¾ì¹ç¤¬¤¢¤ë¡¥
¤³¤ÎÊýË¡¤ÏÎã¤¨¤Ð¥Þ¥¯¥í¤Ë\verb|apply|¤ä\verb|funcall|¤òÅ¬ÍÑ¤·¤¿¤¤¤È¤­¤Ë»È¤¨¤ë¡¥
\begin{verbatim}
> (funcall #'(lambda (x y) (avg x y)) 1 3)
2
\end{verbatim}
¤·¤«¤·¤³¤ÎÊýË¡¤ÏÉÔÊØ¤À¤·¡¤É¬¤º»È¤¨¤ë¤È¤¤¤¦¤â¤Î¤Ç¤Ï¤Ê¤¤¡¥
\verb|avg|¤Î¤è¤¦¤Ë¡¤¥Þ¥¯¥í¤Ë\verb@&rest@¥Ñ¥é¥á¡¼¥¿¤¬¤¢¤Ã¤Æ¤â¡¤
¤½¤ì¤Ë²ÄÊÑ¸Ä¤Î°ú¿ô¤òÅÏ¤¹ÊýË¡¤Ï¤Ê¤¤¡¥
\item ¥½¡¼¥¹¥³¡¼¥É¤ÎÌÀ³Î¤µ¡¥
¥Þ¥¯¥íÄêµÁ¤Ï¡¤Æ±Åù¤Ê´Ø¿ô¤ÎÄêµÁ¤è¤êÆÉ¤ß¿É¤¯¤Ê¤ê¤¬¤Á¤À¡¥
¤À¤«¤é²¿¤«¤ò¥Þ¥¯¥í¤È¤·¤Æ½ñ¤¤¤Æ¤â¥×¥í¥°¥é¥à¤¬Âç¤·¤Æ¿ÊÊâ¤¹¤ëÌõ¤Ç¤â¤Ê¤¤¤Ê¤é¡¤
Âå¤ï¤ê¤Ë´Ø¿ô¤ò»È¤Ã¤¿Êý¤¬¤è¤¤¡¥
\item ¼Â¹Ô»þ¤ÎÌÀ³Î¤µ¡¥
¥Þ¥¯¥í¤Ï´Ø¿ô¤è¤ê¥Ç¥Ð¥Ã¥°¤·¿É¤¤¤³¤È¤¬¤¢¤ë¡¥
Â¿¿ô¤Î¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤ò´Þ¤à¥³¡¼¥É¤Ç¼Â¹Ô»þ¥¨¥é¡¼¤Ë½Ð¤¯¤ï¤·¤Æ¤â¡¤
\verb|backtrace|¤Ç¸«¤¨¤ë¥³¡¼¥É¤Ï¤½¤ì¤éÁ´¤Æ¤Î¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤ÎÅ¸³«·Á¤«¤é¤Ê¤ê¡¤
¸µ¡¹½ñ¤¤¤¿¥³¡¼¥É¤È¤Ï»÷¤Æ¤â»÷¤Ä¤«¤Ê¤¤¤«¤â¤·¤ì¤Ê¤¤¡¥

¥Þ¥¯¥í¤ÏÅ¸³«»þ¤Ë¾Ã¤¨¤Æ¤·¤Þ¤¦¤Î¤Ç¡¤¼Â¹Ô»þ¤Ë¤ÏÆ°ºî¤ÎÀâÌÀ¤¬¤Ä¤«¤Ê¤¤¡¥
ÉáÄÌ¤Ï\verb|trace|¤Ç¥Þ¥¯¥í¤¬¸Æ¤Ó½Ð¤µ¤ì¤ëÍÍ»Ò¤ò¸«¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡¥
¤¿¤È¤¨»È¤Ã¤Æ¤â¡¤\verb|trace|¤Ï¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤½¤Î¤â¤Î¤Ç¤Ï¤Ê¤¯¡¤
¥Þ¥¯¥í¤òÅ¸³«¤¹¤ë´Ø¿ô¤Î¸Æ¤Ó½Ð¤·¤òÉ½¼¨¤¹¤ë¤À¤í¤¦¡¥
\item ºÆµ¢¡¥
¥Þ¥¯¥íÆâ¤ÇºÆµ¢¤ò»È¤¦¤Î¤Ï¡¤´Ø¿ô¤Î¤È¤­¤Û¤É´ÊÃ±¤Ç¤Ê¤¤¡¥
¥Þ¥¯¥íÅ¸³«¤Î·ë²Ì¤Î´Ø¿ô¤ÏºÆµ¢Åª¤Ç¤â¤è¤¤¤¬¡¤Å¸³«¤½¤Î¤â¤Î¤ÏºÆµ¢Åª¤Ç¤¢¤Ã¤Æ¤Ï¤Ê¤é¤Ê¤¤¤«¤é¤À¡¥
Âè10.4¾Ï¤Ç¥Þ¥¯¥í¤Ë¤ª¤±¤ëºÆµ¢¤ò°·¤¦¡¥
\end{enumerate}

¤¤¤Ä¥Þ¥¯¥í¤ò»È¤¦¤«¤ò·è¤á¤ëºÝ¤Ë¤Ï¡¤¤³¤ì¤é¤Î¹ÍÎ¸¤Î¥Ð¥é¥ó¥¹¤ò¼è¤é¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤É¤Á¤é¤¬Í­Íø¤«¤ò¶µ¤¨¤Æ¤¯¤ì¤ë¤Î¤Ï·Ð¸³¤Î¤ß¤À¡¥
¤·¤«¤·¤³¤Î¸å¤Î¾Ï¤Î¥Þ¥¯¥í¤ÎÎã¤Ï¡¤¥Þ¥¯¥í¤¬ÊØÍø¤Ê¾õ¶·¤òÂçÂÎ¥«¥ô¥¡¡¼¤·¤Æ¤¤¤ë¡¥
¹Í¤¨Ãæ¤Î¥Þ¥¯¥í¤¬¤³¤³¤Ç¤ÎÎã¤Ë»÷¤Æ¤¤¤ë¤Ê¤é¡¤¤½¤Î¤è¤¦¤Ë½ñ¤¤¤Æ¤âÂç¾æÉ×¤À¤í¤¦¡¥

ºÇ¸å¤Ë¸À¤¤¤¿¤¤¤Î¤Ï¡¤¼Â¹Ô»þ¤ÎÌÀ³Î¤µ¡Ê¥Ý¥¤¥ó¥È6¡Ë¤Ï¤Û¤È¤ó¤ÉÌäÂê¤Ë¤Ê¤é¤Ê¤¤¤È¤¤¤¦¤³¤È¤À¡¥
ÂçÎÌ¤Î¥Þ¥¯¥í¤ò´Þ¤à¥³¡¼¥É¤Î¥Ç¥Ð¥Ã¥°¤Ï¡¤»×¤Ã¤¿ÄøÆñ¤·¤¯¤Ê¤¤¤À¤í¤¦¡¥
¥Þ¥¯¥íÄêµÁ¤¬¿ôÉ´¹Ô¤ËµÚ¤Ö¤Î¤Ê¤é¡¤¼Â¹Ô»þ¤Ë¤½¤ÎÅ¸³«·Á¤ò¥Ç¥Ð¥Ã¥°¤¹¤ë¤Î¤Ï·ù¤Ë¤Ê¤ë¤³¤È¤À¡¥
¤·¤«¤·¾¯¤Ê¤¯¤È¤â¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¡¤¾®¤µ¤¯¿®Íê¤Ç¤­¤ëÁØ¤È¤·¤Æ½ñ¤«¤ì¤ë¤³¤È¤¬Â¿¤¤¡¥
°ìÈÌÅª¤Ë¤ÏÄêµÁ¤Ï15¹Ô°Ê²¼¤Ë¤Ê¤ë¡¥
¤À¤«¤é¤â¤·\verb|backtrace|¤òÄÌ¤·¤Æ¥³¡¼¥É¤È¤Ë¤é¤á¤Ã¤³¤¹¤ë±©ÌÜ¤Ë¤Ê¤Ã¤Æ¤â¡¤
¤½¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤¬ÌÜ¤ò¤Ò¤É¤¯ÆÞ¤é¤»¤ë¤³¤È¤Ï¤Ê¤¤¤À¤í¤¦¡¥
%}}}
\subsection{¥Þ¥¯¥í¤Î±þÍÑÎã}   %{{{
¥Þ¥¯¥í¤Ç²¿¤¬¤Ç¤­¤ë¤Î¤«¤ò¹Í¤¨¤¿¾å¤Ç¡¤¼¡¤ËÉâ¤«¤Ö¼ÁÌä¤Ï¤³¤¦¤À¡§
¥Þ¥¯¥í¤ò¤É¤Î¤è¤¦¤Ê±þÍÑ¤Ë»È¤¨¤Ð¤è¤¤¤Î¤À¤í¤¦¡©~%
¥Þ¥¯¥í¤ÎÍøÍÑ¤Ë¤Ä¤¤¤Æ¤Î°ìÈÌÅª¤ÊÀâÌÀ¤Ë°ìÈÖ¶á¤¤¤Î¤Ï¡¤
¥Þ¥¯¥í¤Ï¼ç¤Ë¹½Ê¸ÊÑ´¹¤Ë»È¤ï¤ì¤ë¤È¸À¤¦¤³¤È¤À¤í¤¦¡¥
¥Þ¥¯¥í¤ÎÅ¬ÍÑÈÏ°Ï¤¬À©¸Â¤µ¤ì¤Æ¤¤¤ë¤È¸À¤¤¤¿¤¤¤Î¤Ç¤Ï¤Ê¤¤¡¥
Lisp¥×¥í¥°¥é¥à¤Ï¥ê¥¹¥È¤«¤éºî¤é¤ì¤ë¤¬
\footnote{¥ê¥¹¥È¤¬¥³¥ó¥Ñ¥¤¥é¤Ø¤ÎÆþÎÏ¤Ç¤¢¤ë¤È¤¤¤¦°ÕÌ£¤Ç¡Öºî¤é¤ì¤ë¡×¤È¤¤¤¦¤³¤È¤À¡¥
ÀÎ¤ÎÊý¸À¤Î´ö¤Ä¤«¤È¤Ï°ã¤¤¡¤¸½ºß¤Ç¤Ï´Ø¿ô¤Ï¥ê¥¹¥È¤«¤éºî¤é¤ì¤Æ¤Ï¤¤¤Ê¤¤¡¥}¡¤
¥ê¥¹¥È¤ÏLisp¤Î»ý¤Ä¥Ç¡¼¥¿¹½Â¤¤Ç¤¢¤ê¡¤¼ÂºÝ¡Ö¹½Ê¸ÊÑ´¹¡×¤ÏÂçÊÑ±ü¤¬¿¼¤¤¡¥
Âè19-24¾Ï¤Ë¤Ï¡¤¹½Ê¸ÊÑ´¹¤¬ÌÜÅª¤Ç¤¢¤ë¤È¸À¤Ã¤Æ¤è¤¤¥×¥í¥°¥é¥à¤ÎÁ´ÂÎ¤òºÜ¤»¤¿¡¥
¤½¤·¤Æ¤½¤ì¤Ï¡¤·ë¶É¤ÏÁ´¤Æ¥Þ¥¯¥í¤Ç¤¢¤ë¡¥

¥Þ¥¯¥í¤Î±þÍÑ¤Ï¡¤
\verb|while|¤Î¤è¤¦¤Ê¾®¤µ¤ÊÈÆÍÑ¥Þ¥¯¥í¤È¡¤
¤³¤Î¸å¤Î¾Ï¤ÇÄêµÁ¤¹¤ëÂçµ¬ÌÏ¤ÇÆÃÊÌ¤ÊÍÑÅÓ¤ò»ý¤Ã¤¿¥Þ¥¯¥í¤È¤Î´Ö¤ÎÏ¢Â³ÂÎ¤ò·ÁÀ®¤¹¤ë¡¥
Ã¼ÅÀ¤ÎÊÒÊý¤Ï¥æ¡¼¥Æ¥£¥ê¥Æ¥£¡¤
¤Ä¤Þ¤ê¤É¤ÎLisp½èÍý·Ï¤âÁÈ¤ß¹þ¤ß¤Ç»ý¤Ã¤Æ¤¤¤ë¥Þ¥¯¥í¤ÎÎà»÷ÉÊ¤À¡¥
¤½¤ì¤ÏÉáÄÌ¾®¤µ¤¯¡¤°ìÈÌÅª¤Ç¡¤ÆÈÎ©¤·¤Æ½ñ¤«¤ì¤Æ¤¤¤ë¡¥
¤·¤«¤·ÆÃÄê¤Î¼ïÎà¤Î¥×¥í¥°¥é¥à¤Î¤¿¤á¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò½ñ¤¯¤³¤È¤â¤Ç¤­¤ë¡¥
Îã¤¨¤Ð¡¤¥°¥é¥Õ¥£¥Ã¥¯¥¹¡¦¥×¥í¥°¥é¥à¤ÎÃæ¤Ç»È¤¦¤è¤¦¤Ê¥Þ¥¯¥í¤¬½¼¼Â¤·¤Æ¤­¤¿¤È¤­¤Ë¤Ï¡¤
¤½¤ì¤é¤Ï¥°¥é¥Õ¥£¥Ã¥¯¥¹¤Î¤¿¤á¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ë»÷¤Æ¤¯¤ë¤À¤í¤¦¡¥
Ï¢Â³ÂÎ¤Î¤â¤¦ÊÒÊý¤ÎÃ¼ÅÀ¤Ï¡¤
Lisp¤È¤ÏÌÀ¤é¤«¤Ë°Û¤Ê¤Ã¤¿¸À¸ì¤Ç¥×¥í¥°¥é¥àÁ´ÂÎ¤ò½ñ¤±¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤ì¤ë¥Þ¥¯¥í¤À¡¥
¤³¤ÎÊýË¡¤Ç»È¤ï¤ì¤ë¥Þ¥¯¥í¤Ï¡¤Ëä¤á¹þ¤ß¸À¸ì¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¤È¸À¤ï¤ì¤ë¡¥

¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¡¤¥Ü¥È¥à¥¢¥Ã¥×¡¦¥¹¥¿¥¤¥ë¤«¤é¤Îµ¢·ë¤ÎÂè1ÈÖÌÜ¤Ç¤¢¤ë¡¥
Â¿ÁØ¹½Â¤¤òºî¤ë¤Ë¤Ï¥×¥í¥°¥é¥à¤¬¾®¤µ²á¤®¤ë¤è¤¦¤Ê¾ì¹ç¤Ç¤¹¤é¡¤
ºÇ²¼ÁØ¤Ç¤¢¤ëLisp¤Î¾å¤ËÁØ¤ò²Ã¤¨¤Æ¤ª¤¯¤³¤È¤Ë¤ÏÍøÅÀ¤¬¤¢¤ë¤«¤â¤·¤ì¤Ê¤¤¡¥
¥æ¡¼¥Æ¥£¥ê¥Æ¥£\verb|nil!|¤Ï°ú¿ô¤Ënil¤òÂåÆþ¤¹¤ë¤â¤Î¤À¤¬¡¤
¥Þ¥¯¥í°Ê³°¤Ç¤ÏÄêµÁ¤Ç¤­¤Ê¤¤¡¥
\begin{verbatim}
(defmacro nil! (x)
   `(setf ,x nil))
\end{verbatim}
\verb|nil!|¤ò¸«¤ë¤È¡¤
¡Ö²¿¤â¤·¤Æ¤Ê¤¤¤¸¤ã¤Ê¤¤¤«¡¤ÂÇ¤Á¹þ¤àÊ¸»ú¤ò¸º¤é¤·¤Æ¤ë¤À¤±¤À¡×¤È¸À¤¤¤¿¤¯¤Ê¤ë¡¥
¤½¤ì¤ÏËÜÅö¤À¤¬¡¤¥Þ¥¯¥í¤Î¤ä¤Ã¤Æ¤¤¤ë¤³¤È¤È¸À¤Ã¤¿¤é¡¤ÂÇ¤Á¹þ¤àÊ¸»ú¤ÎÀáÌó¤¬Á´¤Æ¤À¡¥
»÷¤¿¤è¤¦¤Ê¹Í¤¨Êý¤ò¤·¤¿¤¤¤Ê¤é¡¤
¥³¥ó¥Ñ¥¤¥é¤Î»Å»ö¤Ï¥Þ¥·¥ó¸ì¤òÂÇ¤Á¹þ¤àºî¶È¤ò¾Ê¤¯¤³¤È¤À¤È¸À¤¨¤ë¡¥
¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Î¸ú²Ì¤ÏÎßÀÑ¤·¤Æ¤¤¤¯¤Î¤Ç¡¤¤½¤Î²ÁÃÍ¤Ï¸«²á¤´¤»¤Ê¤¤¡¥
Ã±½ã¤Ê¥Þ¥¯¥í¤òÊ£¿ô¤ÎÁØ¤Ë½Å¤Í¤ë¤³¤È¤Ç¡¤
¥¨¥ì¥¬¥ó¥È¤Ê¥×¥í¥°¥é¥à¤ÈÍý²ò¤·¤¬¤¿¤¤¥×¥í¥°¥é¥à¤È¤Î°ã¤¤¤¬Ê¬¤«¤ì¤ë¡¥

¤Û¤È¤ó¤É¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ÏËä¤á¹þ¤Þ¤ì¤¿¥Ñ¥¿¡¼¥ó¤À¡¥
¼«Ê¬¤Î¥³¡¼¥É¤ÎÃæ¤Î¥Ñ¥¿¡¼¥ó¤Ëµ¤ÉÕ¤¤¤¿¤é¡¤¤½¤ì¤ò¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ËÊÑ¤¨¤ë¤³¤È¤ò¹Í¤¨¤è¤¦¡¥
¥Ñ¥¿¡¼¥ó¤È¤Ï¤Þ¤µ¤Ë¥³¥ó¥Ô¥å¡¼¥¿¤ÎÆÀ°ÕÊ¬Ìî¤À¡¥
Âå¤ï¤ê¤Ë»Å»ö¤ò¤·¤Æ¤¯¤ì¤ë¥×¥í¥°¥é¥à¤¬¼ê¤ËÆþ¤ë¤È¤¤¤¦¤Î¤Ë¡¤
¤É¤¦¤·¤ÆÆ¬¤òÇº¤Þ¤¹É¬Í×¤¬¤¢¤ë¤Î¤À¤í¤¦¤«¡©~%
²¿¤«¤Î¥×¥í¥°¥é¥à¤ò½ñ¤¤¤Æ¤¤¤ë¤È¤­¡¤
¿§¡¹¤Ê¾ì½ê¤ÇÆ±¤¸¹½Â¤¤ò»ý¤Ã¤¿\verb|do|¥ë¡¼¥×¤ò»È¤Ã¤Æ¤¤¤¿¤³¤È¤Ëµ¤ÉÕ¤¤¤¿¤È¤·¤è¤¦¡¥\\
\texttt{%
(do ()\\[-4pt]
~~((not \formal{¾ò·ï} ))\\[-4pt]
~~\formal{¥³¡¼¥ÉËÜÂÎ} )%
}\\
¥³¡¼¥ÉÆâ¤Ç·«¤êÊÖ¤µ¤ì¤ë¥Ñ¥¿¡¼¥ó¤Ëµ¤ÉÕ¤¤¤¿¤È¤­¡¤
¤½¤Î¥Ñ¥¿¡¼¥ó¤Ë¤Ï¤·¤Ð¤·¤ÐÌ¾Á°¤¬ÉÕ¤±¤é¤ì¤ë¡¥
¤³¤Î¾ì¹ç¤Î¥Ñ¥¿¡¼¥ó¤Ï\verb|while|¤È¤¤¤¦Ì¾Á°¤À¡¥
¤½¤ì¤ò¿·¤·¤¤¥æ¡¼¥Æ¥£¥ê¥Æ¥£Æâ¤ÇÄó¶¡¤·¤¿¤¤¤È¤­¤Ë¤Ï¡¤
¾ò·ïÉ¾²Á¤ÈÊ£¿ô²ó¤ÎÉ¾²Á¤¬É¬Í×¤Ê¤Î¤Ç¡¤
¥Þ¥¯¥í¤ò»È¤ï¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
ruriruri¥Ú¡¼¥¸¤Ë¤¢¤ë²¼¤ÎÄêµÁ¤ò»È¤Ã¤Æ\verb|while|¤òÄêµÁ¤¹¤ë¤È¡¤
\begin{verbatim}
(defmacro while (test &body body)
  `(do ()
     ((not ,test))
     ,@body))
\end{verbatim}
¾å¤Î¥Ñ¥¿¡¼¥óÎã¤Ï¼¡¤Î¤è¤¦¤Ë½ñ¤­´¹¤¨¤é¤ì¤ë¡¥\\
\texttt{%
(while \textrm{$\left<\right.$¾ò·ï$\left.\right>$} \\[-4pt]
~~\textrm{$\left<\right.$¥³¡¼¥ÉËÜÂÎ$\left.\right>$} )%
}\\
¤½¤¦¤¹¤ë¤³¤È¤Ç¥³¡¼¥É¤ÏÃ»¤¯¤Ê¤ê¡¤¹¹¤ËÆ°ºîÆâÍÆ¤¬¤Ï¤Ã¤­¤ê¤È¼¨¤µ¤ì¤ë¡¥

°ú¿ô¤òÊÑ·Á¤Ç¤­¤ëÇ½ÎÏ¤Î¤ª¤«¤²¤Ç¡¤¥Þ¥¯¥í¤Ï¥¤¥ó¥¿¥Õ¥§¥¤¥¹¤ò½ñ¤¯¤Î¤ËÊØÍø¤À¡¥
Å¬ÀÚ¤Ê¥Þ¥¯¥í¤ò»È¤¨¤Ð¡¤
Ä¹¤¯¹þ¤ßÆþ¤Ã¤¿¼°¤¬É¬Í×¤ÊÈ¦¤Î¤È¤­¤Ç¤âÃ»¤¯´Ê·é¤Ê¼°¤¬½ñ¤±¤ë¡¥
GUI¤Î¤»¤¤¤Ç¥¨¥ó¥É¡¦¥æ¡¼¥¶¤Î¤¿¤á¤Ë¤½¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤ò½ñ¤¯É¬Í×¤Ï¸º¤Ã¤Æ¤­¤¿¤¬¡¤
¥×¥í¥°¥é¥Þ¤¬¤³¤ÎÎà¤Î¥Þ¥¯¥í¤ò»È¤¦¤³¤È¤Ï¸º¤é¤Ê¤¤¡¥
°ìÈÖÆëÀ÷¿¼¤¤Îã¤Ï\verb|defun|¤À¤í¤¦¡¥
¤³¤ì¤Ï´Ø¿ô¤òÂ«Çû¤¹¤ë¤â¤Î¤Ç¡¤¸«³Ý¤±¾å¤ÏPascal¤äCÅù¤Î¸À¸ì¤Î´Ø¿ôÄêµÁ¤Ë»÷¤Æ¤¤¤ë¡¥
Âè2¾Ï¤Ç¤Ï°Ê²¼¤Î2¤Ä¤Î¼°¤Ï¤Û¤ÜÆ±¤¸¸ú²Ì¤ò»ý¤Ä¤³¤È¤Ë¿¨¤ì¤¿¡¥
\begin{verbatim}
(defun foo (x) (* x 2))

(setf (symbol-function 'foo)
      #'(lambda (x) (* x 2)))
\end{verbatim}
¤è¤Ã¤Æ\verb|defun|¤ÏÁ°¼Ô¤ò¸å¼Ô¤ØÊÑ´¹¤¹¤ë¥Þ¥¯¥í¤È¤·¤Æ¼ÂÁõ¤Ç¤­¤ë¡¥
\verb|defun|¤Ï¼¡¤Î¤è¤¦¤Ë½ñ¤«¤ì¤Æ¤¤¤ë¤ÈÁÛÁü¤Ç¤­¤ë
\footnote{ÌÀ³Î¤µ¤Î¤¿¤á¤Ë¡¤
¤³¤ÎÎã¤Ç¤Ï\texttt{defun}¤¬¹Ô¤ï¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤ºÙ¡¹¤È¤·¤¿»Å»ö¤òÁ´¤ÆÌµ»ë¤·¤Æ¤¤¤ë¡¥}¡¥
\begin{verbatim}
(defmacro our-defun (name parms &body body)
  `(progn
     (setf (symbol-function ',name)
           #'(lambda ,parms (block ,name ,@body)))
     ',name))
\end{verbatim}
\verb|while|¤ä\verb|nil!|Åù¤Î¥Þ¥¯¥í¤Ï¡¤ÈÆÍÑ¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ç¤¢¤ë¤È¸À¤¨¤ë¡¥
¤½¤ì¤é¤Ï¤É¤ó¤ÊLisp¥×¥í¥°¥é¥à¤Ç»È¤Ã¤Æ¤â¤è¤¤¡¥
¤·¤«¤·ÆÃÄê¤ÎÎÎ°è¤Î¤¿¤á¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò½ñ¤¤¤Æ¤â¤è¤¤¡¥
´ðÈ×¤ÎLisp¤¬¡¤³ÈÄ¥¤Î¤¿¤á¤Î¸À¸ì¤¬ÍøÍÑ¤Ç¤­¤ëÍ£°ì¤Î¥ì¥Ù¥ë¤À¤È¹Í¤¨¤ëÍýÍ³¤Ï¤Ê¤¤¡¥
Îã¤¨¤ÐCAD¥×¥í¥°¥é¥à¤ò½ñ¤¤¤Æ¤¤¤ë¤Î¤Ê¤é¡¤2ÁØ¤ËÊ¬¤±¤Æ½ñ¤¯¤³¤È¤¬°ìÈÖ¤Î·ë²Ì¤òÀ¸¤à¤À¤í¤¦¡¥
CAD¥×¥í¥°¥é¥à¤Î¤¿¤á¤Î¸À¸ì¡Ê¤ª¹¥¤ß¤Ê¤é¥Ä¡¼¥ë¥­¥Ã¥È¤È¤¤¤¦²º¤ä¤«¤Ê¸ÀÍÕ¤Ç¤â¤¤¤¤¤¬¡Ë¤È¡¤
¤½¤ÎÁØ¤ÎÃæ¤Ç½ñ¤«¤ì¤¿¡¤¤¢¤ëÆÃÄê¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤À¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defun move-objs (objs dx dy)
  (multiple-value-bind (x0 y0 x1 y1) (bounds objs)
    (dolist (o objs)
      (incf (obj-x o) dx)
      (incf (obj-y o) dy))
    (multiple-value-bind (xa ya xb yb) (bounds objs)
      (redraw (min x0 xa) (min y0 ya)
              (max x1 xb) (max y1 yb)))))

(defun scale-objs (objs factor)
  (multiple-value-bind (x0 y0 x1 y1) (bounds objs)
    (dolist (o objs)
      (setf (obj-dx o) (* (obj-dx o) factor)
            (obj-dy o) (* (obj-dy o) factor)))
    (multiple-value-bind (xa ya xb yb) (bounds objs)
      (redraw (min x0 xa) (min y0 ya)
              (max x1 xb) (max y1 yb)))))
\end{FramedVerb}\end{center}
\caption{¸µ¡¹¤Î\texttt{move}¤È\texttt{scale}¡¥}
\label{fig:OriginalMoveAndScale}
\end{figure}

Â¾¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤ÏÅö¤êÁ°¤À¤È»×¤ï¤ì¤Æ¤¤¤ë¤¢¤ì¤³¤ì¤Î¶èÊÌ¤Ï¡¤
Lisp¤Ç¤Ï¤Ü¤ä¤±¤Æ¤¤¤ë¡¥
Â¾¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ï¡¤
¥³¥ó¥Ñ¥¤¥ë»þ¤È¼Â¹Ô»þ¡¤¥×¥í¥°¥é¥à¤È¥Ç¡¼¥¿¡¤¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¥×¥í¥°¥é¥à¤Î´Ö¤Ë¤Ï¡¤
³µÇ°Åª¤Ê¶èÊÌ¤¬³Î¤«¤ËÂ¸ºß¤¹¤ë¡¥
Lisp¤Ç¤Ï¡¤¤³¤ì¤é¤Î¶èÊÌ¤Ï¸ÀÍÕ¤Î¾å¤Ç¤Î´·½¬¤È¤·¤ÆÂ¸ºß¤¹¤ë¤Ë²á¤®¤Ê¤¤¡¥
Îã¤¨¤Ð¡¤¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¥×¥í¥°¥é¥à¤ò¶èÀÚ¤ëÀþ¤ÏÂ¸ºß¤·¤Ê¤¤¤Î¤À¡¥
ÌäÂê¤ËÅ¬¤·¤¿½ê¤Ë¡¤¹¥¤­¤Ê¤è¤¦¤Ë¼ê½ñ¤­¤ÎÀþ¤ò°ú¤¤¤Æ¤è¤¤¡¥
ÇØ¸å¤Î¥³¡¼¥É¤ÎÁØ¤ò¥Ä¡¼¥ë¥­¥Ã¥È¤È¸Æ¤Ö¤«¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¸Æ¤Ö¤«¤Ï¡¤
Á´¤¯ÍÑ¸ì¤ÎÌäÂê¤Ë²á¤®¤Ê¤¤¡¥
¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¤ß¤Ê¤¹¤³¤È¤ÎÄ¹½ê¤Î°ì¤Ä¤Ï¡¤
Lisp¤Ç¤ä¤Ã¤Æ¤¤¤ë¤Î¤ÈÆ±¤¸¤è¤¦¤Ë¡¤¤½¤ì¤ò¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ç³ÈÄ¥¤¹¤ëµ¤¤Ë¤Ê¤ì¤ë¤³¤È¤À¡¥

¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¤Ê2D¥É¥í¡¼¡¦¥×¥í¥°¥é¥à¤ò½ñ¤¤¤Æ¤¤¤ë¤È¤·¤è¤¦¡¥
ÏÃ¤ò´ÊÃ±¤Ë¤¹¤ë¤¿¤á¡¤¤½¤Î¥×¥í¥°¥é¥à¤¬°·¤¦¥ª¥Ö¥¸¥§¥¯¥È¤ÏÀþÊ¬¤Î¤ß¤È¤¹¤ë¡¥
ÀþÊ¬¤Ï»ÏÅÀ\verb|x|¡¤\verb|y|¤È¥Ù¥¯¥¿\verb|dx|¡¤\verb|dy|¤ÇÉ½¸½¤µ¤ì¤ë¡¥
¤½¤Î¼ï¤Î¥×¥í¥°¥é¥à¤¬ÂÐ±þ¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤Áàºî¤Ë¡¤
¥ª¥Ö¥¸¥§¥¯¥È¤Î¥°¥ë¡¼¥×¤ÎÊ¿¹Ô°ÜÆ°¤¬¤¢¤ë¡¥
¤½¤ì¤¬Âè\ref{fig:Move-Objs}¿Þ¤Î´Ø¿ô\verb|move-objs|¤ÎÌòÌÜ¤À¡¥
¸úÎ¨¤ò¹Í¤¨¡¤ÁàºîËè¤Ë¥¹¥¯¥ê¡¼¥óÁ´ÂÎ¤òºÆÉÁ²è¤¹¤ë¤³¤È¤ÏÈò¤±¤¿¤¤\wadash
ÊÑ¹¹¤Î¤¢¤Ã¤¿ÉôÊ¬¤À¤±¤òºÆÉÁ²è¤·¤¿¤¤¡¥
¤½¤Î¤¿¤á2¸Ä¤¢¤ë\verb|bounds|¤Î¸Æ¤Ó½Ð¤·¤Ï¡¤
¥ª¥Ö¥¸¥§¥¯¥È¤Î¥°¥ë¡¼¥×¤ò°Ï¤àÄ¹Êý·Á¤òÉ½¤¹4¸Ä¤ÎºÂÉ¸
$(\min \mathtt{x}, \min \mathtt{y}, \max \mathtt{x}, \max \mathtt{y})$¤òÊÖ¤¹¡¥
\verb|move-objs|¤ÎÆ°ºîÉôÊ¬¤Ï¡¤
°ÜÆ°Á°¤È°ÜÆ°¸å¤ÎÄ¹Êý·Á¤ò¤½¤ì¤¾¤ì¸«¤Ä¤±¤ë¤¿¤á¤Î
\verb|bounds|¤Î¸Æ¤Ó½Ð¤·2¸Ä¤Ë¶´¤Þ¤ì¤Æ¤ª¤ê¡¤±Æ¶Á¤ò¼õ¤±¤¿ÎÎ°èÁ´ÂÎ¤òºÆÉÁ²è¤¹¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro with-redraw ((var objs) &body body)
  (let ((gob (gensym))
        (x0 (gensym)) (y0 (gensym))
        (x1 (gensym)) (y1 (gensym)))
    `(let ((,gob ,objs))
       (multiple-value-bind (,x0 ,y0 ,x1 ,y1) (bounds ,gob)
         (dolist (,var ,gob) ,@body)
         (multiple-value-bind (xa ya xb yb) (bounds ,gob)
           (redraw (min ,x0 xa) (min ,y0 ya)
                   (max ,x1 xb) (max ,y1 yb)))))))

(defun move-objs (objs dx dy)
  (with-redraw (o objs)
               (incf (obj-x o) dx)
               (incf (obj-y o) dy)))

(defun scale-objs (objs factor)
  (with-redraw (o objs)
               (setf (obj-dx o) (* (obj-dx o) factor)
                     (obj-dy o) (* (obj-dy o) factor))))
\end{FramedVerb}\end{center}
\caption{filleted¤µ¤ì¤¿\texttt{move}¤È\texttt{scale}¡¥}
\label{fig:Move-Objs}
\end{figure}

´Ø¿ô\verb|scale-objs|¤Ï¡¤¥ª¥Ö¥¸¥§¥¯¥È¤Î¥°¥ë¡¼¥×¤ÎÂç¤­¤µ¤òÊÑ¤¨¤ë¤¿¤á¤Î¤â¤Î¤À¡¥
³ÈÂçÎ¨¤Ë±þ¤¸¤Æ¥°¥ë¡¼¥×¤ò°Ï¤àÎÎ°è¤Ï¹­¤¬¤Ã¤¿¤ê¶¹¤Þ¤Ã¤¿¤ê¤¹¤ë¤Î¤Ç¡¤
¤³¤Î´Ø¿ô¤â\verb|bounds|¤Î2¸Ä¤Î¸Æ¤Ó½Ð¤·¤Î´Ö¤ÇÆ°ºî¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¥×¥í¥°¥é¥à¤ò½ñ¤­¿Ê¤á¤Æ¤¤¤±¤Ð¡¤¤³¤Î¥Ñ¥¿¡¼¥ó¤¬¹¹¤Ë¸½¤ì¤ë¤À¤í¤¦¡¥
²óÅ¾¡¤Î¢ÊÖ¤·¡¤Å¾ÃÖÅù¤À¡¥

¥Þ¥¯¥í¤Ë¤è¤Ã¤Æ¤³¤ì¤é¤Î´Ø¿ô¤¬¶¦ÄÌ¤·¤Æ»ý¤Ä¥³¡¼¥É¤òÃê¾Ý²½¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
Âè\ref{fig:Move-Objs}¿Þ¤Î¥Þ¥¯¥í\verb|with-redraw|¤ÏÂè\ref{fig:OriginalMoveAndScale}¤Î
´Ø¿ô¤¬¶¦Í­¤·¤Æ¤¤¤ë¹ü³Ê¤òÍ¿¤¨¤Æ¤¤¤ë
\footnote{¤³¤Î¥Þ¥¯¥í¤ÎÄêµÁ¤Ë¤Ïgensym¤¬»È¤ï¤ì¤Æ¤¤¤ë¤Î¤Ç¡¤¼¡¾Ï¤ÎÃÎ¼±¤¬É¬Í×¤Ë¤Ê¤ë¡¥
¤½¤ÎÌÜÅª¤Ï¤Þ¤â¤Ê¤¯ÀâÌÀ¤¹¤ë¡¥}¡¥
¤½¤Î·ë²Ì¡¤¤½¤ì¤é¤Î´Ø¿ô¤Ï¤½¤ì¤¾¤ì4¹Ô¤ÎÄ¹¤µ¤ÇÄêµÁ¤Ç¤­¤¿¡¥
¤³¤ì¤é2¤Ä¤Î´Ø¿ô¤ËÍøÍÑ¤Ç¤­¤¿¤³¤È¤Ç¤½¤Î¿·¥Þ¥¯¥í¤Ï¤¹¤Ç¤Ë´Ê·é¤µ¤ÎÅÀ¤Ç¸µ¤¬¼è¤ì¤¿¤³¤È¤Ë¤Ê¤ë¡¥
¤½¤·¤Æ¤³¤ì¤é¤Î´Ø¿ô¤Ï¡¤¥¹¥¯¥ê¡¼¥óºÆÉÁ²è¤Î¾ÜºÙ¤¬Ãê¾Ý²½¤µ¤ì¤¿¤é¡¤²¿¤ÈÌÀ³Î¤Ë¤Ê¤Ã¤¿¤³¤È¤À¤í¤¦¡¥

\verb|with-redraw|¤Ï¡¤¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¡¦¥É¥í¡¼¡¦¥×¥í¥°¥é¥à¤ò½ñ¤¯¤¿¤á¤Î
¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Î°ì¹½Â¤¤È¤·¤ÆÂª¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
¤½¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤ò¹¹¤ËÀ°È÷¤·¤Æ¤¤¤±¤Ð¡¤
¤½¤ì¤é¤ÏÌ¾Á°¤Î¾å¤À¤±¤Ç¤Ê¤¯¡¤¼ÂºÝ¤Ë¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ë»÷¤Æ¤¯¤ë¤À¤í¤¦¡¥
¤½¤·¤Æ½ñ¤¤¤Æ¤¤¤ë¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¼«¿È¤â¡¤
¤½¤ÎÆÃÄê¤ÎÍÑÅÓ¤Î¤¿¤á¤ËÄêµÁ¤µ¤ì¤¿¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç½ñ¤±¤Ð¤³¤¦¤Ê¤ë¤À¤í¤¦¤«¡¤
¤È»×¤¨¤ëÄø¥¨¥ì¥¬¥ó¥È¤Ê¤â¤Î¤ËÊÑ¤ï¤Ã¤Æ¤¤¤¯¡¥

¥Þ¥¯¥í¤Î¼çÍ×¤ÊÍøÍÑË¡¤Î¤â¤¦°ì¤Ä¤Ï¡¤Ëä¤á¹þ¤ß¸À¸ì¤Î¼ÂÁõ¤À¡¥
Lisp¤Ï¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ò½ñ¤¯¤Î¤ËºÝÎ©¤Ã¤ÆÍ¥¤ì¤¿¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤À¡¥
¤½¤ì¤ÏLisp¥×¥í¥°¥é¥à¤Ï¥ê¥¹¥È¤È¤·¤ÆÉ½¸½¤Ç¤­¤ë¤¬¡¤
Lisp¤Ë¤Ï¤½¤Î¤è¤¦¤ËÉ½¸½¤µ¤ì¤¿¥×¥í¥°¥é¥à¤ËÂÐ¤¹¤ëÁÈ¤ß¹þ¤ß¥Ñ¡¼¥µ\verb|(read)|¤È
¥³¥ó¥Ñ¥¤¥é\verb|(compile)|¤¬¤¢¤ë¤«¤é¤À¡¥
ÂçÄñ¤Ï\verb|compile|¤ò¸Æ¤ÖÉ¬Í×¤â¤Ê¤¤¡¥
Ëä¤á¹þ¤ß¸À¸ì¤Ï¡¤ÊÑ´¹¤ò¹Ô¤¦¥³¡¼¥É¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤³¤È¤Ç¼«Æ°Åª¤Ë¥³¥ó¥Ñ¥¤¥ë¤µ¤»¤é¤ì¤ë
¡Êpnk¥Ú¡¼¥¸¡Ë¡¥

Ëä¤á¹þ¤ß¸À¸ì¤È¤ÏLisp¤Î¾å¤Ë½ñ¤«¤ì¤¿¤È¤¤¤¦¤è¤ê¤Ïº®¤¸¤ê¹ç¤Ã¤Æ½ñ¤«¤ì¤¿¤â¤Î¤Ç¤¢¤ë¡¥
¤½¤Î¤¿¤á¡¤Ê¸Ë¡¤ÏLisp¤È¤½¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ËÆÃÍ­¤Î¹½Â¤¤È¤Îº®¹ç¤Ë¤Ê¤ë¡¥
Ëä¤á¹þ¤ß¸À¸ì¤ò¼ÂÁõ¤¹¤ëÁÇËÑ¤ÊÊýË¡¤Ï¡¤Lisp¤Ç¤½¤Î¥¤¥ó¥¿¥×¥ê¥¿¤ò½ñ¤¯¤³¤È¤À¡¥
¤â¤·²ÄÇ½¤Ê¤é¤Ð¤â¤Ã¤ÈÎÉ¤¤¥¢¥×¥í¡¼¥Á¤¬¤¢¤ë¡¥
ÊÑ´¹¤Ë¤è¤Ã¤Æ¤½¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ò¼ÂÁõ¤¹¤ë¤³¤È¤À¡¥
¤¹¤Ê¤ï¤Á¡¤É¾²Á¤µ¤»¤¿¤¤¤È¤­¤Ë¤ÏLisp¥¤¥ó¥¿¥×¥ê¥¿¤¬Æ°ºî¤¹¤ë¤è¤¦¤ÊLisp¥³¡¼¥É¤Ë
¸Ä¡¹¤Î¼°¤òÊÑ´¹¤¹¤ë¤Î¤À¡¥
¤½¤³¤Ë¥Þ¥¯¥í¤Î³èÌö¤Î¾ì¤¬¤¢¤ë¡¥
¥Þ¥¯¥í¤Î»Å»ö¤ÏÀµ¤Ë¤¢¤ë¼ï¤Î¼°¤òÊÌ¤Î¼°¤ËÊÑ´¹¤¹¤ë¤³¤È¤À¤«¤é¡¤
Ëä¤á¹þ¤ß¸À¸ì¤ò½ñ¤¯ºÝ¤Ë¤Ï¥Þ¥¯¥í¤Ï¼«Á³¤ÊÁªÂò¤À¡¥

°ìÈÌÅª¤Ë¤Ï¡¤Ëä¤á¹þ¤ß¸À¸ì¤Ï¤Ê¤ë¤Ù¤¯ÊÑ´¹¤Ë¤è¤Ã¤Æ¼ÂÁõ¤Ç¤­¤¿Êý¤¬¤è¤¤¡¥
Âè1¤Ë¡¤Ï«ÎÏ¤¬¾¯¤Ê¤¯¤ÆºÑ¤à¡¥
Îã¤¨¤Ð¿·¤·¤¤¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ë»»½Ñ±é»»µ¡Ç½¤¬¤¢¤ì¤Ð¡¤
¿ôÃÍ¤òÉ½¸½¤·¡¤Áàºî¤¹¤ë¤³¤È¤ÎÌÌÅÝ¤Ë°ìÀÚ´Ø¤ï¤é¤º¤ËºÑ¤à¡¥
Lisp¤Î»»½ÑÇ½ÎÏ¤¬ÌÜÅª¤Ë¼è¤Ã¤Æ½½Ê¬¤Ê¤â¤Î¤Ê¤é¡¤
¿·¤·¤¤»»½Ñ¼°¤òÅù²Á¤ÊLisp¤Î»»½Ñ¼°¤ËÊÑ´¹¤·¡¤»Ä¤ê¤ÏLisp¤ËÇ¤¤»¤ë¤À¤±¤ÇºÑ¤à¡¥

ÉáÄÌ¡¤ÊÑ´¹¤ò»È¤¦¤È¡¤Ëä¤á¹þ¤ß¸À¸ì¤òÂ®¤¯¤¹¤ë¤³¤È¤Ë¤â¤Ê¤ë¡¥
¥¤¥ó¥¿¥×¥ê¥¿¤ÏËÜ¼ÁÅª¤ËÂ®ÅÙ¤Ë´Ø¤·¤ÆÉÔÍø¤Ç¤¢¤ë¡¥
Îã¤¨¤Ð¤¢¤ë¥³¡¼¥É¤¬¥ë¡¼¥×Æâ¤Ë¤¢¤ë¤È¤·¤è¤¦¡¥
¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¥³¡¼¥É¤Ç¤Ï1²ó¤ÇºÑ¤àÆ°ºî¤ò¡¤
¥¤¥ó¥¿¥×¥ê¥¿¤Ç¤Ï·«¤êÊÖ¤·¤ÎÅÙ¤Ë¤·¤Ê¤ì¤±¤Ð¤Ê¤é¤Ê¤¤¤³¤È¤¬¤·¤Ð¤·¤Ð¤¢¤ë¡¥
¤½¤Î¤¿¤á¼«Á°¤Î¥¤¥ó¥¿¥×¥ê¥¿¤Ë¤è¤ëËä¤á¹þ¤ß¸À¸ì¤Ï¡¤
¤½¤Î¥¤¥ó¥¿¥×¥ê¥¿¤½¤Î¤â¤Î¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¤È¤­¤Ç¤âÃÙ¤¤¡¥
¤·¤«¤·Ëä¤á¹þ¤ß¸À¸ì¤Î¼°¤¬Lisp¤Î¼°¤ËÊÑ´¹¤µ¤ì¤Æ¤¤¤ì¤Ð¡¤
¤½¤Î¥³¡¼¥É¤ÏLisp¥³¥ó¥Ñ¥¤¥é¤Ç¥³¥ó¥Ñ¥¤¥ë¤Ç¤­¤ë¡¥
¤½¤Î¤è¤¦¤Ë¼ÂÁõ¤µ¤ì¤¿Ëä¤á¹þ¤ß¸À¸ì¤Ç¤Ï¡¤
¼Â¹Ô»þ¤Î¥¤¥ó¥¿¥×¥ê¥Æ¡¼¥·¥ç¥ó¤Î¥ª¡¼¥ô¥¡¥Ø¥Ã¥É¤Ë°ìÀÚÇº¤Þ¤µ¤ì¤º¤ËºÑ¤à¡¥
¼«Ê¬¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Î¤¿¤á¤ÎËÜÅö¤Î¥³¥ó¥Ñ¥¤¥é¤ò½ñ¤¯¤Î¤Ç¤Ê¤±¤ì¤Ð¡¤
¥Þ¥¯¥í¤Ë¤è¤Ã¤Æ°ìÈÖ¤ÎÀ­Ç½¤¬ÆÀ¤é¤ì¤ë¤À¤í¤¦¡¥
¼ÂºÝ¡¤Ëä¤á¹þ¤ß¸À¸ì¤òÊÑ´¹¤¹¤ë¥Þ¥¯¥í¤Ï¡¤Ëä¤á¹þ¤ß¸À¸ì¤Î¥³¥ó¥Ñ¥¤¥é¤È¸«¤Ê¤»¤ë\wadash
¤½¤ÎÆ°ºî¤Î¤Û¤È¤ó¤É¤ò´ûÂ¸¤ÎLisp¥³¥ó¥Ñ¥¤¥é¤Ë°ÍÂ¸¤·¤Æ¤¤¤ë¤À¤±¤Î¤³¤È¤À¡¥

Âè19-25¾Ï¤ÏÁ´¤Æ¤½¤ÎÏÃÂê¤Ë¤¢¤Æ¤é¤ì¤Æ¤¤¤ë¤Î¤Ç¡¤
¤³¤³¤Ç¤ÏËä¤á¹þ¤ß¸À¸ì¤ÎÎã¤Ë¤Ä¤¤¤Æ¹Í¤¨¤ë¤³¤È¤Ï¤·¤Ê¤¤¡¥
Âè19¾Ï¤Ç¤ÏÆÃ¤ËËä¤á¹þ¤ß¸À¸ì¤Î¥¤¥ó¥¿¥×¥ê¥Æ¥£¥ó¥°¤ÈÊÑ´¹¤Î°ã¤¤¤ò°·¤¤¡¤
¤½¤Î2ÄÌ¤ê¤ÇÆ±¤¸¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ò¼ÂÁõ¤·¤Æ¸«¤»¤ë¡¥

Common Lisp¤Ë¤Ä¤¤¤Æ¤Î¤¢¤ëËÜ¤Ç¤Ï¡¤¥Þ¥¯¥í¤ÎÅ¬ÍÑÎÎ°è¤¬¸Â¤é¤ì¤Æ¤¤¤ë¤È·Ù¹ð¤·¤Æ¤¤¤ë¡¥
¤½¤Îº¬µò¤È¤·¤Æ¡¤\CLtL1¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¥ª¥Ú¥ì¡¼¥¿¤Î¤¦¤Á¡¤
¥Þ¥¯¥í¤Ï10\%¤Ë¤âËþ¤¿¤Ê¤¤¤³¤È¤ò°úÍÑ¤·¤Æ¤¤¤ë¡¥
¤³¤ì¤Ï²È¤¬Îû´¤¤Çºî¤é¤ì¤Æ¤¤¤ë¤«¤é¡¤²È¶ñ¤âÎû´¤¤Çºî¤í¤¦¤È¸À¤¦¤è¤¦¤Ê¤â¤Î¤À¡¥
Common Lisp¥×¥í¥°¥é¥àÆâ¤Î¥Þ¥¯¥í¤ÎÈæÎ¨¤Ï¡¤¤½¤ÎÍÑÅÓ¤Ë´°Á´¤Ë°ÍÂ¸¤¹¤ë¡¥
¥Þ¥¯¥í¤ò°ìÀÚ»È¤ï¤Ê¤¤¥×¥í¥°¥é¥à¤â¤¢¤ì¤Ð¡¤Á´¤Æ¥Þ¥¯¥í¤«¤éÀ®¤ë¥×¥í¥°¥é¥à¤â¤¢¤ë¡¥
%}}}
%}}}
\section{ÊÑ¿ôÊáÂª} %{{{
¥Þ¥¯¥í¤Î¼åÅÀ¤Ï¡¤ÊÑ¿ôÊáÂª¤È¸Æ¤Ð¤ì¤ëÌäÂê¤À¡¥
ÊÑ¿ôÊáÂª¤Ï¥Þ¥¯¥íÅ¸³«¤¬Ì¾Á°¤Î¾×ÆÍ¤òµ¯¤³¤·¤¿¤È¤­¤ËÀ¸¤¸¤ë¡¥
¤Ä¤Þ¤ê¤¢¤ë¥·¥ó¥Ü¥ë¤¬ÊÌ¤Î¥³¥ó¥Æ¥­¥¹¥È¤ÎÊÑ¿ô¤ò»²¾È¤·¤Æ¤·¤Þ¤Ã¤¿¤È¤­¤À¡¥
¤¦¤Ã¤«¤ê¤·¤Æµ¯¤­¤¿ÊÑ¿ôÊáÂª¤¬¡¤¤â¤Î¤¹¤´¤¯º³ºÙ¤Ê¥Ð¥°¤Ë¤Ä¤Ê¤¬¤ë¤³¤È¤â¤¢¤êÆÀ¤ë¡¥
¤³¤Î¾Ï¤Ç¤Ï¡¤¤É¤Î¤è¤¦¤Ë¤½¤ì¤òÍ½Â¬¤·¡¤Èò¤±¤ë¤«¤ò°·¤¦¡¥
¤·¤«¤·¤Ê¤¬¤é°Õ¿ÞÅª¤ÊÊÑ¿ôÊáÂª¤ÏÊØÍø¤Ê¥×¥í¥°¥é¥ß¥ó¥°µ»Ë¡¤Ç¤¢¤ê¡¤
Âè14¾Ï¤Ï¤½¤ì¤òÍøÍÑ¤·¤¿¥Þ¥¯¥í¤¬¤Û¤È¤ó¤É¤À¡¥

\subsection{¥Þ¥¯¥í°ú¿ô¤ÎÊáÂª}   %{{{
°Õ¿Þ¤·¤Ê¤¤ÊÑ¿ôÊáÂª¤ò¼åÅÀ¤Ë»ý¤Ä¥Þ¥¯¥í¤È¤Ï¡¤¥Ð¥°¤Î¤¢¤ë¥Þ¥¯¥í¤È¸À¤Ã¤Æ¤è¤¤¡¥
¤½¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤ò½ñ¤¯¤Î¤òËÉ¤°¤Ë¤Ï¡¤ÊÑ¿ôÊáÂª¤¬¤¤¤Äµ¯¤­¤ë¤Î¤«¤òÀµ³Î¤ËÃÎ¤é¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¼ÂºÝ¤ÎÊÑ¿ôÊáÂª¤Î¸µ¤òÃ©¤ë¤È¡¤°Ê²¼¤Î2ÄÌ¤ê¤Î¾õ¶·¤Ë¹Ô¤­Ãå¤¯¡¥
¥Þ¥¯¥í°ú¿ô¤ÎÊáÂª¤È¥Õ¥ê¡¼¥·¥ó¥Ü¥ë¤ÎÊáÂª¤À¡¥
¥Þ¥¯¥í°ú¿ô¤ÎÊáÂª¤È¤Ï¡¤¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Î°ú¿ô¤È¤·¤ÆÅÏ¤µ¤ì¤¿¥·¥ó¥Ü¥ë¤¬¡¤
ÉÔÃí°Õ¤Ë¤è¤Ã¤Æ¥Þ¥¯¥íÅ¸³«¤½¤Î¤â¤Î¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤¿ÊÑ¿ô¤ò»²¾È¤·¤Æ¤·¤Þ¤¦¤³¤È¤Ç¤¢¤ë¡¥
¥Þ¥¯¥í\verb|for|¤Î¡¤°Ê²¼¤ÎÄêµÁ¤ò¹Í¤¨¤Æ¤ß¤è¤¦¡¥
¤³¤ì¤ÏPascal¤Î\verb|for|¹½Ê¸¤Î¤è¤¦¤Ë¡¤ËÜÂÎ¤È¤Ê¤ë¼°¤Î¼Â¹Ô¤ò·«¤êÊÖ¤¹¤â¤Î¤À¡¥
\begin{verbatim}
(defmacro for ((var start stop) &body body)          ; ¸í¤ê
  `(do ((,var ,start (1+ ,var))
        (limit ,stop))
     ((> ,var limit))
     ,@body))
\end{verbatim}
¤³¤Î¥Þ¥¯¥í¤Ï½é¸«¤Ç¤ÏÀµ¤·¤¤¤è¤¦¤Ë¸«¤¨¤ë¡¥
¤½¤ì¤É¤³¤í¤«¤Á¤ã¤ó¤ÈÆ°ºî¤Þ¤Ç¤¹¤ë¤è¤¦¤À¡¥
\begin{verbatim}
> (for (x 1 5)
       (princ x))
12345
NIL
\end{verbatim}
¼ÂºÝ¡¤¸í¤ê¤ÏÈùÌ¯¤Ê¤â¤Î¤Ç¡¤¾å¤Î·Á¤Î¥Þ¥¯¥í¤ò¿ôÉ´²ó»È¤Ã¤Æ¤âÁ´¤Æ´°àú¤ËÆ°ºî¤¹¤ë¤«¤âÃÎ¤ì¤Ê¤¤¡¥
¤·¤«¤·¡¤²¼¤Î¤è¤¦¤Ë¸Æ¤Ó½Ð¤µ¤Ê¤±¤ì¤Ð¡¤¤ÎÏÃ¤À¡¥
\begin{verbatim}
(for (limit 1 5)
  (princ limit))
\end{verbatim}
¤³¤Î¼°¤â¾å¤Î¤â¤Î¤ÈÆ±¤¸¸ú²Ì¤ò»ý¤Ä¤È»×¤¨¤ë¡¥
¤·¤«¤·¤³¤ì¤Ï²¿¤âÉ½¼¨¤·¤Ê¤¤¡¥¥¨¥é¡¼¤òµ¯¤³¤¹¤Î¤À¡¥
ÍýÍ³¤òÃÎ¤ë¤¿¤á¤Ë¡¤¤½¤ÎÅ¸³«·Á¤ò¸«¤Æ¤ß¤è¤¦¡¥
\begin{verbatim}
(do ((limit 1 (1+ limit))
         (limit 5))
        ((> limit limit))
  (princ limit))
\end{verbatim}
¤³¤ì¤Ç²¿¤¬¸í¤ê¤ò°ú¤­µ¯¤³¤·¤¿¤Î¤«¤ÏÌÀ¤é¤«¤À¡¥
¥Þ¥¯¥í¤ÎÅ¸³«·Á¤Ë¤Ä¤¤¤Æ¥í¡¼¥«¥ë¤Ê¥·¥ó¥Ü¥ë¤È¡¤¥Þ¥¯¥í¤Ë°ú¿ô¤È¤·¤ÆÅÏ¤µ¤ì¤¿¥·¥ó¥Ü¥ë¤È¤Î´Ö¤Ë¡¤
Ì¾Á°¤Î¾×ÆÍ¤¬¤¢¤Ã¤¿¤Î¤À¡¥
Å¸³«·Á¤¬\verb|limit|¤òÊáÂª¤·¤Æ¤¤¤¿¡¥
·ë¶É¤½¤ì¤¬Æ±¤¸\verb|do|¤ÎÃæ¤Ç2²ó¸½¤ì¤ë¤³¤È¤Ë¤Ê¤ê¡¤¥¨¥é¡¼¤Ë¤Ê¤Ã¤¿¤Î¤À¡¥

ÊÑ¿ôÊáÂª¤Ë¤è¤ë¥¨¥é¡¼¤Ïµ©¤À¤¬¡¤ÉÑÅÙ¤¬¾¯¤Ê¤¤Ê¬¡¤¼Á¤Î°­¤¤¤â¤Î¤À¡¥
ÀèÄø¤ÎÊÑ¿ôÊáÂª¤ÏÈæ³ÓÅªÂç¿Í¤·¤¤\wadash
¾¯¤Ê¤¯¤È¤â¡¤¤³¤³¤Ç¤Ï¥¨¥é¡¼¤¬µ¯¤­¤¿¡¥
¤·¤«¤·ÂçÄñ¤Ï¡¤ÊÑ¿ôÊáÂª¤òµ¯¤³¤¹¥Þ¥¯¥í¤Ï¡¤
²¿¤«¤¬¤ª¤«¤·¤¤¤È¤¤¤¦Ãû¸õ¤ò²¿¤â¼¨¤µ¤º¤Ë¸í¤Ã¤¿·ë²Ì¤ò¤â¤¿¤é¤¹¡¥
²¼¤Î¾ì¹ç¤Ç¤Ï¡¤
\begin{verbatim}
> (let ((limit 5))
    (for (i 1 10)
         (when (> i limit)
           (princ i))))
NIL
\end{verbatim}
·ë²Ì¤Î¥³¡¼¥É¤Ï¥¨¥é¡¼¤ò½Ð¤µ¤º¡¤¤·¤«¤·²¿¤ÎÆ°ºî¤â¤·¤Ê¤¤¡¥
%}}}
\subsection{¥Õ¥ê¡¼¥·¥ó¥Ü¥ë¤ÎÊáÂª}   %{{{
µ¯¤³¤ëÉÑÅÙ¤Ï¾¯¤Ê¤¤¤¬¡¤
ÉÔÃí°Õ¤«¤é¥Þ¥¯¥íÄêµÁ¤½¤Î¤â¤Î¤¬¡¤¥Þ¥¯¥í¤¬Å¸³«¤µ¤ì¤¿´Ä¶­Æâ¤ÎÂ«Çû¤ò»²¾È¤¹¤ë¤³¤È¤¬¤¢¤ë¡¥
¤¢¤ë¥×¥í¥°¥é¥à¤Ç¡¤ÌäÂê¤¬µ¯¤­¤¿¤È¤­¥æ¡¼¥¶¤Ë·Ù¹ð¤òÈ¯¤¹¤ëÂå¤ï¤ê¤Ë¡¤
¸å¤Û¤É¸¡Æ¤¤¹¤ë¤¿¤á¤Ë·Ù¹ð¤ò¥ê¥¹¥È¤ËÃß¤¨¤¿¤¤¤È¤·¤è¤¦¡¥
¤¢¤ë¿Í¤Ï¥Þ¥¯¥í\verb|gripe|¤ò½ñ¤¤¤¿¡¥
¤³¤ì¤Ï·Ù¹ð¥á¥Ã¥»¡¼¥¸¤ò¼è¤ê¡¤¤½¤ì¤ò¥°¥í¡¼¥Ð¥ë¤Ê¥ê¥¹¥È\verb|w|¤ËÉÕ¤±²Ã¤¨¤ë¤â¤Î¤À¡¥
\begin{verbatim}
(defvar w nil)

(defmacro gripe (warning)                        ; ¸í¤ê
  `(progn (setq w (nconc w (list ,warning)))
          nil))
\end{verbatim}
ÊÌ¤Î¤¢¤ë¿Í¤Ï´Ø¿ô\verb|sample-ratio|¤ò½ñ¤³¤¦¤È»×¤Ã¤¿¡¥
¤½¤ì¤Ï2¤Ä¤Î¥ê¥¹¥È¤ÎÄ¹¤µ¤ÎÈæ¤òÊÖ¤¹¤â¤Î¤À¡¥
¤Þ¤¿¡¤¤É¤Á¤é¤«¤Î¥ê¥¹¥È¤¬1¸Ä°Ê²¼¤ÎÍ×ÁÇ¤·¤«»ý¤¿¤Ê¤±¤ì¤Ð¡¤
Âå¤ï¤ê¤Ë \verb|nil| ¤òÊÖ¤·¡¤Æ±»þ¤Ë¡ÖÅý·×Åª¤Ë°ÕÌ£¤Î¸«½Ð¤»¤Ê¤¤¾õ¶·¤À¡×¤È·Ù¹ð¤òÈ¯¤¹¤ë¡¥
(¼ÂºÝ¤Î·Ù¹ð¤Ï¤â¤Ã¤ÈÃúÇ«¤Ê¤Î¤À¤í¤¦¤¬¡¤·Ù¹ðÆâÍÆ¤Ï¤³¤ÎÎã¤Ë¤È¤Ã¤Æ¤Ï¤É¤¦¤Ç¤â¤è¤¤¡¥)
\begin{verbatim}
(defun sample-ratio (v w)
  (let ((vn (length v)) (wn (length w)))
    (if (or (< vn 2) (< wn 2))
      (gripe "sample < 2")
      (/ vn wn))))
\end{verbatim}
\verb|sample-ratio|¤¬$\mathtt{w} = \mathtt{(b)}$¤È¤¤¤¦¾õÂÖ¤Ç¸Æ¤Ð¤ì¤¿¤é¡¤
¡Ö°ú¿ô¤Î°ì¤Ä¤¬Í×ÁÇ¤ò1¸Ä¤·¤«»ý¤Ã¤Æ¤¤¤Ê¤¤¡¤Åý·×Åª¤ËÌµ°ÕÌ£¤À¡×
¤È·Ù¹ð¤òÈ¯¤·¤è¤¦¤È¤¹¤ë¤À¤í¤¦¡¥
¤·¤«¤·\verb|gripe|¤Î¸Æ¤Ó½Ð¤·¤¬Å¸³«¤µ¤ì¤ë¤È¡¤
\verb|sample-ratio|¤¬²¼¤Î¤è¤¦¤ËÄêµÁ¤µ¤ì¤¿¤«¤Î¤è¤¦¤Ê·ë²Ì¤Ë¤Ê¤ë¡¥
\begin{verbatim}
(defun sample-ratio (v w)
  (let ((vn (length v)) (wn (length w)))
    (if (or (< vn 2) (< wn 2))
      (progn (setq w (nconc w (list "sample < 2")))
             nil)
      (/ vn wn))))
\end{verbatim}

¤³¤³¤Ç¤ÎÌäÂê¤Ï¡¤\verb|gripe|¤Î»È¤ï¤ì¤¿¥³¥ó¥Æ¥­¥¹¥È¤Ç¤Ï
\verb|w|¤Ë¤Ï¤½¤ì¼«¿È¤Î¥í¡¼¥«¥ë¤ÊÂ«Çû¤¬¤¢¤ë¤È¤¤¤¦¤³¤È¤À¡¥
·Ù¹ð¤Ï¥°¥í¡¼¥Ð¥ë¤Ê·Ù¹ð¥ê¥¹¥È¤ËÊÝÂ¸¤µ¤ì¤º¤Ë¡¤
\verb|sample-ratio|¤Î²¾°ú¿ô¤Î1¤Ä¤ÎËöÈø¤Ë\verb|nconc|¤µ¤ì¤Æ¤·¤Þ¤¦¡¥
·Ù¹ð¤¬¼º¤ï¤ì¤ë¤À¤±¤Ç¤Ï¤Ê¤¤¡¥
¥ê¥¹¥È\verb|(b)|¤Ï¶²¤é¤¯¥×¥í¥°¥é¥à¤Î¤É¤³¤«¤Ç¥Ç¡¼¥¿¤È¤·¤Æ»È¤ï¤ì¤ë¤Î¤À¤í¤¦¤¬¡¤
¸å¤í¤ËÍ¾·×¤ÊÊ¸»úÎó¤¬¤¯¤Ã¤Ä¤¤¤Æ¤·¤Þ¤¦¡¥
\begin{verbatim}
> (let ((lst '(b)))
    (sample-ratio nil lst)
    lst)
(B "sample < 2")
> w
NIL
\end{verbatim}
%}}}
\subsection{ÊáÂª¤Ï¤¤¤Äµ¯¤­¤ë¤Î¤«}   %{{{
¥Þ¥¯¥íÄêµÁ¤ò¸«¤Æ¼¡¤Î2¼ïÎà¤ÎÊáÂª¤«¤éµ¯¤­ÆÀ¤ëÌäÂê¤òÍ½Â¬¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ê¤¿¤¤¤È¡¤
Â¿¤¯¤Î¥Þ¥¯¥íºî¼Ô¤¬´ê¤¤Â³¤±¤Æ¤­¤¿¡¥
ÊáÂª¤ÏÈùÌ¯¤ÊÌäÂê¤Ç¡¤
ÊáÂª¤µ¤ìÆÀ¤ë¥·¥ó¥Ü¥ë¤¬¤É¤Î¤è¤¦¤Ë¥×¥í¥°¥é¥à¤Ë¾ã³²¤ò¤Ð¤é»µ¤¯¤«¤òÁ´¤ÆÍ½Â¬¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ë¤Ë¤Ï¡¤
´ö¤é¤«¤Î·Ð¸³¤¬Í×¤ë¡¥
¹¬±¿¤Ê¤³¤È¤Ë¡¤ÊáÂª¤¬¥×¥í¥°¥é¥à¤Ë¤É¤Î¤è¤¦¤Ê°­±Æ¶Á¤òµÚ¤Ü¤·¤Æ¤¤¤ë¤Î¤«¤ò¹Í¤¨¤Ê¤¯¤È¤â¡¤
¥Þ¥¯¥íÄêµÁÆâ¤ÎÊáÂª¤Îµ¯¤­ÆÀ¤ë¥·¥ó¥Ü¥ë¤òÈ½ÊÌ¤·¡¤¼è¤ê½ü¤¯¤³¤È¤¬¤Ç¤­¤ë¡¥
¤³¤ÎÀá¤Ç¤Ï¡¤ÊáÂª²ÄÇ½¤Ê¥·¥ó¥Ü¥ë¤òÈ½ÊÌ¤¹¤ë¤¿¤á¤ÎÄ¾Ù£Åª¤ÊÊýË¡¤ò¼¨¤¹¡¥
¤³¤Î¾Ï¤Î»Ä¤ê¤ÎÀá¤Ç¤Ï¡¤¤½¤Î¤è¤¦¤Ê¥·¥ó¥Ü¥ë¤ò¼è¤ê½ü¤¯ÊýË¡¤òÀâÌÀ¤¹¤ë¡¥

ÊáÂª²ÄÇ½¤ÊÊÑ¿ô¤òÄêµÁ¤¹¤ëµ¬Â§¤Ï´ö¤Ä¤«¤Î¼ª´·¤ì¤Ê¤¤³µÇ°¤Ë°ÍÂ¸¤·¤Æ¤ª¤ê¡¤
¤½¤ì¤é¤òÀè¤ËÄêµÁ¤·¤Æ¤ª¤«¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
\begin{quotation}
¥Õ¥ê¡¼¡§¥·¥ó¥Ü¥ë\verb|s|¤¬¼°¤ÎÃæ¤Ç¥Õ¥ê¡¼¤Ê¤Þ¤Þ¤Ç¸½¤ì¤ë¤È¤¤¤¦¤Î¤Ï¡¤
¤½¤Î¼°¤ÎÃæ¤ÇÊÑ¿ô¤È¤·¤Æ»È¤ï¤ì¤Æ¤¤¤ë¤¬¡¤¼°¤ÎÃæ¤Ç¤½¤ÎÊÑ¿ô¤¬Â«Çû¤µ¤ì¤Æ¤¤¤Ê¤¤¤È¤­¤À¡¥
\end{quotation}
°Ê²¼¤Î¼°¤ÎÃæ¤Ç¤Ï¡¤
\verb|w|¡¤\verb|x|¤ä\verb|z|¤Ï¤É¤ì¤â¼°\verb|list|Æâ¤Ç¥Õ¥ê¡¼¤Ë¸½¤ì¤Æ¤ª¤ê¡¤
Â«Çû¤òºî¤Ã¤Æ¤¤¤Ê¤¤¡¥
\begin{verbatim}
(let ((x y) (z 10))
  (list w x z))
\end{verbatim}
¤·¤«¤·³°Â¦¤Î¼°\verb|let|¤Ï\verb|x|¤È\verb|z|¤ËÂ«Çû¤òÍ¿¤¨¤Æ¤¤¤ë¤Î¤Ç¡¤
\verb|let|¤ÎÃæÁ´ÂÎ¤Ç¤Ï¡¤\verb|y|¤È\verb|w|¤Î¤ß¤¬¥Õ¥ê¡¼¤Ê¤Þ¤Þ¸½¤ì¤Æ¤¤¤ë¡¥
²¼¤Î¼°¤ÎÃæ¤Ç¤Ï¡¤
\begin{verbatim}
(let ((x x))
  x)
\end{verbatim}
2¸ÄÌÜ¤Ë¸½¤ì¤ë\verb|x|¤Ï¥Õ¥ê¡¼¤Ç¤¢¤ë\wadash
\verb|x|¤ËÂÐ¤·¤Æºî¤é¤ì¤¿¿·¤·¤¤Â«Çû¤Î¥¹¥³¡¼¥×Æâ¤Ë¤Ï¤Ê¤¤¡¥

\begin{quotation}
¹ü³Ê¡§¥Þ¥¯¥íÅ¸³«¤Î¹ü³Ê¤Ï¡¤
Å¸³«·Á¤½¤Î¤â¤Î¤«¤é¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Î°ú¿ô¤Î°ìÉô¤À¤Ã¤¿¤â¤Î¤òÁ´¤Æ¼è¤ê½ü¤¤¤¿¤â¤Î¤À¡¥
\end{quotation}
°Ê²¼¤Î¤è¤¦¤Ë\verb|foo|¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤Æ¡¤
\begin{verbatim}
(defmacro foo (x y)
  `(/ (+ ,x 1) ,y))
\end{verbatim}
²¼¤Î¤è¤¦¤Ë¸Æ¤Ð¤ì¤Æ¤¤¤¿¤é¡¤
\begin{verbatim}
(foo (- 5 2) 6)
\end{verbatim}
¤³¤ì¤Ï²¼¤Î¤è¤¦¤ÊÅ¸³«·Á¤òÍ¿¤¨¤ë¡¥
\begin{verbatim}
(/ (+ (- 5 2) 1) 6)
\end{verbatim}
¤³¤ÎÅ¸³«·Á¤Î¹ü³Ê¤Ï¡¤¾å¤Î¼°¤Î²¾°ú¿ô\verb|x|¤ä\verb|y|¤¬Æþ¤Ã¤Æ¤¤¤¿½ê¤Ë·ê¤ò³«¤±¤¿¤â¤Î¤À¡¥
\begin{verbatim}
(/ (+                  1) )
\end{verbatim}

¤³¤ì¤é2¤Ä¤Î³µÇ°¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤ì¤Ð¡¤
ÊáÂª¤µ¤ìÆÀ¤ë¥·¥ó¥Ü¥ë¤òÈ½ÊÌ¤¹¤ë¤¿¤á¤ÎÊØÍø¤Êµ¬Â§¤ò½Ò¤Ù¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
\begin{quotation}
ÊáÂª²ÄÇ½¡§
²¿¤é¤«¤Î¥Þ¥¯¥í¤ÎÅ¸³«·ÁÆâ¤Ç¥·¥ó¥Ü¥ë¤¬ÊáÂª²ÄÇ½¤À¤È¤¤¤¦¤Î¤Ï¡¤
°Ê²¼¤Î¾ò·ï¤Î¤É¤Á¤é¤«¤¬Ëþ¤¿¤µ¤ì¤ë¤È¤­¤Ç¤¢¤ë¡¥
(1)¥Þ¥¯¥íÅ¸³«¤Î¹ü³ÊÆâ¤Ç¥Õ¥ê¡¼¤Ê¤Þ¤Þ¸½¤ì¤Æ¤¤¤ë¤«¡¤
(2)¥Þ¥¯¥í¤ËÅÏ¤µ¤ì¤¿°ú¿ô¤¬Â«Çû¤Þ¤¿¤ÏÉ¾²Á¤µ¤ì¤ë¹ü³Ê¤Î°ìÉô¤ËÂ«Çû¤µ¤ì¤Æ¤¤¤ë¡¥
\end{quotation}

´ö¤Ä¤«¤ÎÎã¤«¤é¤³¤Îµ¬Â§¤ÎÉ½¤¹¤â¤Î¤ò¸«¤Æ¤ß¤è¤¦¡¥
²¼¤Î¤è¤¦¤Ê°ìÈÖÃ±½ã¤Ê¾ì¹ç¤Ç¤Ï¡¤
\begin{verbatim}
(defmacro cap1 ()
  '(+ x 1))
\end{verbatim}
\verb|x|¤Ï¹ü³ÊÆâ¤Ç¥Õ¥ê¡¼¤Ê¤Þ¤Þ¸½¤ì¤ë¤À¤í¤¦¤«¤é¡¤ÊáÂª²ÄÇ½¤À¡¥
¤³¤ì¤¬\verb|gripe|Æâ¤Î¥Ð¥°¤ò°ú¤­µ¯¤³¤·¤¿¤â¤Î¤À¡¥
²¼¤Î¥Þ¥¯¥í¤Ç¤Ï¡¤
\begin{verbatim}
(defmacro cap2 (var)
  `(let ((x ...)
              (,var ...))
         ...))
\end{verbatim}
\verb|x|¤ÏÊáÂª²ÄÇ½¤À¡¥
¤½¤ì¤Ï¡¤\verb|x|¤¬Â«Çû¤µ¤ì¤Æ¤¤¤ë¤Î¤ÈÆ±¤¸¼°¤Ë¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Î°ú¿ô¤âÂ«Çû¤µ¤ì¤ë¤«¤é¤À¡¥
(¤½¤ì¤¬\verb|for|¤Î¼ºÇÔ¤ò°ú¤­µ¯¤³¤·¤¿¡¥)
Æ±ÍÍ¤Ë°Ê²¼¤Î2¤Ä¤Î¥Þ¥¯¥í¤Ç¤Ï¡¤
\begin{verbatim}
(defmacro cap3 (var)
  `(let ((x ...))
         (let ((,var ...))
            ...)))

(defmacro cap4 (var)
  `(let ((,var ...))
         (let ((x ...))
            ...)))
\end{verbatim}
¤É¤Á¤é¤Ç¤â\verb|x|¤ÏÊáÂª²ÄÇ½¤À¡¥
¤·¤«¤·Îã¤¨¤Ð²¼¤Î¾ì¹ç¤Î¤è¤¦¤Ë¡¤
\verb|x|¤ÎÂ«Çû¤È°ú¿ô¤È¤·¤ÆÅÏ¤µ¤ì¤¿ÊÑ¿ô¤È¤¬¤È¤â¤Ë²Ä»ë¤Ç¤¢¤ë¤è¤¦¤Ê¥³¥ó¥Æ¥­¥¹¥È¤¬¤Ê¤±¤ì¤Ð¡¤
\begin{verbatim}
(defmacro safe1 (var)
  `(progn (let ((x 1))
            (print x))
          (let ((,var 1))
            (print ,var))))
\end{verbatim}
\verb|x|¤ÏÊáÂª²ÄÇ½¤Ë¤Ï¤Ê¤é¤Ê¤¤¡¥
¹ü³Ê¤ËÂ«Çû¤µ¤ì¤Æ¤¤¤ëÊÑ¿ô¤¬Á´¤Æ´í¸±¤ÊÌõ¤Ç¤Ï¤Ê¤¤¡¥
¤·¤«¤·¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Î°ú¿ô¤¬¹ü³Ê¤Ë¤è¤Ã¤Æºî¤é¤ì¤¿Â«Çû¤ÎÃæ¤ÇÉ¾²Á¤µ¤ì¤¿¤é¡¤
\begin{verbatim}
(defmacro cap5 (&body body)
  `(let ((x ...))
         ,@body))
\end{verbatim}
¤½¤Î¤è¤¦¤ËÂ«Çû¤µ¤ì¤¿ÊÑ¿ô¤Ë¤ÏÊáÂª¤Î´í¸±¤¬¤¢¤ë¡¥
\verb|cap5|¤ÎÃæ¤Ç¤Ï¡¤\verb|x|¤ÏÊáÂª²ÄÇ½¤À¡¥
¤·¤«¤·¼¡¤Î¾ì¹ç¤Ç¤Ï¡¤
\begin{verbatim}
(defmacro safe2 (expr)
  `(let ((x ,expr))
         (cons x 1)))
\end{verbatim}
\verb|x|¤ÏÊáÂª²ÄÇ½¤Ç¤Ï¤Ê¤¤¡¥
\verb|expr|¤ËÅÏ¤µ¤ì¤¿°ú¿ô¤¬É¾²Á¤µ¤ì¤ë»þÅÀ¤Ç¤Ï¡¤\verb|x|¤Î¿·¤¿¤ÊÂ«Çû¤Ï²Ä»ë¤Ç¤Ê¤¤¤«¤é¤À¡¥
¿´ÇÛ¤¹¤ëÉ¬Í×¤¬¤¢¤ë¤Î¤Ï¹ü³ÊÆâ¤ÎÊÑ¿ô¤ÎÂ«Çû¤À¤±¤À¤È¤¤¤¦¤³¤È¤âµ¤¤òÉÕ¤±¤ÆÍß¤·¤¤¡¥
²¼¤Î¥Þ¥¯¥í¤Ç¤Ï¡¤
\begin{verbatim}
(defmacro safe3 (var &body body)
  `(let ((,var ...))
         ,@body))
\end{verbatim}
¤É¤Î¥·¥ó¥Ü¥ë¤Ë¤âÉÔÃí°Õ¤Ë¤è¤ëÊáÂª¤Î´í¸±¤Ï¤Ê¤¤
¡ÊÂè1°ú¿ô¤ÏÂ«Çû¤µ¤ì¤ë¤â¤Î¤ÈÊ¬¤«¤Ã¤Æ¤¤¤ë¤È¤·¤Æ¡Ë¡¥

ÊáÂª²ÄÇ½¤Ê¥·¥ó¥Ü¥ë¤òÆ±Äê¤¹¤ëµ¬Â§¤ò¿·¤·¤¯¼ê¤Ë¤·¤¿½ê¤Ç¡¤\verb|for|¤Î¸µ¤ÎÄêµÁ¤ò¸«¤Æ¤ß¤è¤¦¡¥
\begin{verbatim}
(defmacro for ((var start stop) &body body)          ; ¸í¤ê
  `(do ((,var ,start (1+ ,var))
             (limit ,stop))
            ((> ,var limit))
         ,@body))
\end{verbatim}
¤³¤Î\verb|for|¤ÎÄêµÁ¤Ï¡¤2¤Ä¤ÎÅÀ¤ÇÊáÂª¤òÀ¸¤ß½Ð¤·ÆÀ¤ë¤³¤È¤¬Ê¬¤«¤ë¡¥
¤Þ¤º¸µ¤ÎÎã¤Î¤è¤¦¤Ë\verb|limit|¤¬\verb|for|¤ÎÂè1°ú¿ô¤È¤·¤ÆÅÏ¤µ¤ìÆÀ¤ëÅÀ¤À¡¥
\begin{verbatim}
(for (limit 1 5)
  (princ limit))
\end{verbatim}
¤·¤«¤·\verb|limit|¤¬¥ë¡¼¥×ËÜÂÎÆâ¤Ë¸½¤ì¤¿¤È¤­¤âÆ±¤¸°Ì´í¸±¤À¡¥
\begin{verbatim}
(let ((limit 0))
  (for (x 1 10)
        (incf limit x))
  limit)
\end{verbatim}
\verb|for|¤ò¤³¤Î¤è¤¦¤Ë»È¤¦¿Í¤Ï¼«Ê¬¤Î\verb|limit|¤ÎÂ«Çû¤¬¥ë¡¼¥×Æâ¤Ç1¤º¤ÄÁý¤ä¤µ¤ì¡¤
¼°Á´ÂÎ¤â55¤òÊÖ¤¹¤â¤Î¤È»×¤Ã¤Æ¤¤¤ë¤À¤í¤¦¡¥
¤·¤«¤·¼ÂºÝ¤Ë¤Ï¡¤Å¸³«·Á¤Î¹ü³Ê¤ËÀ¸À®¤µ¤ì¤¿\verb|limit|¤ÎÂ«Çû¤À¤±¤¬1¤º¤ÄÁý¤ä¤µ¤ì¤ë¡¥
\begin{verbatim}
(do ((x 1 (1+ x))
     (limit 10))
  ((> x limit))
  (incf limit x))
\end{verbatim}
¤½¤·¤Æ¤½¤ì¤¬È¿Éü¤òÀ©¸æ¤¹¤ëÌòÌÜ¤ò»ý¤Ã¤Æ¤¤¤ë¤Î¤Ç¡¤È¿Éü¤Ï½ªÎ»¤µ¤¨¤·¤Ê¤¤¡¥

¤³¤Î¾Ï¤ÇÄó¼¨¤µ¤ì¤¿µ¬Â§¤Ï¡¤¤¢¤¯¤Þ¤Ç¤âÌÜ°Â¤È¤·¤Æ°Õ¿Þ¤µ¤ì¤Æ¤¤¤ë¤È¤¤¤¦Î±ÊÝ¤Î¸µ¤Ç»È¤Ã¤ÆÍß¤·¤¤¡¥
¤½¤ì¤é¤Ï·Á¼°¤ËÂ§¤Ã¤Æ½Ò¤Ù¤é¤ì¤Æ¤µ¤¨¤¤¤Ê¤¤¤·¡¤¤Þ¤·¤Æ¤ä·Á¼°¾åÀµ¤·¤¯¤â¤Ê¤¤¡¥
ÊáÂª¤¬ÌäÂê¤Ë¤Ê¤ë¤Î¤Ï¸µ¡¹¤Î°Õ¿Þ¤Ë¤è¤ë¤³¤È¤Ê¤Î¤Ç¡¤ÄêµÁ¤ÏÛ£Ëæ¤À¡¥
Îã¤¨¤Ð²¼¤Î¤è¤¦¤Ê¼°¤Ç¤Ï¡¤
\begin{verbatim}
(let ((x 1)) (list x))
\end{verbatim}
\verb|(list x)|¤¬É¾²Á¤µ¤ì¤¿¤È¤­¤Ë\verb|x|¤¬¿·¤·¤¤ÊÑ¿ô¤ò»²¾È¤¹¤ë¤³¤È¤Ï¡¤¥¨¥é¡¼¤È¤Ï¸«¤Ê¤µ¤Ê¤¤¡¥
\verb|let|¤Ë¤Ï¤½¤Î¤è¤¦¤ÊÆ°ºî¤¬´üÂÔ¤µ¤ì¤Æ¤¤¤ë¡¥
ÊÑ¿ôÊáÂª¤òÈ½ÊÌ¤¹¤ëµ¬Â§¤â¤ä¤Ï¤ê¸·Ì©¤Ç¤Ï¤Ê¤¤¡¥
¾å¤Î3¸Ä¤Î¥Æ¥¹¥È¤òËþ¤¿¤·¤Ê¤¬¤é¡¤¤Ê¤ª°Õ¿Þ¤·¤Ê¤¤ÊÑ¿ôÊáÂª¤ò°ú¤­µ¯¤³¤·ÆÀ¤ë¤è¤¦¤Ê¥Þ¥¯¥í¤¬½ñ¤±¤ë¡¥
Îã¤¨¤Ð²¼¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤À¡¥
\begin{verbatim}
(defmacro pathological (&body body)                 ; ¸í¤ê
  (let* ((syms (remove-if (complement #'symbolp)
                          (flatten body)))
         (var (nth (random (length syms))
                   syms)))
    `(let ((,var 99))
       ,@body)))
\end{verbatim}
¤³¤Î¥Þ¥¯¥í¤¬¸Æ¤Ð¤ì¤ë¤È¡¤
ËÜÂÎÆâ¤Î¼°¤Ï\verb|progn|¤ÎÃæ¤Ë¤¢¤ë¤«¤Î¤è¤¦¤ËÉ¾²Á¤µ¤ì¤ë\wadash
¤·¤«¤·ËÜÂÎÆâ¤Î¥é¥ó¥À¥à¤Ê¤É¤ì¤«1¸Ä¤ÎÊÑ¿ô¤¬°ã¤Ã¤¿ÃÍ¤ò»ý¤Ä¤«¤â¤·¤ì¤Ê¤¤¡¥
¤³¤ì¤ÏÌÀ¤é¤«¤ËÊÑ¿ôÊáÂª¤À¤¬¡¤¤½¤ÎÊÑ¿ô¤Ï¹ü³ÊÆâ¤Ë¤Ï¤Ê¤¤¤Î¤Ç¡¤¾å¤Îµ¬Â§¤òËþ¤¿¤·¤Æ¤¤¤ë¡¥
¤·¤«¤·¼ÂÁ©¤Î¾ì¤Ç¤Ï¡¤¾å¤Îµ¬Â§¤Ï¤Û¤ÜÉ¬¤ºµ¡Ç½¤¹¤ë¤À¤í¤¦¡¥
¾å¤ÎÎã¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤ò½ñ¤­¤¿¤¤¤È¤­¤Ï¡Ê¤¢¤Ã¤¿¤È¤·¤Æ¤â¡Ë¤á¤Ã¤¿¤Ë¤Ê¤¤¡¥
%}}}
\subsection{Å¬ÀÚ¤ÊÌ¾Á°¤Ë¤è¤Ã¤ÆÊáÂª¤òÈò¤±¤ë}   %{{{
Âè1, 2Àá¤Ç¤ÏÊÑ¿ôÊáÂª¤Î¼ÂÎã¤ò2¼ïÎà¤ËÊ¬¤±¤¿¡§
°ú¿ô¤ÎÊáÂª¡¤
¤³¤ì¤Ï°ú¿ôÆâ¤Ç»È¤ï¤ì¤¿¥·¥ó¥Ü¥ë¤¬¥Þ¥¯¥í¤Î¹ü³Ê¤ËÀ¸À®¤µ¤ì¤¿Â«Çû¤ËÊá¤Þ¤ë¤â¤Î¤À¡¥
¤½¤·¤Æ¥Õ¥ê¡¼ÊÑ¿ô¤ÎÊáÂª¡¤
¤³¤ì¤Ï¥Þ¥¯¥í¤ÎÅ¸³«·ÁÆâ¤Î¥Õ¥ê¡¼¤Ê¥·¥ó¥Ü¥ë¤¬¡¤
¥Þ¥¯¥í¤¬Å¸³«¤µ¤ì¤¿¾ì½ê¤Ç¸úÎÏ¤ò»ý¤ÄÂ«Çû¤ËÊáÂª¤µ¤ì¤ë¤â¤Î¤À¡¥
ÉáÄÌ¡¤¸å¼Ô¤ÏÃ±¤Ë¥°¥í¡¼¥Ð¥ëÊÑ¿ô¤Ë¶èÊÌ¤ÎÉÕ¤¯¤è¤¦¤ÊÌ¾Á°¤òÍ¿¤¨¤ë¤³¤È¤Ç²ò·è¤µ¤ì¤ë¡¥
Common Lisp¤Î¥°¥í¡¼¥Ð¥ëÊÑ¿ô¤Ë¤Ï¡¤ÀèÆ¬¤ÈËöÈø¤Ë¥¢¥¹¥¿¥ê¥¹¥¯¤¬ÉÕ¤¯Ì¾Á°¤òÉÕ¤±¤ë¤Î¤¬ÅÁÅý¤À¡¥
Îã¤¨¤Ð¥«¥ì¥ó¥È¡¦¥Ñ¥Ã¥±¡¼¥¸¤òÄêµÁ¤¹¤ëÊÑ¿ô¤Ï\verb|*package*|¤ÈÌ¾ÉÕ¤±¤é¤ì¤ë¡¥
(¤³¤Î¤è¤¦¤ÊÌ¾Á°¤Ï¡¤ÉáÄÌ¤ÎÊÑ¿ô¤Ç¤Ê¤¤¤³¤È¤ò¶¯Ä´¤¹¤ë¤¿¤á¤Ë
¡Ö¥¹¥¿¡¼¡¦¥Ñ¥Ã¥±¡¼¥¸¡¦¥¹¥¿¡¼¡×¤ÈÈ¯²»¤µ¤ì¤ë¤³¤È¤¬¤¢¤ë¡¥)

¤À¤«¤é¤¿¤À¤Î\verb|w|¤Ç¤Ï¤Ê¤¯¡¤
\verb|*warnings*|Åù¤ÎÌ¾Á°¤ÎÊÑ¿ô¤Ë·Ù¹ð¤òÃß¤¨¤ë¤è¤¦¤Ë¤¹¤ë¤³¤È¤Ï¡¤
´°Á´¤Ë\verb|gripe|¤Îºî¼Ô¤ÎÀÕÇ¤¤À¤Ã¤¿¡¥
\verb|sample-ratio|¤Îºî¼Ô¤¬\verb|*warnings*|¤ò²¾°ú¿ô¤ÎÌ¾Á°¤Ë»È¤Ã¤Æ¤¤¤¿¤é¡¤
¸½¤ì¤ë¥Ð¥°¤È¤¤¤¦¥Ð¥°¤Ï¤ß¤Ê¼«Ê¬¤ÎÀÕÇ¤¤À¤í¤¦¡¥
¤·¤«¤·²¾°ú¿ô¤ò\verb|w|¤È¤¤¤¦Ì¾Á°¤Ë¤·¤Æ¤â°ÂÁ´¤À¤í¤¦¤È¹Í¤¨¤¿ÅÀ¤ÏÀÕ¤á¤é¤ì¤ë¤³¤È¤Ç¤Ï¤Ê¤¤¡¥
%}}}
\subsection{Í¥ÀèÉ¾²Á¤Ë¤è¤Ã¤ÆÊáÂª¤òÈò¤±¤ë}   %{{{
´í¸±¤Î¤¢¤ë°ú¿ô¤ò¥Þ¥¯¥íÅ¸³«¤Ë¤è¤Ã¤Æºî¤é¤ì¤ëÂ«Çû¤è¤ê¤â³°¤ÇÉ¾²Á¤¹¤ë¤³¤È¤À¤±¤Ç¡¤
°ú¿ô¤ÎÊáÂª¤¬²óÈò¤Ç¤­¤ë¤³¤È¤¬¤¢¤ë¡¥
°ìÈÖÃ±½ã¤Ê¤â¤Î¤Ï¥Þ¥¯¥í¤ò¼°\verb|let|¤«¤é»Ï¤á¤ë¤³¤È¤Ç²óÈò¤Ç¤­¤ë¡¥
Âè\ref{fig:AvoidCaptureWithLet}¿Þ¤Ë¤Ï¥Þ¥¯¥í\verb|before|¤Î2ÄÌ¤ê¤ÎÄêµÁ¤ò¼¨¤·¤¿¤¬¡¤
¤³¤ì¤Ï2¸Ä¤Î¥ª¥Ö¥¸¥§¥¯¥È¤È1¸Ä¤Î¥·¡¼¥±¥ó¥¹¤ò°ú¿ô¤Ë¼è¤ê¡¤
¤½¤Î¥·¡¼¥±¥ó¥¹Æâ¤Ç1¸ÄÌÜ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤¬2¸ÄÌÜ¤è¤êÁ°¤Ë¸½¤ì¤ë¤È¤­¤Ë¿¿¤òÊÖ¤¹¤â¤Î¤À
\footnote{¤³¤Î¥Þ¥¯¥í¤ÏÎã¤È¤·¤Æ»È¤ï¤ì¤Æ¤¤¤ë¤Ë²á¤®¤Ê¤¤¡¥
ËÜÅö¤Ï¥Þ¥¯¥í¤È¤·¤Æ¼ÂÁõ¤¹¤Ù¤­¤Ç¤â¤Ê¤¤¤·¡¤¤³¤ó¤ÊÈó¸úÎ¨Åª¤Ê¥¢¥ë¥´¥ê¥º¥à¤ò»È¤¦¤Ù¤­¤Ç¤â¤Ê¤¤¡¥
Å¬ÀÚ¤ÊÄêµÁ¤Ïfang¥Ú¡¼¥¸¤ò»²¾È¡¥}¡¥

\begin{figure}\begin{center}
\fbox{~\,\begin{minipage}{\FrameWidth}\narrowbaselines
\vspace{3pt}\hspace{12zw}ÊáÂª¤òµ¯¤³¤·¤ä¤¹¤¤¡§
\begin{center}\begin{minipage}{240pt}\texttt{%
(defmacro before (x y seq)\\
~~`(let ((seq ,seq))\\
~~~~~(< (position ,x seq)\\
~~~~~~~(position ,y seq))))}\end{minipage}\end{center}
\hspace{12zw}Àµ¤·¤¤¥ô¥¡¡¼¥¸¥ç¥ó¡§
\begin{center}\begin{minipage}{240pt}\texttt{%
(defmacro before (x y seq)\\
~~~`(let ((xval ,x) (yval ,y) (seq ,seq))\\
~~~~~~(< (position xval seq)\\
~~~~~~~~(position yval seq))))\\
}\end{minipage}\end{center}
\vspace{1.3em}\end{minipage}~\,}\end{center}
\caption{\texttt{let}¤Ë¤è¤ëÊÑ¿ôÊáÂª¤Î²óÈòÊýË¡¡¥}
\label{fig:AvoidCaptureWithLet}
\end{figure}

1¸ÄÌÜ¤ÎÄêµÁ¤ÏÉÔÅ¬ÀÚ¤À¡¥
ºÇ½é¤Î\verb|let|¤Ï\verb|seq|¤ËÅÏ¤µ¤ì¤¿¼°¤¬³Î¤«¤Ë1²ó¤À¤±É¾²Á¤µ¤ì¤ë¤è¤¦¤Ë¤·¤Æ¤¤¤ë¤¬¡¢
¤³¤ì¤Ç¤Ï¼¡¤Î¤è¤¦¤ÊÌäÂê¤òËÉ¤°¤Î¤ËÉÔ½½Ê¬¤À¡£
\begin{verbatim}
> (before (progn (setq seq '(b a)) 'a)
          'b
          '(a b))
NIL
\end{verbatim}
¤³¤ì¤Ï·ë¶É¡Ö\verb|(a b)|¤ÎÃæ¤Ç\verb|a|¤Ï\verb|b|¤è¤êÁ°¤Ë¤¢¤ë¤À¤í¤¦¤«¡©¡×¤È¿Ò¤Í¤Æ¤¤¤ë¤ï¤±¤À¡¥
Å¬ÀÚ¤Ëºî¤é¤ì¤¿\verb|before|¤Ê¤é¤Ð¿¿¤òÊÖ¤¹¤È¤³¤í¤À¡£
¥Þ¥¯¥íÅ¸³«¤ò¸«¤ë¤È¼ÂºÝ¤Ë²¿¤¬µ¯¤­¤ë¤«¤¬Ê¬¤«¤ë¡¥
\verb|<|¤ÎÂè1°ú¿ô¤ÎÉ¾²Á¤¬Âè2°ú¿ôÆâ¤Ç¤â»È¤ï¤ì¤ë¥ê¥¹¥È¤òÊÂ¤ÙÂØ¤¨¤Æ¤·¤Þ¤Ã¤Æ¤¤¤ë¡¥
\begin{verbatim}
(let ((seq '(a b)))
  (< (position (progn (setq seq '(b a)) 'a)
               seq)
     (position 'b seq)))
\end{verbatim}
¤³¤ÎÌäÂê¤ò²óÈò¤¹¤ë¤Ë¤Ï¡¤°ú¿ô¤òÁ´¤Æ1¸Ä¤ÎÂç¤­¤Ê\verb|let|¤ÇºÇ½é¤ËÉ¾²Á¤·¤Æ¤·¤Þ¤¨¤Ð½½Ê¬¤À¡¥
¤½¤Î¤¿¤áÂè\ref{fig:AvoidCaptureWithLet}¿ÞÆâ¤Î2ÈÖÌÜ¤ÎÄêµÁ¤Ë¤ÏÊáÂª¤Î´í¸±¤Ï¤Ê¤¤¡¥

»ÄÇ°¤Ê¤³¤È¤Ë¡¤\verb|let|¤ò»È¤¦µ»¤¬ÄÌÍÑ¤¹¤ë¾õ¶·¤ÏÂ¿¤¯¤Ê¤¤¡¥
\begin{enumerate}
\item ÊáÂª¤Î´í¸±¤Î¤¢¤ë°ú¿ô¤Ï¤­¤Ã¤«¤ê1²ó¤À¤±É¾²Á¤µ¤ì¤ë¤Ù¤­¤Ç¡¤
\item ¥Þ¥¯¥í¹ü³Ê¤ËÀ¸À®¤µ¤ì¤¿Â«Çû¤Î¥¹¥³¡¼¥×Æâ¤Ç¤Ï¤É¤Î°ú¿ô¤âÉ¾²Á¤ÎÉ¬Í×¤Ï¤Ê¤¤¡¤
\end{enumerate}
¤È¤¤¤¦¥Þ¥¯¥í¤Ç¤·¤«»È¤¨¤Ê¤¤¡¥
¤³¤ÎÀ©¸Â¤ÏÂ¿¿ô¤Î¥Þ¥¯¥í¤òÀÚ¤ê¼Î¤Æ¤Æ¤·¤Þ¤¦¡¥
Á°¤ËÄó°Æ¤µ¤ì¤¿¥Þ¥¯¥í\verb|for|¤Ï¤É¤Á¤é¤Î¾ò·ï¤âËþ¤¿¤µ¤Ê¤¤¡¥
¤·¤«¤·¤³¤Î¼êË¡¤ÎÊÑ·Á¤ò»È¤¦¤³¤È¤Ç¡¤\verb|for|¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤«¤éÊáÂª¤Î´í¸±¤ò¼è¤ê½ü¤¯¤³¤È¤¬¤Ç¤­¤ë¡¥
¥í¡¼¥«¥ë¤ËÀ¸À®¤µ¤ì¤¿¤É¤ÎÂ«Çû¤è¤ê¤â³°Â¦¤Î$\lambda$¼°¤ÎÃæ¤Ë¼Â¹ÔËÜÂÎ¤È¤Ê¤ë¼°¤òÊñ¤ß¹þ¤ó¤Ç¤·¤Þ¤¦¤Î¤À¡¥

È¿ÉüÍÑ¥Þ¥¯¥í¤ò´Þ¤à´ö¤Ä¤«¤Î¥Þ¥¯¥í¤Ï¡¤
¥Þ¥¯¥í¸Æ½Ð¤·¤Ë¸½¤ì¤ë¼°¤¬¿·¤·¤¯À¸À®¤µ¤ì¤¿Â«Çû¤ÎÃæ¤ÇÉ¾²Á¤µ¤ì¤ë¤è¤¦¤Ê¼°¤òÀ¸À®¤¹¤ë¡¥
Îã¤¨¤Ð\verb|for|¤ÎÄêµÁÆâ¤Ç¤Ï¡¤
·«¤êÊÖ¤·¤ÎËÜÂÎ¤Ï¥Þ¥¯¥í¤Îºî¤Ã¤¿\verb|do|¤ÎÃæ¤ÇÉ¾²Á¤µ¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤½¤Î¤¿¤á¡¤·«¤êÊÖ¤·ËÜÂÎÆâ¤Ë½Ð¤ÆÍè¤ëÊÑ¿ô¤Ï\verb|do|¤ËÀ¸À®¤µ¤ì¤¿Â«Çû¤Ë¤è¤ëÊáÂª¤Î´í¸±¤¬¤¢¤ë¡¥

·«¤êÊÖ¤·ËÜÂÎÆâ¤ÎÊÑ¿ô¤ò¤½¤Î¤è¤¦¤ÊÊáÂª¤«¤éÊÝ¸î¤¹¤ë¤¿¤á¤Ë¤Ï¡¤
ËÜÂÎ¤ò¥¯¥í¡¼¥¸¥ã¤ÇÊñ¤ß¡¤¤µ¤é¤Ë·«¤êÊÖ¤·¤ò¹Ô¤¦ºÝ¤Ë¡¤
¼°¤½¤Î¤â¤Î¤òÁÞÆþ¤»¤º¤Ë¥¯¥í¡¼¥¸¥ã¤ò\verb|funcall|¤Ç¸Æ¤Ù¤Ð¤è¤¤¡¥

Âè\ref{fig:AvoidCaptureWithClosure}¿Þ¤Ë¤Ï¤³¤Îµ»Ë¡¤òÍÑ¤¤¤¿¥ô¥¡¡¼¥¸¥ç¥ó¤Î\verb|for|¤ò¼¨¤·¤¿¡¥
¥¯¥í¡¼¥¸¥ã¤Ï\verb|for|¤ÎÅ¸³«·Á¤ÎÃæ¤ÇºÇ½é¤Ëºî¤é¤ì¤ë¤Î¤Ç¡¤
·«¤êÊÖ¤·ËÜÂÎÆâ¤Ë¸½¤ì¤ë¥Õ¥ê¡¼¥·¥ó¥Ü¥ë¤ÏÁ´¤Æ¥Þ¥¯¥í¤ò¸Æ¤ó¤Ç¤¤¤ë´Ä¶­Æâ¤ÎÊÑ¿ô¤ò»²¾È¤¹¤ë¡¥
¤³¤ì¤Ê¤é\verb|do|¤Ï¥¯¥í¡¼¥¸¥ã¤Î²¾°ú¿ô¤òÄÌ¤¸¤Æ¤½¤ÎËÜÂÎ¤È´Ø¤ï¤ê¹ç¤¦¤³¤È¤Ë¤Ê¤ë¡¥
Á´¤Æ¤Î¥¯¥í¡¼¥¸¥ã¤Ï¸½ºß¤¬·«¤êÊÖ¤·¤Î²¿²óÌÜ¤«¤ò\verb|do|¤«¤éÅÁ¤¨¤é¤ì¤ëÉ¬Í×¤¬¤¢¤ë¤Î¤Ç¡¤
¤¿¤À1¸Ä¤Î²¾°ú¿ô¡Ê¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ç¥¤¥ó¥Ç¥Ã¥¯¥¹¤Ë»ØÄê¤·¤¿¥·¥ó¥Ü¥ë¡Ë¤ò»ý¤Ä¡¥

\begin{figure}\begin{center}
\fbox{~\,\begin{minipage}{\FrameWidth}\narrowbaselines
\vspace{3pt}\hspace{12zw}ÊáÂª¤òµ¯¤³¤·¤ä¤¹¤¤¡§
\begin{center}\begin{minipage}{240pt}\texttt{(defmacro for ((var start stop) \&body body)\\
~~`(do ((,var ,start (1+ ,var))\\
~~~~~~~~(limit ,stop))\\
~~~~~((> ,var limit))\\
~~~~~,@body))}\end{minipage}\end{center}
\hspace{12zw}Àµ¤·¤¤¥ô¥¡¡¼¥¸¥ç¥ó¡§
\begin{center}\begin{minipage}{240pt}\texttt{(defmacro for ((var start stop) \&body body)\\
~~~`(do ((b \#'(lambda (,var) ,@body))\\
~~~~~~~~~(count ,start (1+ count))\\
~~~~~~~~~(limit ,stop))\\
~~~~~~~~((> count limit))\\
~~~~~~(funcall b count)))\\
}\end{minipage}\end{center}
\vspace{1.3em}\end{minipage}~\,}\end{center}
\caption{¥¯¥í¡¼¥¸¥ã¤Ë¤è¤ëÊÑ¿ôÊáÂª¤Î²óÈòÊýË¡¡¥}
\label{fig:AvoidCaptureWithClosure}
\end{figure}

¼°¤ò$\lambda$¼°¤ÇÊñ¤àµ»Ë¡¤ÏÉáÊ×Åª¤ÊÂÐ½èË¡¤Ç¤Ï¤Ê¤¤¡¥
¤³¤ì¤Ï¥³¡¼¥ÉËÜÂÎ¤ÎÊÝ¸î¤Ë¤Ï»È¤¨¤ë¤¬¡¤Îã¤¨¤Ð¡ÊºÇ½é¤ÎÉÔÅ¬ÀÚ¤Ê\verb|for|¤Î¤è¤¦¤Ë¡Ë
Æ±¤¸ÊÑ¿ô¤¬Æ±¤¸\verb|let|¤ä\verb|do|¤Ë2²óÂ«Çû¤µ¤ì¤ë´í¸±¤¬¤¢¤ë¤è¤¦¤Ê¾ì¹ç¤Ë¤Ï¡¤
¥¯¥í¡¼¥¸¥ã¤Ï²¿¤ÎÌò¤Ë¤âÎ©¤¿¤Ê¤¤¡¥
¹¬±¿¤Ê¤³¤È¤Ë¤³¤Î¾ì¹ç¤Ï¡¤ËÜÂÎ¤ò¥¯¥í¡¼¥¸¥ãÆâ¤ËÊñ¤à¤è¤¦¤Ë\verb|for|¤ò½ñ¤­Ä¾¤·¤¿¤³¤È¤Ç¡¤
\verb|do|¤¬°ú¿ô\verb|var|¤Î¤¿¤á¤ËÂ«Çû¤òÀ¸À®¤¹¤ëÉ¬Í×¤¬¤Ê¤¯¤Ê¤Ã¤Æ¤¤¤ë¡¥
¸µ¤Î\verb|for|¤Î°ú¿ô\verb|var|¤Ï¥¯¥í¡¼¥¸¥ã¤Î²¾°ú¿ô¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¤
\verb|do|Æâ¤Ç¤Ï¼ÂºÝ¤Î¥·¥ó¥Ü¥ë\verb|count|¤ÇÃÖ¤­´¹¤¨¤Æ¤â¤è¤¤¡¥
¤è¤Ã¤ÆÂè9.3Àá¤Î¥Æ¥¹¥È¤Ç¤âÊ¬¤«¤ë¤è¤¦¤Ë¡¤
\verb|for|¤Î¿·¤·¤¤ÄêµÁ¤ÏÊÑ¿ôÊáÂª¤Î´í¸±¤ò´°Á´¤Ë¹îÉþ¤·¤Æ¤¤¤ë¡¥

¥¯¥í¡¼¥¸¥ã¤ò»È¤¦¤³¤È¤ÎÃ»½ê¤Ï¡¤¤ä¤äÈó¸úÎ¨Åª¤Ë¤Ê¤ë¤«¤âÃÎ¤ì¤Ê¤¤¤³¤È¤À¡¥
´Ø¿ô¸Æ¤Ó½Ð¤·¤ò1²óÍ¾·×¤ËÁý¤ä¤·¤¿¤³¤È¤Ë¤Ê¤Ã¤¿¤«¤âÃÎ¤ì¤Ê¤¤¡¥
»ö¤Ë°Í¤ë¤È¤â¤Ã¤ÈÉÔÅÔ¹ç¤Ê¤³¤È¤Ë¡¤
¥³¥ó¥Ñ¥¤¥é¤¬¥¯¥í¡¼¥¸¥ã¤Ë¥À¥¤¥Ê¥ß¥Ã¥¯¥¨¥¯¥¹¥Æ¥ó¥È¤òÍ¿¤¨¤Æ¤¤¤Ê¤±¤ì¤Ð¡¤
¤½¤Î¤¿¤á¤Î¥¹¥Ú¡¼¥¹¤Ï¼Â¹Ô»þ¤Ë¥Ò¡¼¥×ÎÎ°è¤Ë³ä¤êÅö¤Æ¤ëÉ¬Í×¤¬½Ð¤ë¤«¤â¤·¤ì¤Ê¤¤¡¥
%}}}
\subsection{Gensym¤Ë¤è¤Ã¤ÆÊáÂª¤òÈò¤±¤ë}   %{{{
¥Þ¥¯¥í¤ÎÊÑ¿ôÊáÂª¤òÈò¤±¤ë¤Ë¤Ï¡¤³Î¼Â¤ÊÊýË¡¤¬1¤Ä¤¢¤ë¡¥
ÊáÂª¤µ¤ìÆÀ¤ë¥·¥ó¥Ü¥ë¤ògensym¤ÇÃÖ¤­´¹¤¨¤Æ¤·¤Þ¤¦¤Î¤À¡¥
\verb|for|¤Î¸µ¤Î¥ô¥¡¡¼¥¸¥ç¥ó¤Ç¤Ï¡¤
ÌäÂê¤Ï2¸Ä¤Î¥·¥ó¥Ü¥ë¤¬ÉÔÃí°Õ¤«¤éÆ±¤¸Ì¾Á°¤ò»ý¤Ã¤Æ¤·¤Þ¤Ã¤¿¤È¤­¤Ëµ¯¤­¤¿¡¥
¥Þ¥¯¥í¹ü³Ê¤¬¸Æ½ÐÂ¦¥³¡¼¥É¤Ç¤â»È¤ï¤ì¤Æ¤¤¤ëÌ¾Á°¤ò´Þ¤à¤È¤¤¤¦²ÄÇ½À­¤ò²óÈò¤·¤¿¤¤¤Ê¤é¡¤
¥Þ¥¯¥íÄêµÁÆâ¤Ç¤ÏÊÑ¤ÊÌ¾Á°¤Î¥·¥ó¥Ü¥ë¤À¤±¤ò»È¤¦¤³¤È¤ÇÂÐ½è¤¬Ë¾¤á¤ë¤«¤âÃÎ¤ì¤Ê¤¤¡§
\begin{verbatim}
(defmacro for ((var start stop) &body body)              ; ¸í¤ê
  `(do ((,var ,start (1+ ,var))
        (xsf2jsh ,stop))
     ((> ,var xsf2jsh))
     ,@body))
\end{verbatim}
¤·¤«¤·¤³¤ì¤Ï²ò·èºö¤È¤Ï¤È¤Æ¤â¸À¤¨¤Ê¤¤¡¥
¤³¤ì¤Ï¥Ð¥°¤ò¼è¤ê½ü¤¤¤¿¤Î¤Ç¤Ï¤Ê¤¯¡¤É½ÌÌ²½¤·¤Ë¤¯¤¤¤è¤¦¤Ë¤·¤¿¤À¤±¤À¡¥
¤½¤ì¤âÂç¤·¤ÆÉ½ÌÌ²½¤·¤Ë¤¯¤¤¤ï¤±¤Ç¤Ï¤Ê¤¤\wadash
Æ±¤¸¥Þ¥¯¥í¤òÆþ¤ì»Ò¤Ë¤·¤Æ»È¤Ã¤¿¤È¤­¤Ëµ¯¤­¤ë¾×ÆÍ¤¬¤ä¤Ï¤êÁÛÄê¤Ç¤­¤ë¡¥

¥·¥ó¥Ü¥ë¤¬°ì°ÕÅª¤Ç¤¢¤ë¤³¤È¤òÊÝ¾Ú¤¹¤ëÊýË¡¤¬É¬Í×¤À¡¥
Common Lisp¤Î´Ø¿ô\verb|gensym|¤Ï¡¤¤Þ¤µ¤Ë¤³¤Î¤¿¤á¤ËÂ¸ºß¤¹¤ë¡¥
¤³¤Î´Ø¿ô¤Ïgensym¤È¸Æ¤Ð¤ì¤ë¥·¥ó¥Ü¥ë¤òÊÖ¤¹¤¬¡¤
¤³¤ì¤Ï¥³¡¼¥É¤ËÂÇ¤Á¹þ¤Þ¤ì¤¿¤ê¥×¥í¥°¥é¥à¤ËÀ¸À®¤µ¤ì¤¿¤É¤Î¥·¥ó¥Ü¥ë¤È¤â
\verb|eq|¤Ç¤Ï¤Ê¤¤¤³¤È¤¬ÊÝ¾Ú¤µ¤ì¤Æ¤¤¤ë¡¥

Lisp¥·¥¹¥Æ¥à¤Ï¤É¤¦¤ä¤Ã¤Æ¤½¤ì¤òÊÝ¾Ú¤¹¤ë¤Î¤À¤í¤¦¤«¡©
Common Lisp¤ÎÁ´¤Æ¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ï¡¤¤½¤ÎÃæ¤ÇÇ§¼±¤µ¤ì¤Æ¤¤¤ëÁ´¤Æ¤Î¥·¥ó¥Ü¥ë¤Î¥ê¥¹¥È¤òÊÝ»ý¤·¤Æ¤¤¤ë¡¥
(¥Ñ¥Ã¥±¡¼¥¸¤Ø¤ÎÆ³Æþ¤ËÉÕ¤¤¤Æ¤Ï¡¤chuan¥Ú¡¼¥¸¤ò»²¾È¡¥)
¤½¤Î¥ê¥¹¥È¤ËºÜ¤Ã¤Æ¤¤¤ë¥·¥ó¥Ü¥ë¤Ï¥Ñ¥Ã¥±¡¼¥¸¤Ë¥¤¥ó¥¿¡¼¥ó¤µ¤ì¤Æ¤¤¤ë¤È¸À¤ï¤ì¤ë¡¥
\verb|gensym|¤ò¸Æ¤Ó½Ð¤¹ÅÙ¤Ë¡¤°ì°Õ¤Ç¥¤¥ó¥¿¡¼¥ó¤µ¤ì¤Æ¤¤¤Ê¤¤¥·¥ó¥Ü¥ë¤¬ÊÖ¤µ¤ì¤ë¡¥
¤½¤·¤Æ\verb|read|¤ËÆÉ¤ß¼è¤é¤ì¤ë¥·¥ó¥Ü¥ë¤ÏÁ´¤Æ¥¤¥ó¥¿¡¼¥ó¤µ¤ì¤ë¤Î¤Ç¡¤
gensym¤ÈÅù¤·¤¤¤â¤Î¤òÂÇ¤Á¹þ¤à¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡¥
¤½¤Î¤¿¤á¡¤¼¡¤Î¤è¤¦¤Ë»Ï¤Þ¤ë¼°¤Ï¡¤
\begin{verbatim}
   (eq (gensym) ...
\end{verbatim}
²¿¤òÂ³¤±¤Æ¤â¿¿¤òÊÖ¤¹¤è¤¦¤Ë¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡¥

\verb|gensym|¤Ë¥·¥ó¥Ü¥ë¤òÀ¸À®¤µ¤»¤ë¤³¤È¤Ï¡¤
´ñÌ¯¤ÊÌ¾Á°¤Î¥·¥ó¥Ü¥ë¤òÁª¤Ö¼êË¡¤ò°ìÊâ¿Ê¤á¤¿¤è¤¦¤Ê¤â¤Î¤À\wadash
gensym¤Ï¡¤ÅÅÏÃÄ¢¤òÃµ¤·¤Æ¤âºÜ¤Ã¤Æ¤¤¤Ê¤¤¤è¤¦¤ÊÌ¾Á°¤Î¥·¥ó¥Ü¥ë¤òÊÖ¤¹¡¥
Lisp¤¬gensym¤òÉ½¼¨¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤È¤­¤Ï¡¤¼¡¤Î¤è¤¦¤Ë¤¹¤ë¡¥
\begin{verbatim}
> (gensym)
#:G47
\end{verbatim}
É½¼¨¤µ¤ì¤ë¤â¤Î¤ÏLisp¤Ë¤È¤Ã¤Æ¡ÖÌ¾Ìµ¤Î¸¢Ê¼±Ò¡×Äø¤Î¤â¤Î¤Ë²á¤®¤Ê¤¤¡¥
¤³¤ì¤ÏÇ¤°Õ¤ÎÌ¾Á°¤Ç¡¤Ì¾Á°¤¬°ÕÌ£¤ò»ý¤Ä¤³¤È¤¬¤Ê¤¤¤è¤¦¤Ëºî¤é¤ì¤¿¤â¤Î¤À¡¥
¤½¤·¤Æ¤³¤ÎÉ½¼¨¤Ë¤Ä¤¤¤ÆÍ¾·×¤ÊÁÛÁü¤ò°ìÀÚ°ú¤­µ¯¤³¤µ¤Ê¤¤¤è¤¦¤Ë¡¤
gensyms¤Ï¥·¥ã¡¼¥×¡¦¥³¥í¥ó¤ËÂ³¤¤¤ÆÉ½¼¨¤µ¤ì¤ë¡¥
¤³¤ì¤ÏÆÃ¼ì¤Ê¥ê¡¼¥É¥Þ¥¯¥í¤Ç¡¤
É½¼¨¤µ¤ì¤¿gensym¤òºÆ¤ÓÆÉ¤ß¹þ¤â¤¦¤È¤·¤¿¤È¤­¥¨¥é¡¼¤òµ¯¤³¤¹¤¿¤á¤À¤±¤ËÂ¸ºß¤·¤Æ¤¤¤ë¡¥

\begin{figure}\begin{center}
\fbox{~\,\begin{minipage}{\FrameWidth}\narrowbaselines
\vspace{3pt}\hspace{12zw}ÊáÂª¤òµ¯¤³¤·¤ä¤¹¤¤¡§
\begin{center}\begin{minipage}{240pt}\texttt{%
(defmacro for ((var start stop) \&body body)\\
~~`(do ((,var ,start (1+ ,var))\\
~~~~~~~~(limit ,stop))\\
~~~~~((> ,var limit))\\
~~~~~,@body))%
}\end{minipage}\end{center}
\hspace{12zw}Àµ¤·¤¤¥ô¥¡¡¼¥¸¥ç¥ó¡§
\begin{center}\begin{minipage}{240pt}\texttt{%
(defmacro for ((var start stop) \&body body)\\
~~(let ((gstop (gensym)))\\
~~~~`(do ((,var ,start (1+ ,var))\\
~~~~~~~~~~(,gstop ,stop))\\
~~~~~~~~~((> ,var ,gstop))\\
~~~~~~~,@body)))\\
}\end{minipage}\end{center}
\vspace{1.3em}\end{minipage}~\,}\end{center}
\caption{Gensym¤Ë¤è¤ëÊÑ¿ôÊáÂª¤Î²óÈòÊýË¡¡¥}
\label{fig:AvoidCaptureWithGensym}
\end{figure}

\texttt{CLtL2}¤Ë½¾¤¦Common Lisp¤Ç¤Ï¡¤
gensym¤Î°õ»úÉ½¸½¤Ë¸½¤ì¤ë¿ô¤Ï\verb|*gensym-counter*|¤«¤éÍè¤Æ¤¤¤ë¡¥
¤³¤ì¤Ï¾ï¤ËÀ°¿ô¤ËÂ«Çû¤µ¤ì¤Æ¤¤¤ë¥°¥í¡¼¥Ð¥ëÊÑ¿ô¤À¡¥
¤³¤Î¥«¥¦¥ó¥¿¤ò¼êÆ°¤ÇÀßÄê¤¹¤ë¤³¤È¤Ç2¸Ä¤Îgensym¤òÆ±¤¸¤è¤¦¤ËÉ½¼¨¤µ¤»¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
\begin{verbatim}
> (setq x (gensym))
#:G48
> (setq *gensym-counter* 48 y (gensym))
#:G48
>(eqxy)
NIL
\end{verbatim}
¤·¤«¤·¤³¤ì¤é¤ÏÆ±°ì¤Ç¤Ï¤Ê¤¤¡¥

Âè\ref{fig:AvoidCaptureWithGensym}¿Þ¤Ë¤Ï¡¤gensym¤ò»È¤Ã¤¿\verb|for|¤ÎÀµ¤·¤¤ÄêµÁ¤òºÜ¤»¤¿¡¥
¥Þ¥¯¥í¤ËÅÏ¤µ¤ì¤¿¼°¤ÎÃæ¤Î¥·¥ó¥Ü¥ë¤È¾×ÆÍ¤òµ¯¤³¤·¤Æ¤¤¤¿\verb|limit|¤Ï¤â¤¦¤Ê¤¤¡¥
¤½¤ì¤Ï¥Þ¥¯¥íÅ¸³«¤Î»þÅÀ¤ÇÀ¸À®¤µ¤ì¤¿¥·¥ó¥Ü¥ë¤ËÃÖ¤­´¹¤ï¤Ã¤Æ¤·¤Þ¤¦¡¥
¥Þ¥¯¥í¤¬Å¸³«¤µ¤ì¤ëÅÙ¡¤
\verb|limit|¤Î¾ì½ê¤Ë¤ÏÅ¸³«»þ¤ËÀ¸À®¤µ¤ì¤¿°ì°Õ¤ÊÌ¾Á°¤Î¥·¥ó¥Ü¥ë¤¬Âå¤ï¤ê¤ËÃÖ¤«¤ì¤ë¡¥

\verb|for|¤ÎÀµ¤·¤¤ÄêµÁ¤Ï°ìÈ¯¤Ç½ñ¤­¾å¤²¤ë¤Ë¤ÏÊ£»¨²á¤®¤ë¡¥
´°À®ÉÊ¤Î¥³¡¼¥É¤Ï¡¤´°À®¤·¤¿¿ô³ØÄêÍý¤Î¤è¤¦¤Ë¡¤
¤·¤Ð¤·¤ÐÂ¿¤¯¤Î»î¹Ôºø¸í¤òÊ¤¤¤±£¤·¤Æ¤¤¤ë¡¥
¤À¤«¤é¤¢¤ë¥Þ¥¯¥í¤ò²¿ÃÊ³¬¤Ë¤âÊ¬¤±¤Æ½ñ¤«¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¯¤Æ¤â¿´ÇÛ¤·¤Ê¤¤¤³¤È¤À¡¥
\verb|for|¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤ò½ñ¤­»Ï¤á¤ë¤Ë¤Ï¡¤
ºÇ½é¤Î¥ô¥¡¡¼¥¸¥ç¥ó¤ÏÊÑ¿ôÊáÂª¤Ë¤Ä¤¤¤Æ¹Í¤¨¤º¤Ë½ñ¤­¡¤
¤½¤¦¤·¤¿¤éÁ°¤ËÌá¤Ã¤ÆÊÑ¿ôÊáÂª¤Ë´Ø¤ï¤ë¥·¥ó¥Ü¥ë¤ògensym¤ÇÃÖ¤­´¹¤¨¤ë¤Î¤¬¤¤¤¤¤«¤âÃÎ¤ì¤Ê¤¤¡¥
%}}}
\subsection{¥Ñ¥Ã¥±¡¼¥¸¤Ë¤è¤Ã¤ÆÊáÂª¤òÈò¤±¤ë}   %{{{
¤¢¤ëÄøÅÙ¤Þ¤Ç¤Ï¡¤¥Þ¥¯¥í¤òÆÈ¼«¤Î¥Ñ¥Ã¥±¡¼¥¸¤ËÆþ¤ì¤ë¤³¤È¤ÇÊÑ¿ôÊáÂª¤òÈò¤±¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
¥Ñ¥Ã¥±¡¼¥¸\verb|macros|¤òºî¤Ã¤Æ¤½¤ÎÃæ¤Ç\verb|for|¤òÄêµÁ¤¹¤ì¤Ð¡¤ºÇ½é¤Ëµó¤²¤¿ÄêµÁ
\begin{verbatim}
(defmacro for ((var start stop) &body body)
     `(do ((,var ,start (1+ ,var))
             (limit ,stop))
            ((> ,var limit))
         ,@body))
\end{verbatim}
¤ò»È¤Ã¤Æ¤âÂ¾¤Î¥Ñ¥Ã¥±¡¼¥¸¤«¤é¤Ï°ÂÁ´¤Ë¸Æ¤Ó½Ð¤»¤ë¡¥
\verb|for|¤òÊÌ¤Î¥Ñ¥Ã¥±¡¼¥¸¡ÊÎã¤¨¤Ð\verb|mycode|¡Ë¤«¤é¸Æ¤Ö¤È¡¤
Âè1°ú¿ô¤Ë\verb|limit|¤ò»È¤Ã¤Æ¤â¡¤¤½¤ì¤Ï\verb|mycode::limit|¤Ë¤Ê¤ë\wadash
¤³¤ì¤Ï¥Þ¥¯¥í¹ü³Ê¤Ë¸½¤ì¤ë\verb|macros::limit|¤È¤ÏÊÌÊª¤À¡¥

¤·¤«¤·¥Ñ¥Ã¥±¡¼¥¸¤ÏÊÑ¿ôÊáÂª¤ÎÌäÂê¤Î°ìÈÌÅª¤Ê²ò·èºö¤Ë¤Ï¤Ê¤é¤Ê¤¤¡¥
Âè1¤Ë¤Ï¡¤¥Þ¥¯¥í¤Ï¤¢¤ë¥×¥í¥°¥é¥à¤ËÅý¹ç¤µ¤ì¤¿°ìÉôÊ¬¤Ç¤¢¤Ã¤Æ¡¤
¤½¤ì¤é¤òÆÈ¼«¤Î¥Ñ¥Ã¥±¡¼¥¸Æâ¤ËÊ¬¤±¤Æ¤ª¤«¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤Î¤Ç¤ÏÉÔÊØ¤À¡¥
Âè2¤Ë¤Ï¡¤¥Ñ¥Ã¥±¡¼¥¸\verb|macros|Æâ¤ÎÊÌ¤Î¥³¡¼¥É¤ËÂÐ¤¹¤ëÊÝ¸î¤Ë¤ÏÁ´¤¯¤Ê¤Ã¤Æ¤¤¤Ê¤¤¡¥
%}}}
\subsection{°Û¤Ê¤ëÌ¾Á°¶õ´Ö¤Ç¤ÎÊáÂª}   %{{{
¤³¤ì¤Þ¤Ç¤Î¾Ï¤Ç¤Ï¤¢¤¿¤«¤âÊáÂª¤¬ÊÑ¿ô¤Î¤ß¤Ë°­¤µ¤ò¤¹¤ëÌäÂê¤«¤Î¤è¤¦¤Ë°·¤Ã¤Æ¤­¤¿¡¥
³Î¤«¤Ë¤Û¤È¤ó¤É¤ÎÊáÂª¤ÏÊÑ¿ôÊáÂª¤À¤¬¡¤
Common Lisp¤ÎÂ¾¤ÎÌ¾Á°¶õ´Ö¤Ë¤ª¤¤¤Æ¤âÆ±ÍÍ¤ËÌäÂê¤¬µ¯¤­ÆÀ¤ë¡¥

´Ø¿ô¤â¥í¡¼¥«¥ë¤ÊÂ«Çû¤ò»ý¤Ä¤³¤È¤¬¤Ç¤­¡¤¤½¤·¤Æ´Ø¿ô¤ÎÂ«Çû¤âÆ±ÍÍ¤ËÉÔÍÑ°Õ¤ÊÊáÂª¤ò°ú¤­µ¯¤³¤¹²ÄÇ½À­¤¬¤¢¤ë¡¥
Îã¡§
\begin{verbatim}
> (defun fn (x) (+ x 1))
FN
> (defmacro mac (x) `(fn ,x))
MAC
> (mac 10)
11
> (labels ((fn (y) (- y 1)))
    (mac 10))
9
\end{verbatim}
ÊáÂª¤ò¸«¤Ä¤±¤ëµ¬Â§¤«¤éÍ½Â¬¤Ç¤­¤ë¤è¤¦¤Ë¡¤
\verb|mac|¤Î¹ü³ÊÆâ¤Ç¥Õ¥ê¡¼¤Ê¤Þ¤Þ»È¤ï¤ì¤Æ¤¤¤ë\verb|fn|¤Ë¤ÏÊáÂª¤Î´í¸±¤¬¤¢¤ë¡¥
\verb|fn|¤¬¥í¡¼¥«¥ë¤ËºÆÂ«Çû¤µ¤ì¤ë¤È¡¤\verb|mac|¤ÎÊÖ¤¹ÃÍ¤ÏÉáÄÌ¤È¤Ï°ã¤Ã¤¿¤â¤Î¤Ë¤Ê¤ë¡¥

¤³¤ì¤Ë¤Ï¤É¤¦ÂÐ½è¤¹¤ì¤Ð¤è¤¤¤À¤í¤¦¤«¡©
ÊáÂª¤Î´í¸±¤Î¤¢¤ë¥·¥ó¥Ü¥ë¤¬ÁÈ¹þ¤ß¤Î´Ø¿ô¤ä¥Þ¥¯¥í¤ÎÌ¾Á°¤Ê¤é¤Ð¡¤²¿¤â¤·¤Ê¤¤¤Ç¤ª¤¯¤Î¤¬Íý¤ËÅ¬¤Ã¤Æ¤¤¤ë¡¥
\CLtL2¤Ë¤è¤ì¤Ð(p. 260)¡¤
ÁÈ¹þ¤ß¤Î¤â¤Î¤ÎÌ¾Á°¤¬¥í¡¼¥«¥ë´Ø¿ô¤Þ¤¿¤Ï¥Þ¥¯¥í¤ËÂ«Çû¤µ¤ì¤¿¤È¤­¡¤¡Ö·ë²Ì¤ÏÄêµÁ¤µ¤ì¤Ê¤¤¡×¡¥
¤À¤«¤é½ñ¤¤¤¿¥Þ¥¯¥í¤ÎÆ°ºî¤ÎÌäÂê¤Ç¤Ï¤Ê¤¤¡¥
ÁÈ¹þ¤ß´Ø¿ô¤òºÆÂ«Çû¤·¤¿¤é¡¤¼«Ê¬¤Î¥Þ¥¯¥í¤À¤±¤Ç¤Ê¤¯ÍÍ¡¹¤ÊÌäÂê¤ËÇº¤Þ¤µ¤ì¤ë¤³¤È¤Ë¤Ê¤ë¤À¤í¤¦¡¥

¤½¤¦¤Ç¤Ê¤¤¤È¤­¡¤ÊÑ¿ôÌ¾¤òÊÝ¸î¤¹¤ë¤Î¤ÈÆ±¤¸ÊýË¡¤Ç´Ø¿ôÌ¾¤ò¥Þ¥¯¥í°ú¿ô¤ÎÊáÂª¤«¤éÊÝ¸î¤Ç¤­¤ë¡¥
¥Þ¥¯¥í¹ü³Ê¤Ë¤è¤Ã¤Æ¥í¡¼¥«¥ë¤ËÄêµÁ¤µ¤ì¤¿¤É¤Î¤è¤¦¤Ê´Ø¿ô¤Ë¤â¡¤gensym¤ò´Ø¿ôÌ¾¤Ë»È¤¦¤³¤È¤À¡¥
¤³¤Î¾ì¹ç¡¤¥Õ¥ê¡¼¤Ê¥·¥ó¥Ü¥ë¤ÎÊáÂª¤òÈò¤±¤ë¤³¤È¤Ï¾¯¤·Æñ¤·¤¯¤Ê¤ë¡¥
ÊÑ¿ô¤ò¥Õ¥ê¡¼¥·¥ó¥Ü¥ëÊáÂª¤«¤éÊÝ¸î¤¹¤ë¤Ë¤Ï¡¤¤Ï¤Ã¤­¤ê¶èÊÌ¤Ç¤­¤ë¥°¥í¡¼¥Ð¥ëÊÑ¿ôÍÑ¤ÎÌ¾Á°¤òÉÕ¤±¤ì¤Ð¤è¤«¤Ã¤¿¡§
Îã¤¨¤Ð\verb|w|¤Ç¤Ê¤¯\verb|*warnings*|¤ò»È¤¨¤Ð¤è¤¤¡¥
¤·¤«¤·¤³¤Î²ò·èºö¤Ï´Ø¿ô¤Ë¤ÏÍ­¸ú¤Ç¤Ï¤Ê¤¤¡¥
¥°¥í¡¼¥Ð¥ë´Ø¿ô¤ò¶èÊÌ¤¹¤ë¤¿¤á¤ÎÌ¿Ì¾Ë¡¤Ë¤Ï´·½¬¤¬Ìµ¤¤¤«¤é¤À\wadash
²¿¤·¤íÂçÉôÊ¬¤Î´Ø¿ô¤¬¥°¥í¡¼¥Ð¥ë¤Ê¤Î¤À¤«¤é¡¥
¥Þ¥¯¥í¤¬¡¤É¬Í×¤Ê´Ø¿ô¤¬¥í¡¼¥«¥ë¤ËºÆÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤«¤â¤·¤ì¤Ê¤¤´Ä¶­Æâ¤Ç¸Æ¤Ð¤ì¤ë¤³¤È¤¬¿´ÇÛ¤Ê¤é¡¤
ºÇÎÉ¤Î²ò·èºö¤Ï¡¤¤ª¤½¤é¤¯¥³¡¼¥É¤òÆÈÎ©¤·¤¿¥Ñ¥Ã¥±¡¼¥¸¤ËÆþ¤ì¤ë¤³¤È¤À¡¥

¥Ö¥í¥Ã¥¯Ì¾¡¤¤¹¤Ê¤ï¤Á\verb|go|¤ä\verb|throw|¤Ç»È¤ï¤ì¤ë¥¿¥°¤«¤é¤â¤ä¤Ï¤êÊáÂª¤¬µ¯¤³¤êÆÀ¤ë¡¥
¥Þ¥¯¥í¤Ë¤½¤Î¤è¤¦¤ÊÌ¾Á°¤Î¥·¥ó¥Ü¥ë¤¬É¬Í×¤Ê¤é¡¤\verb|our-do|¤ÎÄêµÁ¤ÈÆ±ÍÍ¤Ëgensym¤ò»È¤¦¤Ù¤­¤À¡¥

¤Þ¤¿\verb|do|Åù¤Î¥ª¥Ú¥ì¡¼¥¿¤Ï°ÅÌÛ¤Î¤¦¤Á¤Ë\verb|nil|¤È¤¤¤¦Ì¾¤Î¥Ö¥í¥Ã¥¯¤Ë°Ï¤Þ¤ì¤ë¤³¤È¤âËº¤ì¤Æ¤Ï¤¤¤±¤Ê¤¤¡¥
¤½¤Î¤¿¤á\verb|do|¤ÎÃæ¤Î\verb|return|¤ä\verb|return-from nil|¤Ï¡¤
\verb|do|¤ÎÃæ¤Î¼°¤Ç¤Ï¤Ê¤¯\verb|do|¤½¤Î¤â¤Î¤«¤éÀ©¸æ¤òÌá¤¹¤³¤È¤Ë¤Ê¤ë¡¥
\begin{verbatim}
> (block nil
         (list 'a
               (do ((x 1 (1+ x)))
                 (nil)
                 (if (> x 5)
                   (return-from nil x)
                   (princ x)))))
12345
(A 6)
\end{verbatim}
\verb|do|¤¬\verb|nil|¤È¤¤¤¦Ì¾Á°¤Î¥Ö¥í¥Ã¥¯¤òºî¤Ã¤Æ¤¤¤Ê¤«¤Ã¤¿¤é¡¤
¤³¤ÎÎã¤Ï\verb|(A 6)|¤Ç¤Ê¤¯¤¿¤À¤Î\verb|6|¤òÊÖ¤·¤Æ¤¤¤¿¤Ï¤º¤À¡¥

\verb|do|¤Î°ÅÌÛ¤Î¥Ö¥í¥Ã¥¯¤ÏÌäÂê¤È¤Ï¸À¤¨¤Ê¤¤¡¥
\verb|do|¤Ï¤½¤Î¤è¤¦¤Ë¿¶¤ëÉñ¤¦¤³¤È¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤«¤é¤À¡¥
¤·¤«¤·Å¸³«·Á¤¬\verb|do|¤ò´Þ¤à¤è¤¦¤Ê¥Þ¥¯¥í¤ò½ñ¤¤¤¿¤È¤­¤Ï¡¤
¤½¤ì¤é¤¬¥Ö¥í¥Ã¥¯Ì¾\verb|nil|¤òÊáÂª¤·¤Æ¤·¤Þ¤¦¤³¤È¤Ï³Ð¤¨¤Æ¤ª¤¯¤Ù¤­¤À¡¥
\verb|for|¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤Ç¤Ï¡¤
\verb|return|¤ä\verb|return-from nil|¤Ï¡¤³°Â¦¤Î¥Ö¥í¥Ã¥¯¤Ç¤Ï¤Ê¤¯\verb|for|¤«¤éÀ©¸æ¤òÌá¤¹¤³¤È¤Ë¤Ê¤ë¡¥
%}}}
\subsection{ÊÑ¿ôÊáÂª¤Ë¤³¤À¤ï¤ëÍýÍ³}   %{{{
¤³¤ì¤Þ¤Ç¼¨¤·¤¿Îã¤Ë¤Ï¶Ë¤á¤ÆÉÂÅª¤È¸À¤Ã¤Æ¤¤¤¤¤â¤Î¤â¤¢¤Ã¤¿¡¥
¤½¤ì¤é¤ò¸«¤Æ¡¤¤³¤¦¸À¤¤¤¿¤¯¤Ê¤Ã¤¿¿Í¤â¤¤¤ë¤«¤â¤·¤ì¤Ê¤¤¡¥
¡ÖÊÑ¿ôÊáÂª¤Ê¤ó¤ÆÌÇÂ¿¤Ëµ¯¤­¤ë¤â¤ó¤¸¤ã¤Ê¤¤¡¤¤Ê¤ó¤Çµ¤¤ËÉÂ¤Þ¤Ê¤­¤ã¤¤¤±¤Ê¤¤¤ó¤À¡©¡×
¤³¤ÎÌä¤Ë¤Ï2ÄÌ¤ê¤ÎÅú¤¨Êý¤¬¤¢¤ë¡¥
1¤ÄÌÜ¤ÏÊÌ¤Î¼ÁÌä¤òÊÖ¤¹¤³¤È¤À¡§
¥Ð¥°¤Î¤Ê¤¤¥×¥í¥°¥é¥à¤¬½ñ¤±¤ë¤Î¤Ë¡¤¤É¤¦¤·¤Æ¾¯¡¹¤Î¥Ð¥°¤ò»ý¤Ã¤¿¥×¥í¥°¥é¥à¤ò½ñ¤¯¤Î¤Ç¤¹¤«¡©

Ä¹¤¤Åú¤¨Êý¤Ï¡¤¼ÂºÝ¤Î±þÍÑ¤Ç¤Ï
½ñ¤¤¤¿¥³¡¼¥É¤ÎÍÑÅÓ¤Ë¤Ä¤¤¤ÆÍ½Â¬¤òÎ©¤Æ¤ë¤Î¤Ï´í¸±¤À¤È»ØÅ¦¤¹¤ë¤³¤È¤À¡¥
Á´¤Æ¤ÎLisp¥×¥í¥°¥é¥à¤Ï¡¤¸½ºß¡Ö¥ª¡¼¥×¥ó¡¦¥¢¡¼¥­¥Æ¥¯¥Á¥ã¡×¤È¸Æ¤Ð¤ì¤ë¹½Â¤¤ò»ý¤Ä¡¥
Â¾¿Í¤Î»È¤¦¥³¡¼¥É¤ò½ñ¤¤¤Æ¤¤¤ë¤Î¤Ê¤é¡¤
¤½¤Î¿ÍÃ£¤ÏÍ½Â¬¤â¤Ä¤«¤Ê¤¤ÊýË¡¤Ç¤½¤ì¤ò»È¤¦¤«¤âÃÎ¤ì¤Ê¤¤¡¥
¤Þ¤¿¡¤¿´ÇÛ¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤Î¤ÏÂ¾¿Í¤À¤±¤Ç¤Ï¤Ê¤¤¡¥
¥×¥í¥°¥é¥à¤â¥×¥í¥°¥é¥à¤ò½ñ¤¯¤Î¤À¡¥
\begin{verbatim}
(before (progn (setq seq '(b a)) 'a)
        'b
        '(a b))
\end{verbatim}
¤³¤Î¤è¤¦¤Ê¥³¡¼¥É¤ò½ñ¤¯¿Í´Ö¤Ï¤¤¤Ê¤¤¤«¤â¤·¤ì¤Ê¤¤¤¬¡¤
¥×¥í¥°¥é¥à¤ËÀ¸À®¤µ¤ì¤¿¥³¡¼¥É¤Ï¤·¤Ð¤·¤Ð¤³¤Î¤è¤¦¤Ê·Á¤ò¤·¤Æ¤¤¤ë¡¥
¸Ä¡¹¤Î¥Þ¥¯¥í¤¬Ã±½ã¤ÇÍý¤ËÅ¬¤Ã¤¿³°¸«¤ÎÅ¸³«·Á¤òÀ¸À®¤¹¤ë¤È¤­¤Ç¤µ¤¨¡¤
¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ë¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤òÅÏ¤·¤¿¤ê¤¹¤ì¤Ð¡¤
ÅÓÃ¼¤ËÅ¸³«·Á¤Ï¤¤¤«¤Ë¤â¿Í¤¬½ñ¤¤¤¿¤â¤Î¤Ë¤Ï¸«¤¨¤Ê¤¤Âç¤­¤Ê¥×¥í¥°¥é¥à¤Ë¤Ê¤êÆÀ¤ë¡¥
¤½¤Î¤è¤¦¤Ê¾ì¹ç¤Ï¡¤¥Þ¥¯¥í¤¬¸í¤Ã¤ÆÅ¸³«¤µ¤ì¤Æ¤·¤Þ¤¦¾õ¶·¤ËÂÐ¤·¤Æ¤Ï¡¤
¤½¤ì¤¬¤É¤ó¤Ê¤Ë¤¢¤ê¤½¤¦¤â¤Ê¤¤¤â¤Î¤Ç¤â¡¤ËÉ¸æºö¤ò¼è¤Ã¤Æ¤ª¤¤¤ÆÂ»¤Ï¤Ê¤¤¡¥

ºÇ¸å¤Ë¸À¤¤¤¿¤¤¤Î¤Ï¡¤ÊáÂª¤òÈò¤±¤ë¤Î¤Ï¤½¤ìÄøÆñ¤·¤¯¤Ï¤Ê¤¤¤È¤¤¤¦¤³¤È¤À¡¥
¾¯¤··Ð¤Æ¤Ð½¬´·¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤¦¡¥
Common Lisp¤Î¸ÅÅµÅª¤Ê\verb|defmacro|¤ÏÎÁÍý¿Í¤ÎÊñÃú¤Î¤è¤¦¤Ê¤â¤Î¤À¡¥
¥¨¥ì¥¬¥ó¥È¤ÊÆ»¶ñ¤Ç´í¸±¤Ë¤â»×¤¨¤ë¤¬¡¤Ã£¿Í¤Ï³Î¿®¤ò»ý¤Ã¤Æ»È¤Ã¤Æ¤¤¤ë¡¥
%}}}
%}}}
\section{¥Þ¥¯¥í¤Î¤½¤ÎÂ¾¤ÎÍî¤··ê} %{{{
¥Þ¥¯¥í¤ò½ñ¤¯¤È¤­¤Ë¤ÏÃí°Õ¤¬Í¾Ê¬¤ËÉ¬Í×¤À¡¥
´Ø¿ô¤Ï¼«Ê¬¤Î¥ì¥­¥·¥«¥ë¤ÊÎÎ°è¤Ë¸ÉÎ©¤·¤Æ¤¤¤ë¤¬¡¤
¥Þ¥¯¥í¤Ï¡¤¸Æ½ÐÂ¦¤Î¥³¡¼¥ÉÆâ¤ËÅ¸³«¤µ¤ì¤ë¤Î¤Ç¡¤
Ãí°Õ¿¼¤¯½ñ¤«¤Ê¤¤¤ÈÉÔÌû²÷¤Ê¶Ã¤­¤ò¤â¤¿¤é¤¹¤³¤È¤¬¤¢¤ë¡¥
Âè9¾Ï¤Ç°·¤Ã¤¿ÊÑ¿ôÊáÂª¤Ï¤½¤ÎºÇ¤¿¤ë¤â¤Î¤À¡¥
¤³¤Î¾Ï¤Ç¤Ï¥Þ¥¯¥í¤òÄêµÁ¤¹¤ëºÝ¤ËÈò¤±¤ë¤Ù¤­ÌäÂê¤ò¤µ¤é¤ËµÄÏÀ¤¹¤ë¡¥
\subsection{É¾²Á¤Î²ó¿ô}   %{{{
Á°¤Î¾Ï¤Ç¤Ï\verb|for|¤ÎÉÔÅ¬ÀÚ¤ÊÄêµÁÎã¤ò¤¤¤¯¤Ä¤«¼¨¤·¤¿¡¥
Âè\ref{fig:ControlingArgEval}¿Þ¤Ë¤Ï¤µ¤é¤Ë2Îã¤ò¡¤Èæ³ÓÍÑ¤ÎÅ¬ÀÚ¤ÊÄêµÁ¤È¶¦¤Ë¼¨¤·¤¿¡¥

\begin{figure}\begin{center}
\fbox{~\,\begin{minipage}{\FrameWidth}\narrowbaselines
\vspace{3pt}\hspace{12zw}Å¬ÀÚ¤Ê¥ô¥¡¡¼¥¸¥ç¥ó¡§
\begin{center}\begin{minipage}{240pt}\texttt{%
(defmacro for ((var start stop) \&body body)\\
~~(let ((gstop (gensym)))\\
~~~~`(do ((,var ,start (1+ ,var))\\
~~~~~~~~~~(,gstop ,stop))\\
~~~~~~~~~((> ,var ,gstop))\\
~~~~~~~,@body)))\\
}\end{minipage}\end{center}
\hspace{12zw}Ê£¿ô²ó¤ÎÉ¾²Á¤òµ¯¤³¤·ÆÀ¤ë¡§
\begin{center}\begin{minipage}{240pt}\texttt{%
(defmacro for ((var start stop) \&body body)\\
~~`(do ((,var ,start (1+ ,var)))\\
~~~~~~~((> ,var ,stop))\\
~~~~~,@body))\\
}\end{minipage}\end{center}
\hspace{12zw}É¾²Á¤Î½çÈÖ¤¬´Ö°ã¤Ã¤Æ¤¤¤ë¡§
\begin{center}\begin{minipage}{240pt}\texttt{%
(defmacro for ((var start stop) \&body body)\\
~~(let ((gstop (gensym)))\\
~~~~`(do ((,gstop ,stop)\\
~~~~~~~~~~(,var ,start (1+ ,var)))\\
~~~~~~~~~((> ,var ,gstop))\\
~~~~~~~,@body)))\\
}\end{minipage}\end{center}
\vspace{1.3em}\end{minipage}~\,}\end{center}
\caption{°ú¿ôÉ¾²Á¤ÎÀ©¸æ}
\label{fig:ControlingArgEval}
\end{figure}

ÊáÂª¤òµ¯¤³¤¹¤³¤È¤Ï¤Ê¤¤¤¬¡¤2ÈÖÌÜ¤Ë¤Ï¥Ð¥°¤¬¤¢¤ë¡¥
¤³¤ì¤ÎÅ¸³«·Á¤Ï\verb|stop|¤È¤·¤ÆÅÏ¤µ¤ì¤¿¼°¤òÈ¿Éü¤ÎÅÙ¤ËÉ¾²Á¤·¤Æ¤·¤Þ¤¦¡¥
°ìÈÖ±¿¤Î¤è¤«¤Ã¤¿¾ì¹ç¤Ç¤â¡¤¤³¤Î¼ï¤Î¥Þ¥¯¥í¤ÏÈó¸úÎ¨¤Ç¡¤1²ó¹Ô¤¨¤Ð¤è¤¤¤³¤È¤ò·«¤êÊÖ¤·¤Æ¤¤¤ë¡¥
\verb|stop|¤ËÉûºîÍÑ¤¬¤¢¤ì¤Ð¡¤¤³¤Î¥Þ¥¯¥í¤¬¼ÂºÝ¤Ë´Ö°ã¤Ã¤¿·ë²Ì¤ò¤â¤¿¤é¤¹¤«¤âÃÎ¤ì¤Ê¤¤¡¥
Îã¤¨¤Ð¼¡¤Î¥ë¡¼¥×¤Ï¤¤¤Ä¤Þ¤Ç¤â½ªÎ»¤·¤Ê¤¤¡¥
¥´¡¼¥ë¤¬È¿Éü¤ÎÅÙ¤Ë±ó¤Î¤¤¤Æ¤æ¤¯¤«¤é¤À¡¥
\begin{verbatim}
> (let ((x 2))
     (for (i 1 (incf x))
        (princ i)))
12345678910111213...
\end{verbatim}

\verb|for|¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤ò½ñ¤¯¤È¤­¤Ë¤Ï¡¤
¥Þ¥¯¥í¤Î°ú¿ô¤Ï¼°¤Ç¤¢¤Ã¤ÆÃÍ¤Ç¤Ï¤Ê¤¤¤³¤È¤òËº¤ì¤Æ¤Ï¤¤¤±¤Ê¤¤¡¥
¤½¤ì¤é¤¬Å¸³«·ÁÆâ¤Ë¸½¤ì¤ë¾ì½ê¤Ë¤è¤Ã¤Æ¤ÏÊ£¿ô²óÉ¾²Á¤µ¤ì¤ë¤³¤È¤â¤¢¤ë¡¥
¾å¤Î¾ì¹ç¡¤²ò·èºö¤Ï¼°\verb|stop|¤¬ÊÖ¤·¤¿ÃÍ¤ËÊÑ¿ô¤òÂ«Çû¤·¡¤
·«¤êÊÖ¤·¤Î´Ö¤Ë¤Ï¤½¤ÎÊÑ¿ô¤ò»²¾È¤¹¤ë¤³¤È¤À¡¥

¥Þ¥¯¥í¤Ï¡¤ÌÀ³Î¤ËÈ¿Éü¤ò°Õ¿Þ¤·¤Æ¤¤¤Ê¤±¤ì¤Ð¡¤
¼°¤¬¤­¤Ã¤«¤ê¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ë½Ð¤ÆÍè¤ë²ó¿ô¤À¤±É¾²Á¤µ¤ì¤ë¤è¤¦¤Ë¤·¤Æ¤ª¤¯¤Ù¤­¤À¡¥
¤³¤Îµ¬Â§¤ÎÅö¤Æ¤Ï¤Þ¤é¤Ê¤¤ÌÀ¤é¤«¤ÊÎã¤¬¤¢¤ë¡§
Common Lisp¤Î\verb|or|¤Ï¡¤Á´¤Æ¤Î°ú¿ô¤òÉ¬¤ºÉ¾²Á¤¹¤ë¤è¤¦¤Ë¤Ê¤Ã¤¿¤é
¤º¤Ã¤ÈÉÔÊØ¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤¦¤À¤í¤¦¡Ê¤½¤ì¤Ç¤ÏPascal¤Î\verb|or|¹½Ê¸¤À¡Ë¡¥
¤·¤«¤·¤³¤Î¤è¤¦¤Ê¾ì¹ç¤Ç¤Ï²¿²óÉ¾²Á¤¬¹Ô¤ï¤ì¤ë¤«¤ÏÊ¬¤«¤Ã¤Æ¤¤¤ë¡¥
¾å¤Î2ÈÖÌÜ¤Î\verb|for|¤Ç¤Ï¤½¤¦¤Ç¤Ï¤Ê¤¤¡¥
¼°\verb|stop|¤¬Ê£¿ô²óÉ¾²Á¤µ¤ì¤ë¤ÈÁÛÄê¤¹¤ë¤è¤¦¤ÊÍýÍ³¤Ï¤Ê¤¤¤·¡¤¼ÂºÝ¤½¤¦¤Ç¤¢¤ë¤Ù¤­ÍýÍ³¤â¤Ê¤¤¡¥
2ÈÖÌÜ¤Î\verb|for|¤Î¤è¤¦¤Ë¤·¤Æ½ñ¤«¤ì¤¿¥Þ¥¯¥í¤Ï²á¸í¤Î»ºÊª¤Ç¤¢¤ë¤³¤È¤¬°ìÈÖÂ¿¤¤¡¥

°Õ¿Þ¤»¤ÌÊ£¿ô²ó¤ÎÉ¾²Á¤Ï\verb|setf|¤Î¾å¤Ë¹½ÃÛ¤µ¤ì¤¿¥Þ¥¯¥í¤Ë¤È¤Ã¤Æ¤ÏÆÃ¤ËÆñ¤·¤¤ÌäÂê¤À¡¥
Common Lisp¤Ï¤½¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤ò½ñ¤­°×¤¯¤¹¤ë¤¿¤á¤Î´ö¤Ä¤«¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤òÄó¶¡¤·¤Æ¤¤¤ë¡¥
ÌäÂê¤È²ò·èºö¤ÏÂè12¾Ï¤Ç°·¤¦¡¥
%}}}
\subsection{É¾²Á¤Î½çÈÖ}   %{{{
¼°¤¬É¾²Á¤µ¤ì¤ë½çÈÖ¤Ï¼°¤¬É¾²Á¤µ¤ì¤ë²ó¿ôÄø½ÅÍ×¤Ç¤Ï¤Ê¤¤¤¬¡¤»þ¡¹ÌäÂê¤Ë¤Ê¤ë¡¥
Common Lisp¤Î´Ø¿ô¸Æ¤Ó½Ð¤·¤Ç¤Ï¡¤°ú¿ô¤Ïº¸¤«¤é±¦¤Î½ç¤ÇÉ¾²Á¤µ¤ì¤ë¡¥
\begin{verbatim}
> (setq x 10)
10
> (+ (setq x 3) x)
6
\end{verbatim}
¥Þ¥¯¥í¤Ë¤Ä¤¤¤Æ¤â¤½¤¦¤¹¤ë¤Î¤¬¤è¤¤½¬´·¤À¡¥
¥Þ¥¯¥í¤Ç¤Ï¾ï¤Ë³Î¤«¤Ë¼°¤¬¥Þ¥¯¥í¸Æ¤Ó½Ð¤·Æâ¤ÈÆ±¤¸½ç¤ÇÉ¾²Á¤µ¤ì¤ë¤è¤¦¤Ë¤¹¤ë¤Ù¤­¤À¡¥

Âè\ref{fig:ControlingArgEval}¿Þ¤Ç¤Ï¡¤3ÈÖÌÜ¤Î\verb|for|¤Ë¤âÈùÌ¯¤Ê¥Ð¥°¤¬¤¢¤ë¡¥
²¾°ú¿ô\verb|stop|¤Ï\verb|start|¤è¤êÁ°¤ËÉ¾²Á¤µ¤ì¤ë¡¥
¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ç¤ÏµÕ¤Î½çÈÖ¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤È¤¤¤¦¤Î¤Ë¡¥
\begin{verbatim}
> (let ((x 1))
    (for (i x (setq x 13))
         (princ i)))
13
NIL
\end{verbatim}
¤³¤Î¥Þ¥¯¥í¤Ï¡¤»þ´Ö¤¬µÕÌá¤ê¤·¤¿¤«¤Î¤è¤¦¤Êdisconcerting°õ¾Ý¤òÍ¿¤¨¤ë¡¥
»úÌÌ¤Î¾å¤Ç¤Ï¼°\verb|start|¤¬ºÇ½é¤Ë½Ð¤ÆÍè¤ë¤Ë¤â´Ø¤ï¤é¤º¡¤
¼°\verb|stop|¤ÎÉ¾²Á¤¬¼°\verb|start|¤ÎÊÖ¤¹ÃÍ¤Ë±Æ¶Á¤·¤Æ¤¤¤ë¤Î¤À¡¥

Å¬ÀÚ¤ËÄêµÁ¤µ¤ì¤¿\verb|for|¤Ç¤Ï¡¤°ú¿ô¤Ï³Î¤«¤Ë½Ð¤ÆÍè¤ë½ç¤ÇÉ¾²Á¤µ¤ì¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥
\begin{verbatim}
> (let ((x 1))
    (for (i x (setq x 13))
         (princ i)))
12345678910111213
NIL
\end{verbatim}
¤³¤ì¤Ê¤é\verb|x|¤ò¼°\verb|stop|Æâ¤ÇÀßÄê¤·¤Æ¤â¡¤Á°¤Î°ú¿ô¤¬ÊÖ¤¹ÃÍ¤Ë¤Ï²¿¤Î±Æ¶Á¤â¤Ê¤¤¡¥

¾å¤Ë¼¨¤·¤¿Îã¤Ï¤³¤Î¤¿¤á¤Ëºî¤Ã¤¿¤â¤Î¤À¤¬¡¤
¤³¤Î¼ï¤ÎÌäÂê¤¬¸²ºß²½¤¹¤ë¾õ¶·¤ÏÂ¸ºß¤·¡¤¤½¤·¤Æ¤³¤Î¤è¤¦¤Ê¥Ð¥°¤ÏÈ¯¸«¤¬¶Ë¤á¤ÆÆñ¤·¤¤¡¥
¥Þ¥¯¥í¤Î¤¢¤ë°ú¿ô¤ÎÉ¾²Á¤¬ÊÌ¤Î°ú¿ô¤¬ÊÖ¤¹ÃÍ¤Ë±Æ¶Á¤¹¤ë¤è¤¦¤Ê¥³¡¼¥É¤ò½ñ¤¯¿Í¤Ï¤Þ¤º¤¤¤Ê¤¤¤À¤í¤¦¡¥
¤·¤«¤·¿Í¤Ï°Õ¿ÞÅª¤Ë¤Ï·è¤·¤Æ¤ä¤é¤Ê¤¤¤³¤È¤Ç¤â¸í¤Ã¤Æ¤ä¤Ã¤Æ¤·¤Þ¤¦¤³¤È¤¬¤¢¤ë¤â¤Î¤À¡¥
¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¡¤°Õ¿Þ¤µ¤ì¤¿ÄÌ¤ê¤Ë»È¤ï¤ì¤ì¤ÐÀµ¤·¤¯µ¡Ç½¤¹¤ë¤À¤±¤Ç¤Ê¤¯¡¤
¥Ð¥°¤ò±£ÊÃ¤·¤Æ¤â¤¤¤±¤Ê¤¤¡¥
¾å¤ÎÎã¤Î¤è¤¦¤Ê¥³¡¼¥É¤ò½ñ¤¯¿Í¤¬¤¤¤¿¤é¡¤¤½¤ì¤Ï¤­¤Ã¤È´Ö°ã¤Ã¤Æ½ñ¤¤¤¿¤Î¤À¤í¤¦¡¥
¤·¤«¤·Å¬ÀÚ¤ËÄêµÁ¤µ¤ì¤¿\verb|for|¤ÏÍÆ°×¤Ë¸í¤ê¤Ëµ¤ÉÕ¤«¤»¤Æ¤¯¤ì¤ë¡¥
%}}}
\subsection{´Ø¿ô¤Ë¤è¤é¤Ê¤¤¥Þ¥¯¥íÅ¸³«}   %{{{
Lisp¤Ï¡¤¥Þ¥¯¥íÅ¸³«¤òÀ¸À®¤¹¤ë¥³¡¼¥É¤Ï
Âè3¾Ï¤ÇÏÀ¤¸¤¿°ÕÌ£¤Ç½ã¿è¤Ë´Ø¿ôÅª¤Ç¤¢¤ë¤â¤Î¤ÈÍ½´ü¤·¤Æ¤¤¤ë¡¥
Å¸³«¤ò¹Ô¤¦¥³¡¼¥É¤Ï°ú¿ô¤È¤·¤ÆÅÏ¤µ¤ì¤¿¼°¤Ë¤Î¤ß°ÍÂ¸¤¹¤Ù¤­¤Ç¡¤
ÃÍ¤òÊÖ¤¹Â¾¤Ë¤Ï¼þ°Ï¤ÎÀ¤³¦¤Ë±Æ¶Á¤·¤è¤¦¤È¤¹¤Ù¤­¤Ç¤Ï¤Ê¤¤¡¥

\textsf{CLtL2}¤Ë¤â¤¢¤ë¤è¤¦¤Ë(p. 685)¡¤
¥³¥ó¥Ñ¥¤¥ëºÑ¤ß¥³¡¼¥ÉÆâ¤Ç¤Î¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ï
¼Â¹Ô»þ¤ËºÆÅ¸³«¤µ¤ì¤ë¤³¤È¤Ï¤Ê¤¤¤È»×¤Ã¤Æ¤ª¤¯¤Î¤¬°ÂÁ´¤À¡¥
¤½¤¦¤Ç¤Ê¤±¤ì¤Ð¡¤Common Lisp¤Ï¤¤¤Ä¤Î»þÅÀ¤Ç¡¤
¤Þ¤¿¤Ï¤É¤ì¤Û¤É¤ÎÉÑÅÙ¤Ç¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤¬Å¸³«¤µ¤ì¤ë¤Î¤«ÊÝ¾Ú¤Ç¤­¤Ê¤¯¤Ê¤Ã¤Æ¤·¤Þ¤¦¡¥
¥Þ¥¯¥í¤ÎÅ¸³«·ë²Ì¤¬¤½¤Î¤É¤Á¤é¤«¤Ë¤è¤Ã¤ÆÊÑ¤ï¤ë¤³¤È¤¬¤¢¤ì¤Ð¡¤¤½¤ì¤Ï¸í¤ê¤È¸«¤Ê¤µ¤ì¤ë¡¥
Îã¤¨¤Ð¡¤¤¢¤ë¥Þ¥¯¥í¤¬»È¤ï¤ì¤¿²ó¿ô¤ò¿ô¤¨¤¿¤¤¤È¤·¤è¤¦¡¥
Ã±¤Ë¥½¡¼¥¹¤Ë¸¡º÷¤ò¤«¤±¤ì¤Ð¤è¤¤Ìõ¤Ç¤Ï¤Ê¤¤¡¥
¤½¤Î¥Þ¥¯¥í¤¬¥×¥í¥°¥é¥à¤ÎÀ¸À®¤·¤¿¥³¡¼¥ÉÆâ¤Ç¸Æ¤Ð¤ì¤Æ¤¤¤ë¤«¤âÃÎ¤ì¤Ê¤¤¤«¤é¤À¡¥
¤À¤«¤é¼¡¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤òÄêµÁ¤·¤¿¤¯¤Ê¤ë¡¥
\begin{verbatim}
(defmacro nil! (x)                   ; ¸í¤ê
  (incf *nil!s*)
  `(setf ,x nil))
\end{verbatim}
¤³¤ÎÄêµÁ¤Ç¤Ï¥°¥í¡¼¥Ð¥ëÊÑ¿ô\verb|*nil!s*|¤¬\verb|nil!|¤¬Å¸³«¤µ¤ì¤ëÅÙ¤Ë1¤À¤±Áý²Ã¤¹¤ë¡¥
¤·¤«¤·¤³¤ÎÊÑ¿ô¤ÎÃÍ¤«¤é\verb|nil!|¤Î¸Æ¤Ð¤ì¤¿²ó¿ô¤¬Ê¬¤«¤ë¤È»×¤Ã¤¿¤é´Ö°ã¤¤¤À¡¥
¤¢¤ë¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤ÏÊ£¿ô²óÅ¸³«¤µ¤ìÆÀ¤ë¡Ê¼ÂºÝ¤·¤Ð¤·¤Ð¤½¤¦¤À¡Ë¡¥
Îã¤¨¤Ð¥½¡¼¥¹¥³¡¼¥É¤ÎÊÑ´¹¤ò¹Ô¤¦¥×¥ê¥×¥í¥»¥Ã¥µ¤Ï¡¤¼°Æâ¤Î¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤ò¡¤
¤½¤ì¤òÊÑ´¹¤¹¤Ù¤­¤«¤É¤¦¤«È½ÃÇ¤¹¤ëÁ°¤ËÅ¸³«¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤«¤â¤·¤ì¤Ê¤¤¡¥

°ìÈÌÂ§¤È¤·¤Æ¤Ï¡¤Å¸³«¤ò¹Ô¤¦¥³¡¼¥É¤Ï°ú¿ô°Ê³°¤Î²¿¤Ë¤â°ÍÂ¸¤¹¤Ù¤­¤Ç¤Ê¤¤¡¥
¤À¤«¤éÎã¤¨¤ÐÅ¸³«·Á¤òÊ¸»úÎó¤«¤éºî¤ê½Ð¤¹¤è¤¦¤Ê¤É¤Î¥Þ¥¯¥í¤â¡¤
Å¸³«»þ¤Ë²¿¤Î¥Ñ¥Ã¥±¡¼¥¸Æâ¤Ë¤¤¤ë¤«¤Ë¤Ä¤¤¤Æ¾¡¼ê¤ËÍ½ÁÛ¤·¤Ê¤¤¤è¤¦Ãí°Õ¤¹¤Ù¤­¤À¡¥
¼¡¤Î´Ê·é¤À¤¬¤«¤Ê¤êÉÂÅª¤ÊÎã¤Ï¡¤
\begin{verbatim}
(defmacro string-call (opstring &rest args)              ; ¸í¤ê
     `(,(intern opstring) ,@args))
\end{verbatim}
¥ª¥Ú¥ì¡¼¥¿¤Î°õ»úÌ¾¤ò¤È¤Ã¤Æ¤½¤Î¥ª¥Ú¥ì¡¼¥¿¤Ø¤Î¸Æ¤Ó½Ð¤·¤òÅ¸³«¤¹¤ë¥Þ¥¯¥í¤òÄêµÁ¤·¤Æ¤¤¤ë¡¥
\begin{verbatim}
> (defun our+ (x y) (+ x y))
OUR+
> (string-call "OUR+" 2 3)
5
\end{verbatim}
\verb|intern|¤ÏÊ¸»úÎó¤ò¼è¤ê¡¤ÂÐ±þ¤¹¤ë¥·¥ó¥Ü¥ë¤òÊÖ¤¹¡¥
¤·¤«¤·¥ª¥×¥·¥ç¥Ê¥ë°ú¿ô¤Î¥Ñ¥Ã¥±¡¼¥¸¤ò¾Ê¤¯¤È¡¤¥«¥ì¥ó¥È¡¦¥Ñ¥Ã¥±¡¼¥¸¤¬»È¤ï¤ì¤ë¡¥
¤è¤Ã¤ÆÅ¸³«·Á¤Ï¤½¤ì¤¬À¸À®¤µ¤ì¤ë¤È¤­¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ë°ÍÂ¸¤¹¤ë¤³¤È¤Ë¤Ê¤ë¡¥
\verb|our+|¤¬¤½¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ç²Ä»ë¤Ç¤Ê¤¤¸Â¤ê¡¤Å¸³«·Á¤ÏÌ¤ÄêµÁ´Ø¿ô¤Ø¤Î¸Æ¤Ó½Ð¤·¤Ë¤Ê¤ë¡¥

Miller¤ÈBenson¤Î\emph{Lisp Style and Design}¤Ï
Å¸³«¥³¡¼¥É¤ÎÉûºîÍÑ¤«¤éµ¯¤­¤ëÌäÂê¤ÎÆÃÊÌ¤Ë±ø¤¤Îã¤Ë¸ÀµÚ¤·¤Æ¤¤¤ë¡¥
Common Lisp¤Ç¤Ï\textsf{CLtL2}¤Ë¤â¤¢¤ë¤è¤¦¤Ë(p. 78)¡¤
\verb|&rest|°ú¿ô¤ËÂ«Çû¤µ¤ì¤¿¥ê¥¹¥È¤¬¿·¤·¤¯À¸À®¤µ¤ì¤¿¤â¤Î¤Ç¤¢¤ëÊÝ¾Ú¤Ï¤Ê¤¤¡¥
¤½¤ì¤Ï¥×¥í¥°¥é¥àÆâ¤Î¤É¤³¤«¤Î¥ê¥¹¥È¤È¹½Â¤¤ò¶¦Í­¤·¤Æ¤¤¤ë¤«¤âÃÎ¤ì¤Ê¤¤¡¥
¤½¤Î·ë²Ì¡¤\verb|&rest|°ú¿ô¤ÏÇË²õÅª¤ËÁàºî¤·¤Æ¤Ï¤¤¤±¤Ê¤¤¤³¤È¤Ë¤Ê¤ë¡¥
Æ±»þ¤ËÂ¾¤Î²¿¤ËÊÑ¹¹¤ò²Ã¤¨¤Æ¤¤¤ë¤«Ê¬¤«¤é¤Ê¤¤¤«¤é¤À¡¥

¤³¤Î²ÄÇ½À­¤Ï´Ø¿ô¤È¥Þ¥¯¥íÎ¾Êý¤Ë±Æ¶Á¤¹¤ë¡¥
´Ø¿ô¤Ë¤Ä¤¤¤Æ¤Ï\verb|apply|¤ò»È¤¦¤ÈÌäÂê¤¬¸²ºß²½¤¹¤ë¡¥
Common Lisp¤Îµ¬³Ê¤Ë±è¤Ã¤¿½èÍý·Ï¤Î¼ÂÁõ¤Ç¤Ï¼¡¤ÎÌäÂê¤¬µ¯¤³¤êÆÀ¤ë¤Î¤À¡¥
°ú¿ô¤Î¥ê¥¹¥È¤ÎËöÈø¤Ëet al¤òÉÕ¤±²Ã¤¨¤ë´Ø¿ô\verb|et-al|¤òÄêµÁ¤·¤¿¤¤¤È¤·¤è¤¦¡¥
\begin{verbatim}
(defun et-al (&rest args)
  (nconc args (list 'et 'al)))
\end{verbatim}
¤³¤Î´Ø¿ô¤ÏÉáÄÌ¤Ë¸Æ¤Ö¸Â¤ê¤Ç¤ÏÅ¬ÀÚ¤ËÆ°ºî¤¹¤ë¤è¤¦¤Ë»×¤¨¤ë¡§
\begin{verbatim}
> (et-al 'smith 'jones)
(SMITH JONES ET AL)
\end{verbatim}
¤·¤«¤·¤½¤ì¤ò\verb|apply|·ÐÍ³¤Ç¸Æ¤Ó½Ð¤¹¤È¡¤´ûÂ¸¤Î¥Ç¡¼¥¿¹½Â¤¤¬ÊÑ¹¹¤µ¤ì¤ë²ÄÇ½À­¤¬¤¢¤ë¡§
\begin{verbatim}
> (setq greats '(leonardo michelangelo))
(LEONARDO MICHELANGELO)
> (apply #'et-al greats)
(LEONARDO MICHELANGELO ET AL)
> greats
(LEONARDO MICHELANGELO ET AL)
\end{verbatim}
¾¯¤Ê¤¯¤È¤âCommon Lisp¤Îµ¬³Ê¤Ë±è¤Ã¤¿½èÍý·Ï¤Ç¤Ï¤³¤¦¤Ê¤ë²ÄÇ½À­¤¬¤¢¤ë¡¥
º£¤Î¤È¤³¤í¼ÂºÝ¤Ë¤Ï¤½¤Î¤è¤¦¤Ê½èÍý·Ï¤Ï¤Ê¤¤¤è¤¦¤À¤¬¡¥

¥Þ¥¯¥í¤Ç¤Ï´í¸±ÅÙ¤¬Âç¤­¤¤¡¥
\verb|&rest|°ú¿ô¤ËÊÑ¹¹¤ò²Ã¤¨¤ë¥Þ¥¯¥í¤Ï¤½¤ì¤Ë¤è¤Ã¤Æ¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤ËÊÑ¹¹¤ò²Ã¤¨¤ë²ÄÇ½À­¤¬¤¢¤ë¡¥
¸À¤¤ÂØ¤¨¤ì¤Ð¡¤¤¦¤Ã¤«¤ê¼«¸Ê½¤ÀµÅª¤Ê¥×¥í¥°¥é¥à¤¬¤Ç¤­¤Æ¤·¤Þ¤¤¤«¤Í¤Ê¤¤¤È¤¤¤¦¤³¤È¤À¡¥
¸½¼ÂÅª¤Ê´í¸±À­¤â¤¢¤ë\wadash
¤³¤ì¤Ï´ûÂ¸¤Î½èÍý·Ï¤Çµ¯¤³¤Ã¤¿¤³¤È¤Ê¤Î¤À¡¥
²¿¤«¤ò\verb|&rest|°ú¿ô¤Ë\verb|nconc|¤¹¤ë¥Þ¥¯¥í¤ò½ñ¤­
\footnote{\texttt{`',(foo)}¤Ï\texttt{`(quote ,(foo))}¤ÈÅù²Á¤ÊÉ½¸½¤À¡¥}¡¤
\begin{verbatim}
(defmacro echo (&rest args)
  `',(nconc args (list 'amen)))
\end{verbatim}
¼¡¤Ë¤½¤ì¤ò¸Æ¤Ó½Ð¤¹´Ø¿ô¤ò½ñ¤¯¡§
\begin{verbatim}
(defun foo () (echo x))
\end{verbatim}
¹­¤¯»È¤ï¤ì¤Æ¤¤¤ëCommon Lisp½èÍý·Ï¤Ç¤Ï¡¤¼¡¤Î¤è¤¦¤Ê·ë²Ì¤Ë¤Ê¤ë¡¥
\begin{verbatim}
> (foo)
(X AMEN AMEN)
> (foo)
(X AMEN AMEN AMEN)
\end{verbatim}
\verb|foo|¤Ï¸í¤Ã¤¿·ë²Ì¤òÊÖ¤¹¤À¤±¤Ç¤Ê¤¯¡¤¼Â¹Ô¤¹¤ëÅÙ¤Ë·ë²Ì¤Ï°Û¤Ê¤ë¡¥
¥Þ¥¯¥í¤¬Å¸³«¤µ¤ì¤ëÅÙ¤Ë\verb|foo|¤ÎÄêµÁ¤¬ÊÑ¹¹¤µ¤ì¤Æ¤¤¤ë¤«¤é¤À¡¥

¤¢¤ë¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤¬Ê£¿ô²óÅ¸³«¤µ¤ì¤ë¤³¤È¤Ë¤Ä¤¤¤ÆÀè¤ËÏÀ¤¸¤¿ÅÀ¤Ë¤Ä¤¤¤Æ¤â¡¤
¤³¤ÎÎã¤«¤éÊ¬¤«¤ë¤³¤È¤¬¤¢¤ë¡¥
¤³¤ÎÆÃÄê¤Î½èÍý·Ï¤Ç¤Ï¡¤\verb|foo|¤Î1²óÌÜ¤Î¸Æ¤Ó½Ð¤·¤Ï2¸Ä¤Îamen¤«¤éÀ®¤ë¥ê¥¹¥È¤òÊÖ¤¹¡¥
²¿¤«¤ÎÍýÍ³¤Ç¤³¤Î½èÍý·Ï¤Ï¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤ò\verb|foo|¤ÎÅ¸³«»þ¤Ë1²óÅ¸³«¤·¡¤
¤½¤·¤Æ¤½¤Î¸å¸Æ¤Ó½Ð¤µ¤ì¤ëÅÙ¤Ë¤â1²ó¤º¤ÄÅ¸³«¤·¤¿¤Î¤À¡¥

\verb|echo|¤Ï¼¡¤Î¤è¤¦¤ËÄêµÁ¤·¤¿Êý¤¬°ÂÁ´¤À¡¥
\begin{verbatim}
(defmacro echo (&rest args)
  `'(,@args amen))
\end{verbatim}
¤³¤ì¤Ï¥³¥ó¥Þ¡¦¥¢¥Ã¥È¤Ï\verb|nconc|¤Ç¤Ê¤¯\verb|append|¤ÈÅù²Á¤À¤«¤é¤À¡¥
¤³¤Î¥Þ¥¯¥í¤òºÆÄêµÁ¤·¤¿¸å¤Ï¡¤
\verb|foo|¤Ï¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤Æ¤¤¤Ê¤¯¤È¤âºÆÄêµÁ¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
Á°¤Î¥ô¥¡¡¼¥¸¥ç¥ó¤Î\verb|echo|¤¬¤½¤ì¤ò½ñ¤­´¹¤¨¤Æ¤·¤Þ¤Ã¤¿¤«¤é¤À¡¥
??? ¤³¤³¤«¤é??END¤Þ¤Ç¤Î¹Ô¤¬ÁÞÆþ¤«ºï½ü¤µ¤ì¤¿¤è¤¦¤Ç¤¹

¥Þ¥¯¥í¤Ç¤Ï¡¤Æ±ÍÍ¤Î´í¸±¤¬¤¢¤ë¤Î¤Ï\verb|&rest|°ú¿ô¤À¤±¤Ç¤Ï¤Ê¤¤¡¥
¥ê¥¹¥È¤Ç¤¢¤ë¥Þ¥¯¥í¤Î°ú¿ô¤Ï¤¤¤º¤ì¤âÊÑ¹¹¤·¤Ê¤¤¤Ç¤ª¤¯¤Ù¤­¤À¡¥
°ú¿ô¤Î¤É¤ì¤«¤ËÊÑ¹¹¤ò²Ã¤¨¤ë¥Þ¥¯¥í¤È¤½¤ì¤ò¸Æ¤Ö´Ø¿ô¤òÄêµÁ¤¹¤ë¤È¡¤
\begin{verbatim}
(defmacro crazy (expr) (nconc expr (list t)))

(defun foo () (crazy (list)))
\end{verbatim}
¸Æ½ÐÂ¦´Ø¿ô¤Î¥½¡¼¥¹¥³¡¼¥É¤ÏÊÑ¹¹¤µ¤ì¤Æ¤·¤Þ¤¦²ÄÇ½À­¤¬¤¢¤ë¡¥
¤¢¤ë½èÍý·Ï¤Ç¤Ï1²óÌÜ¤Ë¸Æ¤Ó½Ð¤·¤¿¤È¤­¤Ë¤½¤¦¤Ê¤Ã¤¿¡¥
\begin{verbatim}
> (foo)
(T T)
\end{verbatim}
¤³¤ì¤Ï¥³¥ó¥Ñ¥¤¥é¤È¥¤¥ó¥¿¥×¥ê¥¿Î¾Êý¤Çµ¯¤­¤¿¤³¤È¤À¡¥

Í×¤¹¤ë¤Ë¡¤°ú¿ô¤Î¥ê¥¹¥È¹½Â¤¤òÇË²õÅª¤ËÊÑ¹¹¤¹¤ë¤³¤È¤Ç¥³¥ó¥·¥ó¥°¤òÈò¤±¤è¤¦¤È¤·¤Ê¤¤¤³¤È¤À¡¥
½ÐÍè¾å¤¬¤Ã¤¿¥×¥í¥°¥é¥à¤Ï¡¤Îã¤¨Æ°ºî¤·¤¿¤È¤·¤Æ¤â²ÄÈÂÀ­¤ò»ý¤¿¤Ê¤¤¤À¤í¤¦¡¥
²ÄÊÑ¸Ä¤Î°ú¿ô¤ò¼è¤ë´Ø¿ôÆâ¤Ç¥³¥ó¥·¥ó¥°¤òÈò¤±¤¿¤¤¤Ê¤é¡¤
²ò·èºö¤Î°ì¤Ä¤Ï¥Þ¥¯¥í¤ò»È¤¤¡¤¥³¥ó¥·¥ó¥°¤ò¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¤º¤é¤¹ÊýË¡¤À¡¥
¥Þ¥¯¥í¤ò¤³¤Î¤è¤¦¤Ë»È¤¦¤³¤È¤Ë¤Ä¤¤¤Æ¤Ï¡¤Âè13¾Ï¤ò»²¾È¤¹¤ë¤³¤È¡¥

¤Þ¤¿¥Þ¥¯¥íÅ¸³«¤ò¹Ô¤¦¥³¡¼¥É¤ÎÊÖ¤·¤¿¼°¤¬¥¯¥©¡¼¥ÈÉÕ¤­¥ê¥¹¥È¤ò´Þ¤à¤È¤­¤Ï¡¤
¤½¤ì¤ËÇË²õÅªÁàºî¤ò¹Ô¤¦¤³¤È¤âÈò¤±¤ë¤Ù¤­¤À¡¥
¤³¤ì¤Ï¥Þ¥¯¥í¤ÎËÜ¼ÁÅª¤ÊÀ©¸Â¤Ç¤Ï¤Ê¤¯¡¤Âè3.3Àá¤ÇÂç¤Þ¤«¤Ë¿¨¤ì¤¿¸¶Â§¤Î°ìÎã¤À¡¥
%}}}
\subsection{ºÆµ¢}   %{ {{
´Ø¿ô¤òºÆµ¢Åª¤ËÄêµÁ¤¹¤ë¤Î¤¬¼«Á³¤Ê¤È¤­¤¬¤¢¤ë¡¥
¼¡¤Î¤è¤¦¤Ê´Ø¿ô¤Ï¡¤ËÜ¼ÁÅª¤ËºÆµ¢Åª¤ÊÀ­¼Á¤ò»ý¤Ã¤Æ¤¤¤ë¡¥
\begin{verbatim}
(defun our-length (x)
  (if (null x)
    0(1+ (our-length (cdr x)))))
\end{verbatim}
¾å¤ÎÄêµÁ¤Ï¡¤Åù²Á¤ÊÈ¿ÉüÈÇ¤è¤ê¤â¡Ê¤ª¤½¤é¤¯ÃÙ¤¤¤À¤í¤¦¤¬¡Ë¼«Á³¤Ë»×¤¨¤ë¡¥
\begin{verbatim}
(defun our-length (x)
  (do ((len 0 (1+ len))
       (y x (cdr y)))
    ((null y) len)))
\end{verbatim}

ºÆµ¢Åª¤Ç¤â¤Ê¤¯¡¤Áê¸ßºÆµ¢Åª¤Ê´Ø¿ô¤Î½¸¹ç¤Î°ìÉô¤Ç¤â¤Ê¤¤´Ø¿ô¤Ï¡¤
Âè7.10¾Ï¤Ç½Ò¤Ù¤¿´ÊÃ±¤ÊÊýË¡¤Ë¤è¤ê¥Þ¥¯¥í¤ËÊÑ´¹¤Ç¤­¤ë¡¥
¤·¤«¤·¤¿¤ÀµÕ¥¯¥©¡¼¥È¤È¥³¥ó¥Þ¤òÁÞÆþ¤¹¤ë¤À¤±¤Ç¤ÏºÆµ¢Åª´Ø¿ô¤ÏÊÑ´¹¤Ç¤­¤Ê¤¤¡¥
ÁÈ¹þ¤ß´Ø¿ô\verb|nth|¤òÎã¤Ë¼è¤Ã¤Æ¤ß¤è¤¦¡¥
(ÏÃ¤ò´ÊÃ±¤Ë¤¹¤ë¤¿¤á¡¤¤³¤Î\verb|nth|¤Ï¥¨¥é¡¼¥Á¥§¥Ã¥¯¤ò¤·¤Ê¤¤¤â¤Î¤È¤¹¤ë¡¥)
Âè\ref{fig:MistakenRecursiveFunc}¿Þ¤Ë¤Ï
\verb|nth|¤ò¥Þ¥¯¥í¤È¤·¤ÆÄêµÁ¤·¤è¤¦¤È¤·¤Æ´Ö°ã¤¨¤¿Îã¤ò¼¨¤·¤¿¡¥
É½ÌÌÅª¤Ë¤Ï\verb|nthb|¤Ï\verb|ntha|¤ÈÅù²Á¤Ë¸«¤¨¤ë¤¬¡¤
\verb|nthb|¤ò»È¤Ã¤¿¥³¡¼¥É¤Ï¥³¥ó¥Ñ¥¤¥ë¤ËÄÌ¤é¤Ê¤¤¡¥
¤³¤ì¤Ï¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤ÎÅ¸³«¤¬½ªÎ»¤·¤Ê¤¤¤¿¤á¤À¡¥

\begin{figure}\begin{center}
\fbox{~\,\begin{minipage}{\FrameWidth}\narrowbaselines
\vspace{3pt}\hspace{12zw}Àµ¤·¤¯Æ°ºî¤¹¤ë¤â¤Î¡§
\begin{center}\begin{minipage}{240pt}\texttt{%
(defun ntha (n lst)\\
~~(if (= n 0)\\
~~~~~~(car lst)\\
~~~~~~(ntha (- n 1) (cdr lst))))%
}\end{minipage}\end{center}
\hspace{12zw}¥³¥ó¥Ñ¥¤¥ë¤Ç¤­¤Ê¤¤¤â¤Î¡§
\begin{center}\begin{minipage}{240pt}\texttt{%
(defmacro nthb (n lst)\\
~~`(if (= ,n 0)\\
~~~~~~~(car ,lst)\\
~~~~~~~(nthb (- ,n 1) (cdr ,lst))))\\
}\end{minipage}\end{center}
\vspace{1.3em}\end{minipage}~\,}\end{center}
\caption{¸í¤Ã¤ÆºÆµ¢´Ø¿ô¤ÈÆ±¤¸¤è¤¦¤ËÂª¤¨¤Æ¤·¤Þ¤Ã¤¿Îã¡¥}
\label{fig:MistakenRecursiveFunc}
\end{figure}

°ìÈÌÅª¤Ë¡¤¥Þ¥¯¥í¤¬Â¾¤Î¥Þ¥¯¥í¤Ø¤Î»²¾È¤ò´Þ¤à¤³¤È¤Ï¡¤Å¸³«¤¬¤É¤³¤«¤Ç½ªÎ»¤¹¤ë¸Â¤ê¤ÏÌäÂê¤Ê¤¤¡¥
\verb|nthb|¤ÎÌäÂê¤Ï¡¤\verb|nthb|¤Î¤É¤ÎÅ¸³«·Á¤â\verb|nthb|¼«¿È¤Ø¤Î»²¾È¤ò´Þ¤àÅÀ¤À¡¥
´Ø¿ôÈÇ¤Î\verb|ntha|¤Ï½ªÎ»¤¹¤ë¡¥
¤½¤ì¤Ï\verb|n|¤ÎÃÍ¤Ë¤Ä¤¤¤ÆºÆµ¢Åª¤Ê¤Î¤À¤¬¡¤¤³¤ÎÃÍ¤ÏºÆµ¢¤ÎÅÙ¤Ë¸º¾¯¤¹¤ë¤«¤é¤À¡¥
¤·¤«¤·¥Þ¥¯¥íÅ¸³«¤Ï¼°¤Ë¤·¤«¥¢¥¯¥»¥¹¤¬¤Ê¤¯¡¤¤½¤ÎÃÍ¤Þ¤Ç¤ÏÊ¬¤«¤é¤Ê¤¤¡¥
¥³¥ó¥Ñ¥¤¥é¤¬¡¤Îã¤¨¤Ð\verb|(nthb x y)|¤òÅ¸³«¤·¤è¤¦¤È¤¹¤ë¤È¡¤ºÇ½é¤ÎÅ¸³«¤Ç¤Ï
\begin{verbatim}
(if (= x 0)
  (car y)
  (nthb (- x 1) (cdr y)))
\end{verbatim}
¤¬ºî¤é¤ì¡¤¤³¤ì¤Ï¹¹¤Ë¼¡¤Î¤è¤¦¤Ë¤Ê¤ë¡¥
\begin{verbatim}
(if (= x 0)
  (car y)
  (if (= (- x 1) 0)
    (car (cdr y))
    (nthb (- (- x 1) 1) (cdr (cdr y)))))
\end{verbatim}
¤³¤¦¤·¤ÆÌµ¸Â¥ë¡¼¥×¤Ë´Ù¤Ã¤Æ¤·¤Þ¤¦¤Î¤À¡¥
¥Þ¥¯¥í¤¬¼«Ê¬¼«¿È¤Î¸Æ¤Ó½Ð¤·¤òÅ¸³«¤¹¤ë¤³¤È¤ËÌäÂê¤Ï¤Ê¤¤¤¬¡¤
¤½¤ì¤Ï¤¤¤Ä¤Þ¤Ç¤âÂ³¤«¤Ê¤¤¤È¤­¤ÎÏÃ¤À¡¥

\verb|nthb|¤Î¤è¤¦¤ÊºÆµ¢Åª¥Þ¥¯¥í¤Î´í¸±¤ÊÅÀ¤Ï¡¤¥¤¥ó¥¿¥×¥ê¥¿¤Ç¤ÏÅ¬ÀÚ¤Ëµ¡Ç½¤¹¤ë¤³¤È¤À¡¥
¤È¤¦¤È¤¦Æ°ºî¤¹¤ë¤è¤¦¤Ë¤Ê¤Ã¤¿¥×¥í¥°¥é¥à¤ò¥³¥ó¥Ñ¥¤¥ë¤·¤è¤¦¤È¤·¤¿¤È¤­¡¤
¤½¤ì¤¬¥³¥ó¥Ñ¥¤¥ë¤òÄÌ¤ê¤¹¤é¤·¤Ê¤¤¤³¤È¤Ë¤Ê¤ë¡¥
¤½¤ì¤À¤±¤Ç¤Ê¤¯¡¤ÌäÂê¤¬ºÆµ¢Åª¥Þ¥¯¥í¤Ë¤è¤ë¤³¤È¤ÏÉáÄÌÊ¬¤«¤é¤Ê¤¤¡¥
¥³¥ó¥Ñ¥¤¥é¤Ï¤¿¤ÀÌµ¸Â¥ë¡¼¥×¤Ë´Ù¤ê¡¤¤½¤³¤Ç²¿¤¬°­¤¤¤Î¤«¹Í¤¨¤ë±©ÌÜ¤Ë¤Ê¤ë¡¥

¾å¤Î¾ì¹ç¡¤\verb|ntha|¤ÏËöÈøºÆµ¢Åª¤À¡¥
ËöÈøºÆµ¢Åª´Ø¿ô¤ÏÍÆ°×¤ËÈ¿Éü·Á¤ËÊÑ´¹¤Ç¤­¡¤¤½¤ì¤Ï¥Þ¥¯¥í¤Î¥â¥Ç¥ë¤Ë»È¤¨¤ë¡¥
\verb|nthb|¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤Ï¤³¤¦¤·¤Æ½ñ¤±¤ë¡¥
\begin{verbatim}
(defmacro nthc (n lst)
  `(do ((n2 ,n (1- n2))
        (lst2 ,lst (cdr lst2)))
     ((= n2 0) (car lst2))))
\end{verbatim}
¸¶Â§Åª¤Ë¤Ï¥Þ¥¯¥í¤ÇºÆµ¢´Ø¿ô¤òÊ£À½¤¹¤ë¤³¤È¤ÏÉÔ²ÄÇ½¤Ç¤Ï¤Ê¤¤¡¥
¤·¤«¤·Ê£»¨¤ÊºÆµ¢´Ø¿ô¤ÎÊÑ´¹¤ÏÆñ¤·¤«¤Ã¤¿¤ê¡¤ÉÔ²ÄÇ½¤Ç¤¹¤é¤¢¤ë¤È¤­¤â¤¢¤ë¡¥

¥Þ¥¯¥í¤ÎÍÑÅÓ¤Ë¤è¤Ã¤Æ¤Ï¡¤Âå¤ï¤ê¤Ë¥Þ¥¯¥í¤È´Ø¿ô¤ÎÁÈ¹ç¤»¤ò»È¤¦¤³¤È¤Ç½½Ê¬¤Ê¤È¤­¤â¤¢¤ë¡¥
Âè\ref{fig:TwoWayFixProb}¤Ë¤ÏºÆµ¢Åª¥Þ¥¯¥í¤Î¤è¤¦¤Ê¤â¤Î¤òºî¤ëÊýË¡¤ò2ÄÌ¤ê¼¨¤·¤¿¡¥
\verb|nthd|¤Ç¼¨¤µ¤ì¤ë1ÈÖÌÜ¤ÎÀïÎ¬¤Ï¡¤Ã±¤Ë¥Þ¥¯¥í¤òºÆµ¢´Ø¿ô¤Î¸Æ¤Ó½Ð¤·¤ØÅ¸³«¤µ¤»¤ë¤³¤È¤À¡¥
Îã¤¨¤Ð¥Þ¥¯¥í¤¬°ú¿ô¤Ë¥¯¥©¡¼¥È¤òÉÕ¤±¤ë¼ê´Ö¤ò¾Ê¤¯¤¿¤á¤À¤±¤Ë»È¤ï¤ì¤Æ¤¤¤ë¤Î¤Ê¤é¡¤
¤³¤Î¼êË¡¤Ç½½Ê¬¤À¤í¤¦¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro nthd (n lst)
  `(nth-fn ,n ,lst))

(defun nth-fn (n lst)
  (if (= n 0)
    (car lst)
    (nth-fn (- n 1) (cdr lst))))

(defmacro nthe (n lst)
  `(labels ((nth-fn (n lst)
              (if (= n 0)
                  (car lst)
                  (nth-fn (- n 1) (cdr lst)))))
     (nth-fn ,n ,lst)))
\end{FramedVerb}\end{center}
\caption{ÌäÂê¤Î2ÄÌ¤ê¤Î½¤ÀµÊýË¡¡¥}
\label{fig:TwoWayFixProb}
\end{figure}

¥Þ¥¯¥í¤¬É¬Í×¤ÊÍýÍ³¤¬¡¤¤½¤ÎÅ¸³«·Á¤ò´Ý¤´¤È¸Æ½ÐÂ¦¤Î¥ì¥­¥·¥«¥ë¤Ê´Ä¶­¤ËÁÞÆþ¤·¤¿¤¤¤È¤¤¤¦¤³¤È¤Ê¤é¡¤
\verb|nthe|¤ËÎã¼¨¤·¤¿ÊýË¡¤ÎÊý¤¬¤¬¤è¤¤¤À¤í¤¦¡¥
ÁÈ¹þ¤ß¤ÎÆÃ¼ì¼°\verb|labels|¡ÊÂè2.7Àá¤ò»²¾È¡Ë¤¬¥í¡¼¥«¥ë¤Ê´Ø¿ôÄêµÁ¤òºî¤Ã¤Æ¤¤¤ë¡¥
\verb|nthc|¤ÎÅ¸³«·Á¤Ï¤¤¤º¤ì¤â¥°¥í¡¼¥Ð¥ë´Ø¿ô\verb|nth-fn|¤ò¸Æ¤ó¤Ç¤¤¤¿¤¬¡¤
\verb|nthe|¤ÎÅ¸³«·Á¤Ï¤½¤ì¤¾¤ì¤ÎÆâÉô¤ËÆ±ÍÍ¤Ê´Ø¿ô¤ò»ý¤Ã¤Æ¤¤¤ë¡¥

ºÆµ¢´Ø¿ô¤òÄ¾ÀÜ¥Þ¥¯¥í¤ËÊÑ´¹¤Ç¤­¤Ê¤¯¤Æ¤â¡¤Å¸³«·Á¤¬ºÆµ¢Åª¤ËÀ¸À®¤µ¤ì¤ë¥Þ¥¯¥í¤ò½ñ¤¯¤³¤È¤Ï¤Ç¤­¤ë¡¥
¥Þ¥¯¥í¤òÅ¸³«¤¹¤ë´Ø¿ô¤ÏLisp¤ÎÄÌ¾ï¤Î´Ø¿ô¤Ç¤¢¤Ã¤Æ¡¤¤â¤Á¤í¤óºÆµ¢Åª¤Ë¤Ê¤êÆÀ¤ë¡¥
Îã¤¨¤ÐÁÈ¹þ¤ß¤Î\verb|or|¤òÆÈ¼«¤ËÄêµÁ¤¹¤ë¤È¤­¤Ë¤Ï¡¤
ºÆµ¢Åª¤ÊÅ¸³«´Ø¿ô¤ò»È¤¦¤³¤È¤Ë¤Ê¤ë¤À¤í¤¦¡¥

Âè\ref{fig:RecExpansionFunc}¿Þ¤Ë¤Ï¡¤
\verb|or|¤Î¤¿¤á¤ÎºÆµ¢Åª¤ÊÅ¸³«´Ø¿ô¤òÄêµÁ¤¹¤ëÊýË¡¤ò2ÄÌ¤ê¼¨¤·¤¿¡¥
¥Þ¥¯¥í\verb|ora|¤ÏÅ¸³«·Á¤òºî¤ë¤¿¤á¤ËºÆµ¢´Ø¿ô\verb|or-expand|¤ò¸Æ¤Ó½Ð¤¹¡¥
¤³¤ì¤ÏÅ¬ÀÚ¤ËÆ°ºî¤¹¤ë¡¥¤Þ¤¿Åù²Á¤Ê\verb|orb|¤âÆ±ÍÍ¤À¡¥
\verb|orb|¤ÏºÆµ¢Åª¤À¤¬¡¤
¥Þ¥¯¥í¤Î°ú¿ô¤½¤Î¤â¤Î¤Ë¤Ä¤¤¤ÆºÆµ¢Åª¤Ç¤¢¤ê¡Ê¤³¤ì¤ÏÅ¸³«»þ¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤ë¡Ë¡¤
¤½¤ÎÃÍ¤Ë¤Ä¤¤¤ÆºÆµ¢Åª¤Ê¤Î¤Ç¤Ï¤Ê¤¤¡Ê¤³¤Á¤é¤Ï¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¡Ë¡¥
Å¸³«·Á¤¬\verb|orb|¤½¤Î¤â¤Î¤Ø¤Î»²¾È¤ò´Þ¤à¤è¤¦¤Ë¤â¸«¤¨¤ë¤¬¡¤
¤¢¤ë1ÃÊ³¬¤Î¥Þ¥¯¥íÅ¸³«¤ÇÀ¸À®¤µ¤ì¤¿\verb|orb|¤Î¸Æ¤Ó½Ð¤·¤Ï
¼¡¤ÎÃÊ³¬¤Ç\verb|let|¤ËÃÖ¤­´¹¤¨¤é¤ì¡¤
Å¸³«¤ÎºÇ½ª·Á¤Ç¤ÏÆþ¤ì»Ò¤Ë¤Ê¤Ã¤¿\verb|let|¤Î¥¹¥¿¥Ã¥¯¤·¤«»Ä¤é¤Ê¤¤¡¥
\verb|(orb x y)|¤Ï¼¡¤Î¥³¡¼¥É¤ÈÅù²Á¤Ê¥³¡¼¥É¤ËÅ¸³«¤µ¤ì¤ë¡¥
\begin{verbatim}
(let ((g2 x))
  (if g2
      g2
      (let ((g3 y))
        (if g3 g3 nil))))
\end{verbatim}
¼ÂºÝ\verb|ora|¤È\verb|orb|¤ÏÅù²Á¤Ç¤¢¤ê¡¤¤É¤Á¤é¤ò»È¤¦¤«¤Ï¸Ä¿ÍÅª¤Ê¹¥¤ß¤ÎÌäÂê¤Ë²á¤®¤Ê¤¤¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro ora (&rest args)
  (or-expand args))

(defun or-expand (args)
  (if (null args)
      nil
      (let ((sym (gensym)))
        `(let ((,sym ,(car args)))
           (if ,sym
               ,sym
               ,(or-expand (cdr args)))))))

(defmacro orb (&rest args)
  (if (null args)
      nil
      (let ((sym (gensym)))
        `(let ((,sym ,(car args)))
           (if ,sym
               ,sym
               (orb ,@(cdr args)))))))
\end{FramedVerb}\end{center}
\caption{ºÆµ¢ÅªÅ¸³«´Ø¿ô¡¥}
\label{fig:RecExpansionFunc}
\end{figure}
%}} }
%}}}
\section{¸ÅÅµÅª¤Ê¥Þ¥¯¥í} %{{{
¤³¤Î¾Ï¤Ç¤Ï¡¤°ìÈÖ¤è¤¯»È¤ï¤ì¤ë¼ïÎà¤Î¥Þ¥¯¥í¤òÄêµÁ¤¹¤ëÊýË¡¤ò¼¨¤¹¡¥
¤½¤ì¤é¤Ï\wadash ¤«¤Ê¤ê½ÅÊ£¤¬À¸¤¸¤ë¤¬\wadash 3¼ïÎà¤ËÊ¬¤±¤é¤ì¤ë¡¥
1¼ïÎàÌÜ¤Ï¥³¥ó¥Æ¥­¥¹¥È¤òºî¤ë¥Þ¥¯¥í¤À¡¥
¥ª¥Ú¥ì¡¼¥¿¤¬°ú¿ô¤ò¿·¤·¤¤¥³¥ó¥Æ¥­¥¹¥ÈÆâ¤ÇÉ¾²Á¤¹¤ë¤â¤Î¤Ê¤é¡¤
¤ª¤½¤é¤¯¥Þ¥¯¥í¤È¤·¤ÆÄêµÁ¤µ¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤À¤í¤¦¡¥
»Ï¤á¤Î2Àá¤Ï´ðËÜÅª¤Ê2¼ïÎà¤Î¥³¥ó¥Æ¥­¥¹¥È¤Ë¤Ä¤¤¤ÆÀâÌÀ¤·¡¤
¤½¤ì¤¾¤ì¤ËÂÐ¤·¤Æ¥Þ¥¯¥í¤òÄêµÁ¤¹¤ëÊýË¡¤ò¼¨¤¹¡¥

Â³¤¯3Àá¤Ï¾ò·ïÉÕ¤­É¾²Á¤ÈÈ¿ÉüÉ¾²Á¤Î¤¿¤á¤Î¥Þ¥¯¥í¤Ë¤Ä¤¤¤ÆÀâÌÀ¤¹¤ë¡¥
¥ª¥Ú¥ì¡¼¥¿¤¬°ú¿ô¤ò1²ó¤è¤ê¾¯¤Ê¤¯¡¤¤Þ¤¿¤ÏÊ£¿ô²óÉ¾²Á¤¹¤ë¤â¤Î¤Ê¤é¡¤
¤ä¤Ï¤ê¥Þ¥¯¥í¤È¤·¤ÆÄêµÁ¤µ¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¾ò·ïÉÕ¤­É¾²Á¤Î¤¿¤á¤Î¥Þ¥¯¥í¤ÈÈ¿ÉüÉ¾²Á¤Î¤¿¤á¤Î¥Þ¥¯¥í¤È¤Î´Ö¤Ë¤ÏÌÀ³Î¤Ê¶èÊÌ¤Ï¤Ê¤¤¡¥
¤³¤Î¾Ï¤Ç¼¨¤·¤¿Îã¤Î´ö¤Ä¤«¤ÏÎ¾Êý¤ò·ó¤Í¤ë¡ÊÂ«Çû¤ÈÆ±ÍÍ¤Ë¡Ë¡¥
ºÇ¸å¤ÎÀá¤Ï¾ò·ïÉÕ¤­É¾²Á¤Î¤¿¤á¤Î¥Þ¥¯¥í¤ÈÈ¿ÉüÉ¾²Á¤Î¤¿¤á¤Î¥Þ¥¯¥í¤È¤Î´Ö¤Î¤â¤¦1¤Ä¤ÎÎà»÷À­¤Ë¤Ä¤¤¤ÆÀâÌÀ¤¹¤ë¡¥
¾ì¹ç¤Ë¤è¤Ã¤Æ¤Ï¡¤¤É¤Á¤é¤â´Ø¿ô¤Ë¤è¤Ã¤Æ¼Â¸½¤Ç¤­¤ë¤Î¤À¡¥
\subsection{¥³¥ó¥Æ¥­¥¹¥È¤ÎÀ¸À®}   %{{{
¥³¥ó¥Æ¥­¥¹¥È¤Ë¤Ï2¤Ä¤Î°ÕÌ£¤¬¤¢¤ë¡¥
1¼ïÎàÌÜ¤Î¥³¥ó¥Æ¥­¥¹¥È¤È¤Ï¥ì¥­¥·¥«¥ë¤Ê´Ä¶­¤À¡¥
ÆÃ¼ì¼°\verb|let|¤Ï¿·¤·¤¤¥ì¥­¥·¥«¥ë´Ä¶­¤òºî¤ë¡¥
\verb|let|¤ÎËÜÂÎÆâ¤Î¼°¤Ï¿·¤·¤¤ÊÑ¿ô¤ò´Þ¤ó¤Ç¤¤¤ë¤«¤âÃÎ¤ì¤Ê¤¤¤è¤¦¤Ê´Ä¶­Æâ¤ÇÉ¾²Á¤µ¤ì¤ë¡¥
\verb|x|¤¬¥È¥Ã¥×¥ì¥Ù¥ëÆâ¤Ç\verb|a|¤ËÀßÄê¤µ¤ì¤¿¤È¤¹¤ë¡¥
¤·¤«¤·¼¡¤Î¼°¤Ï\verb|(b)|¤òÊÖ¤¹¡¥
\begin{verbatim}
(let ((x 'b)) (list x))
\end{verbatim}
¤³¤ì¤ÏÃÍ¤¬\verb|b|¤Ç¤¢¤ë¿·¤·¤¤ÊÑ¿ô\verb|x|¤ò´Þ¤à´Ä¶­Æâ¤Ç\verb|list|¤¬¸Æ¤Ð¤ì¤¿¤«¤é¤À¡¥

¼°¤ò¼Â¹ÔËÜÂÎ¤È¤·¤Æ¼è¤ë¥ª¥Ú¥ì¡¼¥¿¤ÏÉáÄÌ¤Ï¥Þ¥¯¥í¤È¤·¤ÆÄêµÁ¤µ¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
\verb|prog1|¤ä\verb|progn|¤Ê¤É¤Î¾ì¹ç¤ò½ü¤±¤Ð¡¤
¤½¤Î¤è¤¦¤Ê¥ª¥Ú¥ì¡¼¥¿¤ÎÌÜÅª¤ÏÉáÄÌ¤ÏËÜÂÎÉô¤ò²¿¤«¿·¤·¤¤¥³¥ó¥Æ¥­¥¹¥ÈÆâ¤ÇÉ¾²Á¤µ¤»¤ë¤³¤È¤À¤í¤¦¡¥
¥³¥ó¥Æ¥­¥¹¥È¤òÀ¸À®¤¹¤ë¥³¡¼¥É¤ÇËÜÂÎÉô¤Î³°¤òÊ¤¤¦¤¿¤á¤Ë¤Ï¡¤
¥³¥ó¥Æ¥­¥¹¥È¤¬¿·¤·¤¤¥ì¥­¥·¥«¥ëÊÑ¿ô¤ò´Þ¤Þ¤Ê¤¤¤È¤­¤Ç¤¢¤Ã¤Æ¤â¡¤¥Þ¥¯¥í¤¬É¬Í×¤Ë¤Ê¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro our-let (binds &body body)
  `((lambda ,(mapcar #'(lambda (x)
                         (if (consp x) (car x) x))
                     binds)
      ,@body)
    ,@(mapcar #'(lambda (x)
                   (if (consp x) (cadr x) nil))
               binds)))
\end{FramedVerb}\end{center}
\caption{let¤Î¥Þ¥¯¥í¤Ë¤è¤ë¼ÂÁõ¡¥}
\label{fig:MacroLet}
\end{figure}

Âè\ref{fig:MacroLet}¿Þ¤Ë¤Ï\verb|let|¤¬¤É¤Î¤è¤¦¤Ë\verb|lambda|¾å¤Î¥Þ¥¯¥í¤È¤·¤ÆÄêµÁ¤Ç¤­¤ë¤«¤ò¼¨¤·¤¿¡¥
\verb|our-let|¤Ï´Ø¿ô¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ËÅ¸³«¤µ¤ì¤ë\wadash
\begin{verbatim}
(our-let ((x 1) (y 2))
  (+ x y))
\end{verbatim}
¤³¤ì¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ë¡¥
\begin{verbatim}
((lambda (x y) (+ x y)) 1 2)
\end{verbatim}

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro when-bind ((var expr) &body body)
  `(let ((,var ,expr))
     (when ,var
       ,@body)))

(defmacro when-bind* (binds &body body)
  (if (null binds)
      `(progn ,@body)
      `(let (,(car binds))
         (if ,(caar binds)
             (when-bind* ,(cdr binds) ,@body)))))

(defmacro with-gensyms (syms &body body)
  `(let ,(mapcar #'(lambda (s)
                     `(,s (gensym)))
                 syms)
     ,@body))
\end{FramedVerb}\end{center}
\caption{ÊÑ¿ô¤òÂ«Çû¤¹¤ë¥Þ¥¯¥í¤ÎÎã¡¥}
\label{fig:MacroBindsVar}
\end{figure}

Âè\ref{fig:MacroBindsVar}¿Þ¤Ë¤Ï¥ì¥­¥·¥«¥ë´Ä¶­¤òºî¤ê½Ð¤¹¿·¥Þ¥¯¥í¤ò3¸ÄºÜ¤»¤¿¡¥
Âè7.5Àá¤Ç¤Ï\verb|when-bind|¤ò°ú¿ô¥ê¥¹¥È¤Î¹½Â¤²½ÂåÆþ¤ÎÎã¤È¤·¤Æ°·¤Ã¤¿¤Î¤Ç¡¤
¤³¤Î¥Þ¥¯¥í¤Ï¤¹¤Ç¤Ëching¥Ú¡¼¥¸¤ËÀâÌÀ¤µ¤ì¤Æ¤¤¤ë¡¥
¹¹¤Ë°ìÈÌÅª¤Ê\verb|when-bind*|¤Ï\verb|(|\emph{symbol expression}\verb|)|¤Î·Á¤Î¥Ú¥¢¤«¤éÀ®¤ë¥ê¥¹¥È¤ò¼è¤ë\wadash
\verb|let|¤Î°ú¿ô¤ÈÆ±¤¸·Á¼°¤À¡¥
¤É¤ì¤«¤Î¼°¤¬\verb|nil|¤òÊÖ¤·¤¿¤é¡¤¼°\verb|when-bind*|Á´ÂÎ¤ÎÃÍ¤È¤·¤Æ\verb|nil|¤¬ÊÖ¤µ¤ì¤ë¡¥
¤½¤¦¤Ç¤Ê¤±¤ì¤Ð¤½¤ì¤¾¤ì¤Î¥·¥ó¥Ü¥ë¤¬\verb|let*|¤ÈÆ±ÍÍ¤ËÂ«Çû¤µ¤ì¤¿¾õÂÖ¤ÇËÜÂÎÉô¤¬É¾²Á¤µ¤ì¤ë¡§
\begin{verbatim}
> (when-bind* ((x (find-if #'consp '(a (1 2) b)))
                       (y (find-if #'oddp x)))
        (+ y 10))
11
\end{verbatim}

ºÇ¸å¤Ë¡¤¥Þ¥¯¥í\verb|with-gensyms|¤Ï¤½¤ì¼«¿È¤¬¥Þ¥¯¥í¤ò½ñ¤¯¤¿¤á¤Ë»È¤ï¤ì¤ë¡¥
Â¿¤¯¤Î¥Þ¥¯¥íÄêµÁ¤Ïgensym¤ÎÀ¸À®¤«¤é»Ï¤Þ¤ë¤¬¡¤¤½¤ì¤Ï»þ¤È¤·¤Æ¤«¤Ê¤ê¤Î¿ô¤Ë¾º¤ë¡¥
¥Þ¥¯¥í\verb|with-redraw| (p. 115)¤Ç¤Ï5¸Ä¤À¤Ã¤¿¡¥
\begin{verbatim}
(defmacro with-redraw ((var objs) &body body)
  (let ((gob (gensym))
           (x0 (gensym)) (y0 (gensym))
           (x1 (gensym)) (y1 (gensym)))
        ...))
\end{verbatim}
¤³¤Î¤è¤¦¤Ê¥Þ¥¯¥íÄêµÁ¤Ï¡¤\verb|with-gensyms|¤Ë¤è¤Ã¤Æ´Ê·é¤Ë¤Ê¤ë¡¥
¤³¤ì¤Ï¥ê¥¹¥ÈÆâ¤ÎÊÑ¿ô¤òÁ´¤Ægensym¤ËÂ«Çû¤¹¤ë¤â¤Î¤À¡¥
¤³¤Î¥Þ¥¯¥í¤ò»È¤¨¤Ð¡¤¤¿¤À¼¡¤Î¤è¤¦¤Ë½ñ¤±¤Ð¤è¤¤¡¥
\begin{verbatim}
(defmacro with-redraw ((var objs) &body body)
  (with-gensyms (gob x0 y0 x1 y1)
        ...))
\end{verbatim}
¤³¤Î¿·¥Þ¥¯¥í¤Ï°Ê¹ß¤Î¾Ï¤òÄÌ¤¸¤Æ»È¤ï¤ì¤ë¡¥

´ö¤Ä¤«¤ÎÊÑ¿ô¤òÂ«Çû¤·¡¤¤½¤Î¸å²¿¤«¤Î¾ò·ï¤Ë´ð¤Å¤¤¤Æ¼°¤ÎÁÈ¤ÎÃæ¤Î1¤Ä¤òÉ¾²Á¤·¤¿¤¤¤È¤­¡¤
\verb|let|Æâ¤Ç¤¿¤À¾ò·ïÈ½ÃÇ¤ò»È¤Ã¤Æ¤¤¤¿¡¥
\begin{verbatim}
(let ((sun-place 'park) (rain-place 'library))
  (if (sunny)
          (visit sun-place)
          (visit rain-place)))
\end{verbatim}
»ÄÇ°¤Ê¤³¤È¤Ë¡¤µÕ¤Î¾õ¶·¤Ë¤ÏÊØÍø¤Ê´·ÍÑË¡¤¬Â¸ºß¤·¤Ê¤¤¡¥
¤Ä¤Þ¤ê¼Â¹Ô¤·¤¿¤¤¥³¡¼¥É¤Ï¾ï¤ËÆ±¤¸¤À¤¬¡¤Â«Çû¤¬²¿¤«¤Î¾ò·ï¤Ë¤è¤Ã¤ÆÊÑ²½¤¹¤ë¤È¤­¤À¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro condlet (clauses &body body)
  (let ((bodfn (gensym))
        (vars (mapcar #'(lambda (v) (cons v (gensym)))
                      (remove-duplicates
                        (mapcar #'car
                                (mappend #'cdr clauses))))))
    `(labels ((,bodfn ,(mapcar #'car vars)
                      ,@body))
       (cond ,@(mapcar #'(lambda (cl)
                            (condlet-clause vars cl bodfn))
                        clauses)))))

(defun condlet-clause (vars cl bodfn)
  `(,(car cl) (let ,(mapcar #'cdr vars)
                (let ,(condlet-binds vars cl)
                  (,bodfn ,@(mapcar #'cdr vars))))))


(defun condlet-binds (vars cl)
  (mapcar #'(lambda (bindform)
              (if (consp bindform)
                  (cons (cdr (assoc (car bindform) vars))
                        (cdr bindform))))
          (cdr cl)))
\end{FramedVerb}\end{center}
\caption{\texttt{cond}¤È\texttt{let}¤È¤ÎÁÈ¤ß¹ç¤»¡¥}
\label{fig:CondLet}
\end{figure}

Âè\ref{fig:CondLet}¿Þ¤Ë¤Ï¤½¤Î¤è¤¦¤Ê¾õ¶·¤Î¤¿¤á¤Î¥Þ¥¯¥í¤ò¼¨¤·¤¿¡¥
Ì¾Á°¤«¤éÊ¬¤«¤ë¤è¤¦¤Ë¡¤\verb|condlet|¤Ï\verb|cond|¤È\verb|let|¤È¤Î¹ç¤Î»Ò¤Î¤è¤¦¤ÊÆ¯¤­¤ò¤¹¤ë¡¥
¤³¤ì¤ÏÂ«Çû»ØÄê¤ÎÀá¤È¡¤¤½¤Î¼¡¤Î¼Â¹ÔËÜÂÎÉô¤ò°ú¿ô¤Ë¼è¤ë¡¥
¤½¤ì¤¾¤ì¤ÎÂ«ÇûÀá¤Ï¥Æ¥¹¥È¼°¤Ë¤è¤Ã¤Æ¼é¤é¤ì¤Æ¤¤¤ë¡¥
¥³¡¼¥ÉËÜÂÎÉô¤Ï¥Æ¥¹¥È¼°¤¬¿¿¤òÊÖ¤·¤¿ºÇ½é¤ÎÀá¤Ë»ØÄê¤µ¤ì¤¿Â«Çû¤Î²¼¤ÇÉ¾²Á¤µ¤ì¤ë¡¥
°ìÉô¤ÎÀá¤Ë¤Î¤ß´Þ¤Þ¤ì¤ëÊÑ¿ô¤Ï¡¤¿¿¤È¤Ê¤Ã¤¿Àá¤¬Â«Çû¤ò»ØÄê¤·¤Æ¤¤¤Ê¤±¤ì¤Ð\verb|nil|¤ËÂ«Çû¤µ¤ì¤ë¡¥
\begin{verbatim}
> (condlet (((= 1 2) (x (princ 'a)) (y (princ 'b)))
            ((= 1 1) (y (princ 'c)) (x (princ 'd)))
            (t          (x (princ 'e)) (z (princ 'f))))
           (list x y z))
CD
(D C NIL)
\end{verbatim}

\verb|condlet|¤ÎÄêµÁ¤Ï\verb|our-let|¤ÎÄêµÁ¤Î°ìÈÌ²½¤È¤·¤ÆÂª¤¨¤é¤ì¤ë¡¥
¸å¼Ô¤ÏËÜÂÎÉô¤ò´Ø¿ô¤ËÊÑ¤¨¡¤¤½¤Î´Ø¿ô¤¬½é´üÃÍ¤ò·è¤á¤ë¼°¤ÎÉ¾²Á·ë²Ì¤ËÅ¬ÍÑ¤µ¤ì¤ë¤è¤¦¤Ë¤¹¤ë¡¥
\verb|condlet|¤Ï\verb|labels|¤ò»È¤Ã¤Æ¥í¡¼¥«¥ë¤Ê´Ø¿ô¤òÄêµÁ¤·¤Æ¤¤¤ë¥³¡¼¥É¤ËÅ¸³«¤µ¤ì¤ë¡¥
¤½¤ÎÃæ¤Ç¤Ï½é´üÃÍ¤ò·è¤á¤ë¼°¤Î¤É¤ÎÁÈ¤¬É¾²Á¤µ¤ì¤Æ´Ø¿ô¤ËÅÏ¤µ¤ì¤ë¤«¤òcondÀá¤¬·è¤á¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥

Å¸³«¥³¡¼¥É¤ÏÂ«Çû»ØÄêÀá¤«¤éÊÑ¿ôÌ¾¤òÃê½Ð¤¹¤ë¤¿¤á¤Ë
\verb|mapcan|¤Ç¤Ê¤¯\verb|mappend|¤ò»È¤Ã¤Æ¤¤¤ë¤³¤È¤ËÃí°Õ¤·¤è¤¦¡¥
¤³¤ì¤Ï\verb|mapcan|¤¬ÇË²õÅª¤Ç¤¢¤Ã¤Æ¡¤Âè10.3¾Ï¤Ç·Ù¹ð¤·¤¿¤è¤¦¤Ë¡¤
°ú¿ô¤Î¥ê¥¹¥È¹½Â¤¤ËÊÑ¹¹¤ò²Ã¤¨¤ë¤³¤È¤Ï´í¸±¤À¤«¤é¤À¡¥
%}}}
\subsection{\texttt{with-}·Ï¥Þ¥¯¥í}   %{{{
¥ì¥­¥·¥«¥ë´Ä¶­¤ÎÂ¾¤Ë¡¤¤â¤¦1¼ï¤Î¥³¥ó¥Æ¥­¥¹¥È¤¬¤¢¤ë¡¥
¤½¤Î¥³¥ó¥Æ¥­¥¹¥È¤È¤Ï¡¤¹­¤¤°ÕÌ£¤ÇÀ¤³¦¤Î¾õÂÖ¤Î¤³¤È¤ò»Ø¤¹¡¥
¤³¤ì¤Ï¥¹¥Ú¥·¥ã¥ëÊÑ¿ô¤ÎÃÍ¡¤¥Ç¡¼¥¿¹½Â¤ÂÎ¤ÎÆâÍÆ¡¤Lisp³°Éô¤Î»öÊª¤Î¾õÂÖ¤ò´Þ¤à¡¥
¤³¤Î¼ï¤Î¥³¥ó¥Æ¥­¥¹¥È¤òºî¤ê½Ð¤¹¥ª¥Ú¥ì¡¼¥¿¤â¡¤
¥³¡¼¥ÉËÜÂÎ¤¬¥¯¥í¡¼¥¸¥ã¤È¤·¤Æ¤Þ¤È¤á¤é¤ì¤Æ¤¤¤Ê¤¤¸Â¤ê¡¤¤ä¤Ï¤ê¥Þ¥¯¥í¤È¤·¤ÆÄêµÁ¤µ¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥

¥³¥ó¥Æ¥­¥¹¥ÈÀ¸À®¥Þ¥¯¥í¤ÎÌ¾Á°¤Ï¤·¤Ð¤·¤Ð\verb|with-|¤Ç»Ï¤Þ¤ë¡¥
¤³¤Î¼ï¤Î¥Þ¥¯¥í¤ÎÃæ¤Ç°ìÈÖ¤è¤¯»È¤ï¤ì¤ë¤Î¤ÏÂ¿Ê¬\verb|with-open-file|¤À¤í¤¦¡¥
¤½¤ÎËÜÂÎ¤Ï¿·¤·¤¯³«¤«¤ì¤¿¥Õ¥¡¥¤¥ë¤¬»ØÄê¤ÎÊÑ¿ô¤ËÂ«Çû¤µ¤ì¤¿¾õÂÖ¤ÇÉ¾²Á¤µ¤ì¤ë¡¥
\begin{verbatim}
(with-open-file (s "dump" :direction :output)
  (princ 99 s))
\end{verbatim}
¤³¤Î¼°¤ÎÉ¾²Á¸å¤Ë¤Ï¥Õ¥¡¥¤¥ë¡Ö\verb|dump|¡×¤Ï¼«Æ°Åª¤ËÊÄ¤¸¤é¤ì¡¤Ãæ¿È¤Ï2Ê¸»ú¡Ö99¡×¤È¤Ê¤Ã¤Æ¤¤¤ë¤À¤í¤¦¡¥

¤³¤Î¥ª¥Ú¥ì¡¼¥¿¤Ï\verb|s|¤òÂ«Çû¤¹¤ë¤Î¤Ç¡¤ÌÀ¤é¤«¤Ë¥Þ¥¯¥í¤È¤·¤ÆÄêµÁ¤µ¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤·¤«¤·¼°¤ò¿·¤·¤¤¥³¥ó¥Æ¥­¥¹¥ÈÆâ¤ÇÉ¾²Á¤µ¤»¤ë¤è¤¦¤Ê¥ª¥Ú¥ì¡¼¥¿¤Ï¡¤
¤È¤Ë¤«¤¯¥Þ¥¯¥í¤È¤·¤ÆÄêµÁ¤µ¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤Î¤À¡¥
¥Þ¥¯¥í\verb|ignore-errors|¤Ï\textsf{CLtL2}¤Ç¿·¤¿¤ËÄÉ²Ã¤µ¤ì¤¿¤â¤Î¤À¤¬¡¤
¤³¤ì¤Ï¤½¤Î°ú¿ô¤¬\verb|progn|Æâ¤Ë¤¢¤ë¤«¤Î¤è¤¦¤ËÉ¾²Á¤µ¤ì¤ë¤è¤¦¤Ë¤¹¤ë¡¥
¤¤¤º¤ì¤«¤Î»þÅÀ¤Ç¥¨¥é¡¼¤¬È¯À¸¤¹¤ë¤È¡¤¼°\verb|ignore-errors|Á´ÂÎ¤¬\verb|nil|¤òÊÖ¤¹¡¥
(¤³¤ì¤Ï¡¤Îã¤¨¤Ð¥æ¡¼¥¶¤ÎÆþÎÏ¤·¤¿¥Æ¥­¥¹¥È¤òÆÉ¤ß¹þ¤àºÝ¤Ê¤É¤ËÊØÍø¤À¡¥)
\verb|ignore-errors|¤ÏÊÑ¿ô¤òºî¤ëÌõ¤Ç¤Ï¤Ê¤¤¤¬¡¤¥Þ¥¯¥í¤È¤·¤ÆÄêµÁ¤µ¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤½¤Î°ú¿ô¤¬¿·¤·¤¤¥³¥ó¥Æ¥­¥¹¥ÈÆâ¤ÇÉ¾²Á¤µ¤ì¤ë¤«¤é¤À¡¥

°ìÈÌÅª¤Ë¸À¤Ã¤Æ¡¤¥³¥ó¥Æ¥­¥¹¥È¤òÀ¸À®¤¹¤ë¥Þ¥¯¥í¤Ï¥³¡¼¥É¤Î¥Ö¥í¥Ã¥¯¤ËÅ¸³«¤µ¤ì¤ë¡¥
ËÜÂÎ¤ÎÁ°¡¤¸å¡¤¤Þ¤¿¤ÏÎ¾Êý¤Ë¼°¤¬ÉÕ²Ã¤µ¤ì¤ë¤«¤â¤·¤ì¤Ê¤¤¡¥
¤½¤Î¥³¡¼¥É¤¬ËÜÂÎ¤ÎÁ°¤ËÍè¤¿¤È¤­¤Ï¡¤¤½¤ÎÌÜÅª¤Ï¥·¥¹¥Æ¥à¤òÄê¾ï¾õÂÖ¤ËÊÝ¤Ä¤³¤È¤«¤âÃÎ¤ì¤Ê¤¤\wadash
¤Ä¤Þ¤ê²¿¤é¤«¤Î¸å»ÏËö¤À¡¥
Îã¤¨¤Ð\verb|with-open-file|¤Ï¡¤¼«Ê¬¤¬³«¤¤¤¿¥Õ¥¡¥¤¥ë¤òÊÄ¤¸¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤½¤Î¤è¤¦¤Ê¾õ¶·²¼¤Ç¤Ï¡¤\verb|unwind-protect|¤ËÅ¸³«¤µ¤ì¤ë¥³¥ó¥Æ¥­¥¹¥ÈÀ¸À®¥Þ¥¯¥í¤òºî¤ë¤Î¤¬ÄêÀÐ¤À¡¥

\verb|unwind-protect|¤ÎÌÜÅª¤Ï¡¤¥×¥í¥°¥é¥à¤Î¼Â¹Ô¤¬³ä¤ê¹þ¤ß¤µ¤ì¤¿¤È¤­¤Ç¤¢¤Ã¤Æ¤â¡¤
¤¢¤ë¼°¤¬É¬¤ºÉ¾²Á¤µ¤ì¤ë¤è¤¦¤Ë¤¹¤ë¤³¤È¤À¡¥
¤½¤ì¤Ï1¸Ä°Ê¾å¤Î°ú¿ô¤ò¼è¤ê¡¤¤½¤ì¤é¤¬½ç¤ËÉ¾²Á¤µ¤ì¤ë¡¥
²¿»ö¤â¤Ê¤±¤ì¤Ð\verb|prog1|¤ÈÆ±ÍÍ¤ËÂè1°ú¿ô¤ÎÃÍ¤òÊÖ¤¹¡¥
¤½¤ì¤È¤Î°ã¤¤¤Ï¡¤Âè1°ú¿ô¤ÎÉ¾²Á¤¬¥¨¥é¡¼¤ä\verb|throw|¤Ë¤è¤Ã¤ÆÃæÃÇ¤µ¤ì¤¿¤È¤­¤Ç¤µ¤¨¤â¡¤
»Ä¤ê¤Î°ú¿ô¤¬É¾²Á¤µ¤ì¤ëÅÀ¤À¡¥
\begin{verbatim}
> (setq x 'a)
A> (unwind-protect
        (progn (princ "What error?")
                 (error "This error."))
        (setq x 'b))
What error?
>>Error: This error.
\end{verbatim}
¼°\verb|unwind-protect|Á´ÂÎ¤È¤·¤Æ¤Ï¥¨¥é¡¼¤òÊÖ¤¹¡¥
¤·¤«¤·¥È¥Ã¥×¥ì¥Ù¥ë¤ËÌá¤Ã¤¿¸å¤Ë¤Ï¡¤Âè2°ú¿ô¤âÉ¾²Á¤µ¤ì¤Æ¤¤¤¿¤³¤È¤Ëµ¤¤¬ÉÕ¤¯¡§
\begin{verbatim}
>x
B
\end{verbatim}
¤³¤ì¤Ï\verb|with-open-file|¤¬\verb|unwind-protect|¤ËÅ¸³«¤µ¤ì¤¿¤³¤È¤Ç¡¤
ËÜÂÎ¤ÎÉ¾²ÁÃæ¤Ë¥¨¥é¡¼¤¬µ¯¤­¤Æ¤âÉáÄÌ¤Ê¤é³«¤«¤ì¤¿¥Õ¥¡¥¤¥ë¤¬ÊÄ¤¸¤é¤ì¤ë¤«¤é¤À¡¥

¥³¥ó¥Æ¥­¥¹¥ÈÀ¸À®¥Þ¥¯¥í¤Ï¡¤ÂçÄñ¤ÏÆÃÄê¤ÎÍÑÅÓ¤Î¤¿¤á¤Ëºî¤é¤ì¤ë¡¥
Îã¤È¤·¤Æ¡¤Ê£¿ô¤Î±ó³Ö¥Ç¡¼¥¿¥Ù¡¼¥¹¤ò°·¤¦¥×¥í¥°¥é¥à¤ò½ñ¤¤¤Æ¤¤¤ë¤È¤·¤è¤¦¡¥
¥×¥í¥°¥é¥à¤Ï¥°¥í¡¼¥Ð¥ëÊÑ¿ô\verb|*db*|¤Ç»ØÄê¤µ¤ì¤ë¥Ç¡¼¥¿¥Ù¡¼¥¹1¸Ä¤º¤Ä¤ËÌ¿Îá¤¹¤ë¡¥
¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î»ÈÍÑÁ°¤Ë¤Ï¡¤Â¾¿Í¤¬Æ±»þ¤Ë»È¤¦¤³¤È¤¬¤Ê¤¤¤è¤¦¤Ë¤½¤ì¤ò¥í¥Ã¥¯¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤Þ¤¿ºî¶È¤¬ºÑ¤ó¤À¤é¥í¥Ã¥¯¤ò²ò½ü¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¥Ç¡¼¥¿¥Ù¡¼¥¹\verb|db|¤Î¥¯¥¨¥ê\verb|q|¤ÎÃÍ¤¬Íß¤·¤¤¤È¤­¤Ï¡¤¼¡¤Î¤è¤¦¤Ë¤¹¤ë¤À¤í¤¦¡¥
\begin{verbatim}
(let ((temp *db*))
  (setq *db* db)
  (lock *db*)
  (prog1 (eval-query q)
    (release *db*)
    (setq *db* temp)))
\end{verbatim}
¥Þ¥¯¥í¤ò»È¤¨¤ÐÈÑ¤ï¤·¤¤ºî¶È¤òÁ´¤Æ±£ÊÃ¤Ç¤­¤ë¡¥
Âè\ref{fig:TypicalWithMacro}¿Þ¤Ç¤Ï¡¤
¹â¤¤Ãê¾Ý²½¥ì¥Ù¥ë¤Ç¥Ç¡¼¥¿¥Ù¡¼¥¹¤ò°·¤¨¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤ì¤ë¥Þ¥¯¥í¤òÄêµÁ¤·¤¿¡¥
\verb|with-db|¤ò»È¤¨¤Ð¡¤¤¿¤À¤³¤¦¤¹¤ë¤À¤±¤Ç¤è¤¤¡¥
\begin{verbatim}
(with-db db
  (eval-query q))
\end{verbatim}
\verb|with-db|¤ÏÃ±¤Ê¤ë\verb|prog1|¤Ç¤Ê¤¯\verb|unwind-protect|¤ËÅ¸³«¤µ¤ì¤ë¤Î¤Ç¡¤
°ÂÁ´¤Ë¸Æ¤Ó½Ð¤»¤ë¡¥

\begin{figure}\begin{center}
\fbox{~\,\begin{minipage}{\FrameWidth}\narrowbaselines
\vspace{3pt}\hspace{10zw}½ã¿è¤Ê¥Þ¥¯¥í¡§
\begin{center}\begin{minipage}{240pt}\texttt{%
(defmacro with-db (db \&body body)\\
~~(let ((temp (gensym)))\\
~~~~`(let ((,temp *db*))\\
~~~~~~~(unwind-protect\\
~~~~~~~~~(progn\\
~~~~~~~~~~~(setq *db* ,db)\\
~~~~~~~~~~~(lock *db*)\\
~~~~~~~~~~~,@body)\\
~~~~~~~~~(progn\\
~~~~~~~~~~~(release *db*)\\
~~~~~~~~~~~(setq *db* ,temp))))))%
}\end{minipage}\end{center}
\hspace{10zw}¥Þ¥¯¥í¤È´Ø¿ô¤È¤ÎÁÈ¹ç¤»¡§
\begin{center}\begin{minipage}{240pt}\texttt{%
(defmacro with-db (db \&body body)\\
~~(let ((gbod (gensym)))\\
~~~~`(let ((,gbod \#'(lambda () ,@body)))\\
~~~~~~~(declare (dynamic-extent ,gbod))\\
~~~~~~~(with-db-fn *db* ,db ,gbod))))\\
\\
(defun with-db-fn (old-db new-db body)\\
~~(unwind-protect\\
~~~~(progn\\
~~~~~~(setq *db* new-db)\\
~~~~~~(lock *db*)\\
~~~~~~(funcall body))\\
~~~~(progn\\
~~~~~~(release *db*)\\
~~~~~~(setq *db* old-db))))
}\end{minipage}\end{center}
\vspace{1.3em}\end{minipage}~\,}\end{center}
\caption{Åµ·¿Åª¤Ê\texttt{with-}·Ï¥Þ¥¯¥í¡¥}
\label{fig:TypicalWithMacro}
\end{figure}


Âè\ref{fig:TypicalWithMacro}¿ÞÆâ¤Î2¤Ä¤Î\verb|with-db|¤ÎÄêµÁ¤Ï¡¤
¤³¤Î¼ï¤Î¥Þ¥¯¥í¤Î2ÄÌ¤ê¤Î½ñ¤­Êý¤Î²ÄÇ½À­¤ò¼¨¤·¤Æ¤¤¤ë¡¥
1ÈÖÌÜ¤Ï½ã¿è¤Ê¥Þ¥¯¥í¤Ç¡¤2ÈÖÌÜ¤Ï´Ø¿ô¤È¥Þ¥¯¥í¤È¤ÎÁÈ¤ß¹ç¤ï¤»¤À¡¥
¼Â¸½¤·¤¿¤¤\verb|with-|·Ï¥Þ¥¯¥í¤¬Ê£»¨¤Ë¤Ê¤ë¤ËÏ¢¤ì¡¤2ÈÖÌÜ¤Î¼êË¡¤ÎÊý¤¬¼ÂÍÑÅª¤Ë¤Ê¤ë¡¥

\textsf{CLtL2}½àµò¤ÎCommon Lisp½èÍý·Ï¤Ç¤Ï¡¤
Àë¸À\verb|dynamic-extent|¤Ë¤è¤Ã¤ÆËÜÂÎÉô¤ò³ç¤ë¥¯¥í¡¼¥¸¥ã¤¬¸úÎ¨Åª¤Ë³ä¤êÅö¤Æ¤é¤ì¤ë¤è¤¦¤Ë¤Ç¤­¤ë
¡Ê\textsf{CLtL1}½àµò¤Î½èÍý·Ï¤Ç¤ÏÌµ»ë¤µ¤ì¤ë¡Ë¡¥
¤³¤Î¥¯¥í¡¼¥¸¥ã¤Ï\verb|with-db-fn|¤ò¸Æ¤ó¤Ç¤¤¤ë´Ö¤À¤±É¬Í×¤Ê¤Î¤Ç¡¤¤½¤ÎÄÌ¤ê¤Î¤³¤È¤òÀë¸À¤¹¤ì¤Ð¡¤
É¬Í×¤Ê¥á¥â¥ê¶õ´Ö¤ò¥³¥ó¥Ñ¥¤¥é¤Ë¥¹¥¿¥Ã¥¯¾å¤Ë³ä¤êÅö¤Æ¤µ¤»¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
¤³¤Î¶õ´Ö¤Ï¸å¤Ç¥¬¡¼¥Ù¥¸¡¦¥³¥ì¥¯¥¿¤Ë²ó¼ý¤µ¤ì¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¤¼°¤«¤é½Ð¤ë¤È¤­¤Ë¼«Æ°Åª¤Ë²ó¼ý¤µ¤ì¤ë¡¥
%}}}
\subsection{¾ò·ïÉÕ¤­É¾²Á}   %{{{
¥Þ¥¯¥í¸Æ¤Ó½Ð¤·Æâ¤Î°ú¿ô¤ò¡¤¤¢¤ë¾ò·ï¤¬À®Î©¤¹¤ë¤È¤­¤À¤±É¾²Á¤·¤¿¤¤¤³¤È¤¬¤¢¤ë¡¥
¤³¤ì¤Ï¡¤°ú¿ô¤òÉ¬¤ºÉ¾²Á¤¹¤ë¤³¤È¤Ë¤Ê¤Ã¤Æ¤¤¤ë´Ø¿ô¤Ë¤Ï¤Ç¤­¤Ê¤¤¤³¤È¤À¡¥
\verb|if|¡¤\verb|and|¤ä\verb|cond|¤Î¤è¤¦¤ÊÁÈ¹þ¤ß¥ª¥Ú¥ì¡¼¥¿¤Ï°ú¿ô¤Î´ö¤Ä¤«¤òÊÝ¸î¤·¤Æ¤¤¤Æ¡¤
Â¾¤Î°ú¿ô¤¬¤¢¤ëÃÍ¤òÊÖ¤µ¤Ê¤¤¸Â¤êÉ¾²Á¤·¤Ê¤¤¡¥
Îã¤¨¤Ð¼¡¤Î¼°¤Ç¤Ï¡¤
\begin{verbatim}
(if t 'phew
      (/ x 0))
\end{verbatim}
Âè3°ú¿ô¤ÏÉ¾²Á¤µ¤ì¤ë¤È¡Ö¥¼¥í½ü»»¡×¥¨¥é¡¼¤ò°ú¤­µ¯¤³¤¹¡¥
¤·¤«¤·1¡¤2ÈÖÌÜ¤Î°ú¿ô¤À¤±¤¬É¾²Á¤µ¤ì¤ë¤³¤È¤Ë¤Ê¤ë¤Î¤Ç¡¤\verb|if|Á´ÂÎ¤È¤·¤Æ¤Ï¾ï¤Ë°ÂÁ´¤Ë\verb|phew|¤òÊÖ¤¹¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro if3 (test t-case nil-case ?-case)
  `(case ,test
     ((nil) ,nil-case)
     (?       ,?-case)
     (t       ,t-case)))

(defmacro nif (expr pos zero neg)
  (let ((g (gensym)))
    `(let ((,g ,expr))
       (cond ((plusp ,g) ,pos)
             ((zerop ,g) ,zero)
             (t ,neg)))))
\end{FramedVerb}\end{center}
\caption{¾ò·ïÉÕ¤­É¾²Á¤Î¤¿¤á¤Î¥Þ¥¯¥í¡¥}
\label{fig:MacrosForCondEval}
\end{figure}
\begin{verbatim}
\end{verbatim}

¤³¤Î¤è¤¦¤Ê¥ª¥Ú¥ì¡¼¥¿¤ò¿·¤·¤¯½ñ¤¯¤Ë¤Ï¡¤´ûÂ¸¤Î¤³¤Î¤è¤¦¤Ê¥ª¥Ú¥ì¡¼¥¿¤ËÅ¸³«¤µ¤ì¤ë¤è¤¦¤Ê¥Þ¥¯¥í¤ò½ñ¤±¤Ð¤è¤¤¡¥
Âè\ref{fig:MacrosForCondEval}¤Ë¤Ï¡¤\verb|if|¤Î¹Í¤¨ÆÀ¤ëÂ¿¤¯¤ÎÊÑ¼ï¤Î¤¦¤Á2¤Ä¤ò¼¨¤·¤¿¡¥
\verb|if3|¤ÎÄêµÁ¤Ï¡¤»°ÃÍÏÀÍý¤Î¤¿¤á¤Î¾ò·ïÈ½ÃÇ¤òÄêµÁ¤¹¤ëÊýË¡¤ò¼¨¤·¤Æ¤¤¤ë¡¥
\verb|nil|¤òµ¶¡¤¤½¤Î¤Û¤«Á´¤Æ¤ò¿¿¤È¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¤
¤³¤Î¥Þ¥¯¥í¤Ï¿¿Íý¤Î3¼ïÎà¤ÎÅÙ¹ç¤ò¹ÍÎ¸¤¹¤ë¡§
¿¿¡¤µ¶¡¤¤½¤·¤Æ \verb|?| ¤ÇÉ½¤µ¤ì¤ë²ÄÇ½¤À¡¥
¤³¤ì¤Ï5ºÐ¤Î»Ò¶¡¤òÉÁ¼Ì¤¹¤ëºÝ¤Ë¼¡¤Î¤è¤¦¤Ë»È¤¨¤ë¤«¤âÃÎ¤ì¤Ê¤¤¡¥
\begin{verbatim}
(while (not sick)
  (if3 (cake-permitted)
         (eat-cake)
         (throw 'tantrum nil)
         (plead-insistently)))
\end{verbatim}

¤³¤Î¿·¤·¤¤¾ò·ïÈ½ÃÇ¥ª¥Ú¥ì¡¼¥¿¤Ï\verb|case|¤ËÅ¸³«¤µ¤ì¤ë¡¥
(¥­¡¼\verb|nil|¤Ï¥ê¥¹¥È¤Ë³ç¤é¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
\verb|nil|Ã±ÆÈ¤Ç¤Ï°ÕÌ£¤¬¤¢¤¤¤Þ¤¤¤Ë¤Ê¤ë¤«¤é¤À¡¥)
ºÇ¸å¤Î3¤Ä¤Î°ú¿ô¤Ï¡¤Âè1°ú¿ô¤ÎÃÍ¤Ë½¾¤Ã¤Æ¤É¤ì¤«1¤Ä¤À¤±¤¬É¾²Á¤µ¤ì¤ë¡¥

\verb|nif|¤È¤¤¤¦Ì¾Á°¤Ï¡Önumeric if¡Ê¿ôÃÍÅªif¡Ë¡×¤«¤éÍè¤Æ¤¤¤ë¡¥
ÊÌ¤Î¼ÂÁõÊýË¡¤Ïbnm¥Ú¡¼¥¸¤Ë¼¨¤·¤¿¡¥
¤³¤ì¤Ï¿ôÃÍ¤Î¼°¤òÂè1°ú¿ô¤Ë¼è¤ê¡¤¤½¤ÎÉä¹æ¤Ë½¾¤Ã¤Æ»Ä¤ê3¤Ä¤Î°ú¿ô¤Î¤É¤ì¤«¤òÉ¾²Á¤¹¤ë¡¥
\begin{verbatim}
> (mapcar #'(lambda (x)
                   (nif x 'p 'z 'n))
              '(0 1 -1))
(ZPN)
\end{verbatim}

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro in (obj &rest choices)
  (let ((insym (gensym)))
    `(let ((,insym ,obj))
       (or ,@(mapcar #'(lambda (c) `(eql ,insym ,c))
                      choices)))))

(defmacro inq (obj &rest args)
  `(in ,obj ,@(mapcar #'(lambda (a)
                           `',a)
                       args)))

(defmacro in-if (fn &rest choices)
  (let ((fnsym (gensym)))
    `(let ((,fnsym ,fn))
       (or ,@(mapcar #'(lambda (c)
                          `(funcall ,fnsym ,c))
                      choices)))))

(defmacro >case (expr &rest clauses)
  (let ((g (gensym)))
    `(let ((,g ,expr))
       (cond ,@(mapcar #'(lambda (cl) (>casex g cl))
                        clauses)))))

(defun >casex (g cl)
  (let ((key (car cl)) (rest (cdr cl)))
    (cond ((consp key) `((in ,g ,@key) ,@rest))
          ((inq key t otherwise) `(t ,@rest))
          (t (error "bad >case clause")))))
\end{FramedVerb}\end{center}
\caption{¾ò·ïÉÕ¤­É¾²Á¤Î¤¿¤á¤Î¥Þ¥¯¥í¡¥}
\label{fig:MacrosForCondEval2}
\end{figure}
\begin{verbatim}
\end{verbatim}

Âè\ref{fig:MacrosForCondEval2}¿Þ¤Ë¤Ï¡¤¾ò·ïÉÕ¤­É¾²Á¤ÎÍøÅÀ¤òÀ¸¤«¤·¤¿¥Þ¥¯¥í¤ò¹¹¤Ë´ö¤Ä¤«¼¨¤·¤¿¡¥
¥Þ¥¯¥í\verb|in|¤Ï½¸¹ç¤Ø¤Î½êÂ°´Ø·¸¤ò¸úÎ¨Åª¤ËÄ´¤Ù¤ë¤â¤Î¤À¡¥
¤¢¤ë¥ª¥Ö¥¸¥§¥¯¥È¤¬´ö¤Ä¤«¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ÎÃæ¤Î¤É¤ì¤«¤ÈÆ±¤¸¤â¤Î¤«Ä´¤Ù¤¿¤¤¤È¤­¡¤
¤½¤ÎÌä¤ÏÁª¸À¡ÊÌõÃí¡§¤¤¤ï¤æ¤ëor¡Ë¤È¤·¤ÆÉ½¸½¤Ç¤­¤ë¡¥
\begin{verbatim}
(let ((x (foo)))
  (or (eql x (bar)) (eql x (baz))))
\end{verbatim}
¤Þ¤¿¤ÏÆ±¤¸»ö¤ò½¸¹ç¤Ø¤Î½êÂ°´Ø·¸¤È¤·¤Æ¤âÉ½¸½¤Ç¤­¤ë¡¥
\begin{verbatim}
(member (foo) (list (bar) (baz)))
\end{verbatim}
¸å¼Ô¤ÎÊý¤¬Ãê¾ÝÅª¤À¤¬¡¤Èó¸úÎ¨Åª¤À¡¥
\verb|member|¤ò»È¤Ã¤¿¼°¤Ë¤Ï2¤Ä¤ÎÍýÍ³¤ÇÉÔÉ¬Í×¤Ê¥³¥¹¥È¤¬¤«¤«¤ë¡¥
¤³¤ì¤Ï¥ª¥Ö¥¸¥§¥¯¥È¤Î½¸¹ç¤ò\verb|member|¤¬Ä´¤Ù¤ë¤¿¤á¤Ë¥ê¥¹¥È¤Ë³ç¤é¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤Î¤Ç¡¤
¥³¥ó¥·¥ó¥°¤òµ¯¤³¤¹¡¥
¤½¤·¤Æ¥ª¥Ö¥¸¥§¥¯¥È¤Î½¸¹ç¤ò¥ê¥¹¥È¤Ë³ç¤ë¤¿¤á¤Ë¤Ï¤½¤ì¤é¤òÁ´¤ÆÉ¾²Á¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤¬¡¤
Ãæ¤Ë¤ÏÁ´¤¯É¬Í×¤Ç¤Ê¤¤ÃÍ¤â¤¢¤ë¡¥
\verb|(foo)|¤ÎÃÍ¤¬\verb|(bar)|¤ÎÃÍ¤ËÅù¤·¤±¤ì¤Ð¡¤\verb|(baz)|¤òÉ¾²Á¤¹¤ëÉ¬Í×¤Ï¤Ê¤¤¡¥
³µÇ°¤È¤·¤Æ¤Ï¤É¤ìÄøÍ¥¤ì¤Æ¤¤¤Æ¤â¡¤¤³¤Î¤è¤¦¤Ë\verb|member|¤ò»È¤¦¤Î¤Ï¤è¤¤ÊýË¡¤Ç¤Ï¤Ê¤¤¡¥
Æ±ÍÍ¤ÊÃê¾Ý²½¤Ï¥Þ¥¯¥í¤Ë¤è¤ì¤Ð¤è¤ê¸úÎ¨Åª¤Ë¼Â¸½¤Ç¤­¤ë¡¥
\verb|in|¤Ï\verb|member|¤ÎÃê¾ÝÀ­¤È\verb|or|¤Î¸úÎ¨À­¤òÊ»¤»»ý¤Ã¤¿¤â¤Î¤À¡¥
\verb|in|¤ò»È¤Ã¤¿Åù²Á¤Ê¼°¤Ï\verb|member|¤Î¼°¤ÈÆ±¤¸·Á¤ò¤·¤Æ¤¤¤ë¡¥
\begin{verbatim}
(in (foo) (bar) (baz))
\end{verbatim}
¤·¤«¤·¤³¤ì¤Ï¼¡¤Î¤è¤¦¤ËÅ¸³«¤µ¤ì¤ë¡¥
\begin{verbatim}
(let ((#:g25 (foo)))
  (or (eql #:g25 (bar))
         (eql #:g25 (baz))))
\end{verbatim}

¤è¤¯¤¢¤ë¤³¤È¤À¤¬¡¤´·ÍÑË¡¤ÎÌÀ³Î¤Ê¤â¤Î¤È¸úÎ¨Åª¤Ê¤â¤Î¤È¤Î´Ö¤ÎÁªÂò¤ËÄ¾ÌÌ¤·¤¿¤È¤­¤Ï¡¤
Á°¼Ô¤ò¸å¼Ô¤ËÊÑ´¹¤¹¤ë¥Þ¥¯¥í¤ò½ñ¤¯¤³¤È¤Ç¥Ç¥£¥ì¥ó¥Þ¤Î³Ñ¤òÈ´¤±¤ë¤³¤È¤¬¤Ç¤­¤ë
¡ÊÌõÃí¡§¡Ö¤É¤Á¤é¤«¤ÎÁªÂò¡×¤Ë¼Â¤ÏÂè3¤ÎÆ»¤¬¤¢¤ë¤³¤È¡Ë¡¥

\verb|inq|¤Ï``in queue''¤ÈÈ¯²»¤¹¤ë¤¬¡¤¤³¤ì¤Ï¥¯¥©¡¼¥È¤ò»È¤¦\verb|in|¤ÎÊÑ¼ï¤Ç¡¤
¤³¤ì¤ò»È¤¦¤Î¤Ï\verb|set|¤ÎÂå¤ï¤ê¤Ë\verb|setq|¤ò»È¤¦¤è¤¦¤Ê¤â¤Î¤À¡¥
¼¡¤Î¼°¤Ï¡¤
\begin{verbatim}
(inq operator + - *)
\end{verbatim}
¼¡¤Î¤è¤¦¤ËÅ¸³«¤µ¤ì¤ë¡¥
\begin{verbatim}
(in operator '+ '- '*)
\end{verbatim}
\verb|member|¤Î¥Ç¥Õ¥©¥ë¥ÈÆ°ºî¤ÈÆ±ÍÍ¤Ë¡¤\verb|in|¤È\verb|inq|¤ÏÆ±°ìÀ­¤ÎÈ½ÃÇ¤Ë\verb|eql|¤ò»È¤¦¡¥
È½ÃÇ¤ËÂ¾¤Î¥ª¥Ú¥ì¡¼¥¿¤ò»È¤¤¤¿¤¤¤Ê¤é\wadash 1¸Ä¤Î°ú¿ô¤ò¼è¤ë´Ø¿ô¤Ê¤é²¿¤Ç¤â¤è¤¤¤¬\wadash
¹¹¤Ë°ìÈÌÅª¤Ê\verb|in-if|¤ò»È¤¦¤È¤è¤¤¡¥
\verb|in-if|¤È\verb|some|¤È¤Î´Ø·¸¤Ï¤Á¤ç¤¦¤É\verb|in|¤È\verb|member|¤È¤Î´Ø·¸¤ÈÆ±¤¸¤À¡¥
¼¡¤Î¼°¤Ï¡¤
\begin{verbatim}
(member x (list a b) :test #'equal)
\end{verbatim}
¼¡¤Î¤è¤¦¤Ë½ñ¤­´¹¤¨¤é¤ì¤ë¡¥
\begin{verbatim}
(in-if #'(lambda (y) (equal x y)) a b)
\end{verbatim}
Æ±ÍÍ¤Ë¼¡¤Î¼°¤Ï¡¤
\begin{verbatim}
(some #'oddp (list a b))
\end{verbatim}
¼¡¤Î¤è¤¦¤Ë¤Ê¤ë¡¥
\begin{verbatim}
(in-if #'oddp a b)
\end{verbatim}

\verb|cond|¤È\verb|in|¤òÁÈ¤ß¹ç¤ï¤»¤ë¤³¤È¤Ç¡¤\verb|case|¤ÎÊØÍø¤ÊÊÑ¼ï¤¬ÄêµÁ¤Ç¤­¤ë¡¥
Common Lisp¤Î¥Þ¥¯¥í\verb|case|¤Î¥­¡¼¤¬Äê¿ô¤Ç¤¢¤ë¤³¤È¤òÁ°Äó¤Ë¤·¤Æ¤¤¤ë¡¥
¤·¤«¤·\verb|case|¤ÎÆ°ºî¤¬Íß¤·¤¤¤¬¡¤¥­¡¼¤òÉ¾²Á¤·¤ÆÍß¤·¤¤¤È¤­¤â¤¢¤ë¡¥
\verb|>case|¤Ï¤½¤Î¤è¤¦¤Ê¾ì¹ç¤Î¤¿¤á¤Ëºî¤é¤ì¤¿¡¥
¤³¤ì¤Ï\verb|case|¤È»÷¤Æ¤¤¤ë¤¬¡¤¤½¤ì¤¾¤ì¤ÎÀá¤òÊÝ¸î¤¹¤ë¥­¡¼¤¬Èæ³ÓÁ°¤ËÉ¾²Á¤µ¤ì¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥
(Ì¾Á°¤Î¡Ö \verb|>| ¡×¤ÏÌð°õ¤¬É¾²Á¤òÉ½¤¹¤Ä¤â¤ê¤ÇÉÕ¤±¤é¤ì¤¿¡¥)
\verb|>case|¤Ï\verb|in|¤ò»È¤Ã¤Æ¤¤¤ë¤Î¤Ç¡¤É¬Í×°Ê¾å¤Î¥­¡¼¤ÏÉ¾²Á¤·¤Ê¤¤¡¥

¥­¡¼¤ÏLisp¤Î¼°¤Ç¤¢¤Ã¤Æ¤â¤è¤¤¤Î¤Ç¡¤
\verb|(x y)|¤¬´Ø¿ô¤ä¥Þ¥¯¥í¤Î¸Æ¤Ó½Ð¤·¤Ê¤Î¤«2¤Ä¤Î¥­¡¼¤«¤éÀ®¤ë¥ê¥¹¥È¤Ê¤Î¤«È½ÃÇ¤¬ÉÕ¤«¤Ê¤¤¡¥
Û£Ëæ¤µ¤ò¤Ê¤¯¤¹¤¿¤á¡¤¡Ê\verb|t|°Ê³°¤Î¡Ë¥­¡¼¤Ï¡¤
1¤Ä¤·¤«¤Ê¤¤¾ì¹ç¤Ç¤âÉ¬¤º¥ê¥¹¥È¤Ë³ç¤é¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
\verb|case|¤Î¾ì¹ç¡¤Û£Ëæ¤Ç¤¢¤ë¤¿¤á¤Ë\verb|nil|¤ÏÀá¤Î\verb|car|Éô¤Ë¤Ê¤Ã¤Æ¤Ï¤¤¤±¤Ê¤«¤Ã¤¿¡¥
\verb|>case|¤Ç¤Ï¡¤\verb|nil|¤ÏÀá¤Î\verb|car|Éô¤È¤·¤ÆÛ£Ëæ¤Ç¤Ï¤Ê¤¤¡¥
¤·¤«¤·¤½¤¦¤¹¤ë¤ÈÀá¤Î»Ä¤ê¤¬·è¤·¤ÆÉ¾²Á¤µ¤ì¤Ê¤¤¤³¤È¤Ë¤Ê¤ë¡¥

ÌÀ³Î¤µ¤Î¤¿¤á¡¤
¤½¤ì¤¾¤ì¤Î\verb|>case|Àá¤ÎÅ¸³«·Á¤òÀ¸À®¤¹¤ë¥³¡¼¥É¤ÏÆÈÎ©¤·¤¿´Ø¿ô\verb|>casex|¤È¤·¤ÆÄêµÁ¤µ¤ì¤¿¡¥
\verb|>casex|¼«¿È¤â\verb|inq|¤ò»È¤Ã¤Æ¤¤¤ë¤³¤È¤ËÃí°Õ¤·¤è¤¦¡¥
%}}}
\subsection{È¿Éü}   %{{{
´Ø¿ô¤Ë¤Þ¤Ä¤ï¤ëÌäÂê¤¬¡¤°ú¿ô¤¬É¬¤ºÉ¾²Á¤µ¤ì¤ë¤³¤È¤Ç¤Ï¤Ê¤¯¡¤°ú¿ô¤¬1²ó¤·¤«É¾²Á¤µ¤ì¤Ê¤¤¤³¤È¤Ç¤¢¤ë¤È¤­¤â¤¢¤ë¡¥
´Ø¿ô¤Î°ú¿ô¤Ï¤É¤ì¤â¤­¤Ã¤«¤ê1²ó¤À¤±É¾²Á¤µ¤ì¤ë¤Î¤Ç¡¤
ËÜÂÎ¤È¤Ê¤ë¼°¤ò¼è¤Ã¤Æ¤½¤ì¤òÈ¿ÉüÉ¾²Á¤¹¤ë¥ª¥Ú¥ì¡¼¥¿¤òÄêµÁ¤·¤¿¤±¤ì¤Ð¡¤
¤½¤ì¤ò¥Þ¥¯¥í¤È¤·¤ÆÄêµÁ¤¹¤ë¤·¤«¤Ê¤¤¡¥

°ìÈÖÃ±½ã¤ÊÎã¤Ï¡¤°ú¿ô¤ò½çÈÖ¤Ë±Ê±ó¤ËÉ¾²Á¤·Â³¤±¤ë¥Þ¥¯¥í¤À¤í¤¦¡¥
\begin{verbatim}
(defmacro forever (&body body)
  `(do ()
     (nil)
     ,@body))
\end{verbatim}
¤³¤ì¤Ï¤Á¤ç¤¦¤ÉÁÈ¹þ¤ß¥Þ¥¯¥í\verb|loop|¤Ë¥­¡¼¥ï¡¼¥É¤òÍ¿¤¨¤Ê¤«¤Ã¤¿¤È¤­¤ÎÆ°ºî¤À¡¥
±Ê±ó¤Î·«¤êÊÖ¤·¤Ë¤ÏÂç¤·¤¿¾­ÍèÀ­¤Ï¤Ê¤¤¤è¤¦¤Ë»×¤¨¤ë¡Ê¤à¤·¤í¾­Íè¤ËÅÏ¤Ã¤ÆÂ³¤­²á¤®¤ë¡Ë¡¥
¤·¤«¤·\verb|block|¤ä\verb|return-from|¤ÈÁÈ¤ß¹ç¤ï¤»¤ì¤Ð¡¤
¤³¤Î¼ï¤Î¥Þ¥¯¥í¤¬¡¤ÃæÃÇ¤Ï¶ÛµÞ»þ¤Î¤ß¤Ç¤¢¤ë¤è¤¦¤Ê¥ë¡¼¥×¤òÉ½¸½¤¹¤ë¤¿¤á¤Î°ìÈÖ¼«Á³¤ÊÊýË¡¤Ë¤Ê¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro while (test &body body)
  `(do ()
     ((not ,test))
     ,@body))

(defmacro till (test &body body)
  `(do ()
     (,test)
     ,@body))

(defmacro for ((var start stop) &body body)
  (let ((gstop (gensym)))
    `(do ((,var ,start (1+ ,var))
          (,gstop ,stop))
       ((> ,var ,gstop))
       ,@body)))
\end{FramedVerb}\end{center}
\caption{Ã±½ã¤ÊÈ¿ÉüÍÑ¥Þ¥¯¥í¡¥}
\label{fig:SimpleIterMacro}
\end{figure}
\begin{verbatim}
\end{verbatim}

È¿Éü¤Î¤¿¤á¤Î¥Þ¥¯¥í¤ÎÃ±½ã¤ÊÎã¤ò´ö¤Ä¤«Âè\ref{fig:SimpleIterMacro}¤Ë¼¨¤·¤¿¡¥
\verb|while|¤Ï¤¹¤Ç¤Ë¸«¤¿¤â¤Î¤À(p. vom)¡¥
¤³¤ÎËÜÂÎÉô¤Ï¥Æ¥¹¥È¼°¤¬¿¿¤òÊÖ¤¹´ÖÃæÉ¾²Á¤µ¤ìÂ³¤±¤ë¡¥
\verb|till|¤Ï¤½¤ì¤ÈÂÐ¤ò¤Ê¤¹¤â¤Î¤Ç¡¤¥Æ¥¹¥È¼°¤¬µ¶¤òÊÖ¤¹´ÖÉ¾²Á¤ò·«¤êÊÖ¤¹¡¥
ºÇ¸å¤Î\verb|for|¤â¤¹¤Ç¤Ë¸«¤¿(p. qwe)¤â¤Î¤Ç¡¤¤¢¤ëÈÏ°Ï¤Î¿ô¤ËÂÐ¤·¤ÆÈ¿Éü¤ò¹Ô¤¦¡¥

¤³¤ì¤é¤Î¥Þ¥¯¥í¤ò\verb|do|¤ËÅ¸³«¤¹¤ë¤è¤¦¤Ë¤¹¤ë¤³¤È¤Ç¡¤
¤½¤ÎËÜÂÎÉô¤ÎÃæ¤Ç\verb|go|¤ä\verb|return|¤¬»È¤¨¤ë¤è¤¦¤Ë¤Ê¤ë¡¥
\verb|do|¤Î»ý¤Ä¤³¤ÎÀ­¼Á¤Ï\verb|block|¤È\verb|tagbody|¤«¤é°ú¤­·Ñ¤¤¤À¤â¤Î¤À¤«¤é¡¤
\verb|while|¡¤\verb|till|¤È\verb|for|¤Ï\verb|do|¤«¤é¤ä¤Ï¤ê°ú¤­·Ñ¤°¤³¤È¤Ë¤Ê¤ë¡¥
zxc¥Ú¡¼¥¸¤ÇÀâÌÀ¤·¤¿¤è¤¦¤Ë¡¤
\verb|do|¤ò°Ï¤à°ÅÌÛ¤Î¥Ö¥í¥Ã¥¯¤Î¥¿¥°\verb|nil|¤ÏÂè\ref{fig:SimpleIterMacro}¿Þ¤Î¥Þ¥¯¥í¤ËÊáÂª¤µ¤ì¤ë¡¥
¤³¤ÎÅÀ¤Ï¥Ð¥°¤È¤¤¤¦¤è¤ê»ÅÍÍ¤À¤¬¡¤ºÇÄã¤Ç¤âÌÀµ­¤·¤Æ¤ª¤¯¤Ù¤­¤À¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro do-tuples/o (parms source &body body)
  (if parms
      (let ((src (gensym)))
        `(prog ((,src ,source))
               (mapc #'(lambda ,parms ,@body)
                     ,@(map0-n #'(lambda (n)
                                    `(nthcdr ,n ,src))
                                (1- (length parms))))))))

(defmacro do-tuples/c (parms source &body body)
  (if parms
      (with-gensyms (src rest bodfn)
                    (let ((len (length parms)))
                      `(let ((,src ,source))
                         (when (nthcdr ,(1- len) ,src)
                           (labels ((,bodfn ,parms ,@body))
                             (do ((,rest ,src (cdr ,rest)))
                               ((not (nthcdr ,(1- len) ,rest))
                                ,@(mapcar #'(lambda (args)
                                               `(,bodfn ,@args))
                                           (dt-args len rest src))
                                nil)
                               (,bodfn ,@(map1-n #'(lambda (n)
                                                      `(nth ,(1- n)
                                                            ,rest))
                                                  len))))))))))

(defun dt-args (len rest src)
  (map0-n #'(lambda (m)
              (map1-n #'(lambda (n)
                          (let ((x (+ m n)))
                            (if (>= x len)
                                `(nth ,(- x len) ,src)
                                `(nth ,(1- x) ,rest))))
                      len))
          (- len 2)))
\end{FramedVerb}\end{center}
\caption{ÉôÊ¬¥ê¥¹¥È¤ËÅÏ¤ëºÆµ¢¤Î¤¿¤á¤Î¥Þ¥¯¥í¡¥}
\label{fig:MacroForIterBySubSeq}
\end{figure}
\begin{verbatim}
\end{verbatim}

¤µ¤é¤Ë¶¯ÎÏ¤ÊÈ¿Éü¹½Â¤¤òÄêµÁ¤¹¤ëÉ¬Í×¤¬¤¢¤ë¤È¤­¤Ë¤Ï¥Þ¥¯¥í¤ÏÉ¬Í×ÉÔ²Ä·ç¤À¡¥
Âè\ref{fig:MacroForIterBySubSeq}¿Þ¤Ë¤Ï\verb|dolist|¤Î°ìÈÌ²½¤ò2¤Ä¼¨¤·¤¿¡¥
Î¾Êý¤È¤âÊÑ¿ô¤ÎÁÈ¤ò¥ê¥¹¥È¤ÎÎÙ¤ê¹ç¤Ã¤¿ÉôÊ¬¥ê¥¹¥È¤ËÂ«Çû¤·¤¿¾õÂÖ¤ÇËÜÂÎÉô¤òÉ¾²Á¤¹¤ë¡¥
Îã¤¨¤Ð\verb|do-tuples/o|¤Ï°ú¿ô¤ò2¤Ä¼è¤ê¡¤¥ê¥¹¥È¤ÎÍ×ÁÇ¤ËÅÏ¤Ã¤ÆÈ¿Éü¤ò¹Ô¤¦¡¥
\begin{verbatim}
> (do-tuples/o (x y) '(a b c d)
               (princ (list x y)))
(a b)(b c)(c d)
nil
\end{verbatim}
Æ±¤¸°ú¿ô¤ËÂÐ¤·¤Æ¤Ï\verb|do-tuples/c|¤âÆ±¤¸Æ°ºî¤ò¤¹¤ë¤¬¡¤¤³¤Á¤é¤Ï¥ê¥¹¥ÈËöÈø¤ÇÀèÆ¬¤Ë¤Ä¤Ê¤¬¤ë¡¥
\begin{verbatim}
> (do-tuples/c (x y) '(a b c d)
               (princ (list x y)))
(a b)(b c)(c d)(d a)
nil
\end{verbatim}
¤É¤Á¤é¤Î¥Þ¥¯¥í¤âËÜÂÎÆâ¤ÇÍÛ¤Ë\verb|return|¤¬»È¤ï¤ì¤Ê¤¤¸Â¤ê\verb|nil|¤òÊÖ¤¹¡¥

¤³¤Î¼ï¤ÎÈ¿Éü¤Ï·ÐÏ©¤Î³µÇ°¤ò²¿¤é¤«¤Î·Á¤Ç°·¤¦¥×¥í¥°¥é¥à¤Ç¤·¤Ð¤·¤ÐÉ¬Í×¤Ë¤Ê¤ë¡¥
Ì¾Á°¤ÎËöÈø¤Î\verb|/o|¤È\verb|/c|¤Ï¡¤
¤½¤ì¤¾¤ì¤¬³«¤¤¤¿(open)·ÐÏ©¤ÈÊÄ¤¸¤¿(closed)·ÐÏ©¤òÃµº÷¤¹¤ë¤³¤È¤òÉ½¤¹¤Ä¤â¤ê¤ÇÉÕ¤±¤é¤ì¤¿¡¥
Îã¤¨¤Ð\verb|points|¤¬ÅÀ¤Î¥ê¥¹¥È¤Ç¡¤\verb|(drawline x y)|¤¬\verb|x|¤È\verb|y|¤È¤Î´Ö¤ËÀþÊ¬¤òÉÁ¤¯¤â¤Î¤È¤·¤è¤¦¡¥
ºÇ½é¤ÎÅÀ¤«¤éºÇ¸å¤ÎÅÀ¤Þ¤ÇÀÞ¤ìÀþ¤òÉÁ¤¯¤Ë¤Ï¤³¤¦¤¹¤ì¤Ð¤è¤¤¡¥
\begin{verbatim}
(do-tuples/o (x y) points (drawline x y))
\end{verbatim}
¤·¤«¤·\verb|points|¤¬Â¿³Ñ·Á¤ÎÄºÅÀ¤Î¥ê¥¹¥È¤À¤Ã¤¿¤é¡¤¤½¤Î³°¼þ¤òÉÁ¤¯¤Ë¤Ï¤³¤¦¤¹¤ì¤Ð¤è¤¤¡¥
\begin{verbatim}
(do-tuples/c (x y) points (drawline x y))
\end{verbatim}
Âè1°ú¿ô¤È¤·¤ÆÅÏ¤µ¤ì¤¿°ú¿ô¤Î¥ê¥¹¥È¤ÏÇ¤°Õ¤ÎÄ¹¤µ¤Ç¤è¤¯¡¤È¿Éü¤Ï¤½¤ÎÄ¹¤µ¤ÈÆ±¿ô¤ÎÊÑ¿ô¤ÎÁÈ¤ËÅÏ¤Ã¤Æ¹Ô¤ï¤ì¤ë¡¥
°ú¿ô¤¬1¸Ä¤À¤±¤Î¤È¤­¤Ï¡¤¶¦¤Ë\verb|dolist|¤Ë½ÌÂà¤¹¤ë¡¥
\begin{verbatim}
> (do-tuples/o (x) '(a b c) (princ x))
abc
NIL
> (do-tuples/c (x) '(a b c) (princ x))
ABC
NIL
\end{verbatim}

\verb|do-tuples/c|¤ÎÄêµÁ¤Ï\verb|do-tuples/o|¤è¤êÊ£»¨¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥
¤³¤ì¤Ï¥ê¥¹¥ÈËöÈø¤ËÆÏ¤¤¤¿¤È¤­¤ËÀèÆ¬¤Ë¤Ä¤Ê¤¬¤ë¤è¤¦¤Ë¤·¤Æ¤¤¤ë¤»¤¤¤À¡¥
$n$¸Ä¤Î°ú¿ô¤¬¤¢¤ì¤Ð¡¤\verb|do-tuples/c|¤ÏÃÍ¤òÊÖ¤¹Á°¤Ë$n-1$²óÍ¾·×¤ËÈ¿Éü¤ò¹Ô¤ï¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
\begin{verbatim}
> (do-tuples/c (x y z) '(abcd)
               (princ (list x y z)))
(A B C)(B C D)(C D A)(D A B)
NIL

> (do-tuples/c (wxyz)'(abcd)
               (princ (list w x y z)))
(A B C D)(B C D A)(C D A B)(D A B C)
NIL
\end{verbatim}
\verb|do-tuples/c|¤Î¸Æ¤Ó½Ð¤·¤Î1¤ÄÌÜ¤ÎÅ¸³«·Á¤ÏÂè\ref{fig:Expansiondo-tuples/c}¤Ë¼¨¤·¤¿¡¥
À¸À®¤·¿É¤¤¤Î¤Ï¡¤¥ê¥¹¥ÈÀèÆ¬¤Ø¤Ä¤Ê¤¬¤ë¤³¤È¤òÉ½¤¹¸Æ¤Ó½Ð¤·¤ÎÏ¢Â³¤À¡¥
¤³¤ì¤é¤Î¸Æ¤Ó½Ð¤·¤Ï¡Ê¤³¤Î¾ì¹ç¤Ï¤½¤ì¤é¤Î¤¦¤Á2¤Ä¡Ë\verb|dt-args|¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ë¡¥

\begin{figure}\begin{center}
\fbox{~\,\begin{minipage}{\FrameWidth}\narrowbaselines
\vspace{3pt}
\begin{center}\begin{minipage}{240pt}\texttt{%
(do-tuples/c (x y z) '(a b c d)\\
~~~~~~~~~~~~~(princ (list x y z)))
}\end{minipage}\end{center}
\hspace{12zw}¤Ï¼¡¤Î¤è¤¦¤ËÅ¸³«¤µ¤ì¤ë¡§
\begin{center}\begin{minipage}{240pt}\texttt{%
(let ((\#:g2 '(a b c d)))\\
~~(when (nthcdr 2 \#:g2)\\
~~~~(labels ((\#:g4 (x y z)\\
~~~~~~~~~~~~~~~(princ (list x y z))))\\
~~~~~~(do ((\#:g3 \#:g2 (cdr \#:g3)))\\
~~~~~~~~((not (nthcdr 2 \#:g3))\\
~~~~~~~~~(\#:g4 (nth 0 \#:g3)\\
~~~~~~~~~~~~~~~(nth 1 \#:g3)\\
~~~~~~~~~~~~~~~(nth 0 \#:g2))\\
~~~~~~~~~(\#:g4 (nth 1 \#:g3)\\
~~~~~~~~~~~~~~~(nth 0 \#:g2)\\
~~~~~~~~~~~~~~~(nth 1 \#:g2))\\
~~~~~~~~~nil)\\
~~~~~~~~(\#:g4 (nth 0 \#:g3)\\
~~~~~~~~~~~~~~(nth 1 \#:g3)\\
~~~~~~~~~~~~~~(nth 2 \#:g3))))))
}\end{minipage}\end{center}
\vspace{1.3em}\end{minipage}~\,}\end{center}
\caption{\texttt{do-tuples/c}¤Î¸Æ¤Ó½Ð¤·¤ÎÅ¸³«·Á¡¥}
\label{fig:Expansiondo-tuples/c}
\end{figure}

%}}}
\subsection{Ê£¿ô¤ÎÃÍ¤ËÅÏ¤ëÈ¿Éü}   %{{{

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro mvdo* (parm-cl test-cl &body body)
  (mvdo-gen parm-cl parm-cl test-cl body))

(defun mvdo-gen (binds rebinds test body)
  (if (null binds)
      (let ((label (gensym)))
        `(prog nil
               ,label
               (if ,(car test)
                   (return (progn ,@(cdr test))))
               ,@body
               ,@(mvdo-rebind-gen rebinds)
               (go ,label)))
      (let ((rec (mvdo-gen (cdr binds) rebinds test body)))
        (let ((var/s (caar binds)) (expr (cadar binds)))
          (if (atom var/s)
              `(let ((,var/s ,expr)) ,rec)
              `(multiple-value-bind ,var/s ,expr ,rec))))))

(defun mvdo-rebind-gen (rebinds)
  (cond ((null rebinds) nil)
        ((< (length (car rebinds)) 3)
         (mvdo-rebind-gen (cdr rebinds)))
        (t(cons (list (if (atom (caar rebinds))
                          'setq
                          'multiple-value-setq)
                      (caar rebinds)
                      (third (car rebinds)))
                (mvdo-rebind-gen (cdr rebinds))))))
\end{FramedVerb}\end{center}
\caption{Â¿ÃÍ¤ËÂÐ±þ¤·¤¿\texttt{do*}¡¥}
\label{fig:MultiValBindDostar}
\end{figure}

ÁÈ¹þ¤ß¥Þ¥¯¥í\verb|do|¤ÎÎò»Ë¤ÏÂ¿ÃÍ¤è¤ê¤â¸Å¤¤¡¥
¹¬¤¤\verb|do|¤Ï¿·¤·¤¤¾õ¶·¤ËÅ¬±þ¤¹¤ë¤è¤¦¤Ë¿Ê²½¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
Lisp¤Î¿Ê²½¤Ï¥×¥í¥°¥é¥Þ¤Î¼ê¤ÎÃæ¤Ë¤¢¤ë¤«¤é¤À¡¥
Âè\ref{fig:MultiValBindDostar}¤Ë¤ÏÂ¿ÃÍ¤ËÂÐ±þ¤·¤¿\verb|do*|¤ÎÊÑ¼ï¤ò¼¨¤·¤¿¡¥
\verb|mvdo*|¤ò»È¤¨¤Ð¡¤»Ï¤á¤ÎÀá¤ÏÊ£¿ô¸Ä¤ÎÊÑ¿ô¤òÂ«Çû¤Ç¤­¤ë¡¥
\begin{verbatim}
> (mvdo* ((x 1 (1+ x))
          ((y z) (values 0 0) (values z x)))
         ((> x 5) (list x y z))
         (princ (list x y z)))
(1 0 0)(2 0 2)(3 2 3)(4 3 4)(5 4 5)
(656)
\end{verbatim}
¤³¤Î¼ï¤ÎÈ¿Éü¤Ï¡¤Îã¤¨¤Ð¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¤Ê¥°¥é¥Õ¥£¥Ã¥¯¥¹¡¦¥×¥í¥°¥é¥à¤ÇÊØÍø¤Ë¤Ê¤ë¡¥
¤½¤ì¤Ë¤Ï¤·¤Ð¤·¤ÐºÂÉ¸¤äÎÎ°è¤Ê¤É¤ÎÊ£¿ô¤Î¿ôÎÌ¤ò°·¤¦É¬Í×¤¬¤¢¤ë¤«¤é¤À¡¥

Ã±½ã¤Ê¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¡¦¥²¡¼¥à¤ò½ñ¤­¤¿¤¤¤È¤·¤è¤¦¡¥
ÌÜÅª¤ÏÄÉ¤Ã¤Æ¤¯¤ë2¸Ä¤ÎÅ¨¤Ë¶´¤Þ¤ì¤ë¤Î¤òÈò¤±¤ë¤³¤È¤À¡¥
Å¨¤¬Æ±»þ¤Ë¤Ö¤Ä¤«¤Ã¤Æ¤­¤¿¤é¡¤¥²¡¼¥à¤ÏÉé¤±¡¥
¤½¤ì¤¾¤ìÃ±ÆÈ¤Ç¤Ö¤Ä¤«¤ë¤È¡¤¾¡¤Á¤Ë¤Ê¤ë¡¥
Âè\ref{fig:GameSquash}¿Þ¤Ë¤Ï¡¤¤³¤Î¥²¡¼¥à¤Î¥á¥¤¥ó¡¦¥ë¡¼¥×¤ò\verb|mvdo*|¤ò»È¤Ã¤Æ½ñ¤¯ÊýË¡¤ò¼¨¤·¤¿¡¥

\begin{figure}\begin{center}
\fbox{~\,\begin{minipage}{\FrameWidth}\narrowbaselines
\vspace{3pt}
\begin{center}\begin{minipage}{320pt}\texttt{%
(mvdo* (((px py) (pos player)~~~(move player mx my))\\
~~~~~~~~((x1 y1) (pos obj1)~~~~~(move obj1 (- px x1)\\
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(- py y1)))\\
~~~~~~~~((x2 y2) (pos obj2)~~~~~(move obj2 (- px x2)\\
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(- py y2)))\\
~~~~~~~~((mx my) (mouse-vector) (mouse-vector))\\
~~~~~~~~(win~~~~~nil~~~~~~~~~~~~(touch obj1 obj2))\\
~~~~~~~~(lose~~~~nil~~~~~~~~~~~~(and (touch obj1 player)\\
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(touch obj2 player))))\\
~~~~~~~((or win lose) (if win 'win 'lose))\\
~~~~~~~(clear)\\
~~~~~~~(draw obj1)\\
~~~~~~~(draw obj2)\\
~~~~~~~(draw player))\\
}\end{minipage}\\
\begin{minipage}{.85\textwidth}
\texttt{(pos obj)}¤Ï2¤Ä¤ÎÃÍ\texttt{x}¤È\texttt{y}¤òÊÖ¤¹¡¥
¤³¤ì¤é¤Ï\texttt{obj}¤Î°ÌÃÖ¤ò¼¨¤¹¡¥
ºÇ½é¤Ï¡¤3¤Ä¤ÎÊªÂÎ¤Ï¥é¥ó¥À¥à¤Ê°ÌÃÖ¤ËÃÖ¤«¤ì¤ë¡¥

\texttt{(move obj dx dy)}¤Ï
¥ª¥Ö¥¸¥§¥¯¥È\texttt{obj}¤Î·¿¤È¥ô¥§¥¯¥¿\texttt{dx}, \texttt{dy}¤Ë½¾¤Ã¤Æ
\texttt{obj}¤ò°ÜÆ°¤µ¤»¤ë¡¥
¿·¤·¤¤°ÌÃÖ¤ò¼¨¤¹2¤Ä¤ÎÃÍ\texttt{x}¤È\texttt{y}¤òÊÖ¤¹¡¥

\texttt{(mouse-vector)}¤Ï¥Þ¥¦¥¹¤Î¸½ºß¤Î°ÌÃÖ¤ò¼¨¤¹2¤Ä¤ÎÃÍ\texttt{dx}¤È\texttt{dy}¤òÊÖ¤¹¡¥

\texttt{(touch obj1 obj2)}¤Ï¡¤\texttt{obj1}¤È\texttt{obj2}¤¬ÀÜ¿¨¤·¤Æ¤¤¤ë¤Ê¤é¤Ð¿¿¤òÊÖ¤¹¡¥

\texttt{(clear)}¤Ï¥²¡¼¥àÎÎ°è¤ò¾Ãµî¤¹¤ë¡¥

\texttt{(draw obj)}¤Ï\texttt{obj}¤ò¸½ºß°ÌÃÖ¤Ë½¾¤Ã¤ÆÉÁ²è¤¹¤ë¡¥
\end{minipage}\end{center}
\vspace{1.3em}\end{minipage}~\,}\end{center}
\caption{¶´¤ß¥²¡¼¥à¡¥}
\label{fig:GameSquash}
\end{figure}



¤Þ¤¿¥í¡¼¥«¥ëÊÑ¿ô¤òÊÂÎó¤·¤ÆÂ«Çû¤¹¤ë\verb|mvdo|¤ò½ñ¤¯¤³¤È¤â¤Ç¤­¤ë¡¥
\begin{verbatim}
> (mvdo ((x 1 (1+ x))
         ((y z) (values 0 0) (values z x)))
        ((> x 5) (list x y z))
        (princ (list x y z)))
(1 0 0)(2 0 1)(3 1 2)(4 2 3)(5 3 4)
(645)
\end{verbatim}

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro mvpsetq (&rest args)
  (let* ((pairs (group args 2))
         (syms (mapcar #'(lambda (p)
                           (mapcar #'(lambda (x) (gensym))
                                   (mklist (car p))))
                       pairs)))
    (labels ((rec (ps ss)
                  (if (null ps)
                      `(setq
                         ,@(mapcan #'(lambda (p s)
                                        (shuffle (mklist (car p))
                                                 s))
                                    pairs syms))
                      (let ((body (rec (cdr ps) (cdr ss))))
                        (let ((var/s (caar ps))
                              (expr (cadar ps)))
                          (if (consp var/s)
                              `(multiple-value-bind ,(car ss)
                                 ,expr
                                 ,body)
                              `(let ((,@(car ss) ,expr))
                                 ,body)))))))
      (rec pairs syms))))

(defun shuffle (x y)
  (cond ((null x) y)
        ((null y) x)
        (t (list* (car x) (car y)
                  (shuffle (cdr x) (cdr y))))))
\end{FramedVerb}\end{center}
\caption{Â¿ÃÍ¤ËÂÐ±þ¤·¤¿\texttt{psetq}¡¥}
\label{fig:MultiValPsetq}
\end{figure}

\verb|do|¤ÎÄêµÁ¤Ë\verb|psetq|¤¬É¬Í×¤ÊÅÀ¤Ë¤Ä¤¤¤Æ¤Ïasd¥Ú¡¼¥¸¤ÇÀâÌÀ¤·¤¿¡¥
\verb|mvdo|¤òÄêµÁ¤¹¤ë¤Ë¤Ï¡¤Â¿ÃÍ¤ËÂÐ±þ¤·¤¿\verb|psetq|¤¬É¬Í×¤À¡¥
¤½¤¦¤¤¤¦¤â¤Î¤ÏCommon Lisp¤Ë¤Ï¤Ê¤¤¤Î¤Ç¡¤¼«Ê¬¤Ç½ñ¤«¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤½¤ì¤òÂè\ref{fig:MultiValPsetq}¤Ë¼¨¤·¤¿¡¥
¤³¤Î¿·¤·¤¤¥Þ¥¯¥í¤Ï¼¡¤Î¤è¤¦¤ËÆ°ºî¤¹¤ë¡¥
\begin{verbatim}
> (let ((w 0) (x 1) (y 2) (z 3))
    (mvpsetq (w x) (values 'a 'b) (y z) (values w x))
    (list wxyz))
(AB01)
\end{verbatim}

\verb|mvpsetq|¤ÎÄêµÁ¤Ï3¤Ä¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£´Ø¿ô¤Ë°ÍÂ¸¤·¤Æ¤¤¤ë¡§
\verb|mklist| (p. sdf)¡¤\verb|group| (p. dfg)¤Ë¡¤¤³¤³¤ÇÄêµÁ¤·¤¿\verb|shuffle|¤À¡¥
¤½¤ì¤Ï2¤Ä¤Î¥ê¥¹¥È¤ò¸ò¸ß¤ËÁÈ¤ß¹ç¤ï¤»¤ëÆ¯¤­¤ò¤¹¤ë¡¥
\begin{verbatim}
> (shuffle '(a b c) '(1 2 3 4))
(A1B2C34)
\end{verbatim}

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro mvdo (binds (test &rest result) &body body)
  (let ((label (gensym))
        (temps (mapcar #'(lambda (b)
                           (if (listp (car b))
                               (mapcar #'(lambda (x)
                                           (gensym))
                                       (car b))
                               (gensym)))
                       binds)))
    `(let ,(mappend #'mklist temps)
       (mvpsetq ,@(mapcan #'(lambda (b var)
                               (list var (cadr b)))
                           binds
                           temps))
       (prog ,(mapcar #'(lambda (b var) (list b var))
                      (mappend #'mklist (mapcar #'car binds))
                      (mappend #'mklist temps))
             ,label
             (if ,test
                 (return (progn ,@result)))
             ,@body
             (mvpsetq ,@(mapcan #'(lambda (b)
                                     (if (third b)
                                         (list (car b)
                                               (third b))))
                                 binds))
             (go ,label)))))
\end{FramedVerb}\end{center}
\caption{Â¿ÃÍ¤ÎÂ«Çû¤ËÂÐ±þ¤·¤¿\texttt{do}¡¥}
\label{fig:MultiBindDo}
\end{figure}

\verb|mvpsetq|¤ò»È¤¤¡¤\verb|mvdo|¤ÏÂè\ref{fig:MultiBindDo}¿Þ¤Î¤è¤¦¤Ë½ñ¤±¤ë¡¥
\verb|condlet|¤ÈÆ±ÍÍ¡¤¸µ¤Î¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤ËÊÑ¹¹¤ò²Ã¤¨¤ë¤Î¤òÈò¤±¤ë¤¿¤á¡¤
¤³¤Î¥Þ¥¯¥í¤Ï\verb|mapcar|¤Ç¤Ï¤Ê¤¯\verb|mappend|¤ò»È¤Ã¤Æ¤¤¤ë¡¥
´·ÍÑË¡\verb|mappend|-\verb|mklist|¤Ï¥Ä¥ê¡¼¤ò1ÃÊ³¬¤À¤±Ê¿¤¿¤¯¤¹¤ë¡¥
\begin{verbatim}
> (mappend #'mklist '((a b c) d (e (f g) h) ((i)) j))
(ABCDE(FG)H(I)J)
\end{verbatim}

¤³¤Î¤«¤Ê¤êÂç¤­¤Ê¥Þ¥¯¥í¤ÎÍý²ò¤ò½õ¤±¤ë¤¿¤á¡¤Âè\ref{fig:ExpansionOfMvdo}¿Þ¤Ë¤ÏÅ¸³«·Á¤ÎÎã¤â¼¨¤·¤¿¡¥

\begin{figure}\begin{center}
\fbox{~\,\begin{minipage}{\FrameWidth}\narrowbaselines
\vspace{3pt}
\begin{center}\begin{minipage}{240pt}\texttt{%
(mvdo ((x 1 (1+ x))\\
~~~~~~~((y z) (values 0 0) (values z x)))\\
~~~~~~((> x 5) (list x y z))\\
~~~~~~(princ (list x y z)))
}\end{minipage}\end{center}
\hspace{12zw}¤³¤ì¤Ï¼¡¤Î¤è¤¦¤ËÅ¸³«¤µ¤ì¤ë¡§
\begin{center}\begin{minipage}{240pt}\texttt{%
(let (\#:g2 \#:g3 \#:g4)\\
~~(mvpsetq \#:g2 1\\
~~~~~~~~~~~(\#:g3 \#:g4) (values 0 0))\\
~~(prog ((x \#:g2) (y \#:g3) (z \#:g4))\\
~~~~~~~~\#:g1\\
~~~~~~~~(if (> x 5)\\
~~~~~~~~~~~~(return (progn (list x y z))))\\
~~~~~~~~(princ (list x y z))\\
~~~~~~~~(mvpsetq x (1+ x)\\
~~~~~~~~~~~~~~~~~(y z) (values z x))\\
~~~~~~~~(go \#:g1)))
}\end{minipage}\end{center}
\vspace{1.3em}\end{minipage}~\,}\end{center}
\caption{\texttt{mvdo}¤Î¸Æ¤Ó½Ð¤·¤ÎÅ¸³«·Á¡¥}
\label{fig:ExpansionOfMvdo}
\end{figure}
%}}}
\subsection{¥Þ¥¯¥í¤ÎÉ¬Í×À­}   %{{{
°ú¿ô¤òÉ¾²Á¤«¤éÊÝ¸î¤¹¤ëÊýË¡¤Ï¥Þ¥¯¥í¤À¤±¤Ç¤Ï¤Ê¤¤¡¥
°ú¿ô¤ò¥¯¥í¡¼¥¸¥ã¤Ç³ç¤ëÊýË¡¤â¤¢¤ë¡¥
¾ò·ïÉÕ¤­É¾²Á¤ÈÈ¿ÉüÉ¾²Á¤Ï¡¤¤É¤Á¤é¤âËÜ¼ÁÅª¤Ë¥Þ¥¯¥í¤¬É¬Í×¤ÊÌõ¤Ç¤Ï¤Ê¤¤¤Î¤Ç¡¤»÷¤¿¤è¤¦¤Ê¤â¤Î¤À¡¥
Îã¤¨¤Ð\verb|if|¤ò´Ø¿ô¤È¤·¤Æ½ñ¤¯¤³¤È¤¬¤Ç¤­¤ë¡¥
\begin{verbatim}
(defun fnif (test then &optional else)
  (if test
      (funcall then)
      (if else (funcall else))))
\end{verbatim}
thenÉô¤ÈelseÉô¤ËÅö¤¿¤ë°ú¿ô¤Ï¥¯¥í¡¼¥¸¥ã¤È¤·¤ÆÉ½¸½¤¹¤ë¤³¤È¤ÇÊÝ¸î¤Ç¤­¤ë¡¥
¤À¤«¤é¼¡¤Î¤è¤¦¤Ë¤Ï¤»¤º¡¤
\begin{verbatim}
(if (rich) (go-sailing) (rob-bank))
\end{verbatim}
Âå¤ï¤ê¤Ë¼¡¤Î¤è¤¦¤Ë¤¹¤ë¤³¤È¤Ë¤Ê¤ë¡¥
\begin{verbatim}
(fnif (rich)
      #'(lambda () (go-sailing))
      #'(lambda () (rob-bank)))
\end{verbatim}
¤¿¤À¾ò·ïÉÕ¤­É¾²Á¤À¤±¤ò¼Â¸½¤·¤¿¤¤¤Ê¤é¡¤¥Þ¥¯¥í¤¬ÀäÂÐÉ¬Í×¤È¤¤¤¦¤ï¤±¤Ç¤Ï¤Ê¤¤¡¥
¥Þ¥¯¥í¤Ï¥×¥í¥°¥é¥à¤òÌÀ³Î¤Ë¤·¤Æ¤¯¤ì¤ë¤À¤±¤À¡¥
¤·¤«¤·°ú¿ô¤Î¼°¤ÎÃæ¿È¤òÀÚ¤êÊ¬¤±¤¿¤ê¡¤°ú¿ô¤È¤·¤ÆÅÏ¤µ¤ì¤¿ÊÑ¿ô¤òÂ«Çû¤¹¤ë¤¿¤á¤Ë¤Ï¥Þ¥¯¥í¤¬É¬Í×¤Ë¤Ê¤ë¡¥

Æ±¤¸¤³¤È¤¬È¿ÉüÍÑ¤Î¥Þ¥¯¥í¤Ë¤âÅö¤Æ¤Ï¤Þ¤ë¡¥
¥Þ¥¯¥í¤ÏËÜÂÎÉô¤Î¼°¤ÎÁ°¤ËÈ¿Éü¹½Â¤¤òÄêµÁ¤¹¤ëÍ£°ì¤ÎÊýË¡¤À¤¬¡¤
¥ë¡¼¥×ËÜÂÎ¤¬´Ø¿ô¤½¤Î¤â¤Î¤Ç³ç¤é¤ì¤Æ¤¤¤ë¸Â¤ê¡¤´Ø¿ô¤ÇÈ¿Éü¤ò¼Â¸½¤Ç¤­¤ë
\footnote{°ú¿ô¤ò´Ø¿ô¤Ë³ç¤ëÉ¬Í×¤Î¤Ê¤¤È¿ÉüÍÑ´Ø¿ô¤ò½ñ¤¯¤Î¤ÏÉÔ²ÄÇ½¤Ç¤Ï¤Ê¤¤¡¥
°ú¿ô¤È¤·¤ÆÅÏ¤µ¤ì¤¿¼°¤Ç\texttt{eval}¤ò¸Æ¤Ö´Ø¿ô¤¬ÄêµÁ¤Ç¤­¤ë¡¥
¤½¤ì¤¬\texttt{eval}¤Î»È¤¤¤«¤¿¤È¤·¤ÆÎÉ¤¯¤Ê¤¤¤³¤È¤ÎÀâÌÀ¤Ë¤Ï¡¤wer¥Ú¡¼¥¸¤ò»²¾È¡¥}¡¥
Îã¤¨¤ÐÁÈ¹þ¤ß´Ø¿ô\verb|mapc|¤Ï\verb|dolist|¤Î´Ø¿ôÈÇ¤À¡¥
\begin{verbatim}
(dolist (b bananas)
  (peel b)
  (eat b))
\end{verbatim}
¤³¤Î¼°¤Ï¼¡¤ÈÆ±¤¸ÉûºîÍÑ¤ò»ý¤Ä¡¥
\begin{verbatim}
(mapc #'(lambda (b)
          (peel b)
          (eat b))
      bananas)
\end{verbatim}
(¤¿¤À¤·Á°¼Ô¤Ï\verb|nil|¤ò¡¤¸å¼Ô¤Ï¥ê¥¹¥È\verb|bananas|¤òÊÖ¤¹¤¬¡¥)
Æ±ÍÍ¤Ë\verb|forever|¤â¡¤
¼°ËÜÂÎ¤ò¥¯¥í¡¼¥¸¥ã¤È¤·¤ÆÅÏ¤¹¤è¤¦¤Ë¤¹¤ì¤Ð´Ø¿ô¤È¤·¤Æ¼ÂÁõ¤Ç¤­¤ë¡¥
\begin{verbatim}
(defun forever (fn)
  (do ()
    (nil)
    (funcall fn)))
\end{verbatim}

¤·¤«¤·\verb|forever|¤Ç¤â¤½¤¦¤À¤¬¡¤È¿Éü¹½Â¤¤ÏÉáÄÌ¤ÏÈ¿Éü¤À¤±¤¬ÌÜÅª¤Ê¤Î¤Ç¤Ï¤Ê¤¤¡¥
Â«Çû¤ÈÈ¿Éü¤ÎÁÈ¤ß¹ç¤ï¤»¤¬ÌÜÅª¤Ê¤Î¤¬ÉáÄÌ¤À¡¥
´Ø¿ô¤ò»È¤¦¤È¡¤Â«Çû¤ÎÊý¤Î¸«¹þ¤ß¤Ï¸Â¤é¤ì¤ë¡¥
ÊÑ¿ô¤ò¥ê¥¹¥È¤ÎÎÙ¤ê¹ç¤¦Í×ÁÇ¤Ë¤½¤ì¤¾¤ìÂ«Çû¤·¤¿¤¤¤È¤­¤Ë¤Ï¡¤ÂÐ±þ´Ø¿ô¤Î¤É¤ì¤«¤ò»È¤¨¤Ð¤è¤¤¡¥
¤·¤«¤·Í×µá¤µ¤ì¤ë¤³¤È¤¬¤º¤Ã¤È¹þ¤ßÆþ¤Ã¤Æ¤¯¤ë¤È¡¤¥Þ¥¯¥í¤ò½ñ¤«¤¶¤ë¤òÆÀ¤Ê¤¤¤À¤í¤¦¡¥
%}}}
%}}}
\section{ÈÆÊÑ¿ô} %{{{
Âè8¾Ï¤Ç¤Ï¡¤¥Þ¥¯¥í¤ÎÍøÅÀ¤Î1¤Ä¤Ï°ú¿ô¤òÊÑ·Á¤Ç¤­¤ëÇ½ÎÏ¤À¤È¤¤¤¦¤³¤È¤Ë¿¨¤ì¤¿¡¥
¤½¤Î¼ï¤Î¥Þ¥¯¥í¤Î1¤Ä¤¬\verb|setf|¤À¡¥
¤³¤Î¾Ï¤Ç¤Ï¡¤\verb|setf|¤Î»ý¤Ä±£¤ì¤¿°ÕÌ£¤Ë»ëÅÀ¤ò¸þ¤±¡¤¤½¤Î¾å¤Ë¹½ÃÛ¤Ç¤­¤ë¥Þ¥¯¥í¤ÎÎã¤ò´ö¤Ä¤«¼¨¤¹¡¥

\verb|setf|¤Î¾å¤ËÅ¬ÀÚ¤Ê¥Þ¥¯¥í¤ò¹½ÃÛ¤¹¤ë¤³¤È¤Ï¡¤¶Ã¤¯ÄøÆñ¤·¤¤¡¥
¤³¤ÎÏÃÂê¤Ø¤ÎÆ³Æþ¤È¤·¤Æ¡¤ºÇ½é¤ÎÀá¤Ç¤Ï¾¯¡¹¤Þ¤º¤¤½ê¤Î¤¢¤ëÃ±½ã¤ÊÎã¤ò¼¨¤¹¡¥
¼¡¤ÎÀá¤Ç¤Ï¤½¤ì¤Î²¿¤¬¤Þ¤º¤¤¤Î¤«¤òÀâÌÀ¤·¡¤²þÁ±ÊýË¡¤ò¼¨¤¹¡¥
¤½¤Î¸å¤Î2Àá¤Ç¤Ï\verb|setf|¤Î¾å¤Ë¹½ÃÛ¤µ¤ì¤¿¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ÎÎã¤òÄó¼¨¤·¡¤
ºÇ¸å¤ÎÀá¤Ç\verb|setf|¤ÎµÕ¤ËÅö¤¿¤ëÆÈ¼«¤Î¥ª¥Ú¥ì¡¼¥¿¤ÎÄêµÁÊýË¡¤òÀâÌÀ¤¹¤ë¡¥
\subsection{³µÇ°}   %{{{
ÁÈ¹þ¤ß¥Þ¥¯¥í\verb|setf|¤Ï\verb|setq|¤Î°ìÈÌ²½¤ËÅö¤¿¤ë¡¥
\verb|setf|¤ÎÂè1°ú¿ô¤Ï¤¿¤À¤ÎÊÑ¿ô¤Ç¤Ê¤¯´Ø¿ô¤ä¥Þ¥¯¥í¤Î¸Æ¤Ó½Ð¤·¤Ç¤¢¤Ã¤Æ¤â¤è¤¤¡¥
\begin{verbatim}
> (setq lst '(a b c))
(ABC)
> (setf (car lst) 480)
480
> lst
(480 B C)
\end{verbatim}

°ìÈÌÅª¤Ë¤Ï\verb|(setf x y)|¤Ï
¡Ö\verb|x|¤¬\verb|y|¤ËÉ¾²Á¤µ¤ì¤ë¤è¤¦¤Ë¤·¤Æ¤ª¤¤¤Æ¤¯¤ì¡×¤È¤¤¤¦»Ø¼¨¤È¤·¤ÆÍý²ò¤Ç¤­¤ë¡¥
\verb|setf|¤Ï¥Þ¥¯¥í¤Ê¤Î¤Ç¡¤°ú¿ô¤ÎÆâÉô¤ò¸«¤Æ¤½¤Î¤è¤¦¤Ê»Ø¼¨¤ò¼Â¸½¤¹¤ë¤Ë¤Ï²¿¤ò¤¹¤ì¤Ð¤è¤¤¤«¤òÈ½ÃÇ¤Ç¤­¤ë¡¥
¡ÊÅ¸³«¸å¤Î¡Ë1°ú¿ô¤¬¥·¥ó¥Ü¥ë¤À¤Ã¤¿¤é¡¤\verb|setf|¤ÏÃ±¤Ë\verb|setq|¤ËÅ¸³«¤µ¤ì¤ë¡¥
¤·¤«¤·Âè1°ú¿ô¤¬ÊÌ¤ÎÊÑ¿ô¤òµá¤á¤ë¤¿¤á¤Î¼°¤À¤Ã¤¿¤È¤­¤Ï¡¤
\verb|setf|¤ÏÂÐ±þ¤¹¤ë³ÎÄê¤·¤¿Ì¿Îá(assertion)¤ËÅ¸³«¤µ¤ì¤ë¡¥
Âè2°ú¿ô¤ÏÄê¿ô¤Ê¤Î¤Ç¡¤Á°¤ÎÎã¤Ï¼¡¤Î¤è¤¦¤ËÅ¸³«¤µ¤ì¤ë¤«¤â¤·¤ì¤Ê¤¤¡¥
\begin{verbatim}
(progn (rplaca lst 480) 480)
\end{verbatim}

¤³¤Î¤è¤¦¤ËÊÑ¿ô¤òµá¤á¤ë¼°¤«¤é·èÄêÅª¤ÊÌ¿Îá¤ØÊÑ´¹¤¹¤ë¤³¤È¤Ï¥¤¥ó¥ô¥¡¡¼¥¸¥ç¥ó(inversion)¤È¸Æ¤Ð¤ì¤ë¡¥
\verb|car|¡¤\verb|cdr|¡¤\verb|nth|¡¤\verb|aref|¡¤\verb|get|¡¤\verb|gethash|µÚ¤Ó
\verb|defstruct|¤ÇÄêµÁ¤µ¤ì¤ë¥¢¥¯¥»¥¹´Ø¿ôÅù¡¤Common Lisp¤ÇÉÑÈË¤Ë»È¤ï¤ì¤ë¡¤
¥ª¥Ö¥¸¥§¥¯¥È¤Ë¥¢¥¯¥»¥¹¤¹¤ë¤¿¤á¤Î´Ø¿ô¤Ë¤Ï¥¤¥ó¥ô¥¡¡¼¥¸¥ç¥ó¤ËÅö¤¿¤ë¤â¤Î¤¬Í½¤áÄêµÁ¤µ¤ì¤Æ¤¤¤ë¡¥
(´°Á´¤Ê°ìÍ÷¤Ï\textsf{CLtL2}¤Î125¥Ú¡¼¥¸¤Ë¤¢¤ë)

\verb|setf|¤ÎÂè1°ú¿ô¤È¤·¤Æµ¡Ç½¤¹¤ë¼°¤ÏÈÆÊÑ¿ô¡Êgeneralized variable¡Ë¤È¸Æ¤Ð¤ì¤ë¡¥
ÈÆÊÑ¿ô¤Ï¶¯ÎÏ¤ÊÃê¾Ý²½¼êÃÊ¤Ç¤¢¤ë¤³¤È¤¬Ê¬¤«¤Ã¤Æ¤¤¤ë¡¥
¥¤¥ó¥ô¥¡¡¼¥¸¥ç¥ó²ÄÇ½¤Ê»²¾È¤ËÅ¸³«¤µ¤ì¤ë¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤ÏÁ´¤Æ¤½¤ì¼«ÂÎ¤¬¥¤¥ó¥ô¥¡¡¼¥¸¥ç¥ó²ÄÇ½¤È¤¤¤¦ÅÀ¤Ç¡¤
¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤ÏÈÆÊÑ¿ô¤È»÷¤Æ¤¤¤ë¡¥

¤Þ¤¿\verb|setf|¤Î¾å¤Ë¥Þ¥¯¥í¤â¹½ÃÛ¤¹¤ì¤Ð¡¤Áê¾è¸ú²Ì¤Ë¤è¤Ã¤Æ¤«¤Ê¤êÌÀ³Î¤Ê¥×¥í¥°¥é¥à¤¬¤Ç¤­¤ë¡¥
\verb|setf|¤Î¾å¤Ë¹½ÃÛ¤Ç¤­¤ë¥Þ¥¯¥í¤Î1¤Ä¤Ï\verb|toggle|¤À
\footnote{°Ê²¼¤ÎÀá¤Ç¸«¤ë¤è¤¦¤Ë¡¤¤³¤ÎÄêµÁ¤ÏÀµ¤·¤¯¤Ê¤¤¡¥}¡¥
\begin{verbatim}
(defmacro toggle (obj)               ; ´Ö°ã¤¤
  `(setf ,obj (not ,obj)))
\end{verbatim}
¤³¤ì¤ÏÈÆÊÑ¿ô¤ÎÃÍ¤òÀÚÂØ¤¨¤ë¡§
\begin{verbatim}
> (let ((lst '(a b c)))
    (toggle (car lst))
    lst)
(NIL B C)
\end{verbatim}

¤µ¤Æ¼¡¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ò¹Í¤¨¤è¤¦¡¥
Ã¯¤«¤¬\wadash Ãë¤Î¥É¥é¥Þ·à¾ì¤ÎµÓËÜ²È¡¤ÀºÎÏ¤Ë°î¤ì¤¿¼Ò¸ò³¦¤Î¿Í´Ö¡¤¤Ï¤¿¤Þ¤¿À¯ÅÞ¤Î»öÌ³°÷¤«\wadash
¾®¤µ¤ÊÄ®¤Î½»¿Í¤Î´Ö¤Î¿Í´Ö´Ø·¸¤òÁ´¤Æµ­Ï¿¤·¤¿¥Ç¡¼¥¿¥Ù¡¼¥¹¤ò±¿±Ä¤·¤¿¤¤¤È¤·¤è¤¦¡¥
¥Æ¡¼¥Ö¥ë¤Ë¤Ï½»¿Í¤ÎÍ§¿Í¤òµ­Ï¿¤¹¤ëÍó¤¬É¬Í×¤À¡¥
\begin{verbatim}
(defvar *friends* (make-hash-table))
\end{verbatim}
¤³¤Î¥Ï¥Ã¥·¥åÉ½¤Î¥¨¥ó¥È¥ê¤Ï¤½¤ì¼«¿È¤¬¥Ï¥Ã¥·¥åÉ½¤Ç¡¤
¤³¤³¤Ë¤ÏÍ§¿Í¤Î¸õÊä¤ÎÌ¾Á°¤¬\verb|t|¤Þ¤¿¤Ï\verb|nil|¤Ë·ë¹ç¤µ¤ì¤Æ¤¤¤ë¡¥
\begin{verbatim}
(setf (gethash 'mary *friends*) (make-hash-table))
\end{verbatim}
John¤òMary¤ÎÍ§¿Í¤È¤·¤ÆÅÐÏ¿¤¹¤ë¤Ë¤Ï¡¤¼¡¤Î¤è¤¦¤Ë¤¹¤ë¤³¤È¤Ë¤Ê¤ë¡¥
\begin{verbatim}
(setf (gethash 'john (gethash 'mary *friends*)) t)
\end{verbatim}
Ä®¤Ï2¤Ä¤Î¥°¥ë¡¼¥×¤ËÊ¬¤±¤é¤ì¤ë¡¥
¥°¥ë¡¼¥×¤È¤¤¤¦¤â¤Î¤Ï¤¤¤Ä¤Ç¤â¸ß¤¤¤Ë¡ÖÃç´Ö¤¸¤ã¤Ê¤¤¤ä¤Ä¤ÏÅ¨¤À¡×¤È¸À¤¤¤¿¤¬¤ë¤Î¤Ç¡¤
Ä®¤Î¿Í´Ö¤Ï¤É¤Á¤é¤«¤Î¥°¥ë¡¼¥×¤ËÂ°¤¹¤ë¤³¤È¤òÍ¾µ·¤Ê¤¯¤µ¤ì¤ë¡¥
¤À¤«¤éÃ¯¤«¤¬¥°¥ë¡¼¥×¤ò°Ü¤ë¤È¡¤¸µ¤ÎÍ§¿Í¤ÏÅ¨¤Ë¡¤Å¨¤ÏÍ§¿Í¤ËÊÑ¤ï¤ë¡¥

ÁÈ¹þ¤ß¥ª¥Ú¥ì¡¼¥¿¤À¤±¤Ë¤è¤Ã¤Æ\verb|x|¤¬\verb|y|¤ÎÍ§¿Í¤«¤É¤¦¤«¤òÀÚÂØ¤¨¤ë¤Ë¤Ï¡¤
¼¡¤Î¤è¤¦¤Ë¤¹¤ë¤³¤È¤Ë¤Ê¤ë¡¥
\begin{verbatim}
(setf (gethash x (gethash y *friends*))
      (not (gethash x (gethash y *friends*))))
\end{verbatim}
¤³¤ì¤Ï¤«¤Ê¤êÊ£»¨¤Ê¼°¤À
¡Ê¤â¤Á¤í¤ó\verb|setf|¤Ê¤·¤Ç¤Ï¤³¤ÎÄøÅÙ¤Ç¤ÏºÑ¤Þ¤Ê¤«¤Ã¤¿¤À¤í¤¦¤¬¡Ë¡¥
¥Ç¡¼¥¿¥Ù¡¼¥¹¤Ë¼¡¤Î¤è¤¦¤Ê¥¢¥¯¥»¥¹ÍÑ¥Þ¥¯¥í¤òÄêµÁ¤·¤Æ¤¤¤ì¤Ð¡¤
\begin{verbatim}
(defmacro friend-of (p q)
  `(gethash ,p (gethash ,q *friends*)))
\end{verbatim}
¤³¤Î¥Þ¥¯¥í¤È\verb|toggle|¤È¤Ç¡¤¥Ç¡¼¥¿¥Ù¡¼¥¹¤ÎÊÑ¹¹¤ò°·¤¦¤¿¤á¤Ë¤Ï¤«¤Ê¤ê½àÈ÷¤¬À°¤Ã¤¿¤³¤È¤Ë¤Ê¤ë¡¥
¾å¤Î¹¹¿·Áàºî¤Ï´Ê·é¤ËÉ½¸½¤Ç¤­¤ë¤À¤í¤¦¡¥
\begin{verbatim}
(toggle (friend-of x y))
\end{verbatim}

ÈÆÊÑ¿ô¤ÏÈþÌ£¤·¤¤·ò¹¯¿©ÉÊ¤Î¤è¤¦¤Ê¤â¤Î¤À¡¥
¤³¤ì¤Ë¤è¤Ã¤Æ¤Ç¤­¤ë¥×¥í¥°¥é¥à¤Ï¸«»ö¤Ë¥â¥¸¥å¡¼¥ë²½¤µ¤ì¡¤¤½¤ì¤Ç¤¤¤ÆÈþ¤·¤¯¥¨¥ì¥¬¥ó¥È¤À¡¥
¥Ç¡¼¥¿¹½Â¤¤Ë¥Þ¥¯¥í¤«¥¤¥ó¥ô¥¡¡¼¥¸¥ç¥ó²ÄÇ½¤Ê´Ø¿ô¤òÄÌ¤¸¤Æ¥¢¥¯¥»¥¹¤òÄó¶¡¤¹¤ì¤Ð¡¤
Â¾¤Î¥â¥¸¥å¡¼¥ë¤Ï¥Ç¡¼¥¿É½¸½¤Î¾ÜºÙ¤òÃÎ¤ëÉ¬Í×¤Î¤Ê¤¤¤Þ¤Þ\verb|setf|¤Ç¥Ç¡¼¥¿¹½Â¤¤òÁàºî¤Ç¤­¤ë¡¥
%}}}
\subsection{Ê£¿ô²ó¤ÎÉ¾²Á¤Ë´Ø¤ï¤ëÌäÂê}   %{{{
Á°¤ÎÀá¤Ç¤Ï\verb|toggle|¤ÎºÇ½é¤ÎÄêµÁ¤Ï¤Þ¤º¤¤½ê¤¬¤¢¤ë¤È·Ù¹ð¤·¤¿¡¥
\begin{verbatim}
(defmacro toggle (obj)               ; ´Ö°ã¤¤
  `(setf ,obj (not ,obj)))
\end{verbatim}

¤³¤ì¤ÏÂè10.1Àá¤ÇÀâÌÀ¤·¤¿ÌäÂê¡¤¤Ä¤Þ¤êÊ£¿ô²ó¤ÎÉ¾²Á¤Î¸µ¤Ë¤Ê¤ë¡¥
ÌäÂê¤Ï°ú¿ô¤ËÉûºîÍÑ¤¬¤¢¤ë¤È¤­¤Ëµ¯¤­¤ë¡¥
Îã¤¨¤Ð\verb|lst|¤¬¥ª¥Ö¥¸¥§¥¯¥È¤«¤éÀ®¤ë¥ê¥¹¥È¤Ç¡¤¤½¤ì¤ò»È¤Ã¤Æ¤³¤¦½ñ¤¤¤¿¤È¤­¡¤
\begin{verbatim}
(toggle (nth (incf i) lst))
\end{verbatim}
$(i+1)$ÈÖÌÜ¤ÎÍ×ÁÇ¤ÎÃÍ¤òÀÚÂØ¤¨¤Æ¤¤¤ë¤â¤Î¤È»×¤¦¤À¤í¤¦¡¥
¤·¤«¤·\verb|toggle|¤Î¸½ºß¤ÎÄêµÁ¤Ç¤Ï¤³¤Î¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ï¼¡¤Î¤è¤¦¤ËÅ¸³«¤µ¤ì¤ë¡¥
\begin{verbatim}
(setf (nth (incf i) lst)
      (not (nth (incf i) lst)))
\end{verbatim}
¤³¤ì¤Ï\verb|i|¤ò2²óÁý²Ã¤µ¤»¡¤$(i+1)$ÈÖÌÜ¤ÎÍ×ÁÇ¤ò$(i+2)$ÈÖÌÜ¤ÎÍ×ÁÇ¤ÎµÕ¤ËÀßÄê¤¹¤ë¡¥
¤è¤Ã¤Æ¼¡¤ÎÎã¤Ç¤Ï¡¤
\begin{verbatim}
> (let ((lst '(t nil t))
             (i -1))
        (toggle (nth (incf i) lst))
        lst)
(T NIL T)
\end{verbatim}
\verb|toggle|¤ò¸Æ¤ó¤Ç¤â¸ú²Ì¤Ï¤Ê¤¤¤è¤¦¤À¡¥

\verb|toggle|¤Î°ú¿ô¤È¤·¤ÆÍ¿¤¨¤é¤ì¤¿¼°¤ò¼è¤ê½Ð¤·¡¤
\verb|setf|¤ÎÂè1°ú¿ô¤Î¾ì½ê¤ËÁÞÆþ¤¹¤ë¤À¤±¤Ç¤Ï½½Ê¬¤Ç¤Ï¤Ê¤¤¡¥
¼°¤ÎÆâÉô¤ò¸«¤Æ¡¤¤½¤ÎÆ°ºî¤òÃÎ¤é¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤Î¤À¡¥
¤½¤ì¤¬ÉôÊ¬¼°¤ò´Þ¤à¤Ê¤é¡¤¤½¤ì¤é¤¬ÉûºîÍÑ¤ò»ý¤Ä¤³¤È¤ò¹ÍÎ¸¤·¡¤Ê¬³ä¤·¤ÆÊÌ¸Ä¤ËÉ¾²Á¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
°ìÈÌÅª¤Ë¸À¤¨¤Ð¡¤¤³¤ì¤ÏÊ£»¨¤Ê»Å»ö¤À¡¥

Í¾·×¤Ê¼ê´Ö¤ò¾Ê¤¯¤¿¤á¡¤
Common Lisp¤Ï\verb|setf|¤Î¾å¤Ë¡¤¤¢¤ë¸Â¤é¤ì¤¿ÈÏ°Ï¤Î¥Þ¥¯¥í¤ò¼«Æ°Åª¤ËÄêµÁ¤¹¤ë¥Þ¥¯¥í¤òÄó¶¡¤·¤Æ¤¤¤ë¡¥
¤³¤Î¥Þ¥¯¥í¤Ï\verb|define-modify-macro|¤È¤¤¤¦Ì¾Á°¤Ç¡¤3¸Ä¤Î°ú¿ô¤ò¼è¤ë¡¥
ÄêµÁ¤·¤¿¤¤¥Þ¥¯¥í¤ÎÌ¾Á°¡¤¡ÊÈÆÊÑ¿ô¤Î¸å¤Ë¡Ë¼è¤ë¤«¤â¤·¤ì¤Ê¤¤ÉÕ²ÃÅª¤Ê°ú¿ô¡¤
¤½¤·¤ÆÈÆÊÑ¿ô¤Î¿·¤·¤¤ÃÍ¤òÊÖ¤¹´Ø¿ô¤ÎÌ¾Á°¤À
\footnote{¤³¤ì¤Ï°ìÈÌÅª¤Ê°ÕÌ£¤Ç¤Î´Ø¿ôÌ¾¤À¡§
\texttt{1+}¤Þ¤¿¤Ï\texttt{(lambda (x) (+ x 1))}¤Î¤É¤Á¤é¤Ç¤â¤è¤¤¡¥}¡¥

\verb|define-modify-macro|¤ò»È¤¦¤È¡¤\verb|define|¤Ï¤³¤¦¤·¤ÆÄêµÁ¤Ç¤­¤ë¡¥
\begin{verbatim}
(define-modify-macro toggle () not)
\end{verbatim}

´¹¸À¤¹¤ì¤Ð¡¤¤³¤ì¤Ï¡Ö\verb|(toggle place)|¤Î·Á¤Î¼°¤òÉ¾²Á¤¹¤ë¤Ë¤Ï¡¤
\verb|place|¤Î»ØÄê¤¹¤ë°ÌÃÖ¤ò¸«¤Ä¤±¡¤¤½¤·¤Æ¤½¤³¤ËÃß¤¨¤é¤ì¤¿ÃÍ¤¬\verb|val|¤Ê¤é¤Ð¡¤
¤½¤ì¤ò\verb|(not val)|¤ÎÃÍ¤ÇÃÖ¤­´¹¤¨¤ë¤³¤È¡×¤È»Ø¼¨¤·¤Æ¤¤¤ë¤³¤È¤Ë¤Ê¤ë¡¥
¼¡¤Ï¿·¤·¤¤¥Þ¥¯¥í¤òÆ±¤¸Îã¤Ë»È¤Ã¤¿¤È¤³¤í¤À¡¥
\begin{verbatim}
> (let ((lst '(t nil t))
        (i -1))
    (toggle (nth (incf i) lst))
    lst)
(NIL NIL T)
\end{verbatim}

¤³¤ÎÄêµÁ¤ÏÀµ¤·¤¤·ë²Ì¤ò¤â¤¿¤é¤¹¤¬¡¤¹¹¤Ë°ìÈÌ²½¤¹¤ë¤³¤È¤â¤Ç¤­¤ë¡¥
\verb|setf|¤È\verb|setq|¤ÏÇ¤°Õ¤Î¿ô¤Î°ú¿ô¤ò¼è¤ì¤ë¤Î¤À¤«¤é¡¤\verb|toggle|¤â¤½¤¦¤¢¤ë¤Ù¤­¤À¡¥
Âè\ref{fig:MacrosOnGnrlVars}¤Ë¼¨¤·¤¿¤è¤¦¤Ë¡¤
¤³¤Îµ¡Ç½¤Ï\verb|define-modify-macro|¤Î¾å¤ËÊÌ¤Î¥Þ¥¯¥í¤òÄêµÁ¤¹¤ë¤³¤È¤ÇÄÉ²Ã¤Ç¤­¤ë¡¥
%}}}
\subsection{¿·¤·¤¤¥æ¡¼¥Æ¥£¥ê¥Æ¥£}   %{{{
¤³¤ÎÀá¤Ç¤ÏÈÆÊÑ¿ô¤ËÂÐ¤·¤Æµ¡Ç½¤¹¤ë¿·¤·¤¤¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ÎÎã¤ò´ö¤Ä¤«¼¨¤¹¡¥
°ú¿ô¤ò\verb|setf|¤Ë¤½¤Î¤Þ¤Þ¤Î·Á¤ÇÅÏ¤¹¤¿¤á¤Ë¤Ï¡¤¤½¤ì¤é¤Ï¥Þ¥¯¥í¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro allf (val &rest args)
  (with-gensyms (gval)
    `(let ((,gval ,val))
       (setf ,@(mapcan #'(lambda (a) (list a gval))
                        args)))))

(defmacro nilf (&rest args) `(allf nil ,@args))

(defmacro tf (&rest args) `(allf t ,@args))

(defmacro toggle (&rest args)
  `(progn
     ,@(mapcar #'(lambda (a) `(toggle2 ,a))
                args)))

(define-modify-macro toggle2 () not)
\end{FramedVerb}\end{center}
\caption{ÈÆÊÑ¿ô¤ËÂÐ¤·¤Æµ¡Ç½¤¹¤ë¥Þ¥¯¥í¡¥}
\label{fig:MacrosOnGnrlVars}
\end{figure}

Âè\ref{fig:MacrosOnGnrlVars}¤Ë¤Ï¡¤\verb|setf|¤Î¾å¤ËÄêµÁ¤·¤¿¿·¤·¤¤¥Þ¥¯¥í¤ò4¸Ä¼¨¤·¤¿¡¥
ºÇ½é¤Î\verb|allf|¤Ï¡¤Ê£¿ô¤ÎÈÆÊÑ¿ô¤òÆ±¤¸ÃÍ¤ËÀßÄê¤¹¤ë¤¿¤á¤Î¤â¤Î¤À¡¥
¤µ¤é¤Ë¤½¤Î¾å¤Ë\verb|nilf|¤È\verb|tf|¤¬ºî¤é¤ì¤¿¡¥
¤³¤ì¤é¤Ï°ú¿ô¤ò¤½¤ì¤¾¤ì\verb|nil|¤È\verb|t|¤ËÀßÄê¤¹¤ë¡¥
¤³¤ì¤é¤ÏÃ±½ã¤Ê¥Þ¥¯¥í¤À¤¬¡¤¥×¥í¥°¥é¥à¤ËÂç¤­¤Ê°ã¤¤¤òÀ¸¤à¡¥

\verb|setq|¤ÈÆ±ÍÍ¡¤\verb|setf|¤âÊ£¿ô¤Î°ú¿ô¤ò¼è¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
¤¹¤Ê¤ï¤ÁÂ¾¤ËÀßÄê¤·¤¿¤¤ÊÑ¿ô¤ÈÃÍ¤ÎÁÈ¤À¡¥
\begin{verbatim}
(setf x 1 y 2)
\end{verbatim}
¤³¤ì¤é¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤âÆ±ÍÍ¤À¤¬¡¤È¾Ê¬¤Î°ú¿ô¤ò¾ÊÎ¬¤¹¤ë¤³¤È¤â¤Ç¤­¤ë¡¥
Ê£¿ô¤ÎÊÑ¿ô¤ò\verb|nil|¤ËÀßÄê¤·¤¿¤¤¤È¤­¤Ï¡¤
\begin{verbatim}
(setf x nil y nil z nil)
\end{verbatim}
¤Ç¤Ï¤Ê¤¯¡¤¤¿¤À¤³¤¦¤¹¤ì¤Ð¤è¤¤¡¥
\begin{verbatim}
(nilf x y z)
\end{verbatim}

ºÇ¸å¤Î¥Þ¥¯¥í\verb|toggle|¤ÏÁ°¤ÎÀá¤ÇÀâÌÀ¤·¤¿¡¥
¤³¤ì¤Ï\verb|nilf|¤È»÷¤Æ¤¤¤ë¤¬¡¤¤½¤ì¤¾¤ì¤Î°ú¿ô¤ËµÕ¤Î¿¿ÍýÃÍ¤òÍ¿¤¨¤ë¡¥

¤³¤ì¤é4¸Ä¤Î¥Þ¥¯¥í¤ÏÂåÆþÍÑ¥ª¥Ú¥ì¡¼¥¿¤Ë´Ø¤¹¤ë½ÅÍ×¤ÊÅÀ¤ò¤Ï¤Ã¤­¤êÉ½¤·¤Æ¤¤¤ë¡¥
¥ª¥Ú¥ì¡¼¥¿¤òÉáÄÌ¤ÎÊÑ¿ô¤Î¤ß¤ËÂÐ¤·¤Æ»È¤¦¤Ä¤â¤ê¤Ç¤â¡¤
\verb|setq|¤Ç¤Ê¤¯\verb|setf|¤ËÅ¸³«¤µ¤ì¤ë¥Þ¥¯¥í¤ò½ñ¤¤¤¿Êý¤¬¤è¤¤¤È¤¤¤¦¤³¤È¤À¡¥
Âè1°ú¿ô¤¬¥·¥ó¥Ü¥ë¤Ê¤é¤Ð\verb|setf|¤Ï·ë¶É\verb|setq|¤ËÅ¸³«¤µ¤ì¤ë¤Î¤À¡¥
\verb|setf|¤Î°ìÈÌÀ­¤ò¤Ê¤ó¤Î°úÂØ¤â¤Ê¤¯µý¼õ¤Ç¤­¤ë¤Î¤À¤«¤é¡¤
¥Þ¥¯¥íÅ¸³«¤Ç¤Ï\verb|setq|¤ò»È¤¦Êý¤¬¹¥¤Þ¤·¤¤¤³¤È¤Ï¤Þ¤º¤Ê¤¤¤À¤í¤¦¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(define-modify-macro concf (obj) nconc)

(define-modify-macro conc1f (obj)
  (lambda (place obj)
    (nconc place (list obj))))

(define-modify-macro concnew (obj &rest args)
  (lambda (place obj &rest args)
    (unless (apply #'member obj place args)
      (nconc place (list obj)))))
\end{FramedVerb}\end{center}
\caption{ÈÆÊÑ¿ô¤ËÂÐ¤¹¤ë¥ê¥¹¥ÈÁàºî¡¥}
\label{fig:ListOpOnGnrlVars}
\end{figure}

Âè\ref{fig:ListOpOnGnrlVars}¿Þ¤Ë¤Ï¥ê¥¹¥ÈËöÈø¤òÇË²õÅª¤ËÁàºî¤¹¤ë¥Þ¥¯¥í¤ò3¸Ä¼¨¤·¤¿¡¥
Âè3.1Àá¤Ç¤ÏÉûºîÍÑ¤ò´üÂÔ¤·¤Æ
\begin{verbatim}
(nconc x y)
\end{verbatim}
¤ò»È¤¦¤³¤È¤Ï°ÂÁ´¤Ç¤Ï¤Ê¤¯¡¤Âå¤ï¤ê¤Ë¤³¤¦¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤³¤È¤Ë¿¨¤ì¤¿¡¥
\begin{verbatim}
(setq x (nconc x y))
\end{verbatim}

¤³¤Î´·ÍÑË¡¤Ï\verb|concf|¤ÎÃæ¤ËËä¤á¹þ¤Þ¤ì¤Æ¤¤¤ë¡¥
¹¹¤ËÆÃ²½¤·¤¿\verb|conc1f|¤È\verb|concnew|¤È¤Ï¡¤
¤½¤ì¤¾¤ì\verb|push|¤È\verb|pushnew|¤È¤ò¥ê¥¹¥È¤ÎµÕÊý¸þ¤Ë»È¤¦¤è¤¦¤Ê¤â¤Î¤À¡¥
\verb|conc1f|¤Ï1¸Ä¤ÎÍ×ÁÇ¤ò¥ê¥¹¥ÈËöÈø¤ËÄÉ²Ã¤¹¤ë¡¥
\verb|concnew|¤ÏÆ±ÍÍ¤À¤¬Í×ÁÇ¤¬´û¤Ë´Þ¤Þ¤ì¤Æ¤¤¤Ê¤¤¤È¤­¤Ë¸Â¤ë¡¥

Âè2.2Àá¤Ç¡¤´Ø¿ôÌ¾¤Ï¥·¥ó¥Ü¥ë¤ÎÂ¾¤Ë$\lambda$¼°¤Ç¤¢¤Ã¤Æ¤â¤è¤¤¤È½ñ¤¤¤¿¡¥
¤½¤Î¤¿¤á\verb|conc1f|¤ÎÄêµÁ¤Î¤è¤¦¤Ë¡¤
$\lambda$¼°¤ò´Ý¤´¤È\verb|define-modify-macro|¤ÎÂè3°ú¿ô¤Ë»È¤Ã¤Æ¤â·ë¹½¤À¡¥
ert¥Ú¡¼¥¸¤Î\verb|conc1|¤ò»È¤¨¤Ð¡¤¤³¤Î¥Þ¥¯¥í¤Ï¼¡¤Î¤è¤¦¤Ë¤â½ñ¤±¤ë¡¥
\begin{verbatim}
(define-modify-macro conc1f (obj) conc1)
\end{verbatim}

Âè\ref{fig:ListOpOnGnrlVars}¿Þ¤Î¥Þ¥¯¥í¤Ï¤¢¤ëÎ±ÊÝ¤Î¸µ¤Ç»È¤¦¤Ù¤­¤À¡¥
¤¹¤Ê¤ï¤Á¡¤ËöÈø¤ËÍ×ÁÇ¤òÄÉ²Ã¤·¤Æ¤¤¤Ã¤Æ¥ê¥¹¥È¤òºî¤í¤¦¤È»×¤Ã¤Æ¤¤¤ë¤Î¤Ê¤é¡¤
\verb|push|¤ò»È¤¤¡¤ºÇ¸å¤Ë¥ê¥¹¥È¤ò\verb|nreverse|¤Ç¥¤¥ó¥ô¥¡¡¼¥¸¥ç¥ó¤¹¤ëÊý¤¬¹¥¤Þ¤·¤¤¤È¤¤¤¦ÅÀ¤À¡¥
¥ê¥¹¥È¤ÎÀèÆ¬¤Ë²¿¤«Áàºî¤ò¹Ô¤¦Êý¤¬¡¤ËöÈø¤Ë¹Ô¤¦¤è¤ê¤â³Ú¤ËºÑ¤à¡¥
ËöÈø¤ËÁàºî¤ò¹Ô¤¦¤Ë¤Ï¡¤¤Þ¤º¤½¤³¤Þ¤ÇÅþÃ£¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤«¤é¤À¡¥
Common Lisp¤ËÁ°¼Ô¤ò¹Ô¤¦¥ª¥Ú¥ì¡¼¥¿¤¬Â¿¤¯¡¤¸å¼Ô¤Î¤¿¤á¤Î¤â¤Î¤¬¾¯¤Ê¤¤¤Î¤Ï¡¤
¤ª¤½¤é¤¯¸úÎ¨Åª¤Ê¥×¥í¥°¥é¥ß¥ó¥°¤òÎå¹Ô¤¹¤ë¤¿¤á¤À¤í¤¦¡¥
%}}}
\subsection{¹¹¤ËÊ£»¨¤Ê¥æ¡¼¥Æ¥£¥ê¥Æ¥£}   %{{{
\verb|define-modify-macro|¤À¤±¤Ç\verb|setf|¤Î¾å¤Ë¤É¤ó¤Ê¥Þ¥¯¥í¤â¹½ÃÛ¤Ç¤­¤ë¤ï¤±¤Ç¤Ï¤Ê¤¤¡¥
Îã¤¨¤Ð¡¤ÈÆÊÑ¿ô¤ËÇË²õÅª¤Ë´Ø¿ô¤òÅ¬ÍÑ¤¹¤ë¥Þ¥¯¥í\verb|f|¤òÄêµÁ¤·¤¿¤¤¤È¤·¤è¤¦¡¥
ÁÈ¹þ¤ß¥Þ¥¯¥í\verb|incf|¤Ï¡¤\verb|+| ¤Ë\verb|setf|¤ò»È¤¦¤³¤È¤Î¾ÊÎ¬¤À¡¥
¼¡¤Î¤è¤¦¤Ë¤·¤Ê¤¯¤È¤â¡¤
\begin{verbatim}
(setf x (+ x y))
\end{verbatim}
¤¿¤À¤³¤¦¤¹¤ì¤Ð¤è¤¤¡¥
\begin{verbatim}
(incf x y)
\end{verbatim}

¿·¤·¤¯ºî¤ë\verb|f|¤Ï¤³¤Î¹Í¤¨¤Î°ìÈÌ²½¤À¡¥
\verb|incf|¤Ï \verb|+| ¤Î¸Æ¤Ó½Ð¤·¤ËÅ¸³«¤µ¤ì¤ë¤¬¡¤
\verb|f|¤ÏÂè1°ú¿ô¤È¤·¤ÆÅÏ¤µ¤ì¤¿¥ª¥Ú¥ì¡¼¥¿¤Î¸Æ¤Ó½Ð¤·¤ËÅ¸³«¤µ¤ì¤ë¡¥
Îã¤¨¤Ðcvb¥Ú¡¼¥¸¤Î\verb|scale-objs|¤ÎÄêµÁ¤Ç¤Ï¡¤¤³¤¦½ñ¤«¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤«¤Ã¤¿¡¥
\begin{verbatim}
(setf (obj-dx o) (* (obj-dx o) factor))
\end{verbatim}
\verb|f|¤ò»È¤¨¤Ð¡¤¤³¤ì¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ë¡¥
\begin{verbatim}
(_f * (obj-dx o) factor)
\end{verbatim}

\verb|f|¤ÎÄêµÁ¤ÇÈÈ¤¹¸í¤ê¤Ï¡¤¼¡¤Î¤è¤¦¤Ê¤â¤Î¤À¤í¤¦¡¥
\begin{verbatim}
(defmacro _f (op place &rest args)          ; ¸í¤ê
  `(setf ,place (,op ,place ,@args)))
\end{verbatim}
»ÄÇ°¤À¤¬¡¤\verb|define-modify-macro|¤Ç¤ÏÅ¬ÀÚ¤Ë\verb|f|¤òÄêµÁ¤¹¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡¥
¤½¤ì¤ÏÈÆÊÑ¿ô¤ËÅ¬ÍÑ¤µ¤ì¤ë¥ª¥Ú¥ì¡¼¥¿¤¬°ú¿ô¤È¤·¤ÆÍ¿¤¨¤é¤ì¤ë¤«¤é¤À¡¥

¤³¤Î¤è¤¦¤Ë¹¹¤ËÊ£»¨¤Ê¥Þ¥¯¥í¤Ï¼êºî¤ê¤ÇÄêµÁ¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤½¤¦¤¤¤Ã¤¿¥Þ¥¯¥í¤ò½ñ¤­°×¤¯¤¹¤ë¤¿¤á¡¤Common Lisp¤Ï´Ø¿ô\verb|get-setf-method|¤òÄó¶¡¤·¤Æ¤¤¤ë¡¥
¤³¤ì¤ÏÈÆÊÑ¿ô¤ò¼è¤ê¡¤¤½¤ÎÃÍ¤ò¼èÆÀ¤Þ¤¿¤ÏÀßÄê¤¹¤ë¤¿¤á¤ËÉ¬Í×¤ÊÁ´¤Æ¤Î¾ðÊó¤òÊÖ¤¹¤â¤Î¤À¡¥
¼¡¤Î¼°¤ò¼ê¤ÇÅ¸³«¤¹¤ë¤³¤È¤Ç¡¤¤³¤Î¾ðÊó¤Î»È¤¤Êý¤ò¼¨¤¹¡¥
\begin{verbatim}
(incf (aref a (incf i)))
\end{verbatim}

\verb|get-setf-method|¤òÈÆÊÑ¿ô¤ËÂÐ¤·¤Æ¸Æ¤Ó½Ð¤¹¤È¡¤¥Þ¥¯¥íÅ¸³«Æâ¤Ç¤Î»È¤¦¤¿¤á¤ÎÃÍ¤¬5¸ÄÊÖ¤µ¤ì¤ë¡¥
\begin{verbatim}
> (get-setf-method '(aref a (incf i)))
(#:G4 #:G5)
(A (INCF I))
(#:G6)
(SYSTEM:SET-AREF #:G6 #:G4 #:G5)
(AREF #:G4 #:G5)
\end{verbatim}
ºÇ½é¤Î2¸Ä¤ÎÃÍ¤Ï¡¤°ì»þÊÑ¿ô¤È¤½¤ì¤ËÂåÆþ¤¹¤ë¤Ù¤­ÃÍ¤Î¥ê¥¹¥È¤À¡¥
¤À¤«¤éÅ¸³«·Á¤ò¼¡¤Î¤è¤¦¤Ë»Ï¤á¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
\begin{verbatim}
(let* ((#:g4 a)
            (#:g5 (incf i)))
   ...)
\end{verbatim}

°ìÈÌÅª¤Ê¾õ¶·¤Ç¤ÏÃÍ¤Î¼°¤ÏÀè¤Ë½Ð¤Æ¤­¤¿¼°¤ò»²¾È¤·¤Æ¤¤¤ë¤«¤âÃÎ¤ì¤Ê¤¤¤Î¤Ç¡¤
¤³¤ì¤é¤ÎÂ«Çû¤Ï\verb|let*| Æâ¤Çºî¤é¤ì¤ë¤Ù¤­¤À¡¥
3ÈÖÌÜ¤È
\footnote{Âè3¤ÎÃÍ¤Ï¸½ºß¤Î¤È¤³¤í¾ï¤Ë1Í×ÁÇ¤«¤éÀ®¤ë¥ê¥¹¥È¤À¡¥
¤³¤ì¤¬¥ê¥¹¥È¤È¤·¤ÆÍ¿¤¨¤é¤ì¤ë¤Î¤Ï¡¤
ÈÆÊÑ¿ô¤ËÊ£¿ô¤ÎÃÍ¤òÃß¤¨¤ë¡Ê¤³¤ì¤Þ¤Ç¤Î¤È¤³¤í¼Â¸½¤µ¤ì¤Æ¤¤¤Ê¤¤¡Ë²ÄÇ½À­¤òÄó¶¡¤¹¤ë¤¿¤á¤À¡¥}
5ÈÖÌÜ¤ÎÃÍ¤Ï¡¤ÊÌ¤Î°ì»þÊÑ¿ô¤ÈÈÆÊÑ¿ô¤Î¸µ¤ÎÃÍ¤òÊÖ¤¹¼°¤À¡¥
¤³¤ÎÃÍ¤Ë1¤ò²Ã¤¨¤¿¤¤¤Î¤Ç¡¤¸å¼Ô¤ò \verb|1+| ¤Î¸Æ¤Ó½Ð¤·Æâ¤ËÆþ¤ì¤ë¡¥
\begin{verbatim}
(let* ((#:g4 a)
            (#:g5 (incf i))
            (#:g6 (1+ (aref #:g4 #:g5))))
   ...)
\end{verbatim}

ºÇ¸å¤Ë\verb|get-setf-method|¤ÎÊÖ¤¹4ÈÖÌÜ¤ÎÃÍ¤È¤Ï¡¤
¿·¤·¤¤Â«Çû¤Î¥¹¥³¡¼¥×Æâ¤Ç¹Ô¤ï¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤ÂåÆþÁàºî¤À¡¥
\begin{verbatim}
(let* ((#:g4 a)
            (#:g5 (incf i))
            (#:g6 (1+ (aref #:g4 #:g5))))
   (system:set-aref #:g6 #:g4 #:g5))
\end{verbatim}

¤³¤Î¼°¤ÏCommon Lisp¤Î°ìÉô¤Ç¤Ï¤Ê¤¤ÆâÉô´Ø¿ô¤ò»²¾È¤·¤Æ¤¤¤ë¤³¤È¤ÎÊý¤¬Â¿¤¤¡¥
ÉáÄÌ\verb|setf|¤Ï¤½¤ì¤é¤ÎÂ¸ºß¤ò±£ÊÃ¤·¤Æ¤¤¤ë¤¬¡¤¤½¤ì¤é¤Ï¤É¤³¤«¤ËÂ¸ºß¤·¤Æ¤¤¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤½¤ì¤Ë´Ø¤¹¤ë¤³¤È¤Ï¤ß¤Ê¼ÂÁõ°ÍÂ¸¤Ê¤Î¤Ç¡¤
²ÄÈÂÀ­¤ò»ý¤¿¤»¤¿¤¤¥³¡¼¥É¤Ç¤Ï\verb|system:set-aref|¤Î¤è¤¦¤Ê´Ø¿ô¤òÄ¾ÀÜ»²¾È¤»¤º¡¤
\verb|get-setf-method|¤ÎÊÖ¤·¤¿ÃÍ¤ò»È¤è¤¦¤Ë¤¹¤ë¤Ù¤­¤À¡¥

¤µ¤Æ\verb|f|¤ò¼ÂÁõ¤¹¤ë¤¿¤á¤Ë¤Ï¡¤
\verb|incf|¤ò¼ê¤ÇÅ¸³«¤¹¤ë¤È¤­¤Ë¹Ô¤Ã¤¿¤³¤È¤È¤Û¤È¤ó¤ÉÆ±¤¸¤³¤È¤ò¹Ô¤¦¥Þ¥¯¥í¤ò½ñ¤¯¤³¤È¤Ë¤Ê¤ë¡¥
Í£°ì¤Î°ã¤¤¤Ï¡¤\verb|let*| Æâ¤ÎºÇ¸å¤Î¼°¤ò\verb|1+| ¤Î¸Æ¤Ó½Ð¤·¤ÎÃæ¤ËÆþ¤ì¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¤
\verb|f|¤Î°ú¿ô¤«¤éºî¤é¤ì¤¿¼°¤ÎÃæ¤ËÆþ¤ì¤ë¤³¤È¤À¡¥
\verb|f|¤ÎÄêµÁ¤ÏÂè\ref{fig:MoreComplexMacrosOnSetf}¿Þ¤Ë¼¨¤·¤¿¤è¤¦¤Ë¤Ê¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro _f (op place &rest args)
  (multiple-value-bind (vars forms var set access)
    (get-setf-method place)
    `(let* (,@(mapcar #'list vars forms)
             (,(car var) (,op ,access ,@args)))
       ,set)))

(defmacro pull (obj place &rest args)
  (multiple-value-bind (vars forms var set access)
    (get-setf-method place)
    (let ((g (gensym)))
      `(let* ((,g ,obj)
              ,@(mapcar #'list vars forms)
              (,(car var) (delete ,g ,access ,@args)))
         ,set))))

(defmacro pull-if (test place &rest args)
  (multiple-value-bind (vars forms var set access)
    (get-setf-method place)
    (let ((g (gensym)))
      `(let* ((,g ,test)
              ,@(mapcar #'list vars forms)
              (,(car var) (delete-if ,g ,access ,@args)))
         ,set))))

(defmacro popn (n place)
  (multiple-value-bind (vars forms var set access)
    (get-setf-method place)
    (with-gensyms (gn glst)
                  `(let* ((,gn ,n)
                          ,@(mapcar #'list vars forms)
                          (,glst ,access)
                          (,(car var) (nthcdr ,gn ,glst)))
                     (prog1 (subseq ,glst 0 ,gn)
                       ,set)))))
\end{FramedVerb}\end{center}
\caption{\texttt{setf}¤Î¾å¤Ëºî¤ë¹¹¤ËÊ£»¨¤Ê¥Þ¥¯¥í¡¥}
\label{fig:MoreComplexMacrosOnSetf}
\end{figure}
\begin{verbatim}
\end{verbatim}

¤³¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¤È¤Æ¤âÊØÍø¤Ê¤â¤Î¤À¡¥
º£¤³¤ì¤¬¼ê¤ËÆþ¤Ã¤¿¤Î¤Ç¡¤
Îã¤¨¤ÐÌ¾Á°¤ò»ý¤Ã¤¿´Ø¿ô¤Ê¤é¥á¥â¥ï¥¤¥ºµ»Ë¡¡ÊÂè5.3Àá¡Ë¤òÅ¬ÍÑ¤·¤¿¤â¤Î¤È´ÊÃ±¤ËÃÖ¤­´¹¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë
\footnote{¤·¤«¤·ÁÈ¹þ¤ß´Ø¿ô¤Ë¤Ï¤³¤ÎÊýË¡¤Ç¥á¥â¥ï¥¤¥ºµ¡Ç½¤òÉÕ¤±¤ë¤Ù¤­¤Ç¤Ï¤Ê¤¤¡¥
Common Lisp¤ÏÁÈ¹þ¤ß´Ø¿ô¤ÎºÆÄêµÁ¤ò¶Ø¤¸¤Æ¤¤¤ë¡¥}¡¥
\verb|foo|¤ò¥á¥â¥ï¥¤¥ºµ¡Ç½ÉÕ¤­¤Ë¤¹¤ë¤Ë¤Ï¡¤¤³¤Î¤è¤¦¤Ë¤¹¤ì¤Ð¤è¤¤¡¥
\begin{verbatim}
(_f memoize (symbol-function 'foo))
\end{verbatim}

\verb|f|¤òÍøÍÑ¤¹¤ë¤È¡¤\verb|setf|¤Î¾å¤ËÂ¾¤Î¥Þ¥¯¥í¤òÄêµÁ¤¹¤ë¤³¤È¤â´ÊÃ±¤Ë¤Ê¤ë¡¥
Îã¤¨¤Ð\verb|conc1f|¡ÊÂè\ref{fig:ListOpOnGnrlVars}¿Þ¡Ë¤Ï¼¡¤Î¤è¤¦¤ËÄêµÁ¤Ç¤­¤ë¡¥
\begin{verbatim}
(defmacro conc1f (lst obj)
   `(_f nconc ,lst (list ,obj)))
\end{verbatim}

Âè\ref{fig:MoreComplexMacrosOnSetf}¿Þ¤Ë¤Ï\verb|setf|¤Î¾å¤Ë¹½ÃÛ¤·¤¿ÊØÍø¤Ê¥Þ¥¯¥í¤òÂ¾¤Ë¤â¼¨¤·¤¿¡¥
2ÈÖÌÜ¤Î\verb|pull|¤Ï¡¤ÁÈ¹þ¤ß´Ø¿ô\verb|pushnew|¤Î¥³¥ó¥×¥ê¥á¥ó¥È(complement)¤È¤·¤Æ°Õ¿Þ¤µ¤ì¤Æ¤¤¤ë¡¥
¤³¤ì¤é2¤Ä¤Ï¡¤\verb|push|¤È\verb|pop|¤¬°ìÁØÌÀ³Î¤Ë¤Ê¤Ã¤¿¤è¤¦¤Ê¤â¤Î¤À¡¥
\verb|pushnew|¤Ï¥ª¥Ö¥¸¥§¥¯¥È¤¬´û¤Ë¥ê¥¹¥È¤Î¥á¥ó¥Ð¤Ç¤Ê¤¤¤È¤­¤À¤±¤½¤ì¤ò¥ê¥¹¥È¤Ë¥×¥Ã¥·¥å¤·¡¤
\verb|pull|¤ÏÁªÂò¤µ¤ì¤¿Í×ÁÇ¤ò¥ê¥¹¥È¤«¤éÇË²õÅª¤Ëºï½ü¤¹¤ë¡¥
\verb|pull|¤ÎÄêµÁÆâ¤Î\verb|&rest|¥Ñ¥é¥á¡¼¥¿¤Ë¤è¤ê¡¤
\verb|pull|¤Ï\verb|delete|¤ÈÆ±¤¸¥­¡¼¥ï¡¼¥É°ú¿ô¤ò¼õ¤±ÉÕ¤±¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥
\begin{verbatim}
> (setq x '(1 2 (a b) 3))
(12(AB)3)
> (pull 2 x)
(1 (A B) 3)
> (pull '(a b) x :test #'equal)
(1 3)
>x
(1 3)
\end{verbatim}

¤³¤Î¥Þ¥¯¥í¤Ï¤¢¤¿¤«¤â¼¡¤Î¤è¤¦¤ËÄêµÁ¤µ¤ì¤¿¤«¤Î¤è¤¦¤Ë¹Í¤¨¤é¤ì¤ë¡¥
\begin{verbatim}
(defmacro pull (obj seq &rest args)                       ; ¸í¤ê
   `(setf ,seq (delete ,obj ,seq ,@args)))
\end{verbatim}
¤·¤«¤·¤³¤¦ÄêµÁ¤¹¤ë¤ÈÉ¾²Á½ç¤ÈÉ¾²Á²ó¿ô¤ÎÎ¾Êý¤Ë´Ø¤·¤ÆÌäÂê¤¬À¸¤¸¤ë¡¥
Ã±½ã¤Ë\verb|modify-macro|¤ÇÄêµÁ¤·¤¿\verb|pull|¤âºî¤ì¤ë¡¥
\begin{verbatim}
(define-modify-macro pull (obj &rest args)
   (lambda (seq obj &rest args)
        (apply #'delete obj seq args)))
\end{verbatim}
¤·¤«¤·\verb|modify-macros|¤ÏÈÆÊÑ¿ô¤òÂè1°ú¿ô¤È¤·¤Æ¼è¤é¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤Î¤Ç¡¤
Âè1¡¤Âè2°ú¿ô¤òµÕ½ç¤ËÍ¿¤¨¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤¬¡¤¤³¤ì¤Ï¤ä¤äÄ¾´Ñ¤ËÈ¿¤¹¤ë¡¥

¹¹¤Ë°ìÈÌÅª¤Ê\verb|pull-if|¤Ï´Ø¿ô¤ò°ú¿ô¤Ë¼è¤ê¡¤ \verb|delete|¤Ç¤Ê¤¯\verb|delete-if|¤ËÅ¸³«¤µ¤ì¤ë¡¥
\begin{verbatim}
> (let ((lst '(1 2 3 4 5 6)))
        (pull-if #'oddp lst)
        lst)
(2 4 6)
\end{verbatim}

¤³¤ì¤é2¤Ä¤Î¥Þ¥¯¥í¤«¤é¤Ï¡¤°ìÈÌÅª¤Ê¥Ý¥¤¥ó¥È¤¬Â¾¤Ë¤âÊ¬¤«¤ë¡¥
´ðÈ×¤È¤Ê¤ë´Ø¿ô¤¬¥ª¥×¥·¥ç¥Ê¥ë°ú¿ô¤ò¤È¤ë¤È¤­¤Ï¡¤¤½¤Î¾å¤Ë¹½ÃÛ¤µ¤ì¤¿¥Þ¥¯¥í¤â¤½¤¦¤Ê¤ë¤Ù¤­¤À¤È¤¤¤¦ÅÀ¤À¡¥
\verb|pull|¤È\verb|pull-if|¤ÏÎ¾Êý¤È¤â¥ª¥×¥·¥ç¥Ê¥ë°ú¿ô¤òÆâÉô¤Î\verb|delete|¤ËÅÏ¤¹¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥

Âè\ref{fig:MoreComplexMacrosOnSetf}¿Þ¤ÎºÇ¸å¤Î¥Þ¥¯¥í\verb|popn|¤Ï¡¤\verb|pop|¤Î°ìÈÌ²½¤À¡¥
¥ê¥¹¥È¤Ë1Í×ÁÇ¤À¤±¤ò¥Ý¥Ã¥×¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¤Ç¤°Õ¤ÎÉôÊ¬¥ê¥¹¥È¤ò¥Ý¥Ã¥×¤·¤ÆÊÖ¤¹¡¥
\begin{verbatim}
> (setq x '(a b c d e f))
(ABCDEF)
> (popn 3 x)
(ABC)
>x
(DEF)
\end{verbatim}

Âè\ref{fig:MacroWhichSortsArgs}¤Ë¤Ï°ú¿ô¤òÀ°Îó¤µ¤»¤ë¥Þ¥¯¥í¤ò¼¨¤·¤¿¡¥
\verb|x|¤È\verb|y|¤¬ÊÑ¿ô¤Ç¡¤\verb|x|¤ÎÃÍ¤ÎÊý¤¬¾®¤µ¤¯¤Ï¤Ê¤¤¤è¤¦¤Ë¤·¤¿¤¤¤È¤­¤Ï¡¤¤³¤¦¤¹¤ì¤Ð¤è¤¤¡¥
\begin{verbatim}
(if (> y x) (rotatef x y))
\end{verbatim}
¤·¤«¤·¤³¤ì¤ò3¸Ä°Ê¾å¤ÎÊÑ¿ô¤Ë¤Ä¤¤¤Æ¹Ô¤ª¤¦¤È¤¹¤ë¤È¡¤¥³¡¼¥É¤Ï¤¿¤Á¤Þ¤ÁÈîÂç²½¤¹¤ë¡¥
¤³¤ì¤ò¼ê¤Ç½ñ¤¯Âå¤ï¤ê¤Ë¡¤\verb|sortf|¤Ë½ñ¤«¤»¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
¤³¤Î¥Þ¥¯¥í¤ÏÈæ³Ó¥ª¥Ú¥ì¡¼¥¿¤ÈÇ¤°Õ¸Ä¤ÎÈÆÊÑ¿ô¤ò¼è¤ê¡¤
¤½¤ì¤é¤ÎÃÍ¤¬¥ª¥Ú¥ì¡¼¥¿¤Ë¤è¤Ã¤Æ»ØÄê¤µ¤ì¤¿½ç¤ËÊÂ¤Ö¤Þ¤ÇÃÍ¤òÆþ¤ì´¹¤¨¤ë¡¥
°ìÈÖÃ±½ã¤Ê¾ì¹ç¤Ç¤Ï¡¤°ú¿ô¤ÏÉáÄÌ¤ÎÊÑ¿ô¤Ë¤Ê¤ë¡¥
\begin{verbatim}
> (setq x 1 y 2 z 3)
3
> (sortf > x y z)
3
> (list x y z)
(3 2 1)
\end{verbatim}

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro sortf (op &rest places)
  (let* ((meths (mapcar #'(lambda (p)
                            (multiple-value-list
                              (get-setf-method p)))
                        places))
         (temps (apply #'append (mapcar #'third meths))))
    `(let* ,(mapcar #'list
                    (mapcan #'(lambda (m)
                                (append (first m)
                                        (third m)))
                            meths)
                    (mapcan #'(lambda (m)
                                (append (second m)
                                        (list (fifth m))))
                            meths))
       ,@(mapcon #'(lambda (rest)
                      (mapcar
                        #'(lambda (arg)
                            `(unless (,op ,(car rest) ,arg)
                               (rotatef ,(car rest) ,arg)))
                        (cdr rest})))
                  temps)
       ,@(mapcar #'fourth meths))))
\end{FramedVerb}\end{center}
\caption{°ú¿ô¤òÀ°Îó¤µ¤»¤ë¥Þ¥¯¥í¡¥}
\label{fig:MacroWhichSortsArgs}
\end{figure}
\begin{verbatim}
\end{verbatim}

°ìÈÌÅª¤Ë¤Ï¡¤¤½¤ì¤é¤ÏÇ¤°Õ¤Î¥¤¥ó¥ô¥¡¡¼¥¸¥ç¥ó²ÄÇ½¤Ê¼°¤Ç¤¢¤Ã¤Æ¤è¤¤¡¥
¤³¤³¤Ç\verb|cake|¤¬Ã¯¤«¤Î¥±¡¼¥­¤Î¼è¤êÊ¬¤òÊÖ¤¹¥¤¥ó¥ô¥¡¡¼¥¸¥ç¥ó²ÄÇ½¤Ê´Ø¿ô¤Ç¤¢¤ê¡¤
\verb|bigger|¤¬¥±¡¼¥­¤Ë´Ø¤·¤ÆÄêµÁ¤µ¤ì¤¿Èæ³Ó´Ø¿ô¤À¤È¤·¤è¤¦¡¥
\verb|moe|¤Î¥±¡¼¥­¤Ï¾¯¤Ê¤¯¤È¤â\verb|larry|¤Î¥±¡¼¥­Äø¤Ï¤¢¤ê¡¤
¤½¤ì¤Ï¾¯¤Ê¤¯¤È¤â\verb|curly|¤Î¥±¡¼¥­Äø¤Ï¤¢¤ë¤È¤¤¤¦µ¬Â§¤òÎ©¤Æ¤¿¤¤¤Ê¤é¤Ð¡¤¤³¤¦¤¹¤ì¤Ð¤è¤¤¡¥
\begin{verbatim}
(sortf bigger (cake 'moe) (cake 'larry) (cake 'curly))
\end{verbatim}

\verb|sortf|¤ÎÄêµÁ¤Ï¡¤³µ·Á¤È¤·¤Æ¤Ï\verb|f|¤ÎÄêµÁ¤Ë»÷¤Æ¤¤¤ë¡¥
ºÇ½é¤Ë\verb|let*| ¤¬¤¢¤ê¡¤\verb|get-setf-method|¤ÎÊÖ¤·¤¿°ì»þÊÑ¿ô¤¬ÈÆÊÑ¿ô¤Î½é´üÃÍ¤ËÂ«Çû¤µ¤ì¤ë¡¥
\verb|sortf|¤ÎÃæ³Ë¤Ï¿¿Ãæ¤Î¼°\verb|mapcon|¤Ç¤¢¤ê¡¤¤³¤ì¤¬¤½¤Î°ì»þÊÑ¿ô¤òÀ°Îó¤µ¤»¤ë¤¿¤á¤Î¥³¡¼¥É¤òÀ¸À®¤¹¤ë¡¥
¥Þ¥¯¥í¤Î¤³¤ÎÉôÊ¬¤¬À¸À®¤¹¤ë¥³¡¼¥É¤Ï°ú¿ô¤Î¿ô¤Ë´Ø¤·¤Æ»Ø¿ôÅª¤ËÁýÂç¤¹¤ë¡¥
À°Îó¤Î¸å¡¤\verb|get-setf-method|¤ÎÊÖ¤·¤¿¼°¤ò»È¤Ã¤ÆÈÆÊÑ¿ô¤ËºÆ¤ÓÃÍ¤¬ÂåÆþ¤µ¤ì¤ë¡¥
»È¤ï¤ì¤Æ¤¤¤ë¥¢¥ë¥´¥ê¥º¥à¤Ï$O(n^2)$¥ª¡¼¥À¤Î¥Ð¥Ö¥ë¡¦¥½¡¼¥È¤À¤¬¡¤
¤³¤Î¥Þ¥¯¥í¤ÏÂçÎÌ¤Î°ú¿ô¤Ë¤Ä¤¤¤Æ¸Æ¤Ð¤ì¤ë¤³¤È¤ò°Õ¿Þ¤·¤¿¤â¤Î¤Ç¤Ï¤Ê¤¤¡¥

\begin{figure}\begin{center}
\fbox{~\,\begin{minipage}{\FrameWidth}\narrowbaselines
\vspace{3pt}
\begin{center}\begin{minipage}{240pt}\texttt{%
(sortf > x (aref ar (incf i)) (car lst))
}\end{minipage}\end{center}
\hspace{12zw}¤Ï¡Ê¤¢¤ë½èÍý·Ï¤Ç¤Ï¡Ë¼¡¤Î¤è¤¦¤ËÅ¸³«¤µ¤ì¤ë¡§
\begin{center}\begin{minipage}{240pt}\texttt{%
(let* ((\#:g1 x)\\
~~~~~~~(\#:g4 ar)\\
~~~~~~~(\#:g3 (incf i))\\
~~~~~~~(\#:g2 (aref \#:g4 \#:g3))\\
~~~~~~~(\#:g6 lst)\\
~~~~~~~(\#:g5 (car \#:g6)))\\
~~(unless (> \#:g1 \#:g2)\\
~~~~(rotatef \#:g1 \#:g2))\\
~~(unless (> \#:g1 \#:g5)\\
~~~~(rotatef \#:g1 \#:g5))\\
~~(unless (> \#:g2 \#:g5)\\
~~~~(rotatef \#:g2 \#:g5))\\
~~(setq x \#:g1)\\
~~(system:set-aref \#:g2 \#:g4 \#:g3)\\
~~(system:set-car \#:g6 \#:g5))
}\end{minipage}\end{center}
\vspace{1.3em}\end{minipage}~\,}\end{center}
\caption{\texttt{sortf}¤Î¸Æ¤Ó½Ð¤·¤ÎÅ¸³«·Á¡¥}
\label{fig:ExpansionOfSortf}
\end{figure}

Âè\ref{fig:ExpansionOfSortf}¿Þ¤Ë¤Ï¡¤\verb|sortf|¤Î¸Æ¤Ó½Ð¤·¤ÎÅ¸³«·Á¤ò¼¨¤·¤¿¡¥
ºÇ½é¤Î\verb|let*| ¤Ç¡¤°ú¿ô¤È¤½¤ÎÉôÊ¬¼°¤¬Ãí°Õ¿¼¤¯º¸¤«¤é±¦¤Î½ç¤ËÉ¾²Á¤µ¤ì¤ë¡¥
¤½¤·¤Æ¤½¤Î¼¡¤Î3¸Ä¤Î¼°¤Ç°ì»þÊÑ¿ô¤ÎÃÍ¤òÈæ³Ó¤·¡¤¾ì¹ç¤Ë¤è¤Ã¤Æ¤ÏÃÍ¤òÆþ¤ì´¹¤¨¤ë¡¥
Âè1¤Î°ì»þÊÑ¿ô¤¬Âè2¤ÈÈæ³Ó¤µ¤ì¡¤¼¡¤ËÂè1¤ÈÂè3¤¬Èæ³Ó¤µ¤ì¡¤¼¡¤ËÂè2¤ÈÂè3¤¬Èæ³Ó¤µ¤ì¤ë¡¥
ºÇ¸å¤ËÈÆÊÑ¿ô¤Ïº¸¤«¤é±¦¤Î½ç¤ËºÆÂåÆþ¤ò¼õ¤±¤ë¡¥
ÌäÂê¤Ë¤Ê¤ë¤³¤È¤ÏÌÇÂ¿¤Ë¤Ê¤¤¤¬¡¤¥Þ¥¯¥í¤Î°ú¿ô¤ÏÉ¾²Á¤ÈÆ±ÍÍ¤ËÉáÄÌ¤Ïº¸¤«¤é±¦¤Î½ç¤ÇÃÍ¤òÂåÆþ¤µ¤ì¤ë¤Ù¤­¤À¡¥

\verb|f|¤ä\verb|sortf|Åù¤Î¥ª¥Ú¥ì¡¼¥¿¤Ë¤Ï¡¤´Ø¿ô¤Î°ú¿ô¤ò¼è¤ë´Ø¿ô¤È¤Î¤¢¤ë¼ï¤ÎÎà»÷À­¤¬¤¢¤ë¡¥
¤·¤«¤·¤³¤ì¤é¤ÏÁ´¤¯°ã¤Ã¤¿¤â¤Î¤È¤·¤ÆÍý²ò¤µ¤ì¤ë¤Ù¤­¤À¡¥
\verb|find-if|¤Î¤è¤¦¤Ê´Ø¿ô¤Ï´Ø¿ô¤ò¼è¤Ã¤Æ¤½¤ì¤ò¸Æ¤Ó½Ð¤¹¡¥
\verb|f|¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤Ï´Ø¿ô¤ÎÌ¾Á°¤ò¼è¤ê¡¤¤½¤ì¤ò¼°¤ÎcarÉô¤ËÃÖ¤¯¡¥
\verb|f|¤È\verb|sortf|¤Ï¶¦¤Ë´Ø¿ô¤Î°ú¿ô¤ò¼è¤ë¤è¤¦¤Ë½ñ¤¯¤³¤È¤â¤Ç¤­¤¿¡¥
Îã¤¨¤Ð\verb|f|¤ò¼¡¤Î¤è¤¦¤Ë½ñ¤¤¤Æ¡¤
\begin{verbatim}
(defmacro _f (op place &rest args)
  (let ((g (gensym)))
    (multiple-value-bind (vars forms var set access)
      (get-setf-method place)
      `(let* ((,g ,op)
              ,@(mapcar #'list vars forms)
              (,(car var) (funcall ,g ,access ,@args)))
         ,set))))
\end{verbatim}
\verb|(f #'+ x 1)|¤È¤·¤Æ¸Æ¤Ó½Ð¤¹¤³¤È¤â¤Ç¤­¤¿¡¥
¤·¤«¤·¸µ¤Î\verb|f|¤Ï¤³¤ì¤¬¤Ç¤­¤ë¤³¤È¤òÁ´¤Æ¤Ç¤­¤ë¤·¡¤°·¤¦¤â¤Î¤¬Ì¾Á°¤Ê¤Î¤Ç¥Þ¥¯¥í¤äÆÃ¼ì¼°¤ÎÌ¾Á°¤â¼õ¤±ÉÕ¤±¤ë¡¥
\verb|+|¤ÎÂ¾¤Ë¤â¡¤Îã¤¨¤Ð\verb|nif|¡Êrty¥Ú¡¼¥¸¡Ë¤â»È¤¨¤ë¡¥
\begin{verbatim}
> (let ((x 2))
    (_f nif x 'p 'z 'n)
    x)
P
\end{verbatim}
%}}}
\subsection{¥¤¥ó¥ô¥¡¡¼¥¸¥ç¥ó¤òÄêµÁ¤¹¤ë}   %{{{
Âè12.1Àá¤Ç¤Ï¥¤¥ó¥ô¥¡¡¼¥¸¥ç¥ó²ÄÇ½¤Ê»²¾È¤ËÅ¸³«¤µ¤ì¤ëÇ¤°Õ¤Î¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ï¡¤
¤½¤ì¼«¿È¤¬¥¤¥ó¥ô¥¡¡¼¥¸¥ç¥ó²ÄÇ½¤À¤È¤¤¤¦¤³¤È¤òÀâÌÀ¤·¤¿¡¥
¤·¤«¤·¡¤¥ª¥Ú¥ì¡¼¥¿¤ò¥¤¥ó¥ô¥¡¡¼¥¸¥ç¥ó²ÄÇ½¤Ë¤¹¤ë¤À¤±¤Î¤¿¤á¤Ë¤½¤ì¤ò¥Þ¥¯¥í¤È¤·¤ÆÄêµÁ¤¹¤ëÉ¬Í×¤Ï¤Ê¤¤¡¥
\verb|defsetf|¤ò»È¤¨¤Ð¡¤Lisp¤ËÇ¤°Õ¤Î´Ø¿ô¤ä¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤ò¥¤¥ó¥ô¥¡¡¼¥¸¥ç¥ó¤¹¤ëÊýË¡¤ò¶µ¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥

¤³¤Î¥Þ¥¯¥í¤Î»È¤¤Êý¤Ï2ÄÌ¤ê¤¢¤ë¡¥
°ìÈÖÃ±½ã¤Ê¾ì¹ç¤Ç¤Ï¡¤°ú¿ô¤Ï2¸Ä¤Î¥·¥ó¥Ü¥ë¤Ë¤Ê¤ë¡¥
\begin{verbatim}
(defsetf symbol-value set)
\end{verbatim}

Ê£»¨¤Ê·Á¤Ç¤Ï¡¤\verb|defsetf|¤Î¸Æ¤Ó½Ð¤·¤Ï\verb|defmacro|¤Î¸Æ¤Ó½Ð¤·¤È»÷¤¿¤è¤¦¤Ê¤â¤Î¤Ë¤Ê¤ê¡¤
¹¹¿·¤µ¤ì¤¿ÃÍ¤Î¼°¤Î¤¿¤á¤Î²¾°ú¿ô¤¬²Ã¤ï¤ë¡¥
Îã¤¨¤Ð¡¤¼¡¤Î¤è¤¦¤Ë¤·¤Æ\verb|car|¤ËÂÐ¤¹¤ë¥¤¥ó¥ô¥¡¡¼¥¸¥ç¥ó¤òÄêµÁ¤Ç¤­¤ë¡¥
\begin{verbatim}
(defsetf car (lst) (new-car)
   `(progn (rplaca ,lst ,new-car)
           ,new-car))
\end{verbatim}

\verb|defmacro|¤È\verb|defsetf|¤Ë¤Ï¡¤½ÅÍ×¤Ê°ã¤¤¤¬1¸Ä¤¢¤ë¡¥
¸å¼Ô¤Ï°ú¿ô¤Î¤¿¤á¤Ë¼«Æ°Åª¤Ëgensym¤òÀ¸À®¤¹¤ëÅÀ¤À¡¥
¾å¤ÎÄêµÁ¤Î²¼¤Ç¤Ï¡¤\verb|(setf (car x) y)|¤Ï¼¡¤Î¤è¤¦¤ËÅ¸³«¤µ¤ì¤ë¤À¤í¤¦¡¥
\begin{verbatim}
(let* ((#:g2 x)
       (#:g1 y))
  (progn (rplaca #:g2 #:g1)
         #:g1))
\end{verbatim}
¤½¤Î¤¿¤áÊÑ¿ôÊáÂªµÚ¤ÓÉ¾²Á¤Î²ó¿ô¤ä½çÈÖ¤ËÈÑ¤ï¤µ¤ì¤º¤Ë\verb|defsetf|¤ÎÅ¸³«´Ø¿ô¤ò½ñ¤¯¤³¤È¤¬¤Ç¤­¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defvar *cache* (make-hash-table))

(defun retrieve (key)
  (multiple-value-bind (x y) (gethash key *cache*)
    (if y(values x y)
        (cdr (assoc key *world*)))))

(defsetf retrieve (key) (val)
  `(setf (gethash ,key *cache*) ,val))
\end{FramedVerb}\end{center}
\caption{ÈóÂÐ¾Î¤Ê¥¤¥ó¥ô¥¡¡¼¥¸¥ç¥ó¡¥}
\label{fig:AsymmetricInversion}
\end{figure}

\textsf{CLtL2}½àµò¤ÎCommon Lisp¤Ç¤Ï¡¤
\verb|setf|¤ËÂÐ¤¹¤ë¥¤¥ó¥ô¥¡¡¼¥¸¥ç¥ó¤ò\verb|defun|¤ÇÄ¾ÀÜÄêµÁ¤Ç¤­¤ë¡¥
¤è¤Ã¤Æ¾å¤ÎÎã¤Ï¼¡¤Î¤è¤¦¤Ë¤â½ñ¤±¤ë¡¥
\begin{verbatim}
(defun (setf car) (new-car lst)
  (rplaca lst new-car)
  new-car)
\end{verbatim}
¤³¤Î¤è¤¦¤Ê´Ø¿ô¤Ç¤Ï¡¤¹¹¿·¤µ¤ì¤¿ÃÍ¤¬Âè1°ú¿ô¤Ë¤Ê¤ë¤Ù¤­¤À¡¥
¤Þ¤¿¡¤¤³¤ÎÃÍ¤ò´Ø¿ô¤ÎÃÍ¤È¤·¤ÆÊÖ¤¹¤³¤È¤â´·½¬¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥

¤³¤ì¤Þ¤Ç¤ÎÎã¤Ç¤ÏÈÆÊÑ¿ô¤È¤Ï¥Ç¡¼¥¿¹½Â¤Æâ¤Î¾ì½ê¤ò»²¾È¤¹¤ë¤¿¤á¤Î¤â¤Î¤«¤Î¤è¤¦¤Ë¼¨º¶¤·¤Æ¤­¤¿¡¥
°­¼Ô¤¬¿Í¼Á¤òÃÏ²¼ÌÂµÜ¤ÎÃæ¤ËÏ¢¤ìµî¤ë¤È¡¤Èà½÷¤òµß¤¦¥Ò¡¼¥í¡¼¤Ï³°¤ËÏ¢¤ì½Ð¤¹¤³¤È¤Ë¤Ê¤ë¡¥
°­¼Ô¤â¥Ò¡¼¥í¡¼¤âÆ±¤¸Æ»¤òÄÌ¤ë¤¬¡¤¤½¤ÎÊý¸þ¤ÏµÕ¤À¡¥
\verb|setf|¤¬¤³¤Î¤è¤¦¤ËÆ°ºî¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤È¤¤¤¦°õ¾Ý¤ò»ý¤¿¤ì¤Æ¤â¶Ã¤­¤Ï¤·¤Ê¤¤¡¥
ÄêµÁºÑ¤ß¤Î¥¤¥ó¥ô¥¡¡¼¥¸¥ç¥ó¤ÏÁ´¤Æ¤³¤Î·Á¼°¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤è¤¦¤À¤«¤é¤À¡¥
¼ÂºÝ¤Ï¡¤¡Ö¾ì½ê¡×¤Ï¥¤¥ó¥ô¥¡¡¼¥¸¥ç¥ó¤ò¼õ¤±¤ë²¾°ú¿ô¤ËÂÐ¤¹¤ë´·ÍÑÌ¾¤Ë²á¤®¤Ê¤¤¡¥

¸¶Â§Åª¤Ë¤Ï¡¤\verb|setf|¤Ï¤â¤Ã¤È°ìÈÌÅª¤Ê¤â¤Î¤À¡¥
¥¢¥¯¥»¥¹ÍÑ¤Î¼°¤È¤½¤Î¥¤¥ó¥ô¥¡¡¼¥¸¥ç¥ó¤ÏÆ±¤¸¥Ç¡¼¥¿¹½Â¤¤ËÂÐ¤·¤ÆÆ¯¤¯É¬Í×¤¹¤é¤Ê¤¤¡¥
²¿¤«¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ç¡¤¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î¹¹¿·¤ò¥­¥ã¥Ã¥·¥å¤·¤¿¤¤¤È¤·¤è¤¦¡¥
¤³¤ì¤¬É¬Í×¤Ë¤Ê¤ë¤Î¤Ï¡¤Îã¤¨¤ÐÆ°ºîÃæ¤Ë¼ÂºÝ¤Ë¹¹¿·¤ò¹Ô¤¦¤Î¤¬Èó¸úÎ¨Åª¤À¤Ã¤¿¤ê¡¤
°ì´ÓÀ­¤òÊÝ¤Ä¤¿¤á¤Ë¹¹¿·ÅÀ¤ò¥³¥ß¥Ã¥ÈÁ°¤Ë¸¡¾Ú¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤È¤­¤À¡¥

\verb|*world*| ¤¬¼ÂºÝ¤Î¥Ç¡¼¥¿¥Ù¡¼¥¹¤À¤È¤·¤è¤¦¡¥
Ã±½ã²½¤Î¤¿¤á¡¤¤³¤ì¤Ïalist¤Ç¡¤
¤½¤ÎÍ×ÁÇ¤Ï\verb|(|$\langle$¥­¡¼$\rangle$ \verb|.| $\langle$ÃÍ$\rangle$\verb|)|¤È¤¤¤¦·Á¼°¤À¤È¤¹¤ë¡¥
Âè\ref{fig:AsymmetricInversion}¿Þ¤Ë¤Ï\verb|retrieve|¤È¤¤¤¦Ì¾Á°¤Î¸¡º÷´Ø¿ô¤ò¼¨¤·¤¿¡¥
\verb|*world*| ¤¬¼¡¤Î¾õÂÖ¤Î¤È¤­¤Ï¡¤
\begin{verbatim}
((a . 2) (b . 16) (c . 50) (d . 20) (f . 12))
\end{verbatim}
¼¡¤Î¤è¤¦¤ËÆ°ºî¤¹¤ë¡¥
\begin{verbatim}
> (retrieve 'c)
50
\end{verbatim}

\verb|car|¤Î¸Æ¤Ó½Ð¤·¤È°Û¤Ê¤ê¡¤
\verb|retrieve|¤Î¸Æ¤Ó½Ð¤·¤Ï¥Ç¡¼¥¿¹½Â¤¤ÎÆÃÄê¤Î¾ì½ê¤ò»²¾È¤·¤Æ¤¤¤ë¤Î¤Ç¤Ï¤Ê¤¤¡¥
ÊÖ¤êÃÍ¤Ï2²Õ½ê¤Î¾ì½ê¤Î¤¦¤Á¤É¤Á¤é¤«¤«¤éÆÀ¤é¤ì¤ë¤³¤È¤Ë¤Ê¤ë¡¥
¤½¤·¤Æ\verb|retrieve|¤Î¥¤¥ó¥ô¥¡¡¼¥¸¥ç¥ó¡Ê¤ä¤Ï¤êÂè\ref{fig:AsymmetricInversion}¿Þ¤Ë¼¨¤·¤¿¡Ë¤Ï¡¤
¤½¤ÎÊÒÊý¤ò»²¾È¤¹¤ë¤À¤±¤À¡¥
\begin{verbatim}
> (setf (retrieve 'n) 77)
77
> (retrieve 'n)
77
T
\end{verbatim}
¤³¤Î¸¡º÷¤Ç¤ÏÂè2¤ÎÊÖ¤êÃÍ\verb|t|¤¬ÊÖ¤ë¤¬¡¤¤³¤ì¤Ïµá¤á¤ëÃÍ¤¬¥­¥ã¥Ã¥·¥åÆâ¤Ë¸«¤Ä¤«¤Ã¤¿¤³¤È¤òÉ½¤¹¡¥

¥Þ¥¯¥í¤½¤Î¤â¤Î¤ÈÆ±ÍÍ¤Ë¡¤ÈÆÊÑ¿ô¤âÌÜ³Ð¤·¤¤ÎÏ¤ò»ý¤Ã¤¿Ãê¾Ý²½¼êÃÊ¤À¡¥
¤½¤Î¿¿²Á¤Ï¤³¤³¤Ç¸ì¤Ã¤¿¤³¤È¤ËÎ±¤Þ¤é¤Ê¤¤¤À¤í¤¦¡¥
¸Ä¡¹¤Î¸½¾ì¤Ç¤ÏÈÆÊÑ¿ô¤Î»ÈÍÑ¤¬¥¨¥ì¥¬¥ó¥È¤Ç¶¯ÎÏ¤Ê¥×¥í¥°¥é¥à¤Ë¤Ä¤Ê¤¬¤ë¤è¤¦¤ÊÊýË¡¤ÎÊý¤¬
È¯¸«¤·°×¤¤¤³¤È¤Ï³Î¤«¤À¡¥
¤·¤«¤·\verb|setf|¤Î¥¤¥ó¥ô¥¡¡¼¥¸¥ç¥ó¤ò¿·¤·¤¤ÊýË¡¤Ç»È¤Ã¤¿¤ê¡¤
Æ±ÍÍ¤ËÊØÍø¤ÊÊÑ´¹¼êË¡¤òÈ¯¸«¤¹¤ë¤³¤È¤â²ÄÇ½¤«¤âÃÎ¤ì¤Ê¤¤¡¥
%}}}
%}}}
\section{¥³¥ó¥Ñ¥¤¥ë»þ¤Î·×»»½èÍý} %{{{
Á°¤Î¾Ï¤Ç¤Ï¥Þ¥¯¥í¤Ç¼ÂÁõ¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¥ª¥Ú¥ì¡¼¥¿¤ò²¿¼ïÎà¤«ÏÀ¤¸¤¿¡¥
¤³¤Î¾Ï¤ÇÏÀ¤¸¤ë¼ïÎà¤ÎÌäÂê¤Ï¡¤´Ø¿ô¤Ç¤â²ò·è¤Ç¤­¤ë¤¬¡¤¥Þ¥¯¥í¤ÎÊý¤¬¸úÎ¨Åª¤Ë¤Ê¤ë¤è¤¦¤Ê¤â¤Î¤À¡¥
Âè8.2Àá¤Ç¤Ï¤¢¤ë¾õ¶·¤Ë¤ª¤¤¤Æ¥Þ¥¯¥í¤ò»È¤¦¤³¤È¤ÎÄ¹½ê¤ÈÃ»½ê¤òÎóµó¤·¤¿¡¥
Ä¹½ê¤ÎÃæ¤Ë¤Ï¡Ö¥³¥ó¥Ñ¥¤¥ë»þ¤Î·×»»½èÍý¡×¤È¤¤¤¦¤â¤Î¤¬¤¢¤Ã¤¿¡¥
¥ª¥Ú¥ì¡¼¥¿¤ò¥Þ¥¯¥í¤È¤·¤ÆÄêµÁ¤¹¤ë¤³¤È¤Ç¡¤
ºî¶È¤Î°ìÉô¤ò¥ª¥Ú¥ì¡¼¥¿¤¬Å¸³«¤µ¤ì¤ë¤È¤­¤Ë¹Ô¤ï¤»¤ë¤³¤È¤¬¤Ç¤­¤ë¾ì¹ç¤¬¤¢¤ë¡¥
¤³¤Î¾Ï¤Ç¤Ï¤³¤Î²ÄÇ½À­¤ò³èÍÑ¤¹¤ë¥Þ¥¯¥í¤ò¸«¤Æ¤¤¤¯¡¥
\subsection{¿·¤·¤¤¥æ¡¼¥Æ¥£¥ê¥Æ¥£}   %{{{
Âè8.2¾Ï¤Ç¤Ï¥Þ¥¯¥í¤ò»È¤Ã¤Æ·×»»½èÍý¤ò¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¹Ô¤ï¤»¤ë²ÄÇ½À­¤òÄóµ¯¤·¤¿¡¥
¤½¤³¤Ç¤ÏÎã¤È¤·¤Æ¡¤°ú¿ô¤ÎÊ¿¶ÑÃÍ¤òÊÖ¤¹¥Þ¥¯¥í\verb|avg|¤òÄêµÁ¤·¤¿¡¥
\begin{verbatim}
> (avg pi 4 5)
4.047...
\end{verbatim}
Âè\ref{fig:ShiftingComputation}¿Þ¤Ç¤Ï\verb|avg|¤òºÇ½é¤Ï´Ø¿ô¤È¤·¤Æ¡¤¼¡¤Ë¥Þ¥¯¥í¤È¤·¤ÆÄêµÁ¤·¤¿¡¥
\verb|avg|¤¬¥Þ¥¯¥í¤È¤·¤ÆÄêµÁ¤µ¤ì¤ë¤È¡¤\verb|length|¤Ï¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¸Æ¤Ð¤ì¤ë¤³¤È¤Ë¤Ê¤ë¡¥
¥Þ¥¯¥íÈÇ¤Ç¤Ï¡¤¼Â¹Ô»þ¤Ë\verb|&rest|¥Ñ¥é¥á¡¼¥¿¤òÁàºî¤¹¤ë¤³¤È¤ÎÉéÃ´¤â²óÈò¤·¤Æ¤¤¤ë¡¥
Â¿¤¯¤Î½èÍý·Ï¤Ç¤Ï\verb|avg|¤Ï¥Þ¥¯¥í¤È¤·¤Æ½ñ¤¤¤¿Êý¤¬Â®¤¤¡¥


\begin{figure}\begin{center}\begin{FramedVerb}
(defun avg (&rest args)
  (/ (apply #'+ args) (length args)))

(defmacro avg (&rest args)
  `(/ (+ ,@args) ,(length args)))
\end{FramedVerb}\end{center}
\caption{Ê¿¶ÑÃÍ¤òÆÀ¤ë¤È¤­¡¤·×»»½èÍý¤ò¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¤º¤é¤¹¡¥}
\label{fig:ShiftingComputation}
\end{figure}

Å¸³«»þ¤Ë°ú¿ô¤Î¿ô¤òÃÎ¤Ã¤Æ¤¤¤ë¤³¤È¤«¤éÍè¤ë¤è¤¦¤ÊÎà¤Î½èÍý¤ÎÀáÌó¤Ï¡¤
\verb|in|¡Êsdf¥Ú¡¼¥¸¡Ë¤ÇÆÀ¤é¤ì¤ë¤è¤¦¤Ê½èÍý¤ÎÀáÌó¤ÈÁÈ¤ß¹ç¤ï¤»¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
¤½¤³¤Ç¤Ï´ö¤Ä¤«¤Î°ú¿ô¤ÎÉ¾²Á¤¹¤é²óÈò¤Ç¤­¤¿¤Î¤À¤Ã¤¿¡¥
Âè\ref{fig:ShiftingAndAvoiding}¿Þ¤Ë¤Ï2ÄÌ¤ê¤Î\verb|most-of|¤ò¼¨¤·¤¿¡¥
¤³¤ì¤Ï°ú¿ô¤Î²áÈ¾¿ô¤¬¿¿¤òÊÖ¤¹¤Ê¤é¤Ð¿¿¤òÊÖ¤¹¤â¤Î¤À¡¥
\begin{verbatim}
> (most-of t t t nil)
T
\end{verbatim}

\begin{figure}\begin{center}\begin{FramedVerb}
(defun most-of (&rest args)
  (let ((all 0)
        (hits 0))
    (dolist (a args)
      (incf all)
      (if a (incf hits)))
    (> hits (/ all 2))))

(defmacro most-of (&rest args)
  (let ((need (floor (/ (length args) 2)))
        (hits (gensym)))
    `(let ((,hits 0))
       (or ,@(mapcar #'(lambda (a)
                          `(and ,a (> (incf ,hits) ,need)))
                      args)))))
\end{FramedVerb}\end{center}
\caption{·×»»½èÍý¤ò¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¤º¤é¤·¡¤¤µ¤é¤Ë²óÈò¤¹¤ë¡¥}
\label{fig:ShiftingAndAvoiding}
\end{figure}

¥Þ¥¯¥íÈÇ¤Ï¡¤\verb|in|¤ÈÆ±ÍÍ¤Ë¡¤É¬Í×¤Ê¤À¤±¤Î°ú¿ô¤òÉ¾²Á¤¹¤ë¤è¤¦¤Ê¥³¡¼¥É¤ËÅ¸³«¤µ¤ì¤ë¡¥
Îã¤¨¤Ð\verb|(most-of (a)| \verb|(b) (c))|¤Ï¼¡¤Î¤è¤¦¤ÊÅù²Á¤Ê¼°¤ËÅ¸³«¤µ¤ì¤ë¡¥
\begin{verbatim}
(let ((count 0))
     (or (and (a) (> (incf count) 1))
         (and (b) (> (incf count) 1))
         (and (c) (> (incf count) 1))))
\end{verbatim}
°ìÈÖÅÔ¹ç¤¬ÎÉ¤¤¾ì¹ç¤Ë¤Ï¡¤¤Á¤ç¤¦¤É²áÈ¾¿ô¤Î°ú¿ô¤À¤±¤¬É¾²Á¤µ¤ì¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defun nthmost (n lst)
  (nth n (sort (copy-list lst) #'>)))

(defmacro nthmost (n lst)
  (if (and (integerp n) (< n 20))
      (with-gensyms (glst gi)
                    (let ((syms (map0-n #'(lambda (x) (gensym)) n)))
                      `(let ((,glst ,lst))
                         (unless (< (length ,glst) ,(1+ n))
                           ,@(gen-start glst syms)
                           (dolist (,gi ,glst)
                             ,(nthmost-gen gi syms t))
                           ,(car (last syms))))))
      `(nth ,n (sort (copy-list ,lst) #'>))))

(defun gen-start (glst syms)
  (reverse
    (maplist #'(lambda (syms)
                 (let ((var (gensym)))
                   `(let ((,var (pop ,glst)))
                      ,(nthmost-gen var (reverse syms)))))
             (reverse syms))))

(defun nthmost-gen (var vars &optional long?)
  (if (null vars)
      nil
      (let ((else (nthmost-gen var (cdr vars) long?)))
        (if (and (not long?) (null else))
            `(setq ,(car vars) ,var)
            `(if (> ,var ,(car vars))
                 (setq ,@(mapcan #'list
                                  (reverse vars)
                                  (cdr (reverse vars)))
                       ,(car vars) ,var)
                 ,else)))))
\end{FramedVerb}\end{center}
\caption{¥³¥ó¥Ñ¥¤¥ë»þ¤ËÊ¬¤«¤Ã¤Æ¤¤¤ë°ú¿ô¤ÎÍøÍÑ¡¥}
\label{fig:UseOfArgsKnownAtCompileTime}
\end{figure}

¥Þ¥¯¥í¤ÏÆÃÄê¤Î°ú¿ô¤ÎÃÍ¤¬ÃÎ¤é¤ì¤Æ¤¤¤ë¤È¤­¤Ë¤â¡¤·×»»½èÍý¤ò¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¤º¤é¤»¤ë¤«¤âÃÎ¤ì¤Ê¤¤¡¥
Âè\ref{fig:UseOfArgsKnownAtCompileTime}¿Þ¤Ë¤Ï¤½¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤ÎÎã¤ò¼¨¤·¤¿¡¥
´Ø¿ô\verb|nthmost|¤Ï¿ô\verb|n|¤È¿ô¤«¤é¤Ê¤ë¥ê¥¹¥È¤ò¼è¤ê¡¤¥ê¥¹¥ÈÆâ¤Ç\verb|n|ÈÖÌÜ¤ËÂç¤­¤¤¿ô¤òÊÖ¤¹¡¥
Â¾¤Î¥·¡¼¥±¥ó¥¹ÍÑ´Ø¿ô¤ÈÆ±ÍÍ¤Ë¡¤ºÇ½é¤Ï0ÈÖÌÜ¤È¤µ¤ì¤ë¡¥
\begin{verbatim}
> (nthmost 2 '(2 6 1 5 3 4))
4
\end{verbatim}
´Ø¿ôÈÇ¤Ï¤È¤Æ¤âÃ±½ã¤Ë½ñ¤«¤ì¤Æ¤¤¤ë¡¥
¤½¤ì¤Ï¥ê¥¹¥È¤òÀ°Îó¤µ¤»¡¤¤½¤ì¤ò°ú¿ô¤Ë\verb|nth|¤ò¸Æ¤Ö¡¥
\verb|sort|¤ÏÇË²õÅª¤Ê¤Î¤Ç¡¤\verb|nthmost|¤ÏÀ°ÎóÁ°¤Ë¥ê¥¹¥È¤ò¥³¥Ô¡¼¤·¤Æ¤¤¤ë¡¥
¤³¤Î¤è¤¦¤ËÄêµÁ¤µ¤ì¤ë¤È¡¤\verb|nthmost|¤Ï2ÅÀ¤ÇÈó¸úÎ¨Åª¤Ë¤Ê¤ë¡¥
¥³¥ó¥·¥ó¥°¤òµ¯¤³¤¹ÅÀ¤È¡¤
´Ø¿´¤¬¤¢¤ë¤Î¤ÏÂç¤­¤¤½ç¤Ë\verb|n|¸Ä¤Þ¤Ç¤Ê¤Î¤Ë°ú¿ô¤Î¥ê¥¹¥ÈÁ´ÂÎ¤òÀ°Îó¤µ¤»¤ëÅÀ¤À¡¥

\verb|n|¤¬¥³¥ó¥Ñ¥¤¥ë»þ¤ËÊ¬¤«¤Ã¤Æ¤¤¤ì¤Ð¡¤¤³¤ÎÌäÂê¤Ë¤ÏÊÌ¤ÎÊýË¡¤Ç¼è¤êÁÈ¤á¤ë¡¥
Âè\ref{fig:UseOfArgsKnownAtCompileTime}¿Þ¤Î¸åÈ¾¤Ç¤Ï¥Þ¥¯¥íÈÇ¤Î\verb|nthmost|¤òÄêµÁ¤·¤¿¡¥
¤³¤Î¥Þ¥¯¥í¤¬ºÇ½é¤Ë¹Ô¤¦¤³¤È¤Ï¡¤Âè1°ú¿ô¤òÄ´¤Ù¤ë¤³¤È¤À¡¥
Âè1°ú¿ô¤¬¿ôÄê¿ô¤Ç¤Ê¤¤¤È¤­¤Ë¤Ï¡¤¾å¤Ç¸«¤¿¤â¤Î¤ÈÆ±¤¸¥³¡¼¥É¤ËÅ¸³«¤µ¤ì¤ë¡¥
Âè1°ú¿ô¤¬¿ôÄê¿ô¤À¤È¡¤ÊÌ¤Î¼êÃÊ¤Ë°Ü¤ë¡¥
Îã¤¨¤Ð»®¤Î¾å¤Î3ÈÖÌÜ¤ËÂç¤­¤¤¥¯¥Ã¥­¡¼¤ò¼è¤ê¤¿¤¤¤È¤­¤Ï¡¤
¤½¤ì¤¾¤ì¤Î¥¯¥Ã¥­¡¼¤ò½çÈÖ¤ËÄ¯¤á²ó¤·¡¤
¤½¤Î´Ö¤º¤Ã¤È¤½¤ì¤Þ¤Ç¤Ë¸«¤¿¥¯¥Ã¥­¡¼¤ÎÆâ¤ÎÂç¤­¤¤½ç¤Ë3¸Ä¤ò¼ê¤Ë¼è¤Ã¤Æ¤ª¤±¤Ð¤è¤¤¡¥
Á´¤Æ¤Î¥¯¥Ã¥­¡¼¤ò¸«¤¿¸å¤Ï¡¤¼ê¤ÎÃæ¤Î1ÈÖ¾®¤µ¤¤¥¯¥Ã¥­¡¼¤¬µá¤á¤Æ¤¤¤¿¤â¤Î¤À¡¥
\verb|n|¤¬¾®¤µ¤¤Äê¿ô¤Ç¡¤¥¯¥Ã¥­¡¼¤ÎÁí¿ô¤ËÈæÎã¤·¤Ê¤¤¤Ê¤é¤Ð¡¤
¤³¤ÎÊýË¡¤Ë¤è¤ê¡¤ºÇ½é¤ËÁ´¤Æ¤Î¥¯¥Ã¥­¡¼¤òÀ°Îó¤µ¤»¤ë¤È¤­¤è¤ê¤â¾¯¤Ê¤¤Ï«ÎÏ¤Çµá¤á¤ë¥¯¥Ã¥­¡¼¤¬¼ê¤ËÆþ¤ë¡¥

\verb|n|¤¬Å¸³«»þ¤ËÃÎ¤é¤ì¤Æ¤¤¤ë¾ì¹ç¤Ë¤Ï¤³¤ÎÀïÎ¬¤Ë½¾¤¦¡¥
¾å¤Î¥Þ¥¯¥í¤ÏÅ¸³«Ãæ¤Ë\verb|n|¸Ä¤ÎÊÑ¿ô¤òÀ¸À®¤·¡¤\verb|nthmost-gen|¤ò¸Æ¤ó¤Ç¡¤
¤½¤ì¤¾¤ì¤Î¥¯¥Ã¥­¡¼¤ò¸«¤Æ¤¤¤ë¤È¤­¤ËÉ¾²Á¤µ¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¥³¡¼¥É¤òÀ¸À®¤¹¤ë¡¥
Âè\ref{fig:ExpansionOfNthmost}¿Þ¤Ë¤Ï¥Þ¥¯¥íÅ¸³«¤ÎÎã¤ò¼¨¤·¤¿¡¥
¥Þ¥¯¥í\verb|nthmost|¤Ï¸µ¤Î´Ø¿ô¤ÈÁ´¤¯Æ±¤¸Æ°ºî¤ò¤¹¤ë¤¬¡¤\verb|apply|¤Î°ú¿ô¤È¤·¤ÆÅÏ¤»¤Ê¤¤ÅÀ¤¬°ã¤Ã¤Æ¤¤¤ë¡¥
¥Þ¥¯¥í¤ò»È¤¦¤³¤È¤òÀµÅö²½¤¹¤ë¤Î¤Ï¡¤½ã¿è¤Ë¸úÎ¨À­¤È¤¤¤¦´ÑÅÀ¤À¡¥
¥Þ¥¯¥íÈÇ¤Ï¼Â¹Ô»þ¤Ë¥³¥ó¥·¥ó¥°¤òµ¯¤³¤µ¤º¡¤¹¹¤Ë\verb|n|¤¬¾®¤µ¤¤Äê¿ô¤Î¤È¤­¤Ë¤ÏÈæ³Ó²ó¿ô¤¬¾¯¤Ê¤¯¤ÆºÑ¤à¡¥

¸úÎ¨Åª¤Ê¥×¥í¥°¥é¥à¤òÆÀ¤ë¤Ë¤Ï¡¤¤³¤Î¤è¤¦¤ËÂç¤­¤Ê¥Þ¥¯¥í¤ò½ñ¤¯¤è¤¦¤Ê¹üÀÞ¤ê¤¬É¬Í×¤Ê¤Î¤À¤í¤¦¤«¡©
¤³¤Î¾ì¹ç¤Ë¤Ï¡¤¶²¤é¤¯¤½¤¦¤Ç¤Ï¤Ê¤¤¤À¤í¤¦¡¥
2ÄÌ¤ê¤Î\verb|nthmost|¤Ï°ìÈÌ¸¶Â§¤ÎÎã¤È¤·¤Æ°Õ¿Þ¤µ¤ì¤¿¤â¤Î¤À¡¥
´ö¤Ä¤«¤Î°ú¿ô¤¬¥³¥ó¥Ñ¥¤¥ë»þ¤ËÃÎ¤é¤ì¤Æ¤¤¤ë¤Ê¤é¤Ð¡¤¥Þ¥¯¥í¤ò»È¤Ã¤Æ¸úÎ¨¤Î¤è¤¤¥³¡¼¥É¤òÀ¸À®¤Ç¤­¤ë¡¥
¶²¤é¤¯¤³¤Î²ÄÇ½À­¤òÍøÍÑ¤¹¤ë¤«¤É¤¦¤«¤Ï¡¤Íø±×¤Î¤¿¤á¤Ë¤É¤ìÄø¤ÎÉéÃ´¤ËÂÑ¤¨¤é¤ì¤ë¤«¤È¤¤¤¦¤³¤È¤È¡¤
¸úÎ¨Åª¤Ê¥Þ¥¯¥íÈÇ¤ò½ñ¤¯¤¿¤á¤Ë¤É¤ìÄø¤ÎÏ«ÎÏ¤¬É¬Í×¤«¤È¤¤¤¦¤³¤È¤Ë°Í¤ë¡¥
¥Þ¥¯¥íÈÇ¤Î\verb|nthmost|¤ÏÄ¹¤¯Ê£»¨¤Ê¤Î¤Ç¡¤¶ËÃ¼¤Ê¾õ¶·¤Ç¤·¤«½ñ¤¯²ÁÃÍ¤Ï¤Ê¤¤¤À¤í¤¦¡¥
¤·¤«¤·¥³¥ó¥Ñ¥¤¥ë»þ¤ËÆÀ¤é¤ì¤ë¾ðÊó¤Ï¡¤¤½¤ì¤òÍøÍÑ¤·¤Ê¤¤¤³¤È¤Ë·è¤á¤¿¤È¤­¤µ¤¨´Þ¤á¡¤
¾ï¤Ë¹ÍÎ¸¤ËÃÍ¤¹¤ëÍ×ÁÇ¤Ê¤Î¤À¡¥

\begin{figure}\begin{center}
\fbox{~\,\begin{minipage}{\FrameWidth}\narrowbaselines
\vspace{3pt}
\begin{center}\begin{minipage}{240pt}\texttt{%
(nthmost 2 nums)
}\end{minipage}\end{center}
\hspace{12zw}¤³¤ì¤Ï¼¡¤Î¤è¤¦¤ËÅ¸³«¤µ¤ì¤ë¡¥
\begin{center}\begin{minipage}{260pt}\texttt{%
(let ((\#:g7 nums))\\
~~(unless (< (length \#:g7) 3)\\
~~~~(let ((\#:g6 (pop \#:g7)))\\
~~~~~~(setq \#:g1 \#:g6))\\
~~~~(let ((\#:g5 (pop \#:g7)))\\
~~~~~~(if (> \#:g5 \#:g1)\\
~~~~~~~~~~(setq \#:g2 \#:g1 \#:g1 \#:g5)\\
~~~~~~~~~~(setq \#:g2 \#:g5)))\\
~~~~(let ((\#:g4 (pop \#:g7)))\\
~~~~~~(if (> \#:g4 \#:g1)\\
~~~~~~~~~~(setq \#:g3 \#:g2 \#:g2 \#:g1 \#:g1 \#:g4)\\
~~~~~~~~~~(if (> \#:g4 \#:g2)\\
~~~~~~~~~~~~~~(setq \#:g3 \#:g2 \#:g2 \#:g4)\\
~~~~~~~~~~~~~~(setq \#:g3 \#:g4))))\\
~~~~(dolist (\#:g8 \#:g7)\\
~~~~~~(if (> \#:g8 \#:g1)\\
~~~~~~~~~~(setq \#:g3 \#:g2 \#:g2 \#:g1 \#:g1 \#:g8)\\
~~~~~~~~~~(if (> \#:g8 \#:g2)\\
~~~~~~~~~~~~~~(setq \#:g3 \#:g2 \#:g2 \#:g8)\\
~~~~~~~~~~~~~~(if (> \#:g8 \#:g3)\\
~~~~~~~~~~~~~~~~~~(setq \#:g3 \#:g8)\\
~~~~~~~~~~~~~~~~~~nil))))\\
~~~~\#:g3))
}\end{minipage}\end{center}
\vspace{1.3em}\end{minipage}~\,}\end{center}
\caption{\texttt{nthmost}¤ÎÅ¸³«·Á¡¥}
\label{fig:ExpansionOfNthmost}
\end{figure}
%}}}
\subsection{Îã¡§B\`ezier¶ÊÀþ}   %{{{
\verb|with-|·Ï¥Þ¥¯¥í¡ÊÂè11.2Àá¡Ë¤ÈÆ±ÍÍ¤Ë¡¤¥³¥ó¥Ñ¥¤¥ë»þ¤Î½èÍý¤Î¤¿¤á¤Î¥Þ¥¯¥í¤Ï¡¤
ÈÆÍÑ¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤È¤·¤Æ¤è¤ê¤â¤¢¤ëÆÃÄê¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Î¤¿¤á¤Î¤â¤Î¤È¤·¤Æ½ñ¤«¤ì¤ë¤³¤È¤¬Â¿¤¤¡¥
ÈÆÍÑ¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ï¡¤¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¤É¤ì¤À¤±¤Î¾ðÊó¤òÆÀ¤é¤ì¤ë¤À¤í¤¦¤«¡©
¤½¤ì¤ÏÍ¿¤¨¤é¤ì¤¿°ú¿ô¤Î¿ô¤È¡¤¾ì¹ç¤Ë¤è¤ì¤Ð¤½¤ì¤é¤ÎÃÍ¤À¡¥
Â¾¤ÎÀ©Ìó¾ò·ï¤ò»È¤¤¤¿¤¤¤Ê¤é¤Ð¡¤
¤½¤ì¤é¤Ï¤­¤Ã¤È¸Ä¡¹¤Î¥×¥í¥°¥é¥à¤Ë²Ý¤µ¤ì¤¿¤â¤Î¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤À¤í¤¦¡¥

Îã¤È¤·¤Æ¡¤¤³¤Î¾Ï¤Ç¤ÏB\`ezier¡Ê¥Ù¥¸¥§¡Ë¶ÊÀþ¤ÎÀ¸À®¤¬¥Þ¥¯¥í¤Ë¤è¤ê¤É¤ì¤À¤±¹âÂ®²½¤Ç¤­¤ë¤«¤ò¼¨¤¹¡¥
B\`ezier¶ÊÀþ¤¬¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¤ËÁàºî¤µ¤ì¤ë¤È¤­¤Ï¡¤¹âÂ®¤ËÀ¸À®¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¶ÊÀþ¤¬´ö¤Ä¤ÎÉôÊ¬¤«¤éÀ®¤ë¤«¤¬¤¢¤é¤«¤¸¤áÊ¬¤«¤Ã¤Æ¤¤¤ë¤Ê¤é¡¤
½èÍý¤ÎÂçÉôÊ¬¤ò¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¹Ô¤¨¤ë¤³¤È¤¬ÌÀ¤é¤«¤Ë¤Ê¤ë¡¥
¶ÊÀþÀ¸À®¥ë¡¼¥Á¥ó¤ò¥Þ¥¯¥í¤È¤·¤Æ½ñ¤¯¤³¤È¤Ç¡¤·×»»ºÑ¤ß¤ÎÃÍ¤ò¥³¡¼¥ÉÆâ¤Ë¿¥¤ê¹þ¤à¤³¤È¤¬¤Ç¤­¤ë¡¥
¤³¤ì¤è¤ê°ìÈÌÅª¤Ê¡¤ÃÍ¤òÇÛÎó¤ËÊÝ»ý¤¹¤ëºÇÅ¬²½¼êË¡¤è¤ê¤â¡¤¤³¤Á¤é¤ÎÊý¤¬Â®¤¤¤Ï¤º¤À¡¥

B\`ezier¶ÊÀþ¤Ï4¸Ä¤ÎÅÀ¤«¤éÄêµÁ¤µ¤ì¤ë\wadash 2¸Ä¤ÎÃ¼ÅÀ¤È2¸Ä¤ÎÀ©¸æÅÀ¤À¡¥
2¼¡¸µ¤Ë¤Ä¤¤¤Æ¹Í¤¨¤ë¤È¤­¡¤
¤³¤ì¤é¤ÎÅÀ¤Ï¶ÊÀþ¾å¤ÎÅÀ¤ÎxºÂÉ¸¤ÈyºÂÉ¸¤òÄê¤á¤ëÊýÄø¼°¤ÎÇÞ²ðÊÑ¿ôÉ½¼¨¤òÄêµÁ¤¹¤ë¡¥
2¸Ä¤ÎÃ¼ÅÀ¤ò (x0, y0) ¤È (x3, y3) ¤È¤·¡¤2¸Ä¤ÎÀ©¸æÅÀ¤ò (x1, y1) ¤È (x2, y2) ¤È¤¹¤ë¤È¡¤
¶ÊÀþ¾å¤ÎÅÀ¤òÄêµÁ¤¹¤ëÊýÄø¼°¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ë¡¥
\[
    x = (x_3 - 3x_2 + 3x_1 - x_0)u^3 + (3x_2 - 6x_1 + 3x_0)u^2 + (3x_1 - 3x_0)u + x_0
\] \[
    y = (y_3 - 3y_2 + 3y_1 - y_0)u^3 + (3y_2 - 6y_1 + 3y_0)u^2 + (3y_1 - 3y_0)u + y_0
\]

¤³¤ì¤é¤ÎÊýÄø¼°¤ò$0$¤«¤é$1$¤Þ¤Ç¤Î$u$¤Î$n$¸Ä¤ÎÃÍ¤Ë¤Ä¤¤¤ÆÉ¾²Á¤¹¤ì¤Ð¡¤
¶ÊÀþ¾å¤ÎÅÀ¤¬$n$¸ÄÆÀ¤é¤ì¤ë¡¥
Îã¤¨¤Ð¶ÊÀþ¤ò20Ê¬³ä¤·¤ÆÉ½¼¨¤·¤¿¤¤¤È¤­¤Ï¡¤
¾å¤ÎÊýÄø¼°¤ò$u = .05, .1,..., .95$¤Ë¤Ä¤¤¤ÆÉ¾²Á¤¹¤ë¤³¤È¤Ë¤Ê¤ë¡¥
ÊýÄø¼°¤ò$u=0$¤Þ¤¿¤Ï$1$¤ÇÉ¾²Á¤¹¤ëÉ¬Í×¤Ï¤Ê¤¤¡¥
$u = 0$¤Ç¤Ï³«»ÏÃ¼ÅÀ$(x_0, y_0)$¤¬¡¤$u = 1$¤Ç¤Ï½ªÎ»Ã¼ÅÀ$(x3, y3)$¤¬ÆÀ¤é¤ì¤ë¤«¤é¤À¡¥

ÌÀ¤é¤«¤ÊºÇÅ¬²½¼êÃÊ¤Ï¡¤$n$¤ò¸ÇÄê¤·¡¤$u$¡¤$u^2$\ldots ¤ò¤¢¤é¤«¤¸¤á·×»»¤·¡¤
¤½¤·¤Æ¤½¤ì¤é¤ò$(n-1) \times 3$ÇÛÎó¤ËÃß¤¨¤ë¤³¤È¤À¡¥
¶ÊÀþÀ¸À®¥ë¡¼¥Á¥ó¤ò¥Þ¥¯¥í¤È¤·¤ÆÄêµÁ¤¹¤ë¤³¤È¤Ç¡¤¸úÎ¨¤ò¤º¤Ã¤È¾å¤²¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
$n$¤¬¥³¥ó¥Ñ¥¤¥ë»þ¤ËÃÎ¤é¤ì¤Æ¤¤¤ì¤Ð¡¤¥×¥í¥°¥é¥à¤Ï¶ÊÀþ¤òÉÁ¤¯¥³¥Þ¥ó¥É$n$¸Ä¤ËÅ¸³«¤Ç¤­¤ë¡¥
¤¢¤é¤«¤¸¤á·×»»¤·¤¿$u$¡¤$u^2$¡¤\ldots ¤Ï¡¤ÇÛÎó¤ËÃß¤¨¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¤
¥Þ¥¯¥í¤ÎÅ¸³«·Á¤ÎÃæ¤ËÄê¿ôÃÍ¤È¤·¤Æ¤½¤Î¤Þ¤ÞÁÞÆþ¤Ç¤­¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defconstant *segs* 20)
(defconstant *du*       (/ 1-0 *segs*))
(defconstant *pts* (make-array (list (1+ *segs*) 2)))

(defmacro genbez (x0 y0 x1 y1 x2 y2 x3 y3)
  (with-gensyms (gx0 gx1 gy0 gy1 gx3 gy3)
                `(let ((,gx0 ,x0) (,gy0 ,y0)
                                  (,gx1 ,x1) (,gy1 ,y1)
                                  (,gx3 ,x3) (,gy3 ,y3))
                   (let ((cx (* (- ,gx1 ,gx0) 3))
                         (cy (* (- ,gy1 ,gy0) 3))
                         (px (* (- ,x2 ,gx1) 3))
                         (py (* (- ,y2 ,gy1) 3)))
                     (let ((bx (- px cx))
                           (by (- py cy))
                           (ax (- ,gx3 px ,gx0))
                           (ay (- ,gy3 py ,gy0)))
                       (setf (aref *pts* 0 0) ,gx0
                             (aref *pts* 0 1) ,gy0)
                       ,@(map1-n #'(lambda (n)
                                      (let* ((u (* n *du*))
                                             (u^2 (* u u))
                                             (u^3 (expt u 3)))
                                        `(setf (aref *pts* ,n 0)
                                               (+ (* ax ,u^3)
                                                  (* bx ,u^2)
                                                  (* cx ,u)
                                                  ,gx0)
                                               (aref *pts* ,n 1)
                                               (+ (* ay ,u^3)
                                                  (* by ,u^2)
                                                  (* cy ,u)
                                                  ,gy0))))
                                  (1- *segs*))
                       (setf (aref *pts* *segs* 0) ,gx3
                             (aref *pts* *segs* 1) ,gy3))))))
\end{FramedVerb}\end{center}
\caption{B\`ezier¶ÊÀþ¤òÀ¸À®¤¹¤ë¤¿¤á¤Î¥Þ¥¯¥í¡¥}
\label{fig:MacroForBezier}
\end{figure}

Âè\ref{fig:MacroForBezier}¿Þ¤Ë¤Ï¤³¤ÎÀïÎ¬¤Ë´ð¤Å¤¯¶ÊÀþÀ¸À®¥Þ¥¯¥í¤ò¼¨¤·¤¿¡¥
¤³¤ì¤Ï¶ÊÀþ¤òÂ¨ºÂ¤ËÉÁ¤¯¤Î¤Ç¤Ï¤Ê¤¯¡¤À¸À®¤·¤¿ºÂÉ¸¤òÇÛÎó¤ËÃß¤¨¤ë¡¥
¶ÊÀþ¤¬¥¤¥ó¥¿¥é¥¯¥Æ¥£¥Ö¤ËÆ°¤«¤µ¤ì¤Æ¤¤¤ë¤È¤­¤Ï¡¤¸Ä¡¹¤Î¶ÊÀþ¤Ï2²ó¤º¤ÄÉÁ¤«¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
É½¼¨¤¹¤ë¤¿¤á¤Ë1²ó¡¤¤½¤·¤Æ¼¡¤òÉÁ¤¯Á°¤Ë¾Ãµî¤¹¤ë¤¿¤á¤Ë¡ÊÌõÃí¡§ÇØ·Ê¿§¤Ç¡Ë1²ó¤À¡¥
¤½¤Î´Ö¡¤¤É¤³¤«¤ËºÂÉ¸¤òÊÝÂ¸¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥

$n = 20$¤Ç¤Ï¡¤\verb|genbez|¤Ï21¸Ä¤Î\verb|setf|¤ËÅ¸³«¤µ¤ì¤ë¡¥
$u$¡¤$u^2$¡¤\ldots ¤Ï¥³¡¼¥ÉÆâ¤ËÄ¾ÀÜ»È¤ï¤ì¤ë¤Î¤Ç¡¤
¤½¤ì¤é¤ò¼Â¹Ô»þ¤ËÇÛÎó¤«¤éÃµ¤¹ÉéÃ´¤È¡¤³«»Ï»þ¤Ë·×»»¤¹¤ëÉéÃ´¤¬ºï¸º¤Ç¤­¤ë¡¥
$u$¡¤$u^2$¡¤\ldots ¤ÈÆ±ÍÍ¤Ë¡¤ÇÛÎó¤Î¥¤¥ó¥Ç¥Ã¥¯¥¹¤âÅ¸³«·ÁÆâ¤Ë¤ÏÄê¿ô¤È¤·¤Æ¸½¤ì¤ë¤Î¤Ç¡¤
\verb|(setf aref)|¤ÎÈÏ°Ï¥Á¥§¥Ã¥¯¤â¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¹Ô¤ï¤ì¤ë¡¥
%}}}
\subsection{±þÍÑ}   %{{{
¤³¤Î¸å¤Î¾Ï¤Ë¤Ï¥³¥ó¥Ñ¥¤¥ë»þ¤ËÍøÍÑ¤Ç¤­¤ë¾ðÊó¤ò³èÍÑ¤¹¤ë¥Þ¥¯¥í¤¬Â¾¤Ë¤â´ö¤Ä¤«ºÜ¤Ã¤Æ¤¤¤ë¡¥
¤è¤¤Îã¤Ï\verb|if-match| ¡Êcvn¥Ú¡¼¥¸¡Ë¤À¡¥
¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¥ã¤Ï¡¤2¤Ä¤Î¥·¡¼¥±¥ó¥¹¡ÊÊÑ¿ô¤ò´Þ¤ó¤Ç¤è¤¤¡Ë¤òÈæ³Ó¤·¡¤
ÊÑ¿ô¤ËÃÍ¤òÂåÆþ¤·¤Æ2¤Ä¤Î¥·¡¼¥±¥ó¥¹¤òÅù¤·¤¯¤¹¤ëÊýË¡¤¬¤¢¤ë¤«¤òÄ´¤Ù¤ë¡¥
\verb|if-match|¤Î¹½À®¤Ï¡¤¥·¡¼¥±¥ó¥¹¤ÎÊÒÊý¤¬¥³¥ó¥Ñ¥¤¥ë»þ¤ËÊ¬¤«¤Ã¤Æ¤¤¤Æ¡¤
¤½¤Á¤é¤À¤±¤¬ÊÑ¿ô¤ò´Þ¤ó¤Ç¤¤¤ë¤Ê¤é¤Ð¡¤¥Þ¥Ã¥Á¥ó¥°¤ò¸úÎ¨Åª¤Ë¹Ô¤¨¤ë¤³¤È¤ò¼¨¤·¤Æ¤¤¤ë¡¥
¼Â¹Ô»þ¤Ë2¤Ä¤Î¥·¡¼¥±¥ó¥¹¤òÈæ³Ó¤·¡¤
¤½¤Î´Ö¤ËÀ¸À®¤µ¤ì¤¿ÊÑ¿ôÂ«Çû¤òÊÝ»ý¤¹¤ë¥ê¥¹¥È¤ò¡¤¥³¥ó¥·¥ó¥°¤Çºî¤ê¾å¤²¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¤
Ê¬¤«¤Ã¤Æ¤¤¤ë¥·¡¼¥±¥ó¥¹¤«¤é·èÄê¤µ¤ì¤ëÃ±½ã¤ÊÈæ³Ó¤ò¹Ô¤¦¥³¡¼¥É¤ò¥Þ¥¯¥í¤ËÀ¸À®¤µ¤»¡¤
Â«Çû¤òLisp¤Î¿¿¤ÎÊÑ¿ô¤ËÃß¤¨¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥

¤Þ¤¿Âè19-24¾Ï¤ÇÀâÌÀ¤¹¤ëËä¤á¹þ¤ß¸À¸ì¤â¡¤¥³¥ó¥Ñ¥¤¥ë»þ¤ËÆÀ¤é¤ì¤ë¾ðÊó¤òÂçÉôÊ¬¤Ç³èÍÑ¤·¤Æ¤¤¤ë¡¥
Ëä¤á¹þ¤ß¸À¸ì¤Ï°ì¼ï¤Î¥³¥ó¥Ñ¥¤¥é¤Ê¤Î¤Ç¡¤¤½¤Î¤è¤¦¤Ê¾ðÊó¤ò»È¤¦¤Ù¤­¤Ç¤¢¤ë¤Î¤Ï¼«Á³¤Ê¤³¤È¤À¡¥
°ìÈÌÂ§¤È¤·¤Æ¤Ï¡¤¥Þ¥¯¥í¤ÏÀº¹ª¤Ç¤¢¤ì¤Ð¤¢¤ëÄø¡¤¤è¤êÂ¿¤¯¤ÎÀ©Ìó¤ò°ú¿ô¤Ë²Ý¤¹¤³¤È¤Ë¤Ê¤ê¡¤
¤³¤ì¤é¤ÎÀ©Ìó¾ò·ï¤ò¸úÎ¨Åª¤Ê¥³¡¼¥É¤ÎÀ¸À®¤ËÍøÍÑ¤Ç¤­¤ë³ÎÎ¨¤¬°ìÁØ¹â¤Þ¤ë¡¥
%}}}
%}}}
\section{¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¥Þ¥¯¥í} %{{{
Âè9¾Ï¤Ç¤Ï¡¤ÊÑ¿ôÊáÂª¤ò¤É¤ì¤âÌäÂê¤È¤·¤Æ°·¤Ã¤¿\wadash
¤¦¤Ã¤«¤ê¤¹¤ë¤Èµ¯¤­¤Æ¤·¤Þ¤¤¡¤¥×¥í¥°¥é¥à¤Ë°­¤¤±Æ¶Á¤À¤±¤òÍ¿¤¨¤ë¤â¤Î¤È¤·¤Æ¡¥
¤³¤Î¾Ï¤Ç¤ÏÊÑ¿ôÊáÂª¤Ï·úÀßÅª¤Ë¤â»È¤¨¤ë¤³¤È¤ò¼¨¤¹¡¥
¤½¤ì¤Ê¤·¤Ç¤Ï½ñ¤±¤Ê¤¤¤è¤¦¤ÊÊØÍø¤Ê¥Þ¥¯¥í¤¬´ö¤Ä¤«¤¢¤ë¤Î¤À¡¥

¤¢¤ë¼°¤¬Èó\verb|nil|¤ÎÃÍ¤òÊÖ¤¹¤«¤É¤¦¤«Ä´¤Ù¡¤
¤½¤¦¤Ê¤é¤ÐÃÍ¤Ë²¿¤«¤ò¹Ô¤¤¤¿¤¤¤è¤¦¤Ê¤³¤È¤ÏLisp¥×¥í¥°¥é¥ß¥ó¥°¤Ç¤ÏÄÁ¤·¤¯¤Ê¤¤¡¥
¼°¤ÎÉ¾²Á¤ËÂç¤­¤ÊÉéÃ´¤¬¤«¤«¤ë¤Ê¤é¤Ð¡¤ÉáÄÌ¤Ï¼¡¤Î¤è¤¦¤Ë¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤À¤í¤¦¡¥
\begin{verbatim}
(let ((result (big-long-calculation)))
  (if result
      (foo result)))
\end{verbatim}
Æü¾ï¸À¸ì¤ÈÆ±¤¸¤è¤¦¤Ë¡¤¤³¤ì¤ò¼¡¤Î¤è¤¦¤ËÉ½¸½¤Ç¤­¤¿¤é³Ú¤Ç¤Ï¤Ê¤¤¤À¤í¤¦¤«¡©
\begin{verbatim}
(if (big-long-calculation)
     (foo it))
\end{verbatim}

ÊÑ¿ôÊáÂª¤òÍøÍÑ¤¹¤ë¤³¤È¤Ç¡¤¤Þ¤µ¤Ë¤³¤Î¤È¤ª¤ê¤ËÆ°ºî¤¹¤ë\verb|if|¤ÎÊÑ¼ï¤òÄêµÁ¤Ç¤­¤ë¡¥
\subsection{¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¤ÊÊÑ¼ï¥ª¥Ú¥ì¡¼¥¿}   %{{{
Æü¾ï¸À¸ì¤Ç¤Ï¡¤¥¢¥Ê¥Õ¥©¥é¡ÊÁ°Êý¾È±þ¡¤anaphora¡Ë¤È¤Ï²ñÏÃ¤ÎÃæ¤ÇÁ°¤Ë½Ð¤Æ¤­¤¿¤³¤È¤ò»Ø¤¹É½¸½¤Î¤³¤È¤À¡¥
±Ñ¸ì¤Ç°ìÈÖÆëÀ÷¤ß¿¼¤¤¥¢¥Ê¥Õ¥©¥é¤Ï¶²¤é¤¯¡Ö¤½¤ì¡×¤Ç¡¤
¡Ö¥ì¥ó¥Á¤ò¼è¤Ã¤¿¤é¡¤¤½¤ì¤ò´ù¤ËÃÖ¤¤¤Æ¤¯¤ì¡×Åù¤È»È¤ï¤ì¤ë
¡ÊÌõÃí¡§ÆüËÜ¸ì¤Ç¤Ï¤½¤â¤½¤â¾Ê¤«¤ì¤ë¤Î¤ÇÎã¤¬ÉÔ¼«Á³¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤Ã¤¿¡Ë¡¥
¥¢¥Ê¥Õ¥©¥é¤ÏÆü¾ï²ñÏÃ¤ÎÃæ¤ÇÂçÊÑÊØÍø¤Ê¤â¤Î¤À\wadash ¤½¤ì¤ò»È¤ï¤Ê¤¤¤³¤È¤òÁÛÁü¤·¤Æ¤ß¤è¤¦\wadash
¤·¤«¤·¤½¤ì¤Ï¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ë¤Ï½Ð¤Æ¤³¤Ê¤¤
¡ÊÌõÃí¡§Perl¤äRuby¤Ç¤Ï \verb|$_| ¤Ç¡ÖºÇ¸å¤ËÆÉ¤ß¹þ¤ó¤ÀÊ¸»úÎó¡×¤¬É½¤»¤ë¡Ë¡¥
¤Û¤È¤ó¤É¤Î¶ÉÌÌ¤Ç¤Ï¡¤¤½¤ì¤Ç¤¤¤¤¡¥
¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¤Ê¡ÊÁ°Êý¾È±þÅª¤Ê¡¤anaphoric¡ËÉ½¸½¤Ï¤·¤Ð¤·¤Ð¤Ò¤É¤¯Û£Ëæ¤À¤¬¡¤
¸½Âå¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ÏÛ£ËæÀ­¤ò°·¤¦¤è¤¦¤Ë¤ÏÀß·×¤µ¤ì¤Æ¤¤¤Ê¤¤¤«¤é¤À¡¥

¤·¤«¤·Èó¾ï¤ËÀ©¸Â¤µ¤ì¤¿·Á¼°¤Î¥¢¥Ê¥Õ¥©¥é¤ò¡¤Û£Ëæ¤µ¤òÆþ¤ì¤º¤ËLisp¥×¥í¥°¥é¥à¤ËÆ³Æþ¤¹¤ë¤³¤È¤Ï²ÄÇ½¤À¡¥
¥¢¥Ê¥Õ¥©¥é¤ÏÊáÂª¤µ¤ì¤¿¥·¥ó¥Ü¥ë¤Ë¤½¤Ã¤¯¤ê¤À¤È¤¤¤¦¤³¤È¤¬Ê¬¤«¤ë¡¥
ÂåÌ¾»ì¤È¤·¤ÆÆ¯¤¯¥·¥ó¥Ü¥ë¤òºî¤ê¡¤¤½¤·¤Æ¤½¤ì¤é¤Î¥·¥ó¥Ü¥ë¤òÊáÂª¤¹¤ë¥Þ¥¯¥í¤ò°Õ¿ÞÅª¤Ë½ñ¤¯¤³¤È¤Ç¡¤
¥¢¥Ê¥Õ¥©¥é¤ò¥×¥í¥°¥é¥à¤ËÆ³Æþ¤Ç¤­¤ë¡¥

¿··¿¤Î\verb|if|¤Ç¤Ï¡¤¥·¥ó¥Ü¥ë\verb|it|¤¬ÊáÂª¤·¤¿¤¤¤â¤Î¤À¡¥
¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¤Ê\verb|if|¤Ï´Ê·é¤Ë\verb|aif|¤È¸Æ¤Ö¤³¤È¤Ë¤¹¤ë¤¬¡¤¼¡¤Î¤è¤¦¤ËÄêµÁ¤µ¤ì¡¤
\begin{verbatim}
(defmacro aif (test-form then-form &optional else-form)
  `(let ((it ,test-form))
     (if it ,then-form ,else-form)))
\end{verbatim}
Á°¤ÎÊý¤ÎÎã¤ÈÆ±¤¸¤è¤¦¤Ë»È¤ï¤ì¤ë¡¥
\begin{verbatim}
(aif (big-long-calculation)
  (foo it))
\end{verbatim}

\verb|aif|¤ò»È¤¦¤È¤­¤Ï¡¤¥Æ¥¹¥ÈÀá¤ÎÊÖ¤¹·ë²Ì¤Ë¥·¥ó¥Ü¥ë\verb|it|¤¬Â«Çû¤µ¤ì¤¿¤Þ¤Þ¤Ë¤Ê¤ë¡¥
¾å¤Î¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ç¤Ï\verb|it|¤Ï¥Õ¥ê¡¼¤Î¤è¤¦¤Ë¸«¤¨¤ë¤¬¡¤
¼ÂºÝ¤Ï¼°\verb|(foo it)|¤Ï\verb|aif|¤ÎÅ¸³«¤ËÈ¼¤¤¡¤
¥·¥ó¥Ü¥ë\verb|it|¤ËÂ«Çû¤Î¤¢¤ë¥³¡¼¥ÉÆâ¤ËÁÞÆþ¤µ¤ì¤ë¡¥
\begin{verbatim}
(let ((it (big-long-calculation)))
  (if it (foo it) nil))
\end{verbatim}
¤è¤Ã¤Æ¥½¡¼¥¹¥³¡¼¥ÉÆâ¤Ç¤Ï¥Õ¥ê¡¼¤Ë¸«¤¨¤ë¥·¥ó¥Ü¥ë¤Ï¥Þ¥¯¥íÅ¸³«¤Ë¤è¤Ã¤ÆÂ«Çû¤µ¤ì¤¿¤Þ¤Þ¤Ë¤Ê¤ë¡¥
¤³¤Î¾Ï¤Ç¼¨¤¹¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¥Þ¥¯¥í¤Ï¡¤Á´¤ÆÆ±¤¸¼êË¡¤Ë´ð¤Å¤¯¤â¤Î¤À¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro aif (test-form then-form &optional else-form)
  `(let ((it ,test-form))
     (if it ,then-form ,else-form)))

(defmacro awhen (test-form &body body)
  `(aif ,test-form
        (progn ,@body)))

(defmacro awhile (expr &body body)
  `(do ((it ,expr ,expr))
     ((not it))
     ,@body))

(defmacro aand (&rest args)
  (cond ((null args) t)
        ((null (cdr args)) (car args))
        (t `(aif ,(car args) (aand ,@(cdr args))))))

(defmacro acond (&rest clauses)
  (if (null clauses)
      nil
      (let ((cl1 (car clauses))
            (sym (gensym)))
        `(let ((,sym ,(car cl1)))
           (if ,sym
               (let ((it ,sym)) ,@(cdr cl1))
               (acond ,@(cdr clauses)))))))
\end{FramedVerb}\end{center}
\caption{Common Lisp¤ÎÉ¸½à¥ª¥Ú¥ì¡¼¥¿¤Î¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¤ÊÊÑ¼ï¡¥}
\label{fig:AnaphoricVariants}
\end{figure}

Âè\ref{fig:AnaphoricVariants}¿Þ¤Ë¤Ï´ö¤Ä¤«¤ÎCommon Lisp¥ª¥Ú¥ì¡¼¥¿¤Î¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¤ÊÊÑ¼ï¤ò¼¨¤·¤¿¡¥
\verb|aif|¤Î¼¡¤Î\verb|awhen|¤Ï¡¤\verb|when|¤ò¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¤Ë¤·¤¿¤â¤Î¤À¡¥
\begin{verbatim}
(awhen (big-long-calculation)
  (foo it)
  (bar it))
\end{verbatim}

\verb|aif|¤â\verb|awhen|¤âÉÑÈË¤ËÌòÎ©¤Ä¤¬¡¤
\verb|awhile|¤Ï¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¤Ç¤Ê¤¤\verb|while|¡Êvgp¥Ú¡¼¥¸¤ÇÄêµÁ¤µ¤ì¤¿¡Ë¤è¤êÂ¿¤¯É¬Í×¤Ë¤Ê¤ë¤È¤¤¤¦ÅÀ¤Ç
¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¥Þ¥¯¥í¤ÎÃæ¤Ç¤Ï¶²¤é¤¯¥æ¥Ë¡¼¥¯¤Ê¤â¤Î¤À¤í¤¦¡¥
\verb|while|¤È\verb|awhile|¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤Ï¡¤
¥×¥í¥°¥é¥à¤¬³°Éô¥Ç¡¼¥¿¤ò´Æ»ë¤¹¤ëÉ¬Í×¤¬¤¢¤ë¾õ¶·¤Ç»È¤ï¤ì¤ë¤Î¤¬Åµ·¿Åª¤À¡¥
¤½¤·¤Æ¥Ç¡¼¥¿¤Î´Æ»ë¤ò·«¤êÊÖ¤¹´Ö¡¤¤½¤ì¤¬¾õÂÖ¤òÊÑ²½¤µ¤»¤ë¤Î¤ò¤¿¤ÀÂÔ¤Ã¤Æ¤¤¤ë¤Î¤Ç¤Ê¤±¤ì¤Ð¡¤
ÉáÄÌ¤ÏÆÀ¤é¤ì¤¿¥ª¥Ö¥¸¥§¥¯¥È¤ËÂÐ¤·²¿¤«¤ò¹Ô¤¤¤¿¤¤¤³¤È¤À¤í¤¦¡¥
\begin{verbatim}
(awhile (poll *fridge*)
  (eat it))
\end{verbatim}

\verb|aand|¤ÎÄêµÁ¤Ï¤½¤ì¤Þ¤Ç¤Î¤â¤Î¤è¤ê¾¯¡¹Ê£»¨¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥
¤³¤ì¤Ï¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¤Ê\verb|and|¤òÍ¿¤¨¤ë¡¥
¤½¤ì¤¾¤ì¤Î°ú¿ô¤ÎÉ¾²Á¤Î´Ö¡¤\verb|it|¤Ï¤½¤ÎÁ°¤Î°ú¿ô¤¬ÊÖ¤·¤¿ÃÍ¤ËÂ«Çû¤µ¤ì¤ë
\footnote{\texttt{and}¤È\texttt{or}¤Ï°ì½ï¤Ë¤·¤Æ¹Í¤¨¤é¤ì¤¬¤Á¤À¤¬¡¤
¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¤Ê\texttt{or}¤ò½ñ¤¤¤Æ¤â°ÕÌ£¤Ï¤Ê¤¤¤À¤í¤¦¡¥
\texttt{or}¤Î°ú¿ô¤¬É¾²Á¤µ¤ì¤ë¤Î¤Ï¡¤¤½¤ì¤è¤êÁ°¤Î°ú¿ô¤¬\texttt{nil}¤ËÉ¾²Á¤µ¤ì¤¿¤È¤­¤À¤±¤À¡¥
¤À¤«¤é\texttt{aor}¤ÎÃæ¤Ç¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¥·¥ó¥Ü¥ë¤ò»²¾È¤·¤Æ¤â¡¤²¿¤âÊØÍø¤Ê¤³¤È¤Ï¤Ê¤¤¤À¤í¤¦¡¥}¡¥
¼ÂÍÑ¤Ç¤Ï¡¤\verb|aand|¤Ï¾ò·ï¤Ë´ð¤Å¤¤¤Æ¥¯¥¨¥ê¤òÈ¯¹Ô¤¹¤ë¥×¥í¥°¥é¥à¤Ç»È¤ï¤ì¤ë¤³¤È¤¬Â¿¤¤¡¥
\begin{verbatim}
(aand (owner x) (address it) (town it))
\end{verbatim}
¤³¤ì¤Ï\verb|x|¤Î½êÍ­¼Ô¤Î½»½ê¡Ê½êÍ­¼Ô¤¬¤¤¤ë¤Ê¤é¤Ð¡Ë¤Î¤¢¤ëÄ®¡Ê½»½ê¤¬¤¢¤ë¤Ê¤é¤Ð¡Ë
¤òÊÖ¤¹¡ÊÄ®¤¬¤¢¤ë¤Ê¤é¤Ð¡Ë¡¥
\verb|aand|¤Ê¤·¤Ç¤Ï¡¤¤³¤ì¤Ï¼¡¤Î¤è¤¦¤Ë½ñ¤«¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤À¤í¤¦¡¥
\begin{verbatim}
(let ((own (owner x)))
  (if own
      (let ((adr (address own)))
        (if adr (town adr)))))
\end{verbatim}

\verb|aand|¤ÎÄêµÁ¤Ï¡¤Å¸³«·Á¤¬¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Î°ú¿ô¤Î¿ô¤Ë¤è¤Ã¤ÆÊÑ¤ï¤ë¤³¤È¤ò¼¨¤·¤Æ¤¤¤ë¡¥
°ú¿ô¤¬0¸Ä¤Î¤È¤­¤Ï¡¤\verb|aand|¤ÏÉáÄÌ¤Î\verb|and|¤ÈÆ±ÍÍ¤Ë¤¿¤À\verb|t|¤òÊÖ¤¹¤À¤±¤À¡¥
¤½¤¦¤Ç¤Ê¤±¤ì¤ÐÅ¸³«·Á¤ÏºÆµ¢Åª¤ËÀ¸À®¤µ¤ì¤ë¡¥
ºÆµ¢¤ÎÃÊ³¬Ëè¤ËÆþ¤ì»Ò¤Ë¤Ê¤Ã¤¿\verb|aif|¤ÎÏ¢º¿¤Ë¿·¤·¤¤ÁØ¤¬ÄÉ²Ã¤µ¤ì¤ë¡¥\\[4pt]
\texttt{(aif} $\langle$Âè1°ú¿ô$\rangle$\\
~~~$\langle$°ú¿ô¤Î»Ä¤ê$\rangle$ \texttt{)}\\[4pt]

ÂçÉôÊ¬¤ÎºÆµ¢´Ø¿ô¤¬\verb|nil|¤ò¼õ¤±¼è¤ëÃÊ³¬¤Þ¤ÇºÆµ¢¤òÂ³¤±¤ë¤Î¤È¤Ï°ã¤¤¡¤
\verb|aand|¤ÎÅ¸³«¤Ï°ú¿ô¤¬1¸Ä¤Î»þÅÀ¤Ç½ª·ë¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
ÁªÂò»è¤¬1¸Ä¤â¤Ê¤¤ÃÊ³¬¤Þ¤ÇºÆµ¢¤¬¿Ê¤ß²á¤®¤ë¤È¡¤Å¸³«·Á¤ÏÉ¬¤º¼¡¤Î¤è¤¦¤Ê·Á¤Ë¤Ê¤ë¡¥
\begin{verbatim}
(aif  c1
         ...(aif  cn t)...)
\end{verbatim}
¤³¤Î¤è¤¦¤Ê¼°¤ÏÉ¬¤º\verb|t|¤«\verb|nil|¤Î¤É¤Á¤é¤«¤òÊÖ¤¹¤Î¤Ç¡¤
¾å¤ÎÎã¤¬°Õ¿Þ¤·¤¿ÄÌ¤ê¤ËÆ°ºî¤·¤Ê¤¯¤Ê¤ë¡¥

Âè10.4Àá¤Ç¡¤¥Þ¥¯¥í¤¬¾ï¤Ë¼«Ê¬¤Î¸Æ¤Ó½Ð¤·¤ò´Þ¤àÅ¸³«·Á¤òÀ¸À®¤¹¤ë¤è¤¦¤Ç¤Ï¡¤
Å¸³«¤Ï±Ê±ó¤Ë½ª·ë¤·¤Ê¤¤¤È·Ù¹ð¤·¤¿¡¥
\verb|aand|¤âºÆµ¢Åª¤À¤¬¡¤¥Ù¡¼¥¹¡¦¥±¡¼¥¹¤Ç¤ÏÅ¸³«·Á¤Ï\verb|aand|¤ò»²¾È¤·¤Ê¤¤¤Î¤Ç°ÂÁ´¤À¡¥

ºÇ¸å¤Î\verb|acond|¤Ï¡¤
\verb|cond|¤ÎÀá¤Î¥Æ¥¹¥È¼°°Ê³°¤Ç¥Æ¥¹¥È¼°¤ÎÊÖ¤·¤¿ÃÍ¤ò»È¤¤¤¿¤¤¾ì¹ç¤Î¤¿¤á¤Ëºî¤é¤ì¤¿¡¥
(¤³¤Î¾õ¶·¤Ï¤È¤Æ¤â¤è¤¯¸½¤ì¤ë¤Î¤Ç¡¤
Scheme¤Î½èÍý·Ï¤Ë¤è¤Ã¤Æ¤Ï\verb|cond|¤ÎÀá¤ÎÃæ¤Ç¥Æ¥¹¥È¼°¤ÎÊÖ¤·¤¿ÃÍ¤ò»È¤¦ÊýË¡¤òÄó¶¡¤·¤Æ¤¤¤ë¡¥)


\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro alambda (parms &body body)
  `(labels ((self ,parms ,@body))
     #'self))

(defmacro ablock (tag &rest args)
  `(block ,tag
     ,(funcall (alambda (args)
                 (case (length args)
                   (0 nil)
                   (1 (car args))
                   (t `(let ((it ,(car args)))
                         ,(self (cdr args))))))
               args)))
\end{FramedVerb}\end{center}
\caption{¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¤Ê¥ª¥Ú¥ì¡¼¥¿¤ÎÂ³¤­¡¥}
\label{fig:MoreAnaphoricVariants}
\end{figure}


\verb|acond|¤ÎÀá¤ÎÅ¸³«·Á¤ÎÃæ¤Ç¤Ï¡¤¥Æ¥¹¥È¼°¤Î·ë²Ì¤ÏºÇ½é¤Ëgensym¤ËÊÝ»ý¤µ¤ì¤ë¡¥
¤³¤ì¤Ï¥·¥ó¥Ü¥ë\verb|it|¤¬Àá¤Î»Ä¤ê¤ÎÉôÊ¬¤Ç¤Î¤ßÂ«Çû¤µ¤ì¤ë¤è¤¦¤Ë¤¹¤ë¤¿¤á¤À¡¥
¥Þ¥¯¥í¤¬Â«Çû¤òÀ¸À®¤¹¤ë¤È¤­¤Ë¤Ï¡¤É¬¤º²ÄÇ½¤Ê¤«¤®¤ê¶¹¤¤¥¹¥³¡¼¥×¤ÎÃæ¤ÇÀ¸À®¤¹¤ë¤Ù¤­¤À¡¥
¤³¤³¤Çgensym¤ò¤±¤Á¤Ã¤Æ¡¤Âå¤ï¤ê¤Ë¼¡¤Î¤è¤¦¤Ë\verb|it|¤ò¥Æ¥¹¥È¼°¤Î·ë²Ì¤ËÄ¾ÀÜÂ«Çû¤¹¤ë¤È¡¤
\begin{verbatim}
(defmacro acond (&rest clauses)              ; ¸í¤ê
  (if (null clauses)
      nil
      (let ((cl1 (car clauses)))
        `(let ((it ,(car cl1)))
           (if it
               (progn ,@(cdr cl1))
               (acond ,@(cdr clauses)))))))
\end{verbatim}
\verb|it|¤ÎÂ«Çû¤Ï¤½¤Î¼¡¤Î¥Æ¥¹¥È¼°¤â¥¹¥³¡¼¥×¤Ë´Þ¤ó¤Ç¤·¤Þ¤¦¤À¤í¤¦¡¥

Âè\ref{fig:MoreAnaphoricVariants}¿Þ¤Ë¤ÏÉ¸½à¥ª¥Ú¥ì¡¼¥¿¤Î¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¤ÊÊÑ¼ï¤Î¡¤
¹¹¤ËÊ£»¨¤Ê¤â¤Î¤ò¼¨¤·¤¿¡¥
¥Þ¥¯¥í\verb|alambda|¤Ï½ñ¤«¤ì¤Æ¤¤¤ë¤Þ¤Þ¤ÎºÆµ¢´Ø¿ô¤ò»²¾È¤¹¤ë¤¿¤á¤Î¤â¤Î¤À¡¥
½ñ¤«¤ì¤Æ¤¤¤ë¤Þ¤Þ¤ÎºÆµ¢´Ø¿ô¤ò»²¾È¤·¤¿¤¤¤È¤­¤È¤Ï¤¤¤Ä¤À¤í¤¦¤«¡©
¥·¥ã¡¼¥×¥¯¥©¡¼¥ÈÉÕ¤­$\lambda$¼°¤ò»È¤¨¤Ð½ñ¤«¤ì¤Æ¤¤¤ë¤Þ¤Þ¤Î´Ø¿ô¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤ë¡¥
\begin{verbatim}
#'(lambda (x) (* x 2))
\end{verbatim}
¤·¤«¤·Âè2¾Ï¤ÇÀâÌÀ¤·¤¿¤è¤¦¤Ë¡¤Ã±½ã¤Ê$\lambda$¼°¤À¤±¤Ç¤ÏºÆµ¢´Ø¿ô¤ÏÉ½¸½¤Ç¤­¤Ê¤¤¡¥
Âå¤ï¤ê¤Ë\verb|labels|¤Ç¥í¡¼¥«¥ë´Ø¿ô¤òÄêµÁ¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¼¡¤Î´Ø¿ô¡Êert¥Ú¡¼¥¸¤«¤éºÆÏ¿¡Ë¤Ï¡¤
\begin{verbatim}
(defun count-instances (obj lists)
  (labels ((instances-in (list)
             (if list
                 (+ (if (eq (car list) obj) 1 0)
                    (instances-in (cdr list)))
                 0)))
    (mapcar #'instances-in lists)))
\end{verbatim}
¥ª¥Ö¥¸¥§¥¯¥È¤È¥ê¥¹¥È¤ò°ú¿ô¤Ë¼è¤ê¡¤¥ê¥¹¥È¤ÎÍ×ÁÇËè¤Ë¤½¤Î¥ª¥Ö¥¸¥§¥¯¥È¤¬´ö¤Ä¸½¤ì¤¿¤«¤òÊÖ¤¹¡¥
\begin{verbatim}
> (count-instances 'a '((a b c) (d a r p a) (d a r) (a a)))
(1 2 1 2)
\end{verbatim}

¥¢¥Ê¥Õ¥©¥é¤ò»È¤¨¤Ð½ñ¤«¤ì¤Æ¤¤¤ë¤Þ¤Þ¤ÎºÆµ¢´Ø¿ô¤ËÁêÅö¤¹¤ë¤â¤Î¤¬ºî¤ì¤ë¡¥
¥Þ¥¯¥í\verb|alambda|¤Ï\verb|labels|¤ò»È¤Ã¤Æ¤½¤Î¤è¤¦¤Ê¤â¤Î¤òºî¤ë¤Î¤Ç¡¤
Îã¤¨¤Ð³¬¾è´Ø¿ô¤òÉ½¸½¤¹¤ë¤Î¤Ë»È¤¨¤ë¡¥
\begin{verbatim}
(alambda (x) (if (= x 0) 1 (* x (self (1- x)))))
\end{verbatim}

\verb|alambda|¤ò»È¤Ã¤Æ\verb|count-instances|¤ÈÅù²Á¤Ê¤â¤Î¤¬¼¡¤Î¤è¤¦¤ËÄêµÁ¤Ç¤­¤ë¡¥
\begin{verbatim}
(defun count-instances (obj lists)
  (mapcar (alambda (list)
            (if list
                (+ (if (eq (car list) obj) 1 0)
                   (self (cdr list)))
                0))
          lists))
\end{verbatim}

Âè\ref{fig:MoreAnaphoricVariants}¡¤\ref{fig:AnaphoricVariants}¿Þ¤Î
Â¾¤Î¥Þ¥¯¥í¤ÏÁ´¤Æ\verb|it|¤òÊáÂª¤¹¤ë¤¬¡¤¤½¤ì¤é¤È°Û¤Ê¤ê¡¤
\verb|alambda|¤Ï\verb|self|¤òÊáÂª¤¹¤ë¡¥
\verb|alambda|¤Ï\verb|labels|¤ËÅ¸³«¤µ¤ì¤ë¤¬¡¤
¤½¤ÎÃæ¤Ç¤Ï\verb|self|¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤ë´Ø¿ô¼«¿È¤ËÂ«Çû¤µ¤ì¤Æ¤¤¤ë¡¥
\verb|alambda|¤ÏÃ»¤¤¤À¤±¤Ç¤Ê¤¯¡¤¸«´·¤ì¤¿$\lambda$¼°¤È»÷¤Æ¤ª¤ê¡¤
¤½¤ì¤ò»È¤Ã¤Æ¤¤¤ë¥³¡¼¥É¤òÆÉ¤ß°×¤¯¤·¤Æ¤¤¤ë¡¥

\verb|ablock|¤ÎÄêµÁ¤Ç¤Ï¿·¤·¤¤¥Þ¥¯¥í¤¬»È¤ï¤ì¤Æ¤¤¤ë¡¥
ÁÈ¤ß¹þ¤ßÆÃ¼ì¼°\verb|block|¤Î¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯ÈÇ¤À¡¥
\verb|block|¤Ç¤Ï°ú¿ô¤ÏÁ´¤Æº¸¤«¤é±¦¤Î½ç¤ËÉ¾²Á¤µ¤ì¤ë¡¥
\verb|ablock|¤Ç¤â¤½¤ì¤ÏÆ±¤¸¤À¤¬¡¤¤½¤ì¤¾¤ì¤Î°ú¿ô¤Ë¤ª¤¤¤ÆÊÑ¿ô\verb|it|¤ÏÁ°¤Î°ú¿ô¤ÎÃÍ¤ËÂ«Çû¤µ¤ì¤ë¡¥

¤³¤Î¥Þ¥¯¥í¤Ï»×Î¸¤ò»ý¤Ã¤Æ»È¤¦¤Ù¤­¤À¡¥
ÊØÍø¤Ê¤³¤È¤â¤¢¤ë¤¬¡¤\verb|ablock|¤Ï¤¦¤Þ¤¯´Ø¿ôÅª¤Ë¤Ê¤ì¤ë¤Ï¤º¤Î¥×¥í¥°¥é¥à¤òÌ¿ÎáÅª¤ËÊÑ¤¨¤Æ¤·¤Þ¤¤¤¬¤Á¤À¡¥
¼¡¤Î¥³¡¼¥É¤Ï¡¤»ÄÇ°¤Ê¤¬¤éÅµ·¿Åª¤Ê±ø¤¤Îã¤À¡¥
\begin{verbatim}
> (ablock north-pole
    (princ "ho ")
    (princ it)
    (princ it)
    (return-from north-pole))
ho ho ho
NIL
\end{verbatim}

°Õ¿ÞÅª¤ËÊÑ¿ôÊáÂª¤ò¹Ô¤¦¥Þ¥¯¥í¤¬ÊÌ¤Î¥Ñ¥Ã¥±¡¼¥¸¤Ë¥¨¥¯¥¹¥Ý¡¼¥È¤µ¤ì¤ë¤È¤­¤Ë¤Ï¤¤¤Ä¤Ç¤â¡¤
ÊáÂª¤µ¤ì¤ë¥·¥ó¥Ü¥ë¤â¥¨¥¯¥¹¥Ý¡¼¥È¤¹¤ë¤³¤È¤¬É¬Í×¤À¡¥
Îã¤¨¤Ð\verb|aif|¤¬¥¨¥¯¥¹¥Ý¡¼¥È¤µ¤ì¤ë¤È¤­¤Ë¤Ï¤¤¤Ä¤Ç¤â\verb|it|¤â¤½¤¦¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤½¤¦¤·¤Ê¤¤¤È¥Þ¥¯¥íÄêµÁÆâ¤Î\verb|it|¤Ï
¥Þ¥¯¥í¸Æ¤Ó½Ð¤·Æâ¤Ç»È¤ï¤ì¤Æ¤¤¤ë\verb|it|¤È¤ÏÊÌ¤Î¥·¥ó¥Ü¥ë¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤¦¤À¤í¤¦¡¥
%}}}
\subsection{¼ºÇÔ}   %{{{
Common Lisp¤Ç¤Ï¥·¥ó¥Ü¥ë\verb|nil|¤Ë¤Ï¾¯¤Ê¤¯¤È¤â3¼ïÎà¤ÎÌò³ä¤¬¤¢¤ë¡¥
¤Þ¤º¤Ê¤Ë¤è¤ê¶õ¥ê¥¹¥È¤Ç¤¢¤Ã¤Æ¡¤¼¡¤Î¤è¤¦¤ËÆ¯¤¯¡¥
\begin{verbatim}
> (cdr '(a))
NIL
\end{verbatim}

¶õ¥ê¥¹¥È¤ÎÂ¾¤Ë¡¤\verb|nil|¤Ï¼¡¤Î¤è¤¦¤Ë¿¿ÍýÃÍ¤Îµ¶¤ÎÉ½¸½¤Ë¤â»È¤ï¤ì¤ë¡¥
\begin{verbatim}
> (= 1 0)
NIL
\end{verbatim}

¤½¤·¤ÆºÇ¸å¤Ë¡¤´Ø¿ô¤Ï\verb|nil|¤òÊÖ¤¹¤³¤È¤Ç¼ºÇÔ¤òÉ½¤¹¡¥
Îã¤¨¤ÐÁÈ¤ß¹þ¤ß´Ø¿ô\verb|find-if|¤Ï¥ê¥¹¥È¤ÎÍ×ÁÇ¤Ç²¿¤«¤Î¾ò·ï¤òËþ¤¿¤¹ºÇ½é¤Î¤â¤Î¤òÊÖ¤¹¡¥
¤½¤Î¤è¤¦¤ÊÍ×ÁÇ¤¬¸«ÉÕ¤«¤é¤Ê¤±¤ì¤Ð¡¤\verb|find-if|¤Ï\verb|nil|¤òÊÖ¤¹¡¥
\begin{verbatim}
> (find-if #'oddp '(2 4 6))
NIL
\end{verbatim}

»ÄÇ°¤Ê¤³¤È¤Ë¾å¤Î¾ì¹ç¤Ï¡¤\verb|find-if|¤¬¸¡º÷¤ËÀ®¸ù¤·¤¿¤¬¡¤
¸¡º÷¤·¤¿¤â¤Î¤¬\verb|nil|¤À¤Ã¤¿¾ì¹ç¤È¶èÊÌ¤¬¤Ä¤«¤Ê¤¤¡¥
\begin{verbatim}
> (find-if #'null '(2 nil 6))
NIL
\end{verbatim}

\verb|nil|¤Çµ¶¤È¶õ¥ê¥¹¥È¤ÎÎ¾Êý¤òÉ½¸½¤·¤¿¤È¤³¤í¤Ç¡¤¼ÂÍÑÅª¤Ë¤ÏÂç¤­¤ÊÌäÂê¤Ïµ¯¤­¤Ê¤¤¡¥
¼ÂºÝ¡¤¤à¤·¤íÊØÍø¤Ê¤³¤È¤â¤¢¤ë¡¥
¤·¤«¤·\verb|find-if|¤Î¤è¤¦¤Ê´Ø¿ô¤ÎÊÖ¤·¤¿·ë²Ì¤ËÛ£ËæÀ­¤¬À¸¤Þ¤ì¤ë¤Î¤Ç¡¤
\verb|nil|¤Ç¼ºÇÔ¤âÉ½¸½¤¹¤ë¤Î¤Ïº¤¤Ã¤¿¤³¤È¤À¡¥

¼ºÇÔ¤ÈÊÖ¤êÃÍ¤Î\verb|nil|¤ò¶èÊÌ¤¹¤ëÌäÂê¤Ï¡¤¥ª¥Ö¥¸¥§¥¯¥È¤ò¸¡º÷¤¹¤ë´Ø¿ôÁ´¤Æ¤Ç¸½¤ì¤ë¡¥
Common Lisp¤Ï¤³¤ÎÌäÂê¤Ë3ÄÌ¤ê¤â¤Î²ò·èºö¤òÍÑ°Õ¤·¤Æ¤¤¤ë¡¥
¡ÊÂ¿ÃÍ¤òÊÖ¤¹ÊýË¡¤Î¼¡¤Ë¡ËºÇ¤â¤è¤¯»È¤ï¤ì¤ëÊýË¡¤Ï¡¤¤È¤ê¤¢¤¨¤º¥ê¥¹¥È¹½Â¤¤òÊÖ¤·¤Æ¤ª¤¯¤³¤È¤À¡¥
Îã¤¨¤Ð\verb|assoc|¤Ç¸¡º÷¼ºÇÔ¤ò¸«Ê¬¤±¤ë¤Î¤Ë¤Ï²¿¤ÎÌäÂê¤â¤Ê¤¤¡¥
À®¸ù¤·¤¿¤È¤­¤Ë¤Ï\verb|assoc|¤Ï¥­¡¼¤ÈÃÍ¤ÎÂÐÁ´ÂÎ¤òÊÖ¤¹¤«¤é¤À¡¥
\begin{verbatim}
> (setq synonyms '((yes . t) (no . nil)))
((YES . T) (NO))
> (assoc 'no synonyms)
(NO)
\end{verbatim}

¤³¤ÎÊýË¡¤ËÊï¤¤¡¤\verb|find-if|¤ÎÛ£ËæÀ­¤¬¿´ÇÛ¤Ê¤È¤­¤Ï¡¤\verb|member-if|¤ò»È¤¦¤³¤È¤Ë¤¹¤ë¡¥
¤³¤ì¤Ï¾ò·ï¤òËþ¤¿¤¹Í×ÁÇ¤À¤±¤òÊÖ¤¹¤Î¤Ç¤Ï¤Ê¤¯¡¤¤½¤ì¤«¤é»Ï¤Þ¤ë\verb|cdr|ÉôÁ´ÂÎ¤òÊÖ¤¹¡¥
\begin{verbatim}
> (member-if #'null '(2 nil 6))
(NIL 6)
\end{verbatim}

Â¿ÃÍ¤¬ÍøÍÑ²ÄÇ½¤Ë¤Ê¤Ã¤Æ°ÊÍè¡¤¤³¤ÎÌäÂê¤Ë¤Ï¿·¤·¤¤²ò·èºö¤¬²Ã¤ï¤Ã¤¿¡¥
Âè1ÊÖ¤êÃÍ¤ò¥Ç¡¼¥¿¤Ë¡¤Âè2ÊÖ¤êÃÍ¤òÀ®¸ù¡¿¼ºÇÔ¤ÎÉ½¸½¤Ë»È¤¦¤Î¤À¡¥
ÁÈ¤ß¹þ¤ß´Ø¿ô\verb|gethash|¤Ï¤½¤Î¤è¤¦¤ËÆ°ºî¤¹¤ë¡¥
¤³¤ì¤Ï¾ï¤Ë2¸Ä¤ÎÃÍ¤òÊÖ¤¹¤¬¡¤2ÈÖÌÜ¤Ï²¿¤«¤¬¸«¤Ä¤«¤Ã¤¿¤«¤É¤¦¤«¤ò¼¨¤¹¤â¤Î¤À¡¥
\begin{verbatim}
> (setf edible                      (make-hash-table)
        (gethash 'olive-oil edible) t
        (gethash 'motor-oil edible) nil)
NIL
> (gethash 'motor-oil edible)
NIL
T
\end{verbatim}
¤À¤«¤éµ¯¤³¤êÆÀ¤ë3ÄÌ¤ê¤Î¾ì¹ç¤òÁ´¤ÆÈ½ÊÌ¤·¤¿¤¤¤Ê¤é¡¤¼¡¤Î¤è¤¦¤Ê´·ÍÑË¡¤¬»È¤¨¤ë¡¥
\begin{verbatim}
(defun edible? (x)
  (multiple-value-bind (val found?) (gethash x edible)
    (if found?
        (if val 'yes 'no)
        'maybe)))
\end{verbatim}
¤³¤ì¤Ë¤è¤ì¤Ðµ¶¤ò¼ºÇÔ¤È¶èÊÌ¤¹¤ë¤Ë¤Ï¼¡¤Î¤è¤¦¤Ë¤¹¤ì¤Ð¤è¤¤¡¥
\begin{verbatim}
> (mapcar #'edible? '(motor-oil olive-oil iguana))
(NO YES MAYBE)
\end{verbatim}

Common Lisp¤Ç¤Ï¼ºÇÔ¤òÉ½¤¹¤Î¤Ë3ÈÖÌÜ¤ÎÊýË¡¤¬ÍøÍÑ¤Ç¤­¤ë¡¥
¥¢¥¯¥»¥¹´Ø¿ô¤¬¡¤¼ºÇÔ¤Î¤È¤­¤ËÊÖ¤¹¤¿¤á¤ÎÆÃÊÌ¤Ê¥ª¥Ö¥¸¥§¥¯¥È
¡Ê¤ª¤½¤é¤¯gensym¤ò»È¤¦¤³¤È¤Ë¤Ê¤ë¤À¤í¤¦¡Ë¤ò°ú¿ô¤Ë¼è¤ë¤è¤¦¤Ë¤¹¤ë¤³¤È¤À¡¥
¤³¤Î¼êË¡¤¬»È¤ï¤ì¤Æ¤¤¤ë\verb|get|¤Ï¥ª¥×¥·¥ç¥Ê¥ë¤Ê°ú¿ô¤ò¼è¤ê¡¤
»ØÄê¤µ¤ì¤¿Â°À­¤¬¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¤È¤­¤Ë¤Ï¤½¤ì¤òÊÖ¤¹¡¥
\begin{verbatim}
> (get 'life 'meaning (gensym))
#:G618
\end{verbatim}

Â¿ÃÍ¤òÊÖ¤»¤ë¤È¤­¤Ë¤Ï¡¤\verb|gethash|¤Ç»È¤ï¤ì¤Æ¤¤¤ë¼êË¡¤¬°ìÈÖ¤­¤ì¤¤¤À¡¥
\verb|get|¤Ç¤·¤Æ¤¤¤ë¤è¤¦¤Ë¡¤
Á´¤Æ¤Î¥¢¥¯¥»¥¹´Ø¿ô¤Ë¥ª¥×¥·¥ç¥Ê¥ë°ú¿ô¤òÅÏ¤µ¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤è¤¦¤Ê¤³¤È¤ÏÈò¤±¤¿¤¤¡¥
¤½¤·¤Æ¥ê¥¹¥È¤ò»È¤¦¼êË¡¤ÈÈæ¤Ù¤Æ¤â¡¤Â¿ÃÍ¤ò»È¤¦Êý¤¬°ìÈÌÀ­¤¬¹â¤¤¡¥
\verb|find-if|¤Ï2¸Ä¤ÎÃÍ¤òÊÖ¤¹¤è¤¦¤Ë½ñ¤­´¹¤¨¤é¤ì¤ë¤¬¡¤
\verb|gethash|¤Ï¥³¥ó¥·¥ó¥°¤òµ¯¤³¤µ¤º¤ËÛ£Ëæ¤µ¤òÌµ¤¯¤»¤ë¤è¤¦¤Ê¥ê¥¹¥È¹½Â¤¤òÊÖ¤¹¤è¤¦¤Ë
½ñ¤­´¹¤¨¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡¥
¤è¤Ã¤Æ¸¡º÷ÍÑ¤Î¿·´Ø¿ô¤ò½ñ¤¯¤È¤­¤ä¡¤¼ºÇÔ¤¬µ¯¤³¤êÆÀ¤ëÁàºî¤Î¤¿¤á¤Ë¤Ï¡¤
ÉáÄÌ¤Ï\verb|gethash|¤Î¼êË¡¤ËÊï¤Ã¤¿Êý¤¬¤è¤¤¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro aif2 (test &optional then else)
  (let ((win (gensym)))
    `(multiple-value-bind (it ,win) ,test
       (if (or it ,win) ,then ,else))))

(defmacro awhen2 (test &body body)
  `(aif2 ,test
         (progn ,@body)))

(defmacro awhile2 (test &body body)
  (let ((flag (gensym)))
    `(let ((,flag t))
       (while ,flag
              (aif2 ,test
                    (progn ,@body)
                    (setq ,flag nil))))))

(defmacro acond2 (&rest clauses)
  (if (null clauses)
      nil
      (let ((cl1 (car clauses))
            (val (gensym))
            (win (gensym)))
        `(multiple-value-bind (,val ,win) ,(car cl1)
           (if (or ,val ,win)
               (let ((it ,val)) ,@(cdr cl1))
               (acond2 ,@(cdr clauses)))))))
\end{FramedVerb}\end{center}
\caption{Â¿ÃÍ¤òÊÖ¤¹¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¥Þ¥¯¥í¡¥}
\label{fig:Multiple-valueAnaphoricMacros}
\end{figure}

\verb|edible?|¤Ç»È¤ï¤ì¤Æ¤¤¤ë´·ÍÑË¡¤ÏÀµ¤Ë¥Þ¥¯¥í¤Ç±£ÊÃ¤Ç¤­¤ëÎà¤Î»öÌ³Åª½èÍý¤À¡¥
\verb|gethash|Åù¤Î¥¢¥¯¥»¥¹´Ø¿ô¤ËÂÐ¤·¤Æ¤Ï¡¤
Æ±¤¸¼°¤Î¿¿µ¶¤òÄ´¤Ù¤Æ·ë²Ì¤òÂ«Çû¤¹¤ë¤Î¤Ç¤Ê¤¯¡¤
Âè1°ú¿ô¤òÄ´¤Ù¤ÆÂè2°ú¿ô¤òÂ«Çû¤¹¤ë¤è¤¦¤Ë\verb|aif|¤ò²þÊÑ¤·¤¿¤â¤Î¤¬Íß¤·¤¯¤Ê¤ë¡¥
¿·¤·¤¤\verb|aif|¤ò\verb|aif2|¤ÈÌ¾ÉÕ¤±¤ë¤¬¡¤
¤½¤ì¤òÂè\ref{fig:Multiple-valueAnaphoricMacros}¿Þ¤Ë¼¨¤·¤¿¡¥
¤³¤ì¤ò»È¤¨¤Ð\verb|edible?|¤Ï¼¡¤Î¤è¤¦¤Ë½ñ¤±¤ë¡¥
\begin{verbatim}
(defun edible? (x)
  (aif2 (gethash x edible)
           (if it 'yes 'no)
           'maybe))
\end{verbatim}

Âè\ref{fig:Multiple-valueAnaphoricMacros}¿Þ¤Ë¤Ï\verb|awhen|¡¤
\verb|awhile|¤ä\verb|acond|¤òÆ±ÍÍ¤Ë²þÊÑ¤·¤¿¤â¤Î¤â¼¨¤·¤¿¡¥
\verb|acond2|¤ÎÍÑÎã¤Ë¤Ä¤¤¤Æ¤Ïeyoi¥Ú¡¼¥¸¤Î\verb|match|¤ÎÄêµÁ¤ò»²¾È¡¥
¤³¤Î¥Þ¥¯¥í¤Ê¤·¤Ç¤ÏÍÚ¤«¤ËÄ¹¤¯¤Ê¤Ã¤ÆÂÐ¾ÎÀ­¤â¤Ê¤¯¤Ê¤Ã¤Æ¤·¤Þ¤¦´Ø¿ô¤â¡¤
¤³¤Î¥Þ¥¯¥í¤ò»È¤¨¤Ð\verb|cond|¤Î·Á¤ÇÉ½¸½¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(let ((g (gensym)))
  (defun read2 (&optional (str *standard-input*))
    (let ((val (read str nil g)))
      (unless (equal val g) (values val t)))))

(defmacro do-file (filename &body body)
  (let ((str (gensym)))
    `(with-open-file (,str ,filename)
       (awhile2 (read2 ,str)
                ,@body))))
\end{FramedVerb}\end{center}
\caption{¥Õ¥¡¥¤¥ëÍÑ¥æ¡¼¥Æ¥£¥ê¥Æ¥£¡¥}
\label{fig:FileUtilities}
\end{figure}

ÁÈ¤ß¹þ¤ß´Ø¿ô\verb|read|¤Ï\verb|get|¤ÈÆ±¤¸ÊýË¡¤Ç¼ºÇÔ¤òÉ½¤¹¡¥
¤³¤ì¤¬¼è¤ë¥ª¥×¥·¥ç¥Ê¥ë°ú¿ô¤Ï\verb|eof|¤Ë½Ð²ñ¤Ã¤¿¤È¤­¤Ë¥¨¥é¡¼¤òµ¯¤³¤¹¤«¤É¤¦¤«»ØÄê¤¹¤ë¤â¤Î¤È¡¤
µ¯¤³¤µ¤Ê¤¤¤È¤­¤ËÊÖ¤¹ÃÍ¤ò»ØÄê¤¹¤ë¤â¤Î¤À¡¥
Âè\ref{fig:FileUtilities}¿Þ¤Ë¼¨¤·¤¿\verb|read|¤ÎÊÌ¤ÎÄêµÁ¤Ï¡¤Âè2ÊÖ¤êÃÍ¤ò»È¤Ã¤Æ¼ºÇÔ¤òÉ½¤¹¡¥
\verb|read2|¤Ï¤¬ÊÖ¤¹2¸Ä¤ÎÃÍ¤Ï¡¤ÆþÎÏ¤µ¤ì¤¿¼°¤È¡¤\verb|eof|¤Î¤È¤­¤Ë\verb|nil|¤Ë¤Ê¤ë¥Õ¥é¥°¤À¡¥
¤³¤ì¤Ï\verb|eof|¤Î¤È¤­¤ËÊÖ¤µ¤ì¤ëgensymÅù¤ò°ú¿ô¤Ë\verb|read|¤ò¸Æ¤Ö¤¬¡¤
\verb|read2|¤¬¸Æ¤Ð¤ì¤ëÅÙ¤Ëgensym¤òÀ¸À®¤¹¤ëÉéÃ´¤òÀáÌó¤¹¤ë¤¿¤á¡¤
¥³¥ó¥Ñ¥¤¥ë»þ¤ËÀ¸À®¤µ¤ì¤ëgensym¤ÎÆÈ¼«¥³¥Ô¡¼¤ò»ý¤Ã¤¿¥¯¥í¡¼¥¸¥ã¤È¤·¤ÆÄêµÁ¤µ¤ì¤Æ¤¤¤ë¡¥

Âè\ref{fig:FileUtilities}¿Þ¤Ë¤Ï¡¤¥Õ¥¡¥¤¥ëÆâ¤Î¼°¤Ë¤Ä¤¤¤ÆÈ¿Éü¤ò¹Ô¤¦¤¿¤á¤ÎÊØÍø¤Ê¥Þ¥¯¥í¤â¼¨¤·¤¿¡¥
¤³¤ì¤Ï\verb|awhile2|¤È\verb|read2|¤ò»È¤Ã¤ÆÄêµÁ¤µ¤ì¤Æ¤¤¤ë¡¥
\verb|do-file|¤ò»È¤¦¤³¤È¤Ç¡¤Îã¤¨¤Ð°ì¼ï¤Î\verb|load|¤ò¼¡¤Î¤è¤¦¤ËÄêµÁ¤Ç¤­¤ë¡¥
\begin{verbatim}
(defun our-load (filename)
  (do-file filename (eval it)))
\end{verbatim}
%}}}
\subsection{»²¾È¤ÎÆ©ÌÀÀ­}   %{{{
¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¥Þ¥¯¥í¤Ï»²¾ÈÆ©ÌÀÀ­¤ò¿¯¤¹¤È¸À¤ï¤ì¤ë¤³¤È¤¬¤¢¤ë¡¥
Gelernter¤ÈJagannathan¤Ï»²¾ÈÆ©ÌÀÀ­¤ò¼¡¤Î¤è¤¦¤ËÄêµÁ¤·¤¿¡¥
\begin{quotation}
    »²¾È¤ÎÆ©ÌÀÀ­¤¬ÊÝ¤¿¤ì¤Æ¤¤¤ë¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È¤Ï¡¤\\
    a) ¤É¤ÎÉôÊ¬¼°¤â¡¤ÃÍ¤ÎÅù¤·¤¤ÊÌ¤Î¼°¤ËÃÖ¤­´¹¤¨¤ë¤³¤È¤¬¤Ç¤­¡¤\\
    b) ¼°¤ÏÇ¤°Õ¤Î¥³¥ó¥Æ¥­¥¹¥ÈÆâ¤Î¤É¤³¤Ç²¿²ó»È¤ï¤ì¤Æ¤âÆ±¤¸ÃÍ¤òÊÖ¤¹¡¤¤è¤¦¤Ê¤â¤Î¤À¡¥
\end{quotation}

¤³¤Î´ð½à¤Ï¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ËÅ¬ÍÑ¤µ¤ì¤ë¤â¤Î¤Ç¡¤¥×¥í¥°¥é¥à¤Ë¤ÏÅ¬ÍÑ¤µ¤ì¤Ê¤¤¤³¤È¤ËÃí°Õ¤·¤è¤¦¡¥
ÂåÆþÁàºî¤ò»ý¤Ä¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ï¤¤¤º¤ì¤â»²¾ÈÆ©ÌÀÀ­¤ò»ý¤¿¤Ê¤¤¡¥
¼¡¤Î¼°¤Ç¡¤ºÇ½é¤ÈºÇ¸å¤Î\verb|x|¤ÏÆ±¤¸ÃÍ¤ò»ý¤¿¤Ê¤¤¡¥
\begin{verbatim}
(list x (setq x (not x))
      x)
\end{verbatim}
¤³¤ì¤Ï\verb|setq|¤¬²ðºß¤·¤Æ¤¤¤ë¤«¤é¤À¡¥
ÌÀ¤é¤«¤Ë¡¤¤³¤ì¤Ï±ø¤¤¥³¡¼¥É¤À¡¥
¤½¤Î¤è¤¦¤Ê¥³¡¼¥É¤¬²ÄÇ½¤Ç¤¢¤ë¤È¤¤¤¦»ö¼Â¤Ï¡¤Lisp¤Ï»²¾ÈÆ©ÌÀÀ­¤ò»ý¤¿¤Ê¤¤¤È¤¤¤¦¤³¤È¤À¡¥

Norvig¤Ï¡¤\verb|if|¤ò¼¡¤Î¤è¤¦¤ËºÆÄêµÁ¤·¤¿¤éÊØÍø¤À¤í¤¦¤È½Ò¤Ù¤¿¤¬¡¤
\begin{verbatim}
(defmacro if (test then &optional else)
  `(let ((that ,test))
        (if that ,then ,else)))
\end{verbatim}
»²¾ÈÆ©ÌÀÀ­¤ò¿¯¤¹¤È¤¤¤¦´ÑÅÀ¤«¤é¤³¤Î¥Þ¥¯¥í¤òµÑ²¼¤·¤Æ¤¤¤ë¡¥

¤·¤«¤·ÌäÂê¤ÏÁÈ¤ß¹þ¤ß¥ª¥Ú¥ì¡¼¥¿¤òºÆÄêµÁ¤·¤¿¤³¤È¤Ë°ø¤ë¤â¤Î¤Ç¡¤¥¢¥Ê¥Õ¥©¥é¤ò»È¤Ã¤¿¤³¤È¤Ë°ø¤ë¤Î¤Ç¤Ï¤Ê¤¤¡¥
¾å¤ÎÄêµÁ¤Îb)Àá¤Ï¡¤¼°¤¬¡ÖÇ¤°Õ¤Î¥³¥ó¥Æ¥­¥¹¥ÈÆâ¡×¤ÇÉ¬¤ºÆ±¤¸ÃÍ¤òÊÖ¤¹¤³¤È¤òÍ×µá¤·¤Æ¤¤¤ë¡¥
¼¡¤Î\verb|let|¤ÎÃæ¤Ç¤Ï¡¤¥·¥ó¥Ü¥ë\verb|that|¤¬¿·¤·¤¤ÊÑ¿ô¤òÉ½¤·¤Æ¤âÌäÂê¤Ï¤Ê¤¤¡¥
\begin{verbatim}
(let ((that 'which))
  ...)
\end{verbatim}
\verb|let|¤ÏÅöÁ³¿·¤·¤¤¥³¥ó¥Æ¥­¥¹¥È¤òÀ¸À®¤¹¤ë¤Ï¤º¤Î¤â¤Î¤À¤«¤é¤À¡¥

¾å¤Î¥Þ¥¯¥í¤ÎÌäÂê¤Ï\verb|if|¤òºÆÄêµÁ¤·¤Æ¤¤¤ë¤³¤È¤Ç¡¤
¤½¤¦¤¹¤ë¤È¿·¤·¤¤¥³¥ó¥Æ¥­¥¹¥È¤¬ºî¤é¤ì¤ë¤³¤È¤Ë¤Ï¤Ê¤é¤Ê¤¤¡¥
¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¥Þ¥¯¥í¤ËÊÌ¤ÎÌ¾Á°¤òÍ¿¤¨¤ì¤ÐÌäÂê¤Ï¾Ã¼º¤¹¤ë¡¥
(¤½¤ì°ÊÁ°¤Ë¡¤\textsf{CLtL2}¤Ë¤¢¤ë¤è¤¦¤Ë\verb|if|¤ÎºÆÄêµÁ¤Ï°ãË¡¤À¡¥)
¤½¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤¬\verb|aif|¤ÎÄêµÁ¤Î°ìÉô¤Ç¤¢¤ë¤³¤È¤Ë¤è¤ê¡¤
¤½¤Î¥Þ¥¯¥í¤¬À¸À®¤·¤¿¥³¥ó¥Æ¥­¥¹¥ÈÆâ¤Ç¤Ï\verb|it|¤¬¿·¤·¤¤ÊÑ¿ô¤Ç¤¢¤ë¸Â¤ê¡¤
¤½¤Î¥Þ¥¯¥í¤Ï»²¾ÈÆ©ÌÀÀ­¤ò¿¯¤µ¤Ê¤¤¡¥

¤µ¤Æ\verb|aif|¤Ï³Î¤«¤ËÊÌ¤Î´·½¬¤Ë°ãÈ¿¤¹¤ë¤¬¡¤¤½¤ì¤Ï»²¾ÈÆ©ÌÀÀ­¤È¤Ï´Ø·¸¤Ê¤¤¡¥
¤½¤Î´·½¬¤È¤Ï¡¤¿·¤·¤¯À¸À®¤µ¤ì¤¿ÊÑ¿ô¤Ï
¥½¡¼¥¹¥³¡¼¥ÉÆâ¤Ç²¿¤é¤«¤Î·Á¤ÇÊ¬¤«¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤Ù¤­¤È¤¤¤¦¤â¤Î¤À¡¥
¾å¤Î\verb|let|¤Ï\verb|that|¤¬¿·¤·¤¤ÊÑ¿ô¤ò»²¾È¤¹¤ë¤è¤¦¤Ë¤Ê¤ë¤³¤È¤ò¤Ï¤Ã¤­¤ê¼¨¤·¤Æ¤¤¤ë¡¥
\verb|aif|Æâ¤Ç¤Î\verb|it|¤ÎÂ«Çû¤¬¤Ï¤Ã¤­¤ê¸«¤¨¤Ê¤¤¤È¤¤¤¦µÄÏÀ¤â¤¢¤ë¤«¤âÃÎ¤ì¤Ê¤¤¡¥
¤·¤«¤·¤³¤ì¤ÏÍ¾¤êÀâÆÀÎÏ¤Î¤¢¤ë°Õ¸«¤Ç¤Ï¤Ê¤¤¡¥
\verb|aif|¤Ï1¸Ä¤ÎÊÑ¿ô¤òÀ¸À®¤¹¤ë¤À¤±¤À¤·¡¤
¤·¤«¤â¤½¤ÎÊÑ¿ô¤òÀ¸À®¤¹¤ë¤³¤È¤À¤±¤¬\verb|aif|¤ò»È¤¦ÍýÍ³¤À¤«¤é¤À¡¥

Common Lisp¤½¤Î¤â¤Î¤Ï¤³¤Î´·½¬¤òÉÔ²Ä¿¯¤Ê¤â¤Î¤È¤Ï¤·¤Æ¤¤¤Ê¤¤¡¥
CLOS´Ø¿ô\verb|call-next-method|¤ÎÂ«Çû¤Ï¥³¥ó¥Æ¥­¥¹¥È¤Ë°ÍÂ¸¤¹¤ë¤¬¡¤
¤³¤ì¤Ï\verb|aif|¤ÎËÜÂÎÆâ¤Ç¥·¥ó¥Ü¥ë\verb|it|¤¬¤½¤¦¤Ê¤Î¤È¤ÈÁ´¤¯Æ±ÍÍ¤À¡¥
(\verb|call-next-method|¤ò¤É¤Î¤è¤¦¤Ë¼ÂÁõ¤¹¤ë¤«¤Ë¤Ä¤¤¤Æ¤Î¥¢¥¤¥Ç¥£¥¢¤Ë¤Ä¤¤¤Æ¤Ï¡¤
xwg¥Ú¡¼¥¸¤Î¥Þ¥¯¥í\verb|defmeth|¤ò»²¾È¡¥)
¤É¤Î¾ì¹ç¤Ë¤·¤í¡¤¤½¤¦¤¤¤Ã¤¿´·½¬¤Ï¤¢¤ëÌÜÅª¤Î¤¿¤á¤Î¼êÃÊ¤È¹Í¤¨¤é¤ì¤Æ¤¤¤ë¤Ë²á¤®¤Ê¤¤¡¥
ÆÉ¤ß°×¤¤¥×¥í¥°¥é¥à¤È¤¤¤¦ÌÜÅª¤À¡¥
¤½¤·¤Æ¥¢¥Ê¥Õ¥©¥é¤Ï¡¤±Ñ¸ì¤òÆÉ¤ß°×¤¯¤·¤Æ¤¯¤ì¤ë¤Î¤ÈÁ´¤¯Æ±ÍÍ¤Ë¡¤³Î¤«¤Ë¥×¥í¥°¥é¥à¤òÆÉ¤ß°×¤¯¤·¤Æ¤¯¤ì¤ë¡¥
%}}}
%}}}
\section{´Ø¿ô¤òÊÖ¤¹¥Þ¥¯¥í} %{{{
Âè5¾Ï¤Ç¤Ï´Ø¿ô¤òÊÖ¤¹´Ø¿ô¤Î½ñ¤­Êý¤ò¼¨¤·¤¿¡¥
¥Þ¥¯¥í¤Ï¥ª¥Ú¥ì¡¼¥¿¤ÎÁÈ¤ß¹ç¤ï¤»¤ò¤º¤Ã¤ÈÍÆ°×¤Ë¤·¤Æ¤¯¤ì¤ë¡¥
¤³¤Î¾Ï¤Ç¤ÏÂè5¾Ï¤ÇÄêµÁ¤·¤¿¤â¤Î¤ÈÆ±¤¸Ãê¾Ý²½¹½Â¤¤ò¡¤
¥Þ¥¯¥í¤ò»È¤Ã¤Æ¤­¤ì¤¤¤Ë¤«¤Ä¸úÎ¨Åª¤Ë¹½ÃÛ¤¹¤ëÊýË¡¤ò¼¨¤¹¡¥
\subsection{´Ø¿ô¤Î¹½ÃÛ}   %{{{
$f$¤È$g$¤¬´Ø¿ô¤Ê¤é¤Ð¡¤$f\circ g(x)=f(g(x))$¤Ç¤¢¤ë¡¥
Âè5.4Àá¤Ç¤Ï¡¤±é»»»Ò$\circ$¤òLisp¤Î´Ø¿ô\verb|compose|¤È¤·¤Æ¼ÂÁõ¤¹¤ëÊýË¡¤ò¼¨¤·¤¿¡¥
\begin{verbatim}
> (funcall (compose #'list #'1+) 2)
(3)
\end{verbatim}

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro fn (expr) `#',(rbuild expr))

(defun rbuild (expr)
  (if (or (atom expr) (eq (car expr) 'lambda))
      expr
      (if (eq (car expr) 'compose)
          (build-compose (cdr expr))
          (build-call (car expr) (cdr expr)))))

(defun build-call (op fns)
  (let ((g (gensym)))
    `(lambda (,g)
       (,op ,@(mapcar #'(lambda (f)
                           `(,(rbuild f) ,g))
                       fns)))))

(defun build-compose (fns)
  (let ((g (gensym)))
    `(lambda (,g)
       ,(labels ((rec (fns)
                      (if fns
                          `(,(rbuild (car fns))
                             ,(rec (cdr fns)))
                          g)))
          (rec fns)))))
\end{FramedVerb}\end{center}
\caption{ÈÆÍÑ¤Î´Ø¿ôÀ¸À®¥Þ¥¯¥í¡¥}
\label{fig:FuncBuildMacro}
\end{figure}

¤³¤Î¾Ï¤Ç¤Ï¡¤¥Þ¥¯¥í¤Ë¤è¤Ã¤Æ¤è¤ê¤è¤¤´Ø¿ôÀ¸À®¥ª¥Ú¥ì¡¼¥¿¤òÄêµÁ¤¹¤ëÊýË¡¤Ë¤Ä¤¤¤Æ¹Í¤¨¤ë¡¥
Âè\ref{fig:FuncBuildMacro}¿Þ¤Ë¤Ï¡¤ÈÆÍÑ¤Î´Ø¿ôÀ¸À®¥ª¥Ú¥ì¡¼¥¿\verb|fn|¤ò¼¨¤·¤¿¡¥
¤³¤ì¤Ï´Ø¿ô¤Î»ÅÍÍ¤Ë´ð¤Å¤¤¤Æ¹çÀ®´Ø¿ô¤ò¹½ÃÛ¤¹¤ë¤â¤Î¤Ç¡¤
\texttt{(\formal{¥ª¥Ú¥ì¡¼¥¿}~.~\formal{°ú¿ô})}¤È¤¤¤¦·Á¤Î¼°¤ò°ú¿ô¤Ë¼è¤ë¡¥
\formal{¥ª¥Ú¥ì¡¼¥¿}¤Ë¤Ï´Ø¿ô¤Þ¤¿¤Ï¥Þ¥¯¥í¤ÎÌ¾Á°¤«¡¤ÆÃÊÌ°·¤¤¤Î\verb|compose|¤¬»ØÄê¤Ç¤­¤ë¡¥
\formal{°ú¿ô}¤Ë¤Ï1¸Ä¤Î°ú¿ô¤ò¼è¤ë´Ø¿ô¤Þ¤¿¤Ï¥Þ¥¯¥í¤ÎÌ¾Á°¤«¡¤\verb|fn|¤Î°ú¿ô¤Ë¤Ê¤êÆÀ¤ë¼°¤¬Æþ¤ë¡¥
Îã¤¨¤Ð¡¤
\begin{verbatim}
(fn (and integerp oddp))
\end{verbatim}
¤¬À¸À®¤¹¤ë´Ø¿ô¤Ï¼¡¤Î¤â¤Î¤ËÅù²Á¤À¡¥
\begin{verbatim}
#'(lambda (x) (and (integerp x) (oddp x)))
\end{verbatim}

\formal{¥ª¥Ú¥ì¡¼¥¿}¤Ë\verb|compose|¤ò»ØÄê¤¹¤ë¤È¡¤\formal{°ú¿ô}¤Î¹çÀ®¤Ë¤Ê¤Ã¤Æ¤¤¤ë´Ø¿ô¤¬ÆÀ¤é¤ì¤ë¡¥
¤·¤«¤·\verb|compose|¤¬´Ø¿ô¤È¤·¤ÆÄêµÁ¤µ¤ì¤Æ¤¤¤¿¤È¤­¤ËÉ¬Í×¤À¤Ã¤¿\verb|funcall|¤Ï¡¤
ÍÛ¤Ë»È¤¦É¬Í×¤¬¤Ê¤¯¤Ê¤Ã¤Æ¤¤¤ë¡¥
Îã¤¨¤Ð¡¤
\begin{verbatim}
(fn (compose list 1+ truncate))
\end{verbatim}
¤Ï¼¡¤Î¤è¤¦¤ËÅ¸³«¤µ¤ì¤ë¡¥
\begin{verbatim}
#'(lambda (#:g1) (list (1+ (truncate #:g1))))
\end{verbatim}
¤³¤¦¤¹¤ë¤È\verb|list|¤ä\verb|1+|Åù¤Î¾®¤µ¤Ê´Ø¿ô¤Î¥¤¥ó¥é¥¤¥ó¡¦¥³¥ó¥Ñ¥¤¥ë¤¬²ÄÇ½¤Ë¤Ê¤ë¡¥
¥Þ¥¯¥í\verb|fn|¤Ï°ìÈÌÅª¤Ê°ÕÌ£¤Ç¤Î¥ª¥Ú¥ì¡¼¥¿¤ÎÌ¾Á°¤ò¼è¤ë¡¥
¤¹¤Ê¤ï¤Á¡¤¼¡¤ÎÎã¤Î¤è¤¦¤Ë$\lambda$¼°¤â»È¤¨¤ë¡¥
\begin{verbatim}
(fn (compose (lambda (x) (+ x 3)) truncate))
\end{verbatim}
¤³¤ì¤Ï¼¡¤Î¤è¤¦¤ËÅ¸³«¤µ¤ì¤ë¡¥
\begin{verbatim}
#'(lambda (#:g2) ((lambda (x) (+ x 3)) (truncate #:g2)))
\end{verbatim}

¤³¤³¤Ç$\lambda$¼°¤È¤·¤ÆÉ½¸½¤µ¤ì¤¿´Ø¿ô¤Ï³Î¤«¤Ë¥¤¥ó¥é¥¤¥ó¡¦¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë¤³¤È¤Ë¤Ê¤ë¡¥
¤È¤¤¤¦¤Î¤â\verb|compose|¤Î°ú¿ô¤È¤·¤ÆÅÏ¤µ¤ì¤¿¥·¥ã¡¼¥×¥¯¥©¡¼¥ÈÉÕ¤­$\lambda$¼°¤Ï
\verb|funcall|¤µ¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤«¤é¤À¡¥

Âè\ref{fig:FunctionBuilders}¿Þ¤Ë¤Ï¡¤\verb|fif|¡¤\verb|fint|¤Ë\verb|fun|¤È¤¤¤Ã¤¿
3¸Ä¤Î´Ø¿ôÀ¸À®¥ª¥Ú¥ì¡¼¥¿¤ÎÄêµÁ¤ò¼¨¤·¤¿¡¥
¤³¤ì¤é¤ÏÈÆÍÑ¥Þ¥¯¥í\verb|fn|¤ËÅý¹ç¤µ¤ì¤ë¤³¤È¤Ë¤Ê¤ë¡¥
\verb|and|¤ò\formal{¥ª¥Ú¥ì¡¼¥¿}¤Ë»ØÄê¤¹¤ë¤È¡¤\formal{°ú¿ô}¤Î´Ø¿ô¤Î¸ò¤ï¤ê¤¬ÆÀ¤é¤ì¤ë¡¥
\begin{verbatim}
> (mapcar (fn (and integerp oddp))
          '(c 3 p 0))
(NIL T NIL NIL)
\end{verbatim}
¤½¤ì¤ËÂÐ¤·¡¤\verb|or|¤Ç¤Ï¹çÊ»¤¬ÆÀ¤é¤ì¤ë¡¥
\begin{verbatim}
> (mapcar (fn (or integerp symbolp))
          '(c 3 p 0-2))
(T T T NIL)
\end{verbatim}
¤½¤·¤Æ\verb|if|¤Ç¤ÏËÜÂÎ¤¬¾ò·ï¤Ë¤è¤Ã¤ÆÊÑ¤ï¤ë´Ø¿ô¤¬ÆÀ¤é¤ì¤ë¡¥
\begin{verbatim}
> (map1-n (fn (if oddp 1+ identity)) 6)
(2 2 4 4 6 6)
\end{verbatim}

¤·¤«¤·¤³¤ì¤é3¸Ä°Ê³°¤ÎLisp¤Î´Ø¿ô¤âÍøÍÑ¤Ç¤­¤ë¡¥
\begin{verbatim}
> (mapcar (fn (list 1- identity 1+))
          '(1 2 3))
((0 1 2) (1 2 3) (2 3 4))
\end{verbatim}
¤½¤·¤Æ\verb|fn|¤Î\formal{°ú¿ô}¼«ÂÎ¤â¼°¤Ç¤¢¤Ã¤Æ¤è¤¤¡¥
\begin{verbatim}
> (remove-if (fn (or (and integerp oddp)
                     (and consp cdr)))
             '(1 (a b) c (d) 2 3-4 (e f g)))
(C (D) 2 3-4)
\end{verbatim}

\verb|fn|¤Ë\verb|compose|¤òÆÃÊÌ°·¤¤¤µ¤»¤Æ¤â¡¤¤½¤ì¤¬¶¯ÎÏ¤Ë¤Ê¤ëÌõ¤Ç¤Ï¤Ê¤¤¡¥
\verb|fn|¤Î\formal{°ú¿ô}¤òÆþ¤ì»Ò¤Ë¤¹¤ì¤Ð¡¤´Ø¿ô¤Î¹çÀ®¤Ë¤Ê¤ë¤«¤é¤À¡¥
Îã¤¨¤Ð¡¤
\begin{verbatim}
(fn (list (1+ truncate)))
\end{verbatim}
¤Ï¼¡¤Î¤è¤¦¤ËÅ¸³«¤µ¤ì¡¤
\begin{verbatim}
#'(lambda (#:g1)
    (list ((lambda (#:g2) (1+ (truncate #:g2))) #:g1)))
\end{verbatim}
¼¡¤ÈÆ±ÍÍ¤ÎÆ°ºî¤Ë¤Ê¤ë¡¥
\begin{verbatim}
(compose #'list #'1+ #'truncate)
\end{verbatim}

¥Þ¥¯¥í\verb|fn|¤¬\verb|compose|¤òÆÃÊÌ°·¤¤¤¹¤ë¤Î¤Ï¡¤¤½¤Î¾ì¹ç¤Î¥³¡¼¥É¤òÆÉ¤ß°×¤¯¤¹¤ë¤¿¤á¤À¤±¤À¡¥
%}}}
\subsection{CdrÉô¤Ç¤ÎºÆµ¢}   %{{{
Âè5.5¡¤5.6Àá¤Ç¤Ï¡¤ºÆµ¢´Ø¿ô¤òÀ¸À®¤¹¤ë´Ø¿ô¤Î½ñ¤­Êý¤ò¼¨¤·¤¿¡¥
¤³¤³¤«¤é¤Î2Àá¤Ç¤Ï¡¤¤½¤³¤ÇÄêµÁ¤·¤¿´Ø¿ô¤ËÂÐ¤·¤Æ
¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¥Þ¥¯¥í¤Ê¤é¤É¤Î¤è¤¦¤Ë¤­¤ì¤¤¤Ê¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÄó¶¡¤Ç¤­¤ë¤«¤ò¼¨¤¹¡¥

Âè5.5Àá¤Ç¤Ï¡¤Ê¿Ã³¤Ê¥ê¥¹¥È¤ËÂÐ¤¹¤ëºÆµ¢´Ø¿ô¤òÀ¸À®¤¹¤ë\verb|lrec|¤ÎÄêµÁÊýË¡¤ò¼¨¤·¤¿¡¥
\verb|lrec|¤ò»È¤¨¤Ð¡¤¼¡¤Î´Ø¿ô\verb|our-every|¤ò¡¤
\begin{verbatim}
(defun our-every (fn lst)
  (if (null lst)
      t
      (and (funcall fn (car lst))
           (our-every fn (cdr lst)))))
\end{verbatim}
Îã¤¨¤Ð\verb|oddp|¤ËÅ¬ÍÑ¤·¤Æ¸Æ¤Ó½Ð¤¹¤Î¤Ï¡¤¼¡¤Î¤è¤¦¤ËÉ½¸½¤Ç¤­¤ë¡¥
\begin{verbatim}
(lrec #'(lambda (x f) (and (oddp x) (funcall f)))
      t)
\end{verbatim}

¤³¤³¤Ç¥Þ¥¯¥í¤¬¿ÍÀ¸¤ÎÌÌÅÝ¤ò¼è¤ê½ü¤¤¤Æ¤¯¤ì¤ë¡¥
ºÆµ¢´Ø¿ô¤òÉ½¸½¤¹¤ë¤Î¤Ë¡¤»ØÄê¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤»öÊÁ¤Ï¤É¤ìÄø¤À¤í¤¦¤«¡©
¥ê¥¹¥È¤Î¸½ºß¤ÎcarÉô¤ÈºÆµ¢¸Æ¤Ó½Ð¤·¤ò¥¢¥Ê¥Õ¥©¥é¤ò»È¤Ã¤Æ
¡Ê¤½¤ì¤¾¤ì\verb|it|¤È\verb|rec|¤È¤·¤Æ¡ËÉ½¸½¤Ç¤­¤¿¤é¡¤¼¡¤Î¤è¤¦¤Ë¤¹¤ì¤Ð¤è¤¯¤Ê¤ë¡¥
\begin{verbatim}
(alrec (and (oddp it) rec) t)
\end{verbatim}

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro alrec (rec &optional base)
  "cltl2 version"
  (let ((gfn (gensym)))
    `(lrec #'(lambda (it ,gfn)
               (symbol-macrolet ((rec (funcall ,gfn)))
                                ,rec))
           ,base)))

(defmacro alrec (rec &optional base)
  "cltl1 version"
  (let ((gfn (gensym)))
    `(lrec #'(lambda (it ,gfn)
               (labels ((rec () (funcall ,gfn)))
                 ,rec))
           ,base)))

(defmacro on-cdrs (rec base &rest lsts)
  `(funcall (alrec ,rec #'(lambda () ,base)) ,@lsts))
\end{FramedVerb}\end{center}
\caption{¥ê¥¹¥È¤Ç¤ÎºÆµ¢¤Î¤¿¤á¤Î¥Þ¥¯¥í¡¥}
\label{fig:MacrosForListRec}
\end{figure}

Âè\ref{fig:MacrosForListRec}¿Þ¤Ë¤Ï¡¤¼¡¤Î¤è¤¦¤Ê¤³¤È¤ò²ÄÇ½¤Ë¤·¤Æ¤¯¤ì¤ë¥Þ¥¯¥í¤ÎÄêµÁ¤ò¼¨¤·¤¿¡¥
\begin{verbatim}
> (funcall (alrec (and (oddp it) rec) t)
                 '(1 3 5))
T
\end{verbatim}
¤³¤Î¥Þ¥¯¥í¤Ï¡¤Âè2°ú¿ô¤È¤·¤ÆÍ¿¤¨¤é¤ì¤¿¼°¤ò\verb|lrec|¤ËÅÏ¤¹´Ø¿ô¤ËÊÑ´¹¤¹¤ë¤³¤È¤ÇÆ°ºî¤¹¤ë¡¥
Âè2°ú¿ô¤Ï¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¤Ë\verb|it|¤ä\verb|rec|¤ò»²¾È¤·¤Æ¤¤¤ë¤«¤â¤·¤ì¤Ê¤¤¤Î¤Ç¡¤
¥Þ¥¯¥í¤ÎÅ¸³«·¿Æâ¤Ç¤Ï¡¤
´Ø¿ô¤ÎËÜÂÎ¤Ï¤½¤ì¤é¤Î¥·¥ó¥Ü¥ë¤¬À¸À®¤¹¤ëÂ«Çû¤Î¥¹¥³¡¼¥×Æâ¤ËÃÖ¤«¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥

¼ÂºÝ¤Ë¤ÏÂè\ref{fig:MacrosForListRec}¿Þ¤Ë¤Ï2¼ïÎà¤Î\verb|alrec|¤ÎÄêµÁ¤ò¼¨¤·¤Æ¤¢¤ë¡¥
¾å¤ÎÎã¤Ç»È¤Ã¤¿Êý¤Ë¤Ï¥·¥ó¥Ü¥ë¡¦¥Þ¥¯¥í¡ÊÂè7.11Àá¡Ë¤¬É¬Í×¤Ë¤Ê¤ë¡¥
¥·¥ó¥Ü¥ë¡¦¥Þ¥¯¥í¤ÏºÇ¶á¤ÎCommon Lisp¤Ç¤·¤«»È¤¨¤Ê¤¤¤Î¤Ç¡¤
Âè\ref{fig:MacrosForListRec}¿Þ¤Ë¤Ï¾¯¡¹ÍøÊØÀ­¤ÎÎô¤ë\verb|alrec|¤â¼¨¤·¤¿¡¥
¤³¤Á¤é¤Ç¤Ï\verb|rec|¤Ï¥í¡¼¥«¥ë´Ø¿ô¤È¤·¤ÆÄêµÁ¤µ¤ì¤Æ¤¤¤ë¡¥
´Ø¿ô¤Ë¤·¤¿¤³¤È¤ÎÂå½þ¤Ï¡¤\verb|rec|¤ò³ç¸Ì¤Ç°Ï¤Þ¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤È¤¤¤¦ÅÀ¤À¡¥
\begin{verbatim}
(alrec (and (oddp it) (rec)) t)
\end{verbatim}
\verb|symbol-macrolet|¤òÄó¶¡¤¹¤ëCommon Lisp½èÍý·Ï¤Ç¤Ï¡¤¸µ¤ÎÊý¤¬¹¥¤Þ¤·¤¤¡¥

Common Lisp¤Ç¤Ï´Ø¿ô¤ÎÌ¾Á°¶õ´Ö¤¬ÆÈÎ©¤·¤Æ¤¤¤ë¤Î¤Ç¡¤
¤³¤ì¤é¤ÎºÆµ¢´Ø¿ôÀ¸À®¥Þ¥¯¥í¤ÇÌ¾Á°¤Î¤¢¤ë´Ø¿ô¤òÄêµÁ¤¹¤ë¤È¤®¤³¤Á¤Ê¤¯¤Ê¤Ã¤Æ¤·¤Þ¤¦¡¥
\begin{verbatim}
(setf (symbol-function 'our-length)
      (alrec (1+ rec) 0))
\end{verbatim}
Âè\ref{fig:CommonLispFuncsDefinedWithOncdr}¿Þ¤ÎºÇ¸å¤Î¥Þ¥¯¥í¤Ï¡¤¤³¤ì¤òÃê¾Ý²½¤¹¤ë¤¿¤á¤Î¤â¤Î¤À¡¥
\verb|on-cdrs|¤ò»È¤¨¤Ð¡¤¾å¤ÎÂå¤ï¤ê¤Ë¼¡¤Î¤è¤¦¤Ë¤¹¤ì¤Ð¤è¤¤¡¥
\begin{verbatim}
(defun our-length (lst)
  (on-cdrs (1+ rec) 0 lst))

(defun our-every (fn lst)
  (on-cdrs (and (funcall fn it) rec) t lst))
\end{verbatim}

\begin{figure}\begin{center}\begin{FramedVerb}
(defun our-copy-list (lst)
  (on-cdrs (cons it rec) nil lst))

(defun our-remove-duplicates (lst)
  (on-cdrs (adjoin it rec) nil lst))

(defun our-find-if (fn lst)
  (on-cdrs (if (funcall fn it) it rec) nil lst))

(defun our-some (fn lst)
  (on-cdrs (or (funcall fn it) rec) nil lst))
\end{FramedVerb}\end{center}
\caption{Common Lisp¤Î´Ø¿ô¤ò\texttt{on-cdr}¤ò»È¤Ã¤ÆÄêµÁ¤·¤¿Îã¡¥}
\label{fig:CommonLispFuncsDefinedWithOncdr}
\end{figure}

Âè\ref{fig:CommonLispFuncsDefinedWithOncdr}¿Þ¤Ë¤Ï¡¤
¤³¤Î¿¿¥Þ¥¯¥í¤ò»È¤Ã¤ÆÄêµÁ¤·¤¿´ûÂ¸¤ÎCommon Lisp¤Î´Ø¿ô¤ò´ö¤Ä¤«¼¨¤·¤¿¡¥
\verb|on-cdrs|¤ò»È¤Ã¤ÆÉ½¸½¤¹¤ë¤È¡¤¤³¤ì¤é¤Î´Ø¿ô¤ÏºÇ¤â´ðËÜÅª¤Ê·Á¤Ë´Ô¸µ¤µ¤ì¤ë¡¥
¤Þ¤¿¡¤¤½¤¦¤·¤Ê¤±¤ì¤ÐÌÀ¤é¤«¤Ë¤Ï¤Ê¤é¤Ê¤«¤Ã¤¿¤³¤ì¤é¤Î´Ø¿ô¤Î´Ö¤ÎÎà»÷À­¤Ë¤âµ¤ÉÕ¤«¤µ¤ì¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defun unions (&rest sets)
  (on-cdrs (union it rec) (car sets) (cdr sets)))

(defun intersections (&rest sets)
  (unless (some #'null sets)
    (on-cdrs (intersection it rec) (car sets) (cdr sets))))

(defun differences (set &rest outs)
  (on-cdrs (set-difference rec it) set outs))

(defun maxmin (args)
  (when args
    (on-cdrs (multiple-value-bind (mx mn) rec
               (values (max mx it) (min mn it)))
             (values (car args) (car args))
             (cdr args))))
\end{FramedVerb}\end{center}
\caption{\texttt{on-cdrs}¤ò»È¤Ã¤ÆÄêµÁ¤µ¤ì¤¿¿·¥æ¡¼¥Æ¥£¥ê¥Æ¥£¡¥}
\label{fig:UtilsWithOnCdrs}
\end{figure}

Âè\ref{fig:UtilsWithOnCdrs}¿Þ¤Ë¤Ï¡¤
\verb|on-cdrs|¤ò»È¤Ã¤ÆÍÆ°×¤ËÄêµÁ¤µ¤ì¤ë¿·¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò´ö¤Ä¤«¼¨¤·¤¿¡¥
»Ï¤á¤Î3¸Ä¡¤\verb|unions|¡¤\verb|intersections|¤Ë\verb|differences|¤Ï¡¤
¤½¤ì¤¾¤ì¹çÊ»½¸¹ç¡¤¶¦ÄÌ½¸¹ç¤ËÊä½¸¹ç¤ò¼ÂÁõ¤·¤Æ¤¤¤ë¡¥
Common Lisp¤Ë¤Ï¤½¤ì¤é¤ÎÁàºî¤Î¤¿¤á¤ÎÁÈ¤ß¹þ¤ß´Ø¿ô¤¬È÷¤ï¤Ã¤Æ¤¤¤ë¤¬¡¤
¤½¤ì¤é¤Ï1²ó¤Ë2¤Ä¤Î¥ê¥¹¥È¤·¤«°ú¿ô¤Ë¼è¤ì¤Ê¤¤¡¥
¤½¤Î¤¿¤á¡¤3¤Ä¤Î¥ê¥¹¥È¤Î¹çÊ»¤òÆÀ¤ë¤¿¤á¤Ë¤Ï¼¡¤Î¤è¤¦¤Ë¤¹¤ëÉ¬Í×¤¬¤¢¤ë¡¥
\begin{verbatim}
> (union '(a b) (union '(b c) '(c d)))
(A B C D)
\end{verbatim}
¿·¤·¤¯ºî¤Ã¤¿\verb|unions|¤Ï\verb|union|¤ÈÆ±ÍÍ¤ËÆ°ºî¤¹¤ë¤¬¡¤Ç¤°Õ¸Ä¿ô¤Î°ú¿ô¤ò¼è¤ì¤ë¡¥
¤À¤«¤é¼¡¤Î¤è¤¦¤Ë¤Ç¤­¤ë¡¥
\begin{verbatim}
> (unions '(a b) '(b c) '(c d))
(D C A B)
\end{verbatim}
\verb|union|¤ÈÆ±ÍÍ¤Ë¡¤\verb|unions|¤ÏÍ×ÁÇ¤Î¸µ¤Î¥ê¥¹¥ÈÆâ¤Ç¤Î½çÈÖ¤òÊÝ¤¿¤Ê¤¤¡¥

Common LispÁÈ¤ß¹þ¤ß¤Î\verb|intersection|¤È¡¤
¤è¤ê°ìÈÌÅª¤Ê\verb|intersections|¤È¤Î´Ø·¸¤â¤³¤ì¤ÈÆ±¤¸¤À¡¥
\verb|intersections|¤ÎÄêµÁ¤Ç¤Ï¡¤¸úÎ¨À­¤Î¤¿¤á¤ËºÇ½é¤Ë¶õ°ú¿ô¤òÄ´¤Ù¤ëÆ°ºî¤¬ÄÉ²Ã¤µ¤ì¤¿¡¥
½¸¹ç¤Î1¤Ä¤¬¶õ¤Î¤È¤­¤Ë¤Ï¡¤¤³¤ì¤ÏÈæ³Ó¤ò¾ÊÎ¬¤¹¤ë¡¥

Common Lisp¤Ë¤Ï\verb|set-difference|¤È¤¤¤¦´Ø¿ô¤âÈ÷¤ï¤Ã¤Æ¤¤¤ë¡¥
¤³¤ì¤Ï2¤Ä¤Î¥ê¥¹¥È¤ò°ú¿ô¤Ë¼è¤ê¡¤1ÈÖÌÜ¤ÎÍ×ÁÇ¤À¤¬¡¤2ÈÖÌÜ¤ÎÍ×ÁÇ¤Ç¤Ï¤Ê¤¤¤â¤Î¤òÊÖ¤¹¡¥
\begin{verbatim}
> (set-difference '(a b c d) '(a c))
(D B)
\end{verbatim}
¾å¤Î¿·¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ç¤Ï¡¤\verb|-|¡Ê¥Þ¥¤¥Ê¥¹¡Ë¤ÈÆ±ÍÍ¤ËÊ£¿ô¸Ä¤Î°ú¿ô¤ò°·¤¨¤ë¡¥
Îã¤¨¤Ð\verb|(differences x y z)|¤Ï\verb|(set-difference x (unions y z))|¤ÈÅù²Á¤À¡¥
¤·¤«¤·¸å¼Ô¤ËÈ¼¤¦¥³¥ó¥·¥ó¥°¤¬ÉÔÉ¬Í×¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥
\begin{verbatim}
> (differences '(a b c d e) '(a f) '(d))
(B C E)
\end{verbatim}

¤³¤ì¤é¤Î½¸¹çÍÑ¥ª¥Ú¥ì¡¼¥¿¤ÏÃ±¤Ê¤ëÎã¤Ç¤¢¤Ã¤Æ¡¤¼ÂºÝ¤ËÉ¬Í×¤Ë¤Ê¤ë¤³¤È¤Ï¤Ê¤¤¡¥
ÁÈ¤ß¹þ¤ß´Ø¿ô\verb|reduce|¤¬´û¤Ë°·¤Ã¤Æ¤¤¤¿¡¤
¥ê¥¹¥È¤ËÂÐ¤¹¤ëºÆµ¢¤ÎÆÃÊÌ¤Ê¾ì¹ç¤òÂåÉ½¤·¤Æ¤¤¤ë¤Ë²á¤®¤Ê¤¤¤«¤é¤À¡¥
Îã¤¨¤Ð¼¡¤Î¤è¤¦¤Ë¤¹¤ëÂå¤ï¤ê¤Ë¡¤
\begin{verbatim}
(unions ...)
\end{verbatim}
¤¿¤À¤³¤¦¤¹¤ì¤Ð¤è¤¤¡¥
\begin{verbatim}
((lambda (&rest args) (reduce #'union args)) ...)
\end{verbatim}
¤·¤«¤·¡¤°ìÈÌÅª¤Ê¾õ¶·¤Ç¤Ï\verb|on-cdrs|¤ÎÊý¤¬\verb|reduce|¤è¤ê¤â¶¯ÎÏ¤À¡¥

rec¤ÏÃÍ¤Ç¤Ê¤¯¸Æ¤Ó½Ð¤·¤ò»²¾È¤¹¤ë¤Î¤Ç¡¤\verb|on-cdrs|¤ò»È¤Ã¤ÆÂ¿ÃÍ¤òÊÖ¤¹´Ø¿ô¤òÀ¸À®¤Ç¤­¤ë¡¥
Âè\ref{fig:UtilsWithOnCdrs}¿Þ¤ÎºÇ¸å¤Î´Ø¿ô\verb|maxmin|¤Ï¤³¤Î²ÄÇ½À­¤ò³èÍÑ¤·¡¤
¥ê¥¹¥È¤ò1²óÃµº÷¤¹¤ë¤¦¤Á¤ËºÇÂç¤ÎÍ×ÁÇ¤ÈºÇ¾®¤ÎÍ×ÁÇ¤ÎÎ¾Êý¤òÈ¯¸«¤¹¤ë¡¥
\begin{verbatim}
> (maxmin '(3 4 2 8 5 1 6 7))
8 1
\end{verbatim}

\verb|on-cdrs|¤Ï¤³¤Î¸å¤Î¾Ï¤Ç½Ð¤Æ¤¯¤ë¥³¡¼¥É¤Ë»È¤¦¤³¤È¤â¤Ç¤­¤ë¤À¤í¤¦¡¥
Îã¤¨¤Ð\verb|compile-cmds|¡Êldq¥Ú¡¼¥¸¡Ë¤Ï¡¤
\begin{verbatim}
(defun compile-cmds (cmds)
      (if (null cmds)
           'regs
           `(,@(car cmds) ,(compile-cmds (cdr cmds)))))
\end{verbatim}
¼¡¤Î¤è¤¦¤Ë´Ê·é¤ËÄêµÁ¤Ç¤­¤ë¡¥
\begin{verbatim}
(defun compile-cmds (cmds)
      (on-cdrs `(,@it ,rec) 'regs cmds))
\end{verbatim}
%}}}
\subsection{ÉôÊ¬¥Ä¥ê¡¼¤Ç¤ÎºÆµ¢}   %{{{
¥ê¥¹¥È¤ËÂÐ¤¹¤ëºÆµ¢¤Ø¤Î¥Þ¥¯¥í¤Î±þÍÑ¤Ï¡¤¥Ä¥ê¡¼¤ËÂÐ¤¹¤ëºÆµ¢¤Ë¤âÅ¬ÍÑ¤Ç¤­¤ë¡¥
¤³¤ÎÀá¤Ç¤Ï¡¢¥Þ¥¯¥í¤ò»È¤Ã¤ÆÂè5.6Àá¤ÇÄêµÁ¤·¤¿¥Ä¥ê¡¼¤ËÂÐ¤¹¤ëºÆµ¢´Ø¿ô¤Ø¤Î
¤è¤ê¤­¤ì¤¤¤Ê¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÄêµÁ¤¹¤ë¡¥

Âè5.6Àá¤Ç¤Ï¡¤¥Ä¥ê¡¼¤ËÂÐ¤¹¤ëºÆµ¢´Ø¿ô¤òÀ¸À®¤¹¤ë´Ø¿ô¤ò2¤ÄÄêµÁ¤·¤¿¡¥
\verb|ttrav|¤Ï¾ï¤Ë¥Ä¥ê¡¼¤ÎÁ´ÂÎ¤òÃµº÷¤¹¤ë¤â¤Î¤Ç¡¤
¤Þ¤¿\verb|trec|¤ÎÊý¤ÏÊ£»¨¤À¤¬¡¤ºÆµ¢¤ÎÄä»ß¤òÀ©¸æ¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥
¤³¤ì¤é¤Î´Ø¿ô¤ò»È¤¨¤Ð¡¤¼¡¤Î\verb|our-copy-tree|¤Ï¡¤
\begin{verbatim}
(defun our-copy-tree (tree)
  (if (atom tree)
      tree
      (cons (our-copy-tree (car tree))
            (if (cdr tree) (our-copy-tree (cdr tree))))))
\end{verbatim}
¤³¤¦¤·¤ÆÉ½¸½¤Ç¤­¤ë¡¥
\begin{verbatim}
(ttrav #'cons)
\end{verbatim}
¤Þ¤¿¼¡¤Î\verb|rfind-if|¤Î¡¤
\begin{verbatim}
(defun rfind-if (fn tree)
  (if (atom tree)
      (and (funcall fn tree) tree)
      (or (rfind-if fn (car tree))
          (and (cdr tree) (rfind-if fn (cdr tree))))))
\end{verbatim}
Îã¤¨¤Ð\verb|oddp|¤Ø¤ÎÅ¬ÍÑ¤Ï¡¤¤³¤¦¤·¤ÆÉ½¸½¤Ç¤­¤ë¡¥
\begin{verbatim}
(trec #'(lambda (o l r) (or (funcall l) (funcall r)))
      #'(lambda (tree) (and (oddp tree) tree)))
\end{verbatim}

Á°Àá¤Ç\verb|lrec|¤ËÂÐ¤·¤Æ¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òºî¤Ã¤¿¤Î¤ÈÆ±ÍÍ¡¤
¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¥Þ¥¯¥í¤Ï\verb|trec|¤Ø¤Î¤è¤êÎÉ¤¤¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òºî¤ì¤ë¡¥
°ìÈÌÅª¤Ê¾ì¹ç¤Ë¤â½½Ê¬ÂÐ½è¤Ç¤­¤ë¥Þ¥¯¥í¤Ï¡¤°Ê²¼¤Î3¤Ä¤ò¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¤Ë»²¾È¤Ç¤­¤ë¤è¤¦¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡§
¸½ºß¡¤ÂÐ¾Ý¤È¤Ê¤Ã¤Æ¤¤¤ë¥Ä¥ê¡¼¡Ê\verb|it|¤È¸Æ¤Ö¤³¤È¤Ë¤¹¤ë¡Ë¡¤
º¸¤ÎÉôÊ¬¥Ä¥ê¡¼¤ËÂÐ¤¹¤ëºÆµ¢¡Ê\verb|left|¤È¸Æ¤Ö¡Ë¡¤
¤½¤·¤Æ±¦¤ÎÉôÊ¬¥Ä¥ê¡¼¤ËÂÐ¤¹¤ëºÆµ¢¡Ê\verb|right|¤È¸Æ¤Ö¡Ë¤À¡¥
¤³¤ì¤é¤ò´·½¬¤È¤·¤ÆÄê¤á¤ì¤Ð¡¤¾å¤Ë¼¨¤·¤¿´Ø¿ô¤Ï¿·¥Þ¥¯¥í¤ò»È¤Ã¤Æ¼¡¤Î¤è¤¦¤ËÉ½¸½¤Ç¤­¤ë¡¥
\begin{verbatim}
(atrec (cons left right))

(atrec (or left right) (and (oddp it) it))
\end{verbatim}
Âè\ref{fig:MacrosForRecOnTree}¿Þ¤Ë¤Ï¡¤¤³¤Î¥Þ¥¯¥í¤ÎÄêµÁ¤ò¼¨¤·¤¿¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro atrec (rec &optional (base 'it))
  "cltl2 version"
  (let ((lfn (gensym)) (rfn (gensym)))
    `(trec #'(lambda (it ,lfn ,rfn)
               (symbol-macrolet ((left (funcall ,lfn))
                                 (right (funcall ,rfn)))
                                ,rec))
           #'(lambda (it) ,base))))

(defmacro atrec (rec &optional (base 'it))
  "cltl1 version"
  (let ((lfn (gensym)) (rfn (gensym)))
    `(trec #'(lambda (it ,lfn ,rfn)
               (labels ((left () (funcall ,lfn))
                        (right () (funcall ,rfn)))
                 ,rec))
           #'(lambda (it) ,base))))

(defmacro on-trees (rec base &rest trees)
  `(funcall (atrec ,rec ,base) ,@trees))
\end{FramedVerb}\end{center}
\caption{¥Ä¥ê¡¼¤ËÂÐ¤¹¤ëºÆµ¢¤Î¤¿¤á¤Î¥Þ¥¯¥í¡¥}
\label{fig:MacrosForRecOnTree}
\end{figure}

\verb|symbol-macrolet|¤ò¥µ¥Ý¡¼¥È¤·¤Ê¤¤Lisp½èÍý·Ï¤Ç¤Ï¡¤
\verb|atrec|¤ÏÂè\ref{fig:MacrosForRecOnTree}¿Þ¤Î2ÈÖÌÜ¤Î·Á¤ÇÄêµÁ¤Ç¤­¤ë¡¥
¤³¤Á¤é¤Ç¤Ï\verb|left|¤È\verb|right|¤ò¥í¡¼¥«¥ë´Ø¿ô¤È¤·¤ÆÄêµÁ¤·¤Æ¤¤¤ë¤Î¤Ç¡¤
\verb|our-copy-tree|¤Ï¼¡¤Î¤è¤¦¤ËÉ½¸½¤µ¤ì¤ëÉ¬Í×¤¬¤¢¤ë¡¥
\begin{verbatim}
(atrec (cons (left) (right)))
\end{verbatim}

ÍøÊØÀ­¤Î¤¿¤á¤Ë¡¤¥Þ¥¯¥í\verb|on-trees|¤âÄêµÁ¤·¤¿¡¥
¤³¤ì¤ÏÁ°Àá¤Î\verb|on-cdrs|¤Ë»÷¤Æ¤¤¤ë¡¥
Âè\ref{fig:FuncDefinedUsingOnTrees}¿Þ¤Ë¤Ï¡¤Âè5.6Àá¤Î´Ø¿ô¤Î\verb|on-trees|¤ò»È¤Ã¤¿ÄêµÁ¤ò¼¨¤·¤¿¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defun our-copy-tree (tree)
  (on-trees (cons left right) it tree))

(defun count-leaves (tree)
  (on-trees (+ left (or right 1)) 1 tree))

(defun flatten (tree)
  (on-trees (nconc left right) (mklist it) tree))

(defun rfind-if (fn tree)
  (on-trees (or left right)
            (and (funcall fn it) it)
            tree))
\end{FramedVerb}\end{center}
\caption{\texttt{on-trees}¤ò»È¤Ã¤ÆÄêµÁ¤·¤¿´Ø¿ô¡¥}
\label{fig:FuncDefinedUsingOnTrees}
\end{figure}

Âè5¾Ï¤ÇÃí°Õ¤·¤¿¤³¤È¤À¤¬¡¤
¤½¤³¤ÇÄêµÁ¤·¤¿ºÆµ¢´Ø¿ôÀ¸À®´Ø¿ô¤Î¹½ÃÛ¤·¤¿´Ø¿ô¤ÏËöÈøºÆµ¢Åª¤Ë¤Ï¤Ê¤é¤Ê¤¤¡¥
\verb|on-cdrs|¤ä\verb|on-trees|¤ò»È¤Ã¤Æ´Ø¿ô¤òÄêµÁ¤¹¤ë¤È¡¤É¬¤º¤·¤âºÇ¹â¤Î¸úÎ¨¤ò»ý¤Ä¼ÂÁõ¤Ï¤Ç¤­¤Ê¤¤¡¥
´ðÈ×¤È¤Ê¤Ã¤Æ¤¤¤ë\verb|trec|¤ä\verb|lrec|¤ÈÆ±ÍÍ¤Ë¡¤
¤³¤ì¤é¤Î¥Þ¥¯¥í¤Ï¼ç¤Ë¥×¥í¥È¥¿¥¤¥×¤ä¡¤¥×¥í¥°¥é¥àÃæ¤Ç¸úÎ¨À­¤¬»ê¾å¤È¤µ¤ì¤Ê¤¤ÉôÊ¬¤Ç»È¤¦¤â¤Î¤À¡¥
¤·¤«¤·¤³¤Î¾Ï¤ÈÂè5¾Ï¤Î´ðÈ×¤È¤Ê¤ë¹Í¤¨¤Ï¡¤
´Ø¿ôÀ¸À®´Ø¿ô¤ò½ñ¤¤¤Æ¡¤¤½¤ì¤Ë¥Þ¥¯¥í¤Î¤­¤ì¤¤¤Ê¥¤¥ó¥¿¥Õ¥§¡¼¥¹¤òÈï¤»¤ë¤³¤È¤¬¤Ç¤­¤ë¤È¤¤¤¦¤³¤È¤À¡¥
¤³¤ì¤ÈÆ±¤¸µ»Ë¡¤Ï¡¤ÆÃ¤Ë¸úÎ¨Åª¤Ê¥³¡¼¥É¤òÀ¸À®¤¹¤ë´Ø¿ôÀ¸À®´Ø¿ô¤ò¹½ÃÛ¤¹¤ë¤È¤­¤Ë¤âÆ±ÍÍ¤Ë»È¤¨¤ë¡¥
%}}}
\subsection{ÃÙ±äÉ¾²Á}   %{{{


\begin{figure}\begin{center}\begin{FramedVerb}
(defconstant unforced (gensym))

(defstruct delay forced closure)

(defmacro delay (expr)
  (let ((self (gensym)))
    `(let ((,self (make-delay :forced unforced)))
       (setf (delay-closure ,self)
             #'(lambda ()
                 (setf (delay-forced ,self) ,expr)))
       ,self)))

(defun force (x)
  (if (delay-p x)
      (if (eq (delay-forced x) unforced)
          (funcall (delay-closure x))
          (delay-forced x))
      x))
\end{FramedVerb}\end{center}
\caption{\texttt{force}¤È\texttt{delay}¤Î¼ÂÁõ¡¥}
\label{fig:ImplementationOfForceAndDelay}
\end{figure}

ÃÙ±äÉ¾²Á¤È¤Ï¡¤¼°¤ò¡¤ÃÍ¤¬É¬Í×¤Ë¤Ê¤Ã¤¿¤È¤­¤Ë¤Î¤ßÉ¾²Á¤¹¤ë¤³¤È¤À¡¥
ÃÙ±äÉ¾²Á¤Î»È¤¤Æ»¤Î1¤Ä¤Ï¡¤ÃÙ±ä¤È¸Æ¤Ð¤ì¤ë¥ª¥Ö¥¸¥§¥¯¥È¤òºî¤ë¤³¤È¤À¡¥
ÃÙ±ä¤È¤Ï²¿¤é¤«¤Î¼°¤ÎÃÍ¤òÊÝ»ý¤¹¤ë¤â¤Î¤Ç¡¤
¼°¤ÎÃÍ¤ò¡¤¤¤¤Ä¤«¸å¤ÇÉ¬Í×¤Ë¤Ê¤Ã¤¿¤È¤­¤Ë¤Ï³Î¤«¤ËÍ¿¤¨¤ë¤È¤¤¤¦ÌóÂ«¤òÉ½¸½¤¹¤ë¡¥
¤È¤³¤í¤ÇÌóÂ«¤ÏLisp¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ê¤Î¤Ç¡¤¤½¤ì¤¬É½¸½¤¹¤ëÃÍ¤ÎÌÜÅª¤ÎÂ¿¤¯¤ËÂÐ¤·¤ÆÌòÎ©¤Ä¡¥
¤½¤·¤Æ¼°¤ÎÃÍ¤¬É¬Í×¤Ë¤Ê¤Ã¤¿¤È¤­¤Ë¤Ï¡¤ÃÙ±ä¤¬ÃÍ¤òÊÖ¤¹¤³¤È¤¬¤Ç¤­¤ë¡¥
Scheme¤Ë¤ÏÃÙ±ä¤ÎÁÈ¤ß¹þ¤ß¥µ¥Ý¡¼¥È¤¬¤¢¤ë¡¥
Scheme¤Î¥ª¥Ú¥ì¡¼¥¿\verb|force|¤È\verb|delay|¤Ï¡¤
Common Lisp¤Ç¤Ï\ref{fig:ImplementationOfForceAndDelay}¿Þ¤Î¤è¤¦¤Ë¼ÂÁõ¤Ç¤­¤ë¡¥
ÃÙ±ä¤Ï2¸Ä¤Î¥á¥ó¥Ð¤ò»ý¤Ä¹½Â¤ÂÎ\verb|delay|¤È¤·¤ÆÉ½¸½¤µ¤ì¤ë¡¥
1ÈÖÌÜ¤Î¥á¥ó¥Ð¤Ï¤³¤ÎÃÙ±ä¤¬¤¹¤Ç¤ËÉ¾²Á¤µ¤ì¤¿¤«¤É¤¦¤«¤òÉ½¤·¡¤É¾²Á¤µ¤ì¤Æ¤¤¤¿¤È¤­¤Ë¤Ï¤½¤ÎÃÍ¤ò´Þ¤à¡¥
2ÈÖÌÜ¤Î¥á¥ó¥Ð¤Ï¥¯¥í¡¼¥¸¥ã¤ò´Þ¤à¤¬¡¤¤³¤ì¤ò¸Æ¤Ö¤È¤³¤ÎÃÙ±ä¤¬É½¸½¤¹¤ëÃÍ¤¬ÆÀ¤é¤ì¤ë¡¥
¥Þ¥¯¥í\verb|delay|¤Ï¼°¤ò°ú¿ô¤Ë¼è¤ê¡¤¤½¤ÎÃÍ¤òÉ½¸½¤¹¤ëÃÙ±ä¤òÊÖ¤¹¡¥
\begin{verbatim}
> (let ((x 2))
    (setq d (delay (1+ x))))
#S(DELAY ...)
\end{verbatim}

ÃÙ±ä¤ÎÃæ¤Î¥¯¥í¡¼¥¸¥ã¤ò¸Æ¤Ö¤³¤È¤Ï¡¤ÃÙ±ä¤ËÂÐ¤·¤Æ¶¯À©(force)¤ò¹Ô¤¦¤³¤È¤ÈÆ±¤¸¤À¡¥
´Ø¿ô\verb|force|¤ÏÇ¤°Õ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ò°ú¿ô¤Ë¼è¤ë¡¥
ÉáÄÌ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤ËÂÐ¤·¤Æ¤Ï¡¤¤½¤Î¤â¤Î¤òÊÖ¤¹´Ø¿ô\verb|identity|¤È¤·¤ÆÆ°ºî¤¹¤ë¤¬¡¤
ÃÙ±ä¤ËÂÐ¤·¤Æ¤Ï¡¤¤½¤ÎÃÙ±ä¤¬É½¸½¤¹¤ëÃÍ¤ÎÍ×µá¤È¤Ê¤ë¡¥
\begin{verbatim}
> (force 'a)
A
> (force d)
3
\end{verbatim}

\verb|force|¤Ï¡¤ÃÙ±ä¤«¤âÃÎ¤ì¤Ê¤¤¥ª¥Ö¥¸¥§¥¯¥È¤ò°·¤Ã¤Æ¤¤¤ë¤È¤­¤Ë¤Ï¤¤¤Ä¤Ç¤â»È¤¨¤ë¡¥
Îã¤¨¤Ð¡¤ÃÙ±ä¤ò´Þ¤à¤«¤â¤·¤ì¤Ê¤¤¥ê¥¹¥È¤òÀ°Îó¤µ¤»¤ë¤È¤­¤Ë¤Ï¡¤¼¡¤Î¤è¤¦¤Ë¤Ç¤­¤ë¡¥
\begin{verbatim}
(sort lst #'(lambda (x y) (> (force x) (force y))))
\end{verbatim}

ÃÙ±ä¤ò¤³¤Î¤è¤¦¤ÊÍç¤Î·Á¤Ç»È¤¦¤Î¤Ï¤ä¤äÉÔÊØ¤À¡¥
¼ÂºÝ¤Î±þÍÑ¸½¾ì¤Ç¤Ï¡¤¹¹¤ËÃê¾Ý²½¤ÎÁØ¤ò½Å¤Í¤Æ±£ÊÃ¤¹¤ë¤³¤È¤Ë¤Ê¤ë¤«¤âÃÎ¤ì¤Ê¤¤¡¥
%}}}
%}}}
\section{¥Þ¥¯¥í¤òÄêµÁ¤¹¤ë¥Þ¥¯¥í} %{{{
¥³¡¼¥ÉÆâ¤ËÀ¸¤¸¤¿¥Ñ¥¿¡¼¥ó¤Ï¡¤¤·¤Ð¤·¤Ð¿·¤·¤¤Ãê¾Ý²½¤¬É¬Í×¤Ç¤¢¤ë¤³¤È¤òÃÎ¤é¤»¤Æ¤¯¤ì¤ë¡¥
¤³¤Î¥ë¡¼¥ë¤Ï¥Þ¥¯¥í¼«¿È¤Î¥³¡¼¥É¤Ë¤Ä¤¤¤Æ¤âÁ´¤¯Æ±¤¸¤¯Åö¤Æ¤Ï¤Þ¤ë¡¥
´ö¤Ä¤«¤Î¥Þ¥¯¥í¤¬»÷¤¿·Á¤ÇÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤È¤­¤Ï¡¤
¥Þ¥¯¥í¤òÄêµÁ¤¹¤ë¥Þ¥¯¥í¤ò½ñ¤¤¤Æ¡¤¤½¤ì¤é¤òÀ¸À®¤µ¤»¤ë¤³¤È¤¬¤Ç¤­¤ë¤«¤âÃÎ¤ì¤Ê¤¤¡¥
¾ÊÎ¬Ì¾¤òÄêµÁ¤¹¤ë¥Þ¥¯¥í¡¤¥¢¥¯¥»¥¹ÍÑ¥Þ¥¯¥í¤òÄêµÁ¤¹¤ë¥Þ¥¯¥í¡¤
¤½¤·¤ÆÂè14.1Àá¤ÇÀâÌÀ¤·¤¿Îà¤Î¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¥Þ¥¯¥í¤òÄêµÁ¤¹¤ë¥Þ¥¯¥í¤À¡¥
\subsection{¾ÊÎ¬}   %{{{
¥Þ¥¯¥í¤ÎÍÑÅÓ¤Î°ìÈÖÃ±½ã¤Ê¤â¤Î¤Ï¡¤¾ÊÎ¬·Á¤È¤·¤Æ»È¤¦¤â¤Î¤À¡¥
Common Lisp¤Î¥ª¥Ú¥ì¡¼¥¿¤Ë¤Ï¤«¤Ê¤êÄ¹¤¤Ì¾Á°¤Î¤â¤Î¤¬¤¢¤ë¡¥
¤½¤ÎÃæ¤Ç¹â¤¤½ç°Ì¤ò¸Ø¤ë¤â¤Î¤¬¡ÊºÇÄ¹¤È¤Ï¤È¤Æ¤â¸À¤¨¤Ê¤¤¤¬¡Ë
\verb|destructuring-bind|¤Ç¡¤18Ê¸»ú¤Ë¤Ê¤ë¡¥
Steele¤Î¸¶Â§¡Êsjl¥Ú¡¼¥¸¡Ë¤«¤éÆ³¤«¤ì¤ë¡Ö·Ï¡×¤Ï¡¤
¤è¤¯»È¤ï¤ì¤ë¥ª¥Ú¥ì¡¼¥¿¤ÎÌ¾Á°¤ÏÃ»¤¯¤¢¤ë¤Ù¤­¤È¤¤¤¦¤³¤È¤À¡¥
(¡Ö²Ã»»Áàºî¤ò¥³¥¹¥È¤ÎÄã¤¤¤â¤Î¤È»×¤¦ÍýÍ³¤Î°ì¤Ä¤Ï¡¤
¤½¤ì¤ò1Ê¸»ú``\,\verb|+|\,''¤ÇÉ½µ­¤Ç¤­¤ë¤³¤È¤À¡¥¡×)
ÁÈ¤ß¹þ¤ß¥Þ¥¯¥í\verb|destructuring-bind|¤Ï¿·¤¿¤ÊÃê¾Ý²½¤ÎÁØ¤ò¤â¤¿¤é¤¹¤¬¡¤
´Ê·é¤µ¤ÎÌÌ¤Ç¤Ï¼ÂºÝ¤ÎÍø±×¤Ï¤½¤ÎÄ¹¤¤Ì¾Á°¤ËÊ¤¤¤±£¤µ¤ì¤Æ¤·¤Þ¤¦¡¥
\begin{verbatim}
(let ((a (car x)) (b (cdr x))) ...)

(destructuring-bind (a . b) x ...)
\end{verbatim}
¥×¥í¥°¥é¥à¤Ï¡¤°õºþ¤µ¤ì¤¿Ê¸¾Ï¤ÈÆ±ÍÍ¡¤1¹Ô¤¬¤»¤¤¤¼¤¤70Ê¸»ú¤Î¤È¤­¤¬°ìÈÖÆÉ¤ß°×¤¤¡¥
1¸Ä¤Î¼±ÊÌ»Ò¤¬¤½¤Î$1/4$¤òÀê¤á¤ë¤è¤¦¤Ê¤È¤­¤Ë¤Ï¡¤»Ï¤á¤«¤é°­¾ò·ï¤Î²¼¤ËÃÖ¤«¤ì¤¿¤³¤È¤Ë¤Ê¤ë¡¥

¹¬±¿¤Ê¤³¤È¤Ë¡¤Lisp¤Î¤è¤¦¤Ê¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ï¡¤¸À¸ìÀß·×¼Ô¤Î·èÄê¤ËÁ´¤Æ¤òÇ¤¤»¤ÆÀ¸¤­¤ëÉ¬Í×¤Ï¤Ê¤¤¡¥
¼¡¤Î¤è¤¦¤ËÄêµÁ¤·¤Æ¤ª¤±¤Ð¡¤
\begin{verbatim}
(defmacro dbind (&rest args)
  `(destructuring-bind ,@args))
\end{verbatim}
¤â¤¦2ÅÙ¤ÈÄ¹¤¤Ì¾Á°¤ò»È¤¦É¬Í×¤Ï¤Ê¤¤¡¥
¹¹¤ËÄ¹¤¯¡¤¤·¤«¤â¤è¤¯»È¤ï¤ì¤ë\verb|multiple-value-bind|¤Ë¤Ä¤¤¤Æ¤âÆ±ÍÍ¤À¡¥
\begin{verbatim}
(defmacro mvbind (&rest args)
  `(multiple-value-bind ,@args))
\end{verbatim}
\verb|dbind|¤È\verb|mvbind|¤ÎÄêµÁ¤Ï¡¤¤É¤ìÄø»÷ÄÌ¤Ã¤Æ¤¤¤ë¤«Ãí°Õ¤·¤ÆÍß¤·¤¤¡¥
¼ÂºÝ¡¤Ç¤°Õ¤Î´Ø¿ô
\footnote{¾ÊÎ¬·Á¤Ï\texttt{apply}¤ä\texttt{funcall}¤Ë¤ÏÅÏ¤»¤Ê¤¤¤¬¡¥}¡¤
¥Þ¥¯¥í¤äÆÃ¼ì¼°¤Î¾ÊÎ¬·Á¤òÄêµÁ¤¹¤ë¤Ë¤Ï¡¤
¤³¤Î·Á¤Î\,\verb|&rest|°ú¿ô¤È¥³¥ó¥Þ¡¦¥¢¥Ã¥È¤Ç½½Ê¬¤Ê¤Î¤À¡¥
ºî¶È¤òÂå¤ï¤ê¤Ë¹Ô¤Ã¤Æ¤¯¤ì¤ë¥Þ¥¯¥í¤¬¼ê¤ËÆþ¤ë¤È¤¤¤¦¤Î¤Ë¡¤
¤É¤¦¤·¤Æ¹¹¤Ë\verb|mvbind|¤ÎÊý¼°¤ÇÄêµÁ¤òºî¤ê½Ð¤µ¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤³¤È¤¬¤¢¤í¤¦¤«¡©

¥Þ¥¯¥í¤òÄêµÁ¤¹¤ë¥Þ¥¯¥í¤òÄêµÁ¤¹¤ë¤Ë¤Ï¡¤¤·¤Ð¤·¤ÐÆþ¤ì»Ò¤Ë¤Ê¤Ã¤¿µÕ¥¯¥©¡¼¥È¤¬É¬Í×¤Ë¤Ê¤ë¡¥
µÕ¥¯¥©¡¼¥È¤ÎÆþ¤ì»Ò¤ÏÍý²ò¤·¿É¤¤¤³¤È¤Ç°­É¾¤¬¹â¤¤¡¥
¤è¤¯»È¤ï¤ì¤ë·Á¤Ë¤Ï¤¤¤Ä¤«´·¤ì¤ë¤À¤í¤¦¤¬¡¤
µÕ¥¯¥©¡¼¥È¤ÎÉÕ¤¤¤¿Ç¤°Õ¤Î¼°¤ò¸«¤Æ¡¤¤É¤Î¤è¤¦¤ËÅ¸³«¤µ¤ì¤ë¤«¤ò¸À¤¨¤ë¤è¤¦¤Ë¤Ê¤ë¤È¤Ï»×¤¦¤Ù¤­¤Ç¤Ï¤Ê¤¤¡¥
¤½¤¦¤Ê¤ë¤Î¤ÏLisp¤Î·ç´Ù¤Ç¤Ï¤Ê¤¯¡¤¤Þ¤·¤Æ¤äÉ½µ­¤Î·ç´Ù¤Ç¤â¤Ê¤¤¡¥
¹þ¤ßÆþ¤Ã¤¿ÀÑÊ¬¤Î¿ô¼°¤ò¸«¤ÆÃÍ¤¬²¿¤«ÃÎ¤ë¤³¤È¤¬¤Ç¤­¤Ê¤¤¤Î¤ÈÆ±¤¸¤³¤È¤À¡¥
º¤Æñ¤ÏÌäÂê¤ÎÃæ¤Ë¤¢¤ê¡¤É½µ­¤ÎÃæ¤Ë¤¢¤ë¤Î¤Ç¤Ï¤Ê¤¤¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro abbrev (short long)
  `(defmacro ,short (&rest args)
     `(,',long ,@args)))

(defmacro abbrevs (&rest names)
  `(progn
     ,@(mapcar #'(lambda (pair)
                    `(abbrev ,@pair))
                (group names 2))))
\end{FramedVerb}\end{center}
\caption{¾ÊÎ¬·Á¤Î¼«Æ°ÄêµÁ¡¥}
\label{fig:AutomaticDefOfAbbrev}
\end{figure}

¤·¤«¤·ÀÑÊ¬¤Ë¼è¤êÁÈ¤à¤È¤­¤ÈÆ±ÍÍ¡¤µÕ¥¯¥©¡¼¥È¤ÎÊ¬ÀÏ¤ò¾®¤µ¤ÊÃÊ³¬¤ËÊ¬¤±¡¤
¤½¤ì¤¾¤ì¤ÏÍÆ°×¤Ë¹½À®¤òÄÉ¤¨¤ë¤è¤¦¤Ë¤¹¤ë¤³¤È¤Ï¤Ç¤­¤ë¡¥
¤³¤³¤Ç¥Þ¥¯¥í\verb|abbrev|¤ò½ñ¤­¤¿¤¤¤È¤·¤è¤¦¡¥
¤³¤ì¤Ï\verb|mvbind|¤ò¤¿¤À¼¡¤Î¤è¤¦¤Ë¤¹¤ë¤À¤±¤ÇÄêµÁ¤Ç¤­¤ë¤è¤¦¤Ë¤·¤Æ¤¯¤ì¤ë¤â¤Î¤À¡¥
\begin{verbatim}
(abbrev mvbind multiple-value-bind)
\end{verbatim}
Âè\ref{fig:AutomaticDefOfAbbrev}¿Þ¤Ë¤Ï¡¤¤³¤Î¥Þ¥¯¥í¤ÎÄêµÁ¤ò¼¨¤·¤¿¡¥
¤³¤ÎÄêµÁ¤Ï²¿¤«¤é½Ð¤Æ¤­¤¿¤Î¤À¤í¤¦¤«¡©
¤³¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤ÎÄêµÁ¤Ï¡¤Å¸³«Îã¤«¤éÆ³¤±¤ë¡¥
Å¸³«Îã¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ë¡¥
\begin{verbatim}
(defmacro mvbind (&rest args)
  `(multiple-value-bind ,@args))
\end{verbatim}
µÕ¥¯¥©¡¼¥È¤ÎÃæ¤«¤é\verb|multiple-value-bind|¤ò¼è¤ê½Ð¤¹¤È¡¤Æ³½Ð¤Ï´ÊÃ±¤Ë¤Ê¤ë¡¥
ºÇ½ªÅª¤Ëºî¤é¤ì¤ë¥Þ¥¯¥í¤Ç¤Ï¤½¤ì¤¬°ú¿ô¤Ë¤Ê¤ë¤³¤È¤¬Ê¬¤«¤Ã¤Æ¤¤¤ë¤«¤é¤À¡¥
¤³¤¦¤·¤Æ¡¤¼¡¤ÎÅù²Á¤ÊÄêµÁ¤¬ÆÀ¤é¤ì¤ë¡¥
\begin{verbatim}
(defmacro mvbind (&rest args)
  (let ((name 'multiple-value-bind))
    `(,name ,@args)))
\end{verbatim}
¤³¤ì¤Ç¤³¤Î¼°¤ò¥Æ¥ó¥×¥ì¡¼¥È¤Ë¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
ÀèÆ¬¤ËµÕ¥¯¥©¡¼¥È¤òÉÕ¤±¡¤ÊÑ²½¤·ÆÀ¤ë¼°¤òÊÑ¿ô¤ËÃÖ¤­´¹¤¨¤ë¡¥
\begin{verbatim}
`(defmacro ,short (&rest args)
   (let ((name ',long))
     `(,name ,@args)))
\end{verbatim}
ºÇ¸å¤Ë¡¤ÆâÂ¦¤ÎµÕ¥¯¥©¡¼¥ÈÆâ¤Î\verb|',long|¤ò\verb|name|¤ËÃÖ¤­´¹¤¨¤Æ¼°¤ò´ÊÎ¬²½¤¹¤ë¡¥
\begin{verbatim}
`(defmacro ,short (&rest args)
   `(,',long ,@args))
\end{verbatim}
¤³¤ì¤ÇÂè\ref{fig:AutomaticDefOfAbbrev}¿Þ¤Ë¼¨¤·¤¿¥Þ¥¯¥í¤ÎËÜÂÎ¤¬ÆÀ¤é¤ì¤ë¡¥

Âè\ref{fig:AutomaticDefOfAbbrev}¿Þ¤Ë¤Ï\verb|abbrevs|¤â¼¨¤·¤¿¡¥
¤³¤ì¤ÏÊ£¿ô¤Î¾ÊÎ¬·Á¤òÆ±»þ¤ËÄêµÁ¤·¤¿¤¤¤È¤­¤Ë»È¤¦¡¥
\begin{verbatim}
(abbrevs dbind  destructuring-bind
         mvbind multiple-value-bind
         mvsetq multiple-value-setq)
\end{verbatim}
\verb|abbrevs|¤ò»È¤¦¤Ë¤ÏÍ¾·×¤Ê³ç¸Ì¤òÁÞÆþ¤¹¤ëÉ¬Í×¤Ï¤Ê¤¤¡¥
\verb|abbrevs|¤Ï\verb|group|¡Êaqh¥Ú¡¼¥¸¡Ë¤ò¸Æ¤Ó¡¤°ú¿ô¤ò2¸Ä¤´¤È¤Ë¤Þ¤È¤á¤ë¤«¤é¤À¡¥
°ìÈÌ¤Ë¡¤ÏÀÍýÅª¤Ë¤ÏÉÔÍ×¤Ê³ç¸Ì¤òÂÇ¤Á¹þ¤à¤Î¤ò¥Þ¥¯¥í¤¬¾Ê¤¤¤Æ¤¯¤ì¤ë¤Î¤Ï¤è¤¤¤³¤È¤À¡¥
\verb|group|¤Ï¤½¤¦¤¤¤Ã¤¿¥Þ¥¯¥í¤ÎÂçÉôÊ¬¤ËÌòÎ©¤Ä¡¥
%}}}
\subsection{Â°À­}   %{{{
Lisp¤Ï¡¤²¿¤«¤ÎÂ°À­¤ò¥ª¥Ö¥¸¥§¥¯¥È¤Ë´ØÏ¢¤Å¤±¤ëÊýË¡¤ò¿ôÂ¿¤¯Äó¶¡¤¹¤ë¡¥
ÌäÂê¤È¤µ¤ì¤ë¥ª¥Ö¥¸¥§¥¯¥È¤¬¥·¥ó¥Ü¥ë¤È¤·¤ÆÉ½¸½¤µ¤ì¤ë¤È¤­¤Ï¡¤
°ìÈÖÊØÍø¤ÊÊýË¡¤Ï¡Ê°ìÈÖ¸úÎ¨¤¬°­¤¤¤¬¡Ë¥·¥ó¥Ü¥ë¤ÎÂ°À­¥ê¥¹¥È¤ò»È¤¦¤â¤Î¤À¡¥
¥ª¥Ö¥¸¥§¥¯¥È\verb|o|¤¬Â°À­\verb|p|¤ò»ý¤Á¡¤¤½¤ÎÃÍ¤¬\verb|v|¤Ç¤¢¤ë¤È¤¤¤¦»ö¼Â¤òÉ½¸½¤¹¤ë¤Ë¤Ï¡¤
\verb|o|¤ÎÂ°À­¥ê¥¹¥È¤òÀßÄê¤¹¤ë¡¥
\begin{verbatim}
(setf (get op) v)
\end{verbatim}
¤À¤«¤é\verb|ball1|¤¬¿§\verb|red|¤ò»ý¤Ä¤³¤È¤òÉ½¸½¤¹¤ë¤Ë¤Ï¡¤¤³¤¦¤¹¤ì¤Ð¤è¤¤¡¥
\begin{verbatim}
(setf (get 'ball1 'color) 'red)
\end{verbatim}
¥ª¥Ö¥¸¥§¥¯¥È¤ÎÂ°À­¤Î¤¦¤ÁÉÑÈË¤Ë»²¾È¤¹¤ë¤â¤Î¤¬¤¢¤ë¤È¤­¤Ï¡¤¤½¤ì¤ò»²¾È¤¹¤ë¥Þ¥¯¥í¤òÄêµÁ¤·¡¤
\begin{verbatim}
(defmacro color (obj)
   `(get ,obj 'color))
\end{verbatim}
¤½¤·¤Æ\verb|get|¤Î¾ì½ê¤Ë\verb|color|¤ò»È¤¦¡¥
\begin{verbatim}
> (color 'ball1)
RED
\end{verbatim}
¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ï\verb|setf|¤ËÂÐ¤·¤ÆÆ©ÌÀ¤Ê¤Î¤Ç¡ÊÂè12¾Ï¤ò»²¾È¡Ë¤³¤¦¤â½ñ¤±¤ë¡¥
\begin{verbatim}
> (setf (color 'ball1) 'green)
GREEN
\end{verbatim}

¤½¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤Ë¤Ï¡¤
¥×¥í¥°¥é¥à¤¬¥ª¥Ö¥¸¥§¥¯¥È¤Î¿§¤òÉ½¸½¤¹¤ë¤Î¤Ë»È¤¦ÆÃÄê¤ÎÊýË¡¤ò±£ÊÃ¤Ç¤­¤ë¤È¤¤¤¦ÍøÅÀ¤¬¤¢¤ë¡¥
Â°À­¥ê¥¹¥È¤ÏÃÙ¤¤¡¥
¥×¥í¥°¥é¥à¤Îº£¸å¤Î¥ô¥¡¡¼¥¸¥ç¥ó¤Ç¤Ï¡¤Â®ÅÙ¤ò¹ÍÎ¸¤·¡¤
¿§¤ò¹½Â¤ÂÎ¤Î¥Õ¥£¡¼¥ë¥É¤Þ¤¿¤Ï¥Ï¥Ã¥·¥åÉ½¤Î¹àÌÜ¤È¤·¤ÆÉ½¸½¤¹¤ë¤³¤È¤Ë¤Ê¤ë¤«¤âÃÎ¤ì¤Ê¤¤¡¥
\verb|color|¤Î¤è¤¦¤Ë¡¤¥Ç¡¼¥¿¤ò¤½¤ì¤ËÈï¤»¤¿¥Þ¥¯¥í·ÐÍ³¤Ç°·¤¦¤È¡¤
¤«¤Ê¤ê¹½ÃÛ¤Î¿Ê¤ó¤À¥×¥í¥°¥é¥à¤Ë¤ª¤¤¤Æ¤¹¤é¡¤
ºÇ²¼ÁØ¤Î¥³¡¼¥É¤ËÂç¤­¤ÊÊÑ¹¹¤ò²Ã¤¨¤ë¤³¤È¤¬ÍÆ°×¤Ë¤Ê¤ë¡¥
¥×¥í¥°¥é¥à¤Ç»È¤¦¤â¤Î¤¬Â°À­¥ê¥¹¥È¤«¤é¹½Â¤ÂÎ¤Ë°Ü¹Ô¤·¤Æ¤â¡¤
¤½¤³¤ËÈï¤»¤¿¥¢¥¯¥»¥¹ÍÑ¥Þ¥¯¥í¤è¤ê¾å¤ÎÃÊ³¬¤ËÊÑ¹¹¤ò²Ã¤¨¤ëÉ¬Í×¤Ï¤Ê¤¤¡¥
Èï¤»¤¿¥Þ¥¯¥í¤òÍøÍÑ¤¹¤ë¥³¡¼¥É¤Ç¤Ï¡¤ÆâÉô¤Çµ¯¤³¤Ã¤¿ºÆ¹½ÃÛ¤ò°Õ¼±¤¹¤ëÉ¬Í×¤¹¤é¤Ê¤¤¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro propmacro (propname)
  `(defmacro ,propname (obj)
     `(get ,obj ',',propname)))

(defmacro propmacros (&rest props)
  `(progn
     ,@(mapcar #'(lambda (p) `(propmacro ,p))
                props)))
\end{FramedVerb}\end{center}
\caption{¥¢¥¯¥»¥¹ÍÑ¥Þ¥¯¥í¤Î¼«Æ°ÄêµÁ¡¥}
\label{fig:AutoDefAccessMacro}
\end{figure}

½Å¤µ¤È¤¤¤¦Â°À­¤ËÂÐ¤·¤Æ¤Ï¡¤¿§¤ËÂÐ¤·¤Æ½ñ¤¤¤¿¤â¤Î¤È»÷¤¿¥Þ¥¯¥í¤òÄêµÁ¤¹¤ì¤Ð¤è¤¤¡¥
\begin{verbatim}
(defmacro weight (obj)
  `(get ,obj 'weight))
\end{verbatim}
Á°Àá¤Î¾ÊÎ¬·Á¤ÈÆ±ÍÍ¤Ë¡¤¥Þ¥¯¥í\verb|color|¤È\verb|weight|¤ÎÄêµÁ¤Ï¤Û¤ÜÆ±°ì¤À¡¥
¤³¤³¤Ç\verb|propmacro|¡ÊÂè\ref{fig:AutoDefAccessMacro}¿Þ¡Ë¤Ï\verb|abbrev|¤ÈÆ±¤¸Ìò³ä¤òÃ´¤¦¡¥

¥Þ¥¯¥í¤òÄêµÁ¤¹¤ë¥Þ¥¯¥í¤ò¹½À®¤¹¤ë²áÄø¤Ë¤ÏÂ¾¤Î¤É¤Î¥Þ¥¯¥í¤È¤â°ã¤¤¤Ï¤Ê¤¤¡¥
¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤ò¡¤¼¡¤ËÅ¸³«¤µ¤ì¤ÆÍß¤·¤¤¼°¤ò¸«¤Æ¡¤
¤½¤·¤ÆÁ°¼Ô¤ò¸å¼Ô¤ËÊÑ·Á¤¹¤ëÊýË¡¤òÍý²ò¤¹¤ë¤³¤È¤À¡¥
¼¡¤Î¥Þ¥¯¥í¤Ï¡¤
\begin{verbatim}
(propmacro color)
\end{verbatim}
¼¡¤Î¤è¤¦¤ËÅ¸³«¤µ¤ì¤ÆÍß¤·¤¤¡¥
\begin{verbatim}
(defmacro color (obj)
  `(get ,obj 'color))
\end{verbatim}
¤³¤ÎÅ¸³«·Á¤½¤Î¤â¤Î¤Ë¤â\verb|defmacro|¤¬»È¤ï¤ì¤Æ¤¤¤ë¤¬¡¤
¥Æ¥ó¥×¥ì¡¼¥È¤Îºî¤êÊý¤Ï¤ä¤Ï¤ê¼¡¤ÎÄÌ¤ê¤À¡¥
Å¸³«·Á¤ËµÕ¥¯¥©¡¼¥È¤òÉÕ¤±¡¤\verb|color|¤¬»È¤ï¤ì¤Æ¤¤¤ë½ê¤Ë¥³¥ó¥Þ¤òÉÕ¤±¤¿²¾°ú¿ôÌ¾¤òÃÖ¤¯¡¥
Á°Àá¤ÈÆ±ÍÍ¡¤´ûÂ¸¤ÎµÕ¥¯¥©¡¼¥È¤ÎÃæ¤Ë\verb|color|¤¬¸½¤ì¤Ê¤¤¤è¤¦¤ËÅ¸³«·Á¤òÊÑ·Á¤¹¤ë¤³¤È¤«¤é»Ï¤á¤ë¡¥
\begin{verbatim}
(defmacro color (obj)
  (let ((p 'color))
    `(get ,obj ',p)))
\end{verbatim}
¤½¤¦¤·¤¿¤é¹¹¤Ë¼ê½ç¤ò¿Ê¤á¤Æ¥Æ¥ó¥×¥ì¡¼¥È¤òºî¤ê¡¤
\begin{verbatim}
`(defmacro ,propname (obj)
   (let ((p ',propname))
     `(get ,obj ',p)))
\end{verbatim}
¤³¤ì¤ò´ÊÎ¬²½¤·¤Æ¼¡¤òÆÀ¤ë¡¥
\begin{verbatim}
`(defmacro ,propname (obj)
   `(get ,obj ',',propname))
\end{verbatim}

°ì·²¤ÎÂ°À­Ì¾¤¬Á´¤Æ¥Þ¥¯¥í¤È¤·¤ÆÄêµÁ¤µ¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¾ì¹ç¤Î¤¿¤á¤Ë¡¤
\verb|propmacros| (\ref{fig:AutoDefAccessMacro}) ¤¬¤¢¤ë¡¥
¤³¤ì¤ÏÊ£¿ô¸Ä¤Î\verb|propmacro|¤ò¸ÄÊÌ¤Ë¸Æ¤Ó½Ð¤¹¥³¡¼¥É¤ËÅ¸³«¤µ¤ì¤ë¡¥
\verb|abbrevs|¤ÈÆ±ÍÍ¡¤¼ÂºÝ¤Ë¥³¡¼¥É¤ÎÂçÉôÊ¬¤Ï¥Þ¥¯¥í¤òÄêµÁ¤¹¤ë¥Þ¥¯¥í¤òÄêµÁ¤¹¤ë¥Þ¥¯¥í¤À¡¥

¤³¤ÎÀá¤Ç¤ÏÂ°À­¥ê¥¹¥È¤ò°·¤Ã¤¿¤¬¡¤¤³¤³¤Ç°·¤Ã¤¿µ»Ë¡¤Ï°ìÈÌÅª¤Ê¤â¤Î¤À¡¥
¤³¤ì¤ò»È¤Ã¤Æ¡¤¤É¤Î¤è¤¦¤Ê·Á¤ÇÊÝ»ý¤µ¤ì¤Æ¤¤¤ë¥Ç¡¼¥¿¤ËÂÐ¤·¤Æ¤â¥¢¥¯¥»¥¹ÍÑ¥Þ¥¯¥í¤òÄêµÁ¤Ç¤­¤ë¡¥
%}}}
\subsection{¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¥Þ¥¯¥í}   %{{{
Âè14.1Àá¤Ç¤Ï´ö¤Ä¤«¤Î¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¥Þ¥¯¥í¤ÎÄêµÁ¤ò¼¨¤·¤¿¡¥
\verb|aif|¤ä\verb|aand|¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤ò»È¤¦¤È¤­¤Ï¡¤
²¿¤é¤«¤Î°ú¿ô¤ÎÉ¾²ÁÃæ¤Ë¤Ï¥·¥ó¥Ü¥ë\verb|it|¤¬Â¾¤Î¥·¥ó¥Ü¥ë¤ÎÊÖ¤·¤¿ÃÍ¤ËÂ«Çû¤µ¤ì¤ë¡¥
¤è¤Ã¤Æ¤³¤¦¤¹¤ëÂå¤ï¤ê¤Ë¡¤
\begin{verbatim}
(let ((res (complicated-query)))
  (if res
      (foo res)))
\end{verbatim}
¤¿¤À¤³¤¦¤¹¤ì¤Ð¤è¤¯¡¤
\begin{verbatim}
(aif (complicated-query)
         (foo it))
\end{verbatim}
¤Þ¤¿¤³¤¦¤¹¤ëÂå¤ï¤ê¤Ë¡¤
\begin{verbatim}
(let ((o (owner x)))
  (and o (let ((a (address o)))
           (and a (city a)))))
\end{verbatim}
¤¿¤À¤³¤¦¤¹¤ì¤Ð¤è¤¤¡¥
\begin{verbatim}
(aand (owner x) (address it) (city it))
\end{verbatim}
Âè14.1Àá¤Ç¤Ï7¸Ä¤Î¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¥Þ¥¯¥í¤òÄêµÁ¤·¤¿¡¥
\verb|aif|¡¤\verb|awhen|¡¤\verb|awhile|¡¤\verb|acond|¡¤\verb|alambda|¡¤
\verb|ablock|¤½¤·¤Æ\verb|aand|¤À¡¥
¤³¤Î¼ï¤Î¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¥Þ¥¯¥í¤Î¤¦¤Á¡¤ÊØÍø¤Ê¤â¤Î¤Ï¤³¤ì¤é7¸Ä¤À¤±¤Ê¤É¤È¤¤¤¦¤³¤È¤Ï¤Ê¤¤¡¥
¼ÂºÝ¡¤Common Lisp¤Î¤¢¤é¤æ¤ë´Ø¿ô¤ä¥Þ¥¯¥í¤Ë¤Ä¤¤¤Æ¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯ÈÇ¤òÄêµÁ¤Ç¤­¤ë¡¥
¤³¤ì¤é¤Î¥Þ¥¯¥í¤ÎÂ¿¤¯¤Ï\verb|mapcon|¤Î¤è¤¦¤Ë¤Ê¤ë¤À¤í¤¦¡¥
¤Ä¤Þ¤êÌÇÂ¿¤Ë»È¤ï¤ì¤Ê¤¤¤¬¡¤É¬Í×¤Ê¤È¤­¤Ë¤Ï·ç¤«¤»¤Ê¤¤¤è¤¦¤Ê¤â¤Î¤À¡¥

Îã¤¨¤Ð\verb|aand|¤ÈÆ±ÍÍ¤Ë¡¤
\verb|it|¤¬¾ï¤ËÁ°¤Î°ú¿ô¤ÎÊÖ¤·¤¿ÃÍ¤ËÂ«Çû¤µ¤ì¤ë¤è¤¦¤Ê\verb|a+|¤È¤¤¤¦¤â¤Î¤òÄêµÁ¤Ç¤­¤ë¡¥
¼¡¤Î´Ø¿ô¤Ï¥Þ¥µ¥Á¥å¡¼¥»¥Ã¥Ä¤Ç¿©»ö¤ò¼è¤ë¤È¤­¤ÎÈñÍÑ¤ò·×»»¤¹¤ë¡¥
\begin{verbatim}
(defun mass-cost (menu-price)
  (a+ menu-price (* it .05) (* it 3)))
\end{verbatim}
¥Þ¥µ¥Á¥å¡¼¥»¥Ã¥Ä¿©ÎÁÀÇ¤¬5\%¡¤¤Þ¤¿½»Ì±¤Ï¤·¤Ð¤·¤ÐÀÇ¤Î3ÇÜ¤ò¥Á¥Ã¥×¤È¤·¤ÆÊ§¤¦¡¥
¤³¤ÎË¡Â§¤Ë½¾¤¦¤È¡¤Dolphin Seafood¤Çbroiled scrod¤ò¿©¤Ù¤ë¤È¤­¤ÎÈñÍÑ¤Ï¤³¤¦¤Ê¤ë¡¥
\begin{verbatim}
> (mass-cost 7-95)
9-54
\end{verbatim}
¤·¤«¤·¤³¤ì¤Ïsalad¤Èbaked potato¤â´Þ¤ó¤Ç¤¤¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro a+ (&rest args)
  (a+expand args nil))

(defun a+expand (args syms)
  (if args
      (let ((sym (gensym)))
        `(let* ((,sym ,(car args))
                (it ,sym))
           ,(a+expand (cdr args)
                      (append syms (list sym)))))
      `(+ ,@syms)))

(defmacro alist (&rest args)
  (alist-expand args nil))

(defun alist-expand (args syms)
  (if args
      (let ((sym (gensym)))
        `(let* ((,sym ,(car args))
                (it ,sym))
           ,(alist-expand (cdr args)
                          (append syms (list sym)))))
      `(list ,@syms)))
\end{FramedVerb}\end{center}
\caption{\texttt{a+}¤È\texttt{alist}¤ÎÄêµÁ¡¥}
\label{fig:DefAPlusAlist}
\end{figure}

Âè\ref{fig:DefAPlusAlist}¤Ë¼¨¤·¤¿¥Þ¥¯¥í\verb|a+|¤Ï¡¤
Å¸³«·Á¤ÎÀ¸À®¤òºÆµ¢´Ø¿ô\verb|a+expand|¤Ë°ÍÂ¸¤·¤Æ¤¤¤ë¡¥
\verb|a+expand|¤ÎÀïÎ¬¤òÂç»¨ÇÄ¤Ë¸À¤¦¤È¡¤
¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Î°ú¿ô¤«¤éÀ®¤ë¥ê¥¹¥È¤ÎcdrÉô¤ËÂÐ¤·¤ÆºÆµ¢Åª¤ËÆ¯¤­¡¤
°ìÏ¢¤ÎÆþ¤ì»Ò¤Ë¤Ê¤Ã¤¿let¼°¤òÀ¸À®¤¹¤ë¤³¤È¤À¡¥
¸Ä¡¹¤Î\verb|let|¤Ï\verb|it|¤ò°Û¤Ê¤ë°ú¿ô¤ËÂ«Çû¤·¤¿¤Þ¤Þ¤Ë¤¹¤ë¤¬¡¤
¸ÄÊÌ¤Îgensym¤ò¤½¤ì¤¾¤ì¤Î°ú¿ô¤ËÂ«Çû¤¹¤ë¡¥
Å¸³«´Ø¿ô¤Ï¤½¤ì¤é¤Îgensym¤ò¥ê¥¹¥È¤Ë¤Þ¤È¤á¡¤
°ú¿ô¤Î¥ê¥¹¥È¤Î½ªÃ¼¤ËÃ£¤¹¤ë¤È¡¤gensym¤ò°ú¿ô¤Ë¤·¤¿\verb|+|¼°¤òÊÖ¤¹¡¥
¤è¤Ã¤Æ¼¡¤Î¼°¤Ï¡¤
\begin{verbatim}
(a+ menu-price (* it .05) (* it 3))
\end{verbatim}
¼¡¤ÎÅ¸³«·Á¤òÀ¸À®¤¹¤ë¡¥
\begin{verbatim}
(let* ((#:g2 menu-price) (it #:g2))
  (let* ((#:g3 (* it 0-05)) (it #:g3))
        (let* ((#:g4 (* it 3)) (it #:g4))
           (+ #:g2 #:g3 #:g4))))
\end{verbatim}

Âè\ref{fig:DefAPlusAlist}¿Þ¤Ë¤Ï¡¤¤³¤ì¤È»÷¤¿\verb|alist|¤â¼¨¤·¤¿¡¥
\begin{verbatim}
> (alist 1 (+ 2 it) (+ 2 it))
(1 3 5)
\end{verbatim}

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro defanaph (name &optional calls)
  (let ((calls (or calls (pop-symbol name))))
    `(defmacro ,name (&rest args)
       (anaphex args (list ',calls)))))

(defun anaphex (args expr)
  (if args
      (let ((sym (gensym)))
        `(let* ((,sym ,(car args))
                (it ,sym))
           ,(anaphex (cdr args)
                     (append expr (list sym)))))
      expr))

(defun pop-symbol (sym)
  (intern (subseq (symbol-name sym) 1)))
\end{FramedVerb}\end{center}
\caption{¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯¥Þ¥¯¥í¤Î¼«Æ°ÄêµÁ¡¥}
\label{fig:AutoDefOfAnaphMac}
\end{figure}

·«¤êÊÖ¤¹¤¬¡¤\verb|a+|¤È\verb|alist|¤ÎÄêµÁ¤Ï¤Û¤ÜÆ±°ì¤À¡¥
¤½¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤ò¤â¤Ã¤ÈÄêµÁ¤·¤¿¤¤¤è¤¦¤Ê¤È¤­¤Ï¡¤¤½¤ì¤é¤Î¤Û¤È¤ó¤É¤¬¥³¡¼¥É¤Î½ÅÊ£¤Ë¤Ê¤ë¤À¤í¤¦¡¥
¥×¥í¥°¥é¥à¤Ë¤½¤ì¤é¤òÀ¸À®¤µ¤»¤ì¤Ð¤è¤¤¤Ç¤Ï¤Ê¤¤¤«¡©
Âè\ref{fig:AutoDefOfAnaphMac}¿Þ¤Î¥Þ¥¯¥í\verb|defanaph|¤¬¤½¤ì¤ò¹Ô¤Ã¤Æ¤¯¤ì¤ë¡¥
\verb|defanaph|¤ò»È¤¦¤È¡¤\verb|a+|¤È\verb|alist|¤ÎÄêµÁ¤Ï¼¡¤Î¤è¤¦¤Ë´Ê·é¤Ë¤Ê¤ë¡¥
\begin{verbatim}
(defanaph a+)
(defanaph alist)
\end{verbatim}

¤³¤¦¤·¤ÆÄêµÁ¤µ¤ì¤¿\verb|a+|¤È\verb|alist|¤ÎÅ¸³«·Á¤Ï¡¤
Âè\ref{fig:DefAPlusAlist}¿Þ¤Î¥³¡¼¥É¤Ë¤è¤ëÄêµÁ¤ÈÆ±°ì¤À¡¥
¥Þ¥¯¥í¤òÄêµÁ¤¹¤ë¥Þ¥¯¥í\verb|defanaph|¤Ï¡¤
°ú¿ô¤¬´Ø¿ô¤ÈÆ±¤¸ÄÌ¾ï¤ÎÉ¾²ÁË¡Â§¤Ë¤·¤¿¤¬¤Ã¤ÆÉ¾²Á¤µ¤ì¤ë¤â¤Î¤Ê¤é¤Ð²¿¤Ç¤¢¤Ã¤Æ¤â¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯ÈÇ¤òºî¤ì¤ë¡¥
¤¹¤Ê¤ï¤Á¡¤\verb|defanaph|¤ÎÂÐ¾Ý¤Ï¡¤°ú¿ô¤¬Á´¤ÆÉ¾²Á¤µ¤ì¡¤¤«¤Äº¸¤«¤é±¦¤ËÉ¾²Á¤µ¤ì¤ë¤â¤Î¤Ê¤é¤Ð²¿¤Ç¤â¤è¤¤¡¥
¤À¤«¤é¾å¤Ë¼¨¤·¤¿\verb|defanaph|¤Ç¤Ï\verb|aif|¤ä\verb|awhile|¤ÏÄêµÁ¤Ç¤­¤Ê¤¤¤¬¡¤
¤É¤Î¤è¤¦¤Ê´Ø¿ô¤Î¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯ÈÇ¤Ç¤âÄêµÁ¤Ç¤­¤ë¡¥

\verb|a+|¤¬\verb|a+expand|¤ò¸Æ¤ó¤ÇÅ¸³«·Á¤òÀ¸À®¤·¤Æ¤¤¤¿¤Î¤ÈÆ±ÍÍ¡¤
\verb|defanaph|¤Ï\verb|anaphex|¤ò¸Æ¤ó¤ÇÅ¸³«·Á¤òÀ¸À®¤¹¤ë¡¥
ÈÆÍÑ¤ÎÅ¸³«´Ø¿ô\verb|anaphex|¤¬\verb|a+expand|¤È°ã¤Ã¤Æ¤¤¤ë¤Î¤Ï¡¤
ºÇ½ªÅª¤ËÅ¸³«·ÁÆâ¤Ë¸½¤ì¤ë´Ø¿ôÌ¾¤ò°ú¿ô¤Ë¼è¤ëÅÀ¤À¤±¤À¡¥
¼ÂºÝ¡¤\verb|a+|¤Ï¼¡¤Î¤è¤¦¤ËÄêµÁ¤Ç¤­¤ë¡¥
\begin{verbatim}
(defmacro a+ (&rest args)
  (anaphex args '(+)))
\end{verbatim}
\verb|anaphex|¤È\verb|a+expand|¤Î¤¤¤º¤ì¤âÆÈÎ©¤·¤¿´Ø¿ô¤È¤·¤ÆÄêµÁ¤¹¤ëÉ¬Í×¤Ï¤Ê¤¤¡¥
\verb|anaphex|¤Ï\verb|labels|¤ä\verb|alambda|¤Ë¤è¤Ã¤Æ\verb|defanaph|ÆâÉô¤ÇÄêµÁ¤Ç¤­¤ë¡¥
Å¸³«·Á¤òÀ¸À®¤¹¤ë´Ø¿ô¤¬¾å¤ÇÊ¬Î¥¤µ¤ì¤Æ¤¤¤¿¤Î¤Ï¡¤¥³¡¼¥É¤òÌÀ³Î¤Ë¤¹¤ë¤¿¤á¤À¤±¤À¡¥

ÉáÄÌ¡¤\verb|defanaph|¤Ï°ú¿ô¤ÎÀèÆ¬1Ê¸»ú¡Ê¤ª¤½¤é¤¯\verb|a|¡Ë¤ò¼è¤ê½ü¤¤¤¿¤â¤Î¤¬
Å¸³«·ÁÆâ¤Ç¸Æ¤Ó½Ð¤µ¤ì¤ë¤è¤¦¤Ë¤¹¤ë¡¥
¡Ê¤³¤ì¤Ï\verb|pop-symbol|¤Ë¤è¤Ã¤Æ¹Ô¤ï¤ì¤ë¡¥¡Ë
¥æ¡¼¥¶¤¬Âå¤ï¤ê¤ò»ØÄê¤·¤¿¤¤¤È¤­¤Ï¡¤¥ª¥×¥·¥ç¥Ê¥ë°ú¿ô¤Ç»ØÄê¤Ç¤­¤ë¡¥
\verb|defanaph|¤ÏÁ´¤Æ¤Î´Ø¿ô¤È´ö¤Ä¤«¤Î¥Þ¥¯¥í¤Î¥¢¥Ê¥Õ¥©¥ê¥Ã¥¯ÈÇ¤òÄêµÁ¤Ç¤­¤ë¤¬¡¤ÌÌÅÝ¤ÊÀ©¸Â¤¬È¼¤¦¡¥
\begin{enumerate}
    \item °ú¿ô¤¬Á´¤ÆÉ¾²Á¤µ¤ì¤ë¥ª¥Ú¥ì¡¼¥¿¤Ë¤·¤«Å¬ÍÑ¤Ç¤­¤Ê¤¤¡¥
    \item Å¸³«·ÁÆâ¤Ç¤Ï¡¤\verb|it|¤Ï¾ï¤Ë1¸ÄÁ°¤Î°ú¿ô¤ËÂ«Çû¤µ¤ì¤ë¡¥
        ¤·¤«¤·¾ì¹ç¤Ë¤è¤Ã¤Æ¤Ï\wadash Îã¤¨¤Ð\verb|awhen|\wadash
        \verb|it|¤ÏÂè1°ú¿ô¤ÎÃÍ¤ËÂ«Çû¤µ¤ì¤¿¤Þ¤Þ¤Ç¤¢¤Ã¤ÆÍß¤·¤¤¡¥
    \item \verb|setf|¤Î¤è¤¦¤Ë¡¤Âè1°ú¿ô¤ËÈÆÊÑ¿ô¤ò¼è¤ë¥Þ¥¯¥í¤Ë¤ÏÅ¬ÍÑ¤Ç¤­¤Ê¤¤¡¥
\end{enumerate}
¤³¤ì¤é¤ÎÀ©¸Â¤ò´ö¤Ä¤«¼è¤ê½ü¤¯ÊýË¡¤ò¹Í¤¨¤è¤¦¡¥
Âè1¤ÎÌäÂê¤Î°ìÉô¤Ï¡¤Âè2¤ÎÌäÂê¤Ëµ¢Ãå¤µ¤ì¤ë¡¥
\verb|aif|¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤òÄêµÁ¤¹¤ëÅ¸³«·Á¤òÀ¸À®¤¹¤ë¤Ë¤Ï¡¤
\verb|anaphex|¤¬¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤ÎÂè1°ú¿ô¤Î¤ß¤òÃÖ´¹¤¹¤ë¤è¤¦¤Ë½¤Àµ¤¹¤ëÉ¬Í×¤¬¤¢¤ë¡¥
\begin{verbatim}
(defun anaphex2 (op args)
  `(let ((it ,(car args)))
     (,op it ,@(cdr args))))
\end{verbatim}
¾å¤ÎºÆµ¢Åª¤Ç¤Ê¤¤\verb|anaphex|¤Ï¡¤
\verb|it|¤¬¥Þ¥¯¥íÅ¸³«¤Ë¤è¤Ã¤Æ°ìÏ¢¤Î°ú¿ô¤ËÉ¬¤ºÂ«Çû¤µ¤ì¤ë¤è¤¦¤Ë¤¹¤ëÉ¬Í×¤¬¤Ê¤¤¤Î¤Ç¡¤
¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Î°ú¿ô¤òÉ¬¤º¤·¤âÁ´¤ÆÉ¾²Á¤·¤Ê¤¤¤è¤¦¤ÊÅ¸³«·Á¤òÀ¸À®¤Ç¤­¤ë¡¥
É¾²Á¤¹¤ëÉ¬Í×¤¬¤¢¤ë¤Î¤ÏÂè1°ú¿ô¤À¤±¤À
¡Ê¤³¤ì¤Ï\verb|it|¤ò¤½¤ÎÃÍ¤ËÂ«Çû¤¹¤ë¤¿¤á¡Ë¡¥
¤è¤Ã¤Æ\verb|aif|¤Ï¼¡¤Î¤è¤¦¤ËÄêµÁ¤Ç¤­¤ë¡¥
\begin{verbatim}
(defmacro aif (&rest args)
  (anaphex2 'if args))
\end{verbatim}
xqg¥Ú¡¼¥¸¤Î¸µ¤ÎÄêµÁ¤È¤Î°ã¤¤¤Ï¡¤¤³¤Á¤é¤Ç¤Ï\verb|aif|¤Ë¸í¤Ã¤¿¿ô¤Î°ú¿ô¤òÍ¿¤¨¤ë¤È¥¨¥é¡¼¤Ë¤Ê¤ëÅÀ¤À¤±¤À¡¥
Àµ¤·¤¤¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Ç¤Ï¡¤¤É¤Á¤é¤âÆ±°ì¤ÎÅ¸³«·Á¤òÀ¸À®¤¹¤ë¡¥

\verb|defanaph|¤¬ÈÆÊÑ¿ô¤ËÂÐ¤·¤ÆÆ°ºî¤·¤Ê¤¤¤È¤¤¤¦3ÈÖÌÜ¤ÎÌäÂê¤Ï¡¤
Å¸³«·ÁÆâ¤Ç\verb|f|¡Êgvx¥Ú¡¼¥¸¡Ë¤ò»È¤¦¤È²ò·è¤Ç¤­¤ë¡¥
\verb|setf|¤Ê¤É¤Î¥ª¥Ú¥ì¡¼¥¿¤Ï¡¤\verb|anaphex2|¤ò¼¡¤Î¤è¤¦¤ËÄêµÁ¤·Ä¾¤·¤¿¤â¤Î¤Ê¤é°·¤¨¤ë¡¥
\begin{verbatim}
(defun anaphex3 (op args)
  `(_f (lambda (it) (,op it ,@(cdr args))) ,(car args)))
\end{verbatim}
¤³¤ÎÅ¸³«´Ø¿ô¤Ï¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤¬1¸Ä°Ê¾å¤Î°ú¿ô¤ò»ý¤Ä¤â¤Î¤È²¾Äê¤·¤Æ¤¤¤ë
¡ÊÂè1°ú¿ô¤òÈÆÊÑ¿ô¤Ë¤¹¤ë¡Ë¡¥
¤³¤ì¤ò»È¤¦¤È¡¤\verb|asetf|¤Ï¼¡¤Î¤è¤¦¤ËÄêµÁ¤Ç¤­¤ë¡¥
\begin{verbatim}
(defmacro asetf (&rest args)
       (anaphex3 'setf args))
\end{verbatim}

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro defanaph (name &optional &key calls (rule :all))
  (let* ((opname (or calls (pop-symbol name)))
         (body (case rule
                 (:all   `(anaphex1 args '(,opname)))
                 (:first `(anaphex2 ',opname args))
                 (:place `(anaphex3 ',opname args)))))
    `(defmacro ,name (&rest args)
       ,body)))

(defun anaphex1 (args call)
  (if args
      (let ((sym (gensym)))
        `(let* ((,sym ,(car args))
                (it ,sym))
           ,(anaphex1 (cdr args)
                      (append call (list sym)))))
      call))

(defun anaphex2 (op args)
  `(let ((it ,(car args))) (,op it ,@(cdr args))))

(defun anaphex3 (op args)
  `(_f (lambda (it) (,op it ,@(cdr args))) ,(car args)))
\end{FramedVerb}\end{center}
\caption{¹¹¤Ë°ìÈÌÅª¤Ê\texttt{defanaph}¡¥}
\label{fig:MoreGeneralDefanaph}
\end{figure}

Âè\ref{fig:MoreGeneralDefanaph}¿Þ¤Ë¤Ï¡¤3¼ïÎà¤ÎÅ¸³«´Ø¿ô¤ò¼¨¤·¤¿¤¬¡¤
¤½¤ì¤é¤ÏÃ±°ì¤Î¥Þ¥¯¥í¤Ç¤¢¤ë¿·ÈÇ\verb|defanaph|¤Ë¤è¤Ã¤ÆÅý¹ç¤µ¤ì¤Æ¤¤¤ë¡¥
¥×¥í¥°¥é¥Þ¤Ï¥Þ¥¯¥íÅ¸³«¤ÎË¾¤ß¤ÎÊý¼°¤ò¡¤¥ª¥×¥·¥ç¥Ê¥ë¤Ê¥­¡¼¥ï¡¼¥É°ú¿ô\verb|rule|¤Ç»ØÄê¤¹¤ë¡¥
¤¹¤Ê¤ï¤Á¡¤¤½¤ì¤Ë¤è¤Ã¤Æ¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Î°ú¿ô¤òÉ¾²Á¤¹¤ëºÝ¤Îµ¬Â§¤ò»ØÄê¤¹¤ë¡¥
¤½¤ì¤¾¤ì¤ÎÊý¼°¤Ï¼¡¤ÎÄÌ¤ê¡¥
\begin{description}
    \item[:all] ¡Ê¥Ç¥Õ¥©¥ë¥È¡Ë¥Þ¥¯¥íÅ¸³«¤Ï\verb|alist|ÍÑ¤ÎÊý¼°¤ò¼è¤ë¡¥
        ¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤Î°ú¿ô¤ÏÁ´¤ÆÉ¾²Á¤µ¤ì¡¤\verb|it|¤Ï¾ï¤ËÄ¾Á°¤Î°ú¿ô¤ÎÃÍ¤ËÂ«Çû¤µ¤ì¤ë¡¥
    \item[:first] ¥Þ¥¯¥íÅ¸³«¤Ï\verb|aif|ÍÑ¤ÎÊý¼°¤ò¼è¤ë¡¥
        É¬¤ºÉ¾²Á¤µ¤ì¤ë¤Î¤ÏÂè1°ú¿ô¤Î¤ß¤Ç¡¤\verb|it|¤Ï¤½¤ÎÃÍ¤ËÂ«Çû¤µ¤ì¤ë¡¥
    \item[:place] ¥Þ¥¯¥íÅ¸³«¤Ï\verb|asetf|ÍÑ¤ÎÊý¼°¤ò¼è¤ë¡¥
        Âè1°ú¿ô¤ÏÈÆÊÑ¿ô¤È¤·¤Æ°·¤ï¤ì¡¤\verb|it|¤Ï¤½¤Î½é´üÃÍ¤ËÂ«Çû¤µ¤ì¤ë¡¥
\end{description}
¿·¤·¤¤\verb|defanaph|¤ò»È¤¦¤È¡¤¤³¤³¤Þ¤Ç¤Ë¼¨¤·¤¿Îã¤Î´ö¤Ä¤«¤Ï¼¡¤Î¤è¤¦¤ËÄêµÁ¤Ç¤­¤ë¡¥
\begin{verbatim}
(defanaph alist)
(defanaph aif :rule :first)
(defanaph asetf :rule :place)
\end{verbatim}

\verb|asetf|¤Ë¤Ï¡¤ÈÆÊÑ¿ô¤ò»È¤¦Â¿¼ïÂ¿ÍÍ¤Ê¥Þ¥¯¥í¤òÊ£¿ô²ó¤ÎÉ¾²Á¤Ë¤Ä¤¤¤Æ¿´ÇÛ¤»¤º¤ËÄêµÁ¤Ç¤­¤ëÄ¹½ê¤¬¤¢¤ë¡¥
Îã¤¨¤Ð¡¤\verb|incf|¤Ï¼¡¤Î¤è¤¦¤ËÄêµÁ¤Ç¤­¤ë¡¥
\begin{verbatim}
(defmacro incf (place &optional (val 1))
  `(asetf ,place (+ it ,val)))
\end{verbatim}
¤Þ¤¿¡¤Îã¤¨¤Ð\verb|pull|¡Êsqk¥Ú¡¼¥¸¡Ë¤Ï¼¡¤Î¤è¤¦¤ËÄêµÁ¤Ç¤­¤ë¡¥
\begin{verbatim}
(defmacro pull (obj place &rest args)
  `(asetf ,place (delete ,obj it ,@args)))
\end{verbatim}
%}}}
%}}}
\section{¥ê¡¼¥É¥Þ¥¯¥í} %{{{
Lisp¤ÎS¼°¤ÎÀ¸³¶¤Ç½ÅÍ×¤Ê½Ö´Ö¤Ï3¤Ä¡¤¤¹¤Ê¤ï¤ÁÆÉ¤ß¹þ¤ß»þ¡¤¥³¥ó¥Ñ¥¤¥ë»þ¡¤¼Â¹Ô»þ¤À¡¥
´Ø¿ô¤òÁà¤ì¤ë¤Î¤Ï¼Â¹Ô»þ¤À¡¥
¥Þ¥¯¥í¤Ë¤è¤ê¥×¥í¥°¥é¥à¤ò¥³¥ó¥Ñ¥¤¥ë»þ¤ËÊÑ´¹¤¹¤ëµ¡²ñ¤¬ÆÀ¤é¤ì¤ë¡¥
¤³¤Î¾Ï¤Ç¤Ï¥ê¡¼¥É¥Þ¥¯¥í¤ò°·¤¦¤¬¡¤¤³¤ì¤ÏÆÉ¤ß¹þ¤ß»þ¤Ëµ¡Ç½¤¹¤ë¤â¤Î¤À¡¥
\subsection{¥Þ¥¯¥íÊ¸»ú}   %{{{
Lisp¤Î´ðËÜÅª»×ÁÛ¤Ë½¾¤¤¡¤¥ê¡¼¥À¤ÏÂçÉý¤ËÀ©¸æ¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
¥ê¡¼¥À¤ÎÆ°ºî¤Ï´°Á´¤Ë¼Â¹ÔÃæ¤ÎÊÑ¹¹¤¬¸ú¤¯Â°À­ÃÍ¤ÈÊÑ¿ô¤ÇÀ©¸æ¤Ç¤­¤ë¡¥
¥ê¡¼¥À¤ÏÊ£¿ô¤ÎÃÊ³¬¤Ç¥×¥í¥°¥é¥à¤Ç¤­¤ë¡¥
°ìÈÖÍÆ°×¤ËÆ°ºî¤òÊÑ¹¹¤¹¤ëÊýË¡¤Ï¡¤¿·¤·¤¤¥Þ¥¯¥íÊ¸»ú¤òÄêµÁ¤¹¤ë¤³¤È¤À¡¥

¥Þ¥¯¥íÊ¸»ú¤È¤ÏLisp¤Î¥ê¡¼¥À¤«¤éÆÃÊÌ¤Ê°·¤¤¤òÍ×µá¤¹¤ëÊ¸»ú¤À¡¥
Îã¤¨¤Ð¾®Ê¸»ú¤Î\verb|a|¤ÏÉáÄÌ¤Ï¾®Ê¸»ú¤Î\verb|b|¤ÈÁ´¤¯Æ±¤¸°·¤¤¤À¤¬¡¤³«¤­³ç¸Ì¤Ï¾¯¡¹°Û¤Ê¤ë¡¥
³«¤­³ç¸Ì¤Ï¥ê¥¹¥È¤ÎÆÉ¤ß¹þ¤ß¤¬³«»Ï¤·¤¿¤³¤È¤Î°õ¤À¡¥
¤½¤¦¤¤¤Ã¤¿Ê¸»ú¤Ë¤Ï¤½¤ì¤¾¤ì´Ø¿ô¤¬´ØÏ¢ÉÕ¤±¤é¤ì¤Æ¤ª¤ê¡¤
¤½¤ì¤¬Lisp¤Î¥ê¡¼¥À¤Ë¤½¤ÎÊ¸»ú¤òÆÉ¤ß¹þ¤ó¤ÀºÝ¤Î»Ø¼¨¤òÍ¿¤¨¤ë¡¥
´ûÂ¸¤Î¥Þ¥¯¥íÊ¸»ú¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿´Ø¿ô¤òÊÑ¹¹¤¹¤ë¤³¤È¤â¤Ç¤­¤ë¤·¡¤
ÆÈ¼«¤Î¥Þ¥¯¥íÊ¸»ú¤òÄêµÁ¤¹¤ë¤³¤È¤â¤Ç¤­¤ë¡¥

ÁÈ¤ß¹þ¤ß´Ø¿ô\verb|set-macro-character|¤ò»È¤¦¤Î¤¬¥ê¡¼¥É¥Þ¥¯¥í¤òÄêµÁ¤¹¤ëÊýË¡¤Î1¤Ä¤À¡¥
¤³¤ì¤Ï°ú¿ô¤Ë1¸Ä¤ÎÊ¸»ú¤È1¸Ä¤Î´Ø¿ô¤ò¼è¤ë¤¬¡¤
¤½¤Î¸å\verb|read|¤¬¤½¤ÎÊ¸»ú¤òÆÉ¤ß¹þ¤ó¤À¤é¡¤\verb|read|¤Ï¤½¤Î´Ø¿ô¤ò¸Æ¤ó¤À·ë²Ì¤òÊÖ¤¹¤è¤¦¤Ë¤Ê¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(set-macro-character #\'
  #'(lambda (stream char)
      (list 'quote (read stream t nil t))))
\end{FramedVerb}\end{center}
\caption{\texttt{'}¤Ï¤³¤Î¤è¤¦¤Ë¤âÄêµÁ¤Ç¤­¤ë.}
\label{fig:PossibleDefQuote}
\end{figure}

Lisp¤ÇºÇ¸Å»²¤Î¥ê¡¼¥É¥Þ¥¯¥í¤Î1¤Ä¤Ï\,\verb|'|\,¤¹¤Ê¤ï¤Á¥¯¥©¡¼¥È¤À¡¥
\verb|'|¤¬¤Ê¤¯¤È¤â¡¤¾ï¤Ë\,\verb|'a|¤ÎÂå¤ï¤ê¤Ë\verb|(quote a)|¤È¤¹¤ë¤³¤È¤â¤Ç¤­¤ë¡¥
¤·¤«¤·¤½¤ì¤ÏÌÌÅÝ¤À¤·¡¤¥³¡¼¥É¤âÆÉ¤ß¿É¤¯¤Ê¤Ã¤Æ¤·¤Þ¤¦¤À¤í¤¦¡¥
ÆÉ¤ß¹þ¤ß¥Þ¥¯¥í\verb|quote|¤Î¤ª¤«¤²¤Ç\,\verb|'a|¤ò\verb|(quote a)|¤ÎÂå¤ï¤ê¤Ë»È¤¨¤ë¡¥
¤½¤ì¤ÏÂè\ref{fig:PossibleDefQuote}¿Þ¤Î¤è¤¦¤ËÄêµÁ¤¹¤ë¤³¤È¤â¤Ç¤­¤ë¡¥

\verb|read|¤ÏÄÌ¾ï¤Î¥³¥ó¥Æ¥­¥¹¥È
¡ÊÎã¤¨¤Ð\,\verb|"a'b"|\,¤ä\,\verb@|a'b|@\,¤Ï½ü¤¯¡Ë¤Ç\,\verb|'|\,¤òÆÉ¤ß¹þ¤à¤È¡¤
¸½ºß¤Î¥¹¥È¥ê¡¼¥à¤ÈÊ¸»ú¤Ë¤Ä¤¤¤Æ¤³¤Î´Ø¿ô¤ò¸Æ¤ó¤À·ë²Ì¤òÊÖ¤¹¡¥
¡Ê¤³¤Î´Ø¿ô¤ÏÂè2°ú¿ô¤òÌµ»ë¤¹¤ë¡¥¤É¤¦¤»É¬¤º¥¯¥©¡¼¥ÈÊ¸»ú¤À¤«¤é¤À¡¥¡Ë
¤è¤Ã¤Æ\verb|read|¤Ï\,\verb|'a|¤òÆÉ¤à¤È\verb|(quote a)|¤òÊÖ¤¹¡¥

\verb|read|¤Î°ú¿ô¤ÎºÇ¸å¤Î3¸Ä¤Ï¤½¤ì¤¾¤ì°Ê²¼¤Î¤³¤È¤òÀ©¸æ¤¹¤ë¡¥
¤¹¤Ê¤ï¤Á¡¤¥Õ¥¡¥¤¥ë½ªÃ¼¤ËÃ£¤·¤¿¤È¤­¤Ë¥¨¥é¡¼¤òµ¯¤³¤¹¤Ù¤­¤«¡¤µ¯¤³¤µ¤Ê¤¤¤Ê¤é²¿¤ÎÃÍ¤òÊÖ¤¹¤«¡¤
\verb|read|¤ò¸Æ¤Ó½Ð¤·¤Æ¤¤¤ë´Ö¤Ë¤â\verb|read|¤¬¸Æ¤Ó½Ð¤µ¤ì¤ë¤«¤É¤¦¤«¡¥
¤Û¤È¤ó¤ÉÁ´¤Æ¤Î¥ê¡¼¥É¥Þ¥¯¥í¤ÇÂè2¤ÈÂè4°ú¿ô¤Ï\verb|t|¤Ç¤¢¤ë¤Ù¤­¤Ç¡¤
¤Þ¤¿¤½¤Îµ¢·ë¤È¤·¤ÆÂè3°ú¿ô¤Ï¤É¤¦¤Ç¤â¤è¤¤¡¥

¥ê¡¼¥É¥Þ¥¯¥í¤ÈÉáÄÌ¤Î¥Þ¥¯¥í¤Ë¤Ï¡¤¶¦¤Ë´Ø¿ô¤¬ÇØ¸å¤Ë¤¢¤ë¡¥
¤½¤·¤Æ¥Þ¥¯¥í¤ÎÅ¸³«·Á¤òÀ¸À®¤¹¤ë´Ø¿ô¤ÈÆ±ÍÍ¤Ë¡¤¥Þ¥¯¥íÊ¸»ú¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿´Ø¿ô¤Ï¡¤
ÆÉ¤ß¹þ¤ß¸µ¤Î¥¹¥È¥ê¡¼¥à¤ËÂÐ¤·¤Æ°Ê³°¤ÏÉûºîÍÑ¤ò»ý¤Ä¤Ù¤­¤Ç¤Ê¤¤¡¥
¥ê¡¼¥É¥Þ¥¯¥í¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿´Ø¿ô¤¬¤¤¤Ä¡¤¤Þ¤¿¤Ï¤É¤ìÄøÉÑÈË¤Ë¸Æ¤Ð¤ì¤ë¤«¤Ë¤Ä¤¤¤Æ¡¤
Common Lisp¤Ï°ìÀÚ¤ÎÊÝ¾Ú¤òÌÀ¼¨¤·¤Æ¤¤¤Ê¤¤¡¥
¡Ê\textsf{CLtL2}¤Î543¥Ú¡¼¥¸¤ò»²¾È¡Ë

¥Þ¥¯¥í¤È¥ê¡¼¥É¥Þ¥¯¥í¤Ï¡¤¥³¡¼¥É¤ò¤½¤ì¤¾¤ì°Û¤Ê¤Ã¤¿ÃÊ³¬¤Ç¼õ¤±¼è¤ë¡¥
¥Þ¥¯¥í¤Ï¥³¡¼¥É¤¬¥ê¡¼¥À¤Ë¤è¤Ã¤Æ´û¤ËLisp¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ø¤È¥Ñ¡¼¥¹¤µ¤ì¤¿»þÅÀ¤Ç¼õ¤±¼è¤ë¤¬¡¤
¥ê¡¼¥É¥Þ¥¯¥í¤Ï¥³¡¼¥É¤¬¤Þ¤À¥Æ¥­¥¹¥È¤Ç¤¢¤ë´Ö¤Ë¤½¤ì¤ËºîÍÑ¤¹¤ë¡¥
¤·¤«¤·¤³¤Î¥Æ¥­¥¹¥È¤ËÂÐ¤·\verb|read|¤ò¸Æ¤Ö¤³¤È¤Ç¡¤
¥ê¡¼¥É¥Þ¥¯¥í¤â¡ÊË¾¤ß¤È¤¢¤é¤Ð¡ËÆ±ÍÍ¤Ë¥Ñ¡¼¥¹ºÑ¤ß¤ÎLisp¥ª¥Ö¥¸¥§¥¯¥È¤òÆÀ¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
¤À¤«¤é¥ê¡¼¥É¥Þ¥¯¥í¤Ï¾¯¤Ê¤¯¤È¤âÉáÄÌ¤Î¥Þ¥¯¥í¤ÈÆ±ÄøÅÙ¤ÎÎÏ¤ò»ý¤Ã¤Æ¤¤¤ë¡¥

¼ÂºÝ¤Ë¤Ï¡¤¥ê¡¼¥É¥Þ¥¯¥í¤ÎÊý¤¬¾¯¤Ê¤¯¤È¤â2ÅÀ¤Ç¥Þ¥¯¥í¤è¤ê¶¯ÎÏ¤À¡¥
¥ê¡¼¥É¥Þ¥¯¥í¤ÏLisp¤ÎÆÉ¤ß¹þ¤à¤â¤ÎÁ´¤Æ¤Ë±Æ¶Á¤Ç¤­¤ë¤¬¡¤¥Þ¥¯¥í¤Ï¥³¡¼¥ÉÆâ¤ËÅ¸³«¤µ¤ì¤ë¤À¤±¤À¡¥
¤Þ¤¿¥ê¡¼¥É¥Þ¥¯¥í¤Ï°ìÈÌ¤Ë\verb|read|¤òºÆµ¢Åª¤Ë¸Æ¤Ö¤Î¤Ç¡¤¼¡¤Î¤è¤¦¤Ê¼°¤Ï¡¤
\begin{verbatim}
''a
\end{verbatim}
¼¡¤Î¤è¤¦¤ËÅ¸³«¤µ¤ì¤ë¡¥
\begin{verbatim}
(quote (quote a))
\end{verbatim}
¤·¤«¤·\verb|quote|¤Î¾ÊÎ¬·Á¤òÉáÄÌ¤Î¥Þ¥¯¥í¤ÇÄêµÁ¤·¤è¤¦¤È¤¹¤ë¤È¡¤
¤½¤ì¤Ï¸ÉÎ©¤·¤¿¾õÂÖ¤Ç¤Ïµ¡Ç½¤¹¤ë¤¬¡¤
\begin{verbatim}
> (eq 'a (q a))
T
\end{verbatim}
Æþ¤ì»Ò¤Ë¤Ê¤ë¤Èµ¡Ç½¤·¤Ê¤¤¡¥
Îã¤¨¤Ð¡¤
\begin{verbatim}
(q (q a))
\end{verbatim}
¤È¤·¤Æ¤â¼¡¤Î¤è¤¦¤Ë¤·¤«¤Ê¤é¤Ê¤¤¡¥
\begin{verbatim}
(quote (q a))
\end{verbatim}
%}}}
\subsection{¥Þ¥¯¥íÊ¸»ú¤Î¥Ç¥£¥¹¥Ñ¥Ã¥Á¥ó¥°}   %{{{
¥·¥ã¡¼¥×¥¯¥©¡¼¥È¤Ï¡¤\verb|#|\,¤Ç»Ï¤Þ¤ëÂ¾¤Î¥ê¡¼¥É¥Þ¥¯¥í¤ÈÆ±ÍÍ¡¤
¥Ç¥£¥¹¥Ñ¥Ã¥Á¥ó¥°¡¦¥ê¡¼¥É¥Þ¥¯¥í¤È¸Æ¤Ð¤ì¤ë°¡¼ï¤ÎÎã¤À¡¥
¤½¤ì¤é¤Ï2Ê¸»ú¤Ç»È¤ï¤ì¤ë¤¬¡¤¤½¤Î1Ê¸»úÌÜ¤Ï¥Ç¥£¥¹¥Ñ¥Ã¥Á¥ó¥°Ê¸»ú¤È¸Æ¤Ð¤ì¤ë¡¥
¤½¤Î¤è¤¦¤Ê¥ê¡¼¥É¥Þ¥¯¥í¤ÎÌÜÅª¤Ï¡¤Ã±¤ËASCIIÊ¸»ú½¸¹ç¤òºÇÂç¸Â¤Ë³èÍÑ¤¹¤ë¤³¤È¤À¤±¤À¡¥
1Ê¸»ú¤Î¥ê¡¼¥É¥Þ¥¯¥í¤Ï¤»¤¤¤¼¤¤ASCIIÊ¸»ú½¸¹ç¤Î¿ô¤À¤±¤·¤«ÄêµÁ¤Ç¤­¤Ê¤¤¡¥

¡Ê\verb|make-dispatch-macro-character|¤Ë¤è¤Ã¤Æ¡ËÆÈ¼«¤Î¥Ç¥£¥¹¥Ñ¥Ã¥Á¥ó¥°¡¦¥Þ¥¯¥íÊ¸»ú¤¬ÄêµÁ¤Ç¤­¤ë¤¬¡¤
\verb|#|\,¤¬´û¤Ë¤½¤ì¤È¤·¤ÆÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¤¤½¤ì¤ò»È¤Ã¤Æ¤â¤è¤¤¡¥
\verb|#|\,¤Ç»Ï¤Þ¤ëÁÈ¹ç¤»¤Î´ö¤Ä¤«¤ÏÆÈ¼«ÍøÍÑ¤Î¤¿¤á¤ËÌÀ¼¨Åª¤ËÍ½Ìó¤µ¤ì¤Æ¤¤¤ë¡¥
Â¾¤ÎÁÈ¹ç¤»¤Ï¡¤Common Lisp¤ÇÍ½¤áÄêµÁ¤µ¤ì¤¿°ÕÌ£¤ò»ý¤¿¤Ê¤¤¸Â¤êÍøÍÑ¤Ç¤­¤ë¡¥
ÌÖÍåÅª¤Ê°ìÍ÷¤Ï\textsf{CLtL2}¤Î531¥Ú¡¼¥¸¤Ë¤¢¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro q (obj)
  `(quote ,obj))
     (set-dispatch-macro-character #\# #\?
       #'(lambda (stream char1 char2)
            `#'(lambda (&rest ,(gensym))
                  ,(read stream t nil t))))
\end{FramedVerb}\end{center}
\caption{Äê¿ô´Ø¿ô¤Î¤¿¤á¤Î¥ê¡¼¥É¥Þ¥¯¥í¡¥}
\label{fig:ReadMacroForConstFunc}
\end{figure}

¥Ç¥£¥¹¥Ñ¥Ã¥Á¥ó¥°¥Þ¥¯¥íÊ¸»ú¤Î¿·¤¿¤ÊÁÈ¹ç¤»¤Ï¡¤´Ø¿ô\verb|set-dispatch-macro-character|¤ÇÄêµÁ¤Ç¤­¤ë¡¥
¤³¤ì¤Ï\verb|set-macro-character|¤È»÷¤Æ¤¤¤ë¤¬¡¤Ê¸»ú¤Î°ú¿ô¤ò2¸Ä¼è¤ëÅÀ¤¬°Û¤Ê¤ë¡¥
¥×¥í¥°¥é¥Þ¤ËÍ½Ìó¤µ¤ì¤Æ¤¤¤ëÁÈ¹ç¤»¤Î°ì¤Ä¤Ï\,\verb|#?|\,¤À¡¥
Âè\ref{fig:ReadMacroForConstFunc}¿Þ¤Ë¤Ï¡¤
¤³¤ÎÁÈ¹ç¤»¤òÄê¿ô´Ø¿ô¤Î¤¿¤á¤Î¥ê¡¼¥É¥Þ¥¯¥í¤È¤·¤ÆÄêµÁ¤¹¤ëÊýË¡¤ò¼¨¤·¤¿¡¥
¤½¤ì¤Ë¤è¤ë¤È\,\verb|#?2|\,¤ÏÇ¤°Õ¸Ä¿ô¤Î°ú¿ô¤ò¼è¤Ã¤Æ2¤òÊÖ¤¹´Ø¿ô¤È¤·¤ÆÆÉ¤ß¹þ¤Þ¤ì¤ë¡¥
Îã:
\begin{verbatim}
> (mapcar #?2 '(a b c))
(2 2 2)
\end{verbatim}
¤³¤ÎÎã¤Ç¤Ï¿·¥ª¥Ú¥ì¡¼¥¿¤Ï¤«¤Ê¤êÌµ°ÕÌ£¤Ë¸«¤¨¤ë¤¬¡¤
´Ø¿ô¤ò°ú¿ô¤Ë»È¤¦¤³¤È¤¬¤Ò¤É¤¯Â¿¤¤¥×¥í¥°¥é¥à¤Ç¤Ï¡¤Äê¿ô´Ø¿ô¤â¤·¤Ð¤·¤ÐÉ¬Í×¤Ë¤Ê¤ë¡¥
»ö¼Â¡¤Lisp¤ÎÊý¸À¤Ë¤è¤Ã¤Æ¤ÏÄê¿ô´Ø¿ô¤òÄêµÁ¤¹¤ë¤¿¤á¤Î\verb|always|¤È¤¤¤¦ÁÈ¹þ¤ß´Ø¿ô¤¬ÍÑ°Õ¤µ¤ì¤Æ¤¤¤ë¡¥

¥Þ¥¯¥íÊ¸»ú¤ò¤½¤Î¥Þ¥¯¥íÊ¸»ú¤ÎÄêµÁÆâ¤Ë»È¤¦¤³¤È¤ÏÁ´¤¯ÌäÂê¤Ê¤¤¤³¤È¤ËÃí°Õ¤·¤è¤¦¡¥
Â¾¤Î¤É¤ÎLisp¼°¤È¤âÆ±¤¸¤è¤¦¤Ë¡¤¤½¤ì¤é¤ÏÄêµÁ¤¬ÆÉ¤ß¹þ¤Þ¤ì¤¿¤È¤­¤Ë¾Ã¤¨¤Æ¤·¤Þ¤¦¡¥
¥Þ¥¯¥íÊ¸»ú¤Ï\,\verb|#?|\,¤Î¸å¤Ë»È¤Ã¤Æ¤â¹½¤ï¤Ê¤¤¡¥
\verb|#?|\,¤ÎÄêµÁ¤Ç¤Ï\verb|read|¤ò¸Æ¤ó¤Ç¤¤¤ë¤Î¤Ç¡¤
\verb|'|¤ä\,\verb|#'|Åù¤Î¥Þ¥¯¥íÊ¸»ú¤ÏÉáÄÌÄÌ¤ê¤Ëµ¡Ç½¤¹¤ë¡¥
\begin{verbatim}
> (eq (funcall #?'a) 'a)
T
> (eq (funcall #?#'oddp) (symbol-function 'oddp))
T
\end{verbatim}
%}}}
\subsection{¥Ç¥ê¥ß¥¿}   %{{{
\begin{figure}\begin{center}\begin{FramedVerb}
(set-macro-character #\] (get-macro-character #\)))

(set-dispatch-macro-character #\# #\[
  #'(lambda (stream char1 char2)
      (let ((accum nil)
            (pair (read-delimited-list #\] stream t)))
        (do ((i (ceiling (car pair)) (1+ i)))
          ((> i (floor (cadr pair)))
           (list 'quote (nreverse accum)))
          (push i accum)))))
\end{FramedVerb}\end{center}
\caption{¥ê¡¼¥É¥Þ¥¯¥í¤òÄêµÁ¤¹¤ë¥Ç¥ê¥ß¥¿¡¥}
\label{fig:ReadMacroDefngDlmt}
\end{figure}

Ã±½ã¤Ê¥Þ¥¯¥íÊ¸»ú¤Î¼¡¤Ë¤è¤¯»È¤ï¤ì¤ë¥Þ¥¯¥íÊ¸»ú¤Ï¡¤¥ê¥¹¥È¤Î¥Ç¥ê¥ß¥¿¤À¡¥
¥æ¡¼¥¶¤ËÍ½Ìó¤µ¤ì¤Æ¤¤¤ëÁÈ¹ç¤»¤Ë¤Ï\,\verb|#[|¤â¤¢¤ë¡¥
Âè\ref{fig:ReadMacroDefngDlmt}¿Þ¤Ë¤Ï¡¤
¤½¤ì¤ò¼ê¤Î¹þ¤ó¤À»ÅÁÈ¤ß¤ò»ý¤Ä³«¤­³ç¸Ì¤Î°ì¼ï¤È¤·¤ÆÄêµÁ¤¹¤ëÊýË¡¤ò¼¨¤·¤¿¡¥
¤½¤³¤Ç¤Ï\,\verb|#[x y]|¤È¤¤¤¦·Á¤Î¼°¤ò
\verb|x|°Ê¾å\verb|y|°Ê²¼¤ÎÀ°¿ôÁ´¤Æ¤«¤éÀ®¤ë¥ê¥¹¥È¤È¤·¤ÆÆÉ¤ß¹þ¤Þ¤»¤ë¤è¤¦¤Ë¤·¤Æ¤¤¤ë¡¥
\begin{verbatim}
> #[2 7]
(2 3 4 5 6 7)
\end{verbatim}
¤³¤Î¥ê¡¼¥É¥Þ¥¯¥í¤Ç¿·¤·¤¤¤Î¤Ï\verb|read-delimited-list|¤ò¸Æ¤ó¤Ç¤¤¤ëÅÀ¤À¤±¤À¡¥
¤³¤ì¤Ï¤Á¤ç¤¦¤É¤³¤Î¤è¤¦¤Ê¾ì¹ç¤Î¤¿¤á¤ËÍÑ°Õ¤µ¤ì¤¿ÁÈ¹þ¤ß´Ø¿ô¤À¡¥
Âè1°ú¿ô¤Ë¤Ï¥ê¥¹¥È¤Î½ª¤ï¤ê¤È¤·¤Æ°·¤¦Ê¸»ú¤òÍ¿¤¨¤ë¡¥
\verb|]|¤¬\,\verb|#[|¤òÊÄ¤¸¤ë¥Ç¥ê¥ß¥¿¤È¤·¤ÆÇ§¼±¤µ¤ì¤ë¤¿¤á¤Ë¤Ï¡¤
Àè¤Ë¥Ç¥ê¥ß¥¿¤Î°ì¼ï¤Ë´Þ¤Þ¤ì¤Æ¤¤¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤Î¤Ç¡¤Í½¤á\verb|set-macro-character|¤ò¸Æ¤ÖÉ¬Í×¤¬¤¢¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro defdelim (left right parms &body body)
  `(ddfn ,left ,right #'(lambda ,parms ,@body)))

(let ((rpar (get-macro-character #\) )))
  (defun ddfn (left right fn)
    (set-macro-character right rpar)
    (set-dispatch-macro-character #\# left
       #'(lambda (stream char1 char2)
           (apply fn
                  (read-delimited-list right stream t))))))
\end{FramedVerb}\end{center}
\caption{¥Ç¥ê¥ß¥¿¡¦¥ê¡¼¥É¥Þ¥¯¥í¤òÄêµÁ¤¹¤ë¤¿¤á¤Î¥Þ¥¯¥í¡¥}
\label{fig:MacroForDefngDlmtReadMacro}
\end{figure}

¥Ç¥ê¥ß¥¿¡¦¥ê¡¼¥É¥Þ¥¯¥í¤ÎÄêµÁ¤Ç¤Ï¤Û¤ÜËè²óÂè\ref{fig:ReadMacroDefngDlmt}¿Þ¤Î¥³¡¼¥É¤ÎÂ¿¤¯¤¬
·«¤êÊÖ¤·»È¤ï¤ì¤ë¤À¤í¤¦¡¥
¥Þ¥¯¥í¤Ê¤é¤½¤ì¤ò¹Ô¤¦»ÅÁÈ¤ß¤ËÃê¾Ý²½¤µ¤ì¤¿¥¤¥ó¥¿¥Õ¥§¥¤¥¹¤òÈ÷¤¨¤µ¤»¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
Âè\ref{fig:MacroForDefngDlmtReadMacro}¿Þ¤Ë¤Ï¡¤
¥Ç¥ê¥ß¥¿¡¦¥ê¡¼¥É¥Þ¥¯¥í¤òÄêµÁ¤¹¤ë¤¿¤á¤Î¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ÎÄêµÁÎã¤ò¼¨¤·¤¿¡¥
¥Þ¥¯¥í\verb|defdelim|¤Ï°ú¿ô¤Ë2¸Ä¤ÎÊ¸»ú¡¤²¾°ú¿ô¥ê¥¹¥ÈµÚ¤ÓËÜÂÎ¤Ë¤Ê¤ë¥³¡¼¥É¤ò¼è¤ë¡¥
°ú¿ô¥ê¥¹¥È¤ÈËÜÂÎ¥³¡¼¥É¤Ï°ÅÌÛ¤Î¤¦¤Á¤Ë´Ø¿ô¤òÄêµÁ¤¹¤ë¡¥
\verb|defdelim|¤ò¸Æ¤Ó½Ð¤¹¤È¡¤1Ê¸»úÌÜ¤ò¥Ç¥£¥¹¥Ñ¥Ã¥Á¥ó¥°¡¦¥ê¡¼¥É¥Þ¥¯¥í¤È¤·¤Æ¡¤
2Ê¸»úÌÜ¤ò¤½¤Î½ªÃ¼¤È¤·¤ÆÄêµÁ¤¹¤ë¡¥
¤½¤·¤ÆÄêµÁ¤µ¤ì¤¿´Ø¿ô¤ò¤½¤ì¤é¤Î´Ö¤Î¤â¤Î¤ËÅ¬ÍÑ¤·¤¿·ë²Ì¤òÊÖ¤¹¤è¤¦¤Ë¤¹¤ë¡¥
¤Ä¤¤¤Ç¤Ë¸À¤¨¤Ð¡¤Âè\ref{fig:ReadMacroDefngDlmt}¿Þ¤Î´Ø¿ôËÜÂÎ¤â¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤òÍß¤·¤¬¤Ã¤Æ¤¤¤ë¡¥
¤¹¤Ê¤ï¤Á¡¤´û¤ËÄêµÁ¤·¤¿\verb|mapa-b|¡Êckv¥Ú¡¼¥¸¡Ë¤À¡¥
\verb|defdelim|¤È\verb|mapa-b|¤ò»È¤¦¤È¡¤
Âè\ref{fig:ReadMacroDefngDlmt}¿Þ¤ÇÄêµÁ¤·¤¿¥ê¡¼¥É¥Þ¥¯¥í¤Ï¼¡¤Î¤è¤¦¤Ë½ñ¤±¤ë¡¥
\begin{verbatim}
(defdelim #\[ #\] (x y)
  (list 'quote (mapa-b #'identity (ceiling x) (floor y))))
\end{verbatim}

¥Ç¥ê¥ß¥¿¡¦¥ê¡¼¥É¥Þ¥¯¥í¤Ï´Ø¿ô¤Î¹çÀ®¤Ë¤â»È¤¦¤ÈÊØÍø¤À¡¥
Âè5.4Àá¤Ç¤Ï´Ø¿ô¹çÀ®ÍÑ¤Î¥ª¥Ú¥ì¡¼¥¿¤òÄêµÁ¤·¤¿¡¥
\begin{verbatim}
> (let ((f1 (compose #'list #'1+))
        (f2 #'(lambda (x) (list (1+ x)))))
    (equal (funcall f1 7) (funcall f2 7)))
T
\end{verbatim}
ÁÈ¹þ¤ß´Ø¿ô¤Î\verb|list|¤È\verb|1+|Åù¤ò¹çÀ®¤¹¤ë¤È¤­¤Ë¤Ï¡¤
\verb|compose|¤Î¸Æ¤Ó½Ð¤·¤ÎÉ¾²Á¤ò¼Â¹Ô»þ¤Þ¤ÇÂÔ¤ÄÍýÍ³¤Ï¤Ê¤¤¡¥
Âè5.7Àá¤Ç¤ÏÂåÂØÊýË¡¤ò¾Ò²ð¤·¤¿¡¥
¥ê¡¼¥É¥Þ¥¯¥í¤Î¥·¥ã¡¼¥×¥É¥Ã¥È¤ò\verb|compose|¼°¤ÎÆ¬¤ËÉÕ¤±¤ë¤³¤È¤Ç¡¤¤½¤ì¤òÆÉ¤ß¹þ¤ß»þ¤ËÉ¾²Á¤Ç¤­¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
#.(compose #'list #'1+)
(defdelim #\@{ #\@} (&rest args)
          `(fn (compose ,@args)))
\end{FramedVerb}\end{center}
\caption{´Ø¿ô¹çÀ®¤Î¤¿¤á¤Î¥ê¡¼¥É¥Þ¥¯¥í¡¥}
\label{fig:ReadMacroForFuncComp}
\end{figure}

¤³¤³¤Ç¤Ï»÷¤Æ¤¤¤ë¤¬¤µ¤é¤Ë¤­¤ì¤¤¤Ê²ò·èË¡¤ò¼¨¤½¤¦¡¥
Âè\ref{fig:ReadMacroForFuncComp}¿Þ¤Î¥ê¡¼¥É¥Þ¥¯¥í¤Ï¡¤\verb|#@{f 1 f 2 ...fn@}|¤È¤¤¤¦·Á¤Î¼°¤¬
\verb|f1|¡¤\verb|f2|¡¤\ldots¡¤\verb|fn|¤ò¹çÀ®¤·¤¿¤â¤Î¤È¤·¤ÆÆÉ¤ß¹þ¤Þ¤ì¤ë¤è¤¦¤ËÄêµÁ¤¹¤ë¡¥
¤è¤Ã¤Æ¤³¤¦¤Ê¤ë¡¥
\begin{verbatim}
> (funcall #@{list 1+@} 7)
(8)
\end{verbatim}
¤³¤ì¤Ï\verb|fn|¡Êgfd¥Ú¡¼¥¸¡Ë¤Î¸Æ¤Ó½Ð¤·¤òÀ¸À®¤¹¤ë¤³¤È¤ÇÆ°ºî¤¹¤ë¡¥
\verb|fn|¤Ï¥³¥ó¥Ñ¥¤¥ë»þ¤Ë´Ø¿ô¤òÀ¸À®¤Ç¤­¤ë¤â¤Î¤À¡¥
%}}}
\subsection{¤¤¤Ä²¿¤¬µ¯¤­¤ë¤Î¤«}   %{{{
ºÇ¸å¤Ë¡¤º®Íð¤¹¤ë¤«¤â¤·¤ì¤Ê¤¤ÅÀ¤Ë¤Ä¤¤¤Æ¤Ï¤Ã¤­¤ê¤µ¤»¤Æ¤ª¤¤¤¿Êý¤¬¤è¤¤¤«¤â¤·¤ì¤Ê¤¤¡¥
¥ê¡¼¥É¥Þ¥¯¥í¤¬ÉáÄÌ¤Î¥Þ¥¯¥í¤è¤êÀè¤Ë¸Æ¤Ó½Ð¤µ¤ì¤ë¤Ê¤é¡¤
¥Þ¥¯¥í¤¬¥ê¡¼¥É¥Þ¥¯¥í¤ò´Þ¤à¼°¤ËÅ¸³«¤µ¤ì¤ë¤È¤¤¤¦¤Î¤Ï²¿¤Ê¤Î¤À¤í¤¦¤«¡©
Îã¤¨¤Ð¼¡¤Î¥Þ¥¯¥í¤Ï¡¤
\begin{verbatim}
(defmacro quotable ()
  '(list 'able))
\end{verbatim}
¥¯¥©¡¼¥È¤ò´Þ¤à¼°¤ËÅ¸³«¤µ¤ì¤ë¡¥
¤µ¤Æ¤½¤ì¤ÏËÜÅö¤À¤í¤¦¤«¡©
¼Â¤Ï¡¤¤³¤Î¥Þ¥¯¥í¤ÎÄêµÁÆâ¤Ë¤¢¤ë¤É¤Á¤é¤Î¥¯¥©¡¼¥È¤â\verb|defmacro|¼°¤¬ÆÉ¤ß¹þ¤Þ¤ì¤¿¤È¤­¤ËÅ¸³«¤µ¤ì¡¤
¼¡¤Î¤è¤¦¤Ë¤Ê¤ë¡¥
\begin{verbatim}
(defmacro quotable ()
  (quote (list (quote able))))
\end{verbatim}
ÉáÄÌ¤Ï¥Þ¥¯¥í¤ÎÅ¸³«·Á¤Ë¥ê¡¼¥É¥Þ¥¯¥í¤¬´Þ¤Þ¤ì¤ë¤È»×¤Ã¤Æ¤¤¤Æ¤âÉÔÅÔ¹ç¤Ï¤Ê¤¤¤¬¡¤
¤½¤ì¤Ï¥ê¡¼¥É¥Þ¥¯¥í¤ÎÄêµÁ¤ÏÆÉ¤ß¹þ¤ß»þ¤È¥³¥ó¥Ñ¥¤¥ë»þ¤ÇÊÑ¤ï¤é¤Ê¤¤¤Ï¤º¡ÊÊÑ¤ï¤ë¤Ù¤­¤Ç¤Ê¤¤¡Ë¤«¤é¤À¡¥
%}}}
%}}}
\section{¹½Â¤²½ÂåÆþ} %{{{
¹½Â¤²½ÂåÆþ¤È¤Ï¡¤ÂåÆþ¤Î°ìÈÌ²½¤À¡¥
¥ª¥Ú¥ì¡¼¥¿\verb|setq|¤È\verb|setf|¤Ï¸Ä¡¹¤ÎÊÑ¿ô¤ËÂåÆþ¤ò¹Ô¤¦¡¥
¹½Â¤²½ÂåÆþ¤ÏÂåÆþ¤ò¥¢¥¯¥»¥¹¤ÈÁÈ¤ß¹ç¤ï¤»¤ë¡¥
Âè1°ú¿ô¤ËÊÑ¿ô¤òÃ±ÆÈ¤ÇÃÖ¤¯¤Î¤Ç¤Ï¤Ê¤¯¡¤ÊÑ¿ô¤Î¥Ñ¥¿¡¼¥ó¤òÍ¿¤¨¤ë¡¥
¤¹¤ë¤È³Æ¡¹¤ËÆ±¤¸¹½Â¤¤ÎÂÐ±þ¤¹¤ë¾ì½ê¤ËÃÖ¤«¤ì¤¿ÃÍ¤¬ÂåÆþ¤µ¤ì¤ë¡¥
\subsection{¥ê¥¹¥È¤ËÂÐ¤¹¤ë¹½Â¤²½ÂåÆþ}   %{{{
\textsf{CLtL2}¤Ç¤Ï¡¤Common Lisp¤Ë¿·¥Þ¥¯¥í\verb|destructuring-bind|¤¬²Ã¤ï¤Ã¤¿¡¥
¤³¤Î¥Þ¥¯¥í¤ÏÂè7¾Ï¤Ç´ÊÃ±¤Ë°·¤Ã¤¿¤¬¡¤¤³¤³¤Ç¤Ï¾Ü¤·¤¯¸¡Æ¤¤¹¤ë¡¥
\verb|lst|¤¬Í×ÁÇ¤ò3¤Ä»ý¤Ä¥ê¥¹¥È¤Ç¡¤\verb|x|¤ËÂè1Í×ÁÇ¤ò¡¤\verb|y|¤ËÂè2¡¤
\verb|z|¤ËÂè3Í×ÁÇ¤òÂ«Çû¤·¤¿¤¤¤È¤·¤è¤¦¡¥
\textsf{CLtL1}¤Î¤ß¤ËÂÐ±þ¤ÎCommon Lisp¤Ç¤Ï¡¤¤³¤¦¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
\begin{verbatim}
(let ((x (first lst))
      (y (second lst))
      (z (third lst)))
...)
\end{verbatim}
¿·¥Þ¥¯¥í¤ò»È¤¦¤È¡¤Âå¤ï¤ê¤Ë¤³¤¦½ñ¤¯¤³¤È¤¬¤Ç¤­¤ë¡¥
\begin{verbatim}
(destructuring-bind (x y z) lst
  ...)
\end{verbatim}
¤³¤ì¤ÏÃ»¤¤¤À¤±¤Ç¤Ê¤¯¡¤·Á¤âÀ°¤Ã¤Æ¤¤¤ë¡¥
¤â¤Î¤òÆÉ¤à¤È¤­¤Ë¤Ï»ë³ÐÅª¼ê¤¬¤«¤ê¤ÏÊ¸»ú¾å¤Î¤â¤Î¤è¤êÍÚ¤«¤ËÂ®¤¯Ç§¼±¤µ¤ì¤ë¡¥
¸å¤Î·Á¤Ç¤Ï\verb|x|¡¤\verb|y|¤È\verb|z|¤Î´Ø·¸¤¬¼¨¤µ¤ì¤Æ¤¤¤ë¤¬¡¤
Á°¤Î·Á¤Ç¤Ï¿äÏÀ¤¬É¬Í×¤Ë¤Ê¤ë¡¥

¤³¤Î¤è¤¦¤ËÃ±½ã¤Ê¾ì¹ç¤¹¤é¹½Â¤²½ÂåÆþ¤Ë¤è¤Ã¤Æ¤­¤ì¤¤¤Ë¤Ç¤­¤ë¤Î¤À¤«¤é¡¤
Ê£»¨¤Ê¾ì¹ç¤Ë¤É¤ì¤Û¤ÉÆÉ¤ß¤ä¤¹¤¯¤Ê¤ë¤«ÁÛÁü¤·¤ÆÍß¤·¤¤¡¥
\verb|destructuring-bind|¤ÎÂè1°ú¿ô¤Ë¤ÏÇ¤°Õ¤ÎÊ£»¨¤Ê¥Ä¥ê¡¼¤òÅÏ¤»¤ë¡¥
¼¡¤Î¥³¡¼¥É¤¬¡¤\verb|let|¤È¥ê¥¹¥È¤Ø¤Î¥¢¥¯¥»¥¹´Ø¿ô¤ò»È¤Ã¤Æ½ñ¤«¤ì¤¿¤é¤É¤¦¤Ê¤ë¤«ÁÛÁü¤·¤ÆÍß¤·¤¤¡¥
\begin{verbatim}
(destructuring-bind ((first last) (month day year) . notes)
                     birthday
  ...)
\end{verbatim}
¤³¤ì¤«¤é¿·¤·¤¯Ê¬¤«¤ë¤³¤È¤¬¤¢¤ë¡¥
¹½Â¤²½ÂåÆþ¤Ï¡¤¥×¥í¥°¥é¥à¤òÆÉ¤ß°×¤¯¤¹¤ë¤À¤±¤Ç¤Ê¤¯½ñ¤­°×¤¯¤â¤¹¤ë¡¥

¹½Â¤²½ÂåÆþ¤Ï\textsf{CLtL1}¤ÎCommon Lisp¤Ë¤â³Î¤«¤ËÂ¸ºß¤·¤¿¡¥
¾å½Ò¤ÎÎã¤¬¸«´·¤ì¤¿¤â¤Î¤Ë»×¤¨¤ë¤Ê¤é¡¤¤½¤ì¤Ï¥Þ¥¯¥í¤Î²¾°ú¿ô¥ê¥¹¥È¤ÈÆ±¤¸·Á¼°¤ò»ý¤Ã¤Æ¤¤¤ë¤«¤é¤À¡¥
¼ÂºÝ¡¤\verb|destructuring-bind|¤Ï¥Þ¥¯¥í¤Î°ú¿ô¥ê¥¹¥È¤òÊ¬Î¥¤¹¤ë¤¿¤á¤Ë»È¤ï¤ì¤ë¥³¡¼¥É¤À¤¬¡¤
º£¤Ç¤Ï¤½¤ì¤¬ÆÈÎ©¤·¤¿¥ª¥Ú¥ì¡¼¥¿¤Ë¤Ê¤Ã¤¿¤Î¤À¡¥
¥Þ¥¯¥í¤Î²¾°ú¿ô¥ê¥¹¥È¤ËÆþ¤ì¤é¤ì¤ë¤â¤Î¤Ê¤é²¿¤Ç¤â¥Ñ¥¿¡¼¥ó¤ËÆþ¤ì¤é¤ì¤ë¡¥
¡Ê¤¿¤À¤·º³ºÙ¤ÊÎã³°¤¬¤¢¤ë¡¥¥­¡¼¥ï¡¼¥É\verb|&environment|¤À¡¥¡Ë

Â«Çû¤ò¤¤¤Á¤É¤­¤ËÀ¸À®¤¹¤ë¤Î¤ÏÌ¥ÎÏÅª¤ÊÈ¯ÁÛ¤À¡¥
°Ê²¼¤ÎÀá¤Ç¤Ï¤³¤Î¹Í¤¨¤ÎÊÑ²½·Á¤ò´ö¤Ä¤«ÀâÌÀ¤¹¤ë¡¥
%}}}
\subsection{Â¾¤Î¹½Â¤}   %{{{
¹½Â¤²½ÂåÆþ¤ò¥ê¥¹¥È¤Ë¸Â¤ëÍýÍ³¤Ï¤Ê¤¯¡¤Ê£»¨¤Ê¥ª¥Ö¥¸¥§¥¯¥È¤Ï¤É¤ì¤â¤½¤Î¸õÊä¤Ë¤Ê¤ë¡¥
¤³¤ÎÀá¤Ç¤Ï¡¤¥ê¥¹¥È°Ê³°¤Î¥ª¥Ö¥¸¥§¥¯¥ÈÍÑ¤Î\verb|destructuring-bind|Îà»÷¥Þ¥¯¥í¤Î½ñ¤­Êý¤òÀâÌÀ¤¹¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro dbind (pat seq &body body)
  (let ((gseq (gensym)))
    `(let ((,gseq ,seq))
       ,(dbind-ex (destruc pat gseq #'atom) body))))

(defun destruc (pat seq &optional (atom? #'atom) (n 0))
  (if (null pat)
      nil
      (let ((rest (cond ((funcall atom? pat) pat)
                        ((eq (car pat) '&rest) (cadr pat))
                        ((eq (car pat) '&body) (cadr pat))
                        (t nil))))
        (if rest
            `((,rest (subseq ,seq ,n)))
            (let ((p (car pat))
                  (rec (destruc (cdr pat) seq atom? (1+ n))))
              (if (funcall atom? p)
                  (cons `(,p (elt ,seq ,n))
                        rec)
                  (let ((var (gensym)))
                    (cons (cons `(,var (elt ,seq ,n))
                                (destruc p var atom?))
                          rec))))))))

(defun dbind-ex (binds body)
  (if (null binds)
      `(progn ,@body)
      `(let ,(mapcar #'(lambda (b)
                         (if (consp (car b))
                             (car b)
                             b))
                     binds)
         ,(dbind-ex (mapcan #'(lambda (b)
                                (if (consp (car b))
                                    (cdr b)))
                            binds)
                    body))))
\end{FramedVerb}\end{center}
\caption{¥·¡¼¥¯¥§¥ó¥¹°ìÈÌ¤Ë¹½Â¤²½ÂåÆþ¤ò¹Ô¤¦¥ª¥Ú¥ì¡¼¥¿¡¥}
\label{fig:GeneralSeqDestructuringOp}
\end{figure}

¼¡¤Î¼«Á³¤Ê°ìÊâ¤Ï¡¤¥·¡¼¥¯¥§¥ó¥¹°ìÈÌ¤ò°·¤¦¤³¤È¤À¡¥
Âè\ref{fig:GeneralSeqDestructuringOp}¿Þ¤Ë¤Ï\verb|dbind|¤È¤¤¤¦¥Þ¥¯¥í¤ò¼¨¤·¤¿¡¥
¤³¤ì¤Ï\verb|destructuring-bind|¤È»÷¤Æ¤¤¤ë¤¬¡¤Ç¤°Õ¤Î¼ïÎà¤Î¥·¡¼¥¯¥§¥ó¥¹¤ËÂÐ¤·¤Æµ¡Ç½¤¹¤ë¡¥
Âè2°ú¿ô¤Ë¤Ï¥ê¥¹¥È¡¤¥ô¥§¥¯¥¿¡¤¤Þ¤¿¤Ï¤½¤ì¤é¤ÎÇ¤°Õ¤ÎÁÈ¹ç¤»¤¬»È¤¨¤ë¡¥
\begin{verbatim}
> (dbind (a b c) #(1 2 3)
        (list a b c))
(123)
> (dbind (a (b c) d) '( 1 #(2 3) 4)
        (list a b c d))
(1234)
> (dbind (a (b . c) &rest d) '(1 "fribble" 2 3 4)
        (list a b c d))
(1 #\f "ribble" (2 3 4))
\end{verbatim}

¥ê¡¼¥É¥Þ¥¯¥í\,\verb|#(|¤Ï¥ô¥§¥¯¥¿¤òÉ½¸½¤¹¤ë¤¿¤á¤Î¤â¤Î¤Ç¡¤\verb|#\|¤ÏÊ¸»ú¤òÉ½¸½¤¹¤ë¤¿¤á¤Î¤â¤Î¤À¡¥
$\verb|"abc"|=\verb|#(#\a #\b #\c)|$¤Ê¤Î¤Ç¡¤\verb|"fribble"|¤ÎÂè1Í×ÁÇ¤ÏÊ¸»ú\verb|#\f|¤À¡¥
ÏÃ¤òÃ±½ã¤Ë¤¹¤ë¤¿¤á¡¤\verb|dbind|¤Ï\verb|&rest|µÚ¤Ó\verb|&body|¥­¡¼¥ï¡¼¥É¤Î¤ß¤ËÂÐ±þ¤¹¤ë¡¥

¤³¤ì¤Þ¤Ç¤Ë¸«¤¿ÂçÈ¾¤Î¥Þ¥¯¥í¤ÈÈæ¤Ù¤Æ¡¤\verb|dbind|¤ÏÂç¤­¤¤¡¥
¤³¤Î¥Þ¥¯¥í¤Î¼ÂÁõÊýË¡¤Ï³Ø¤ó¤Ç¤ª¤¯²ÁÃÍ¤¬¤¢¤ë¡¥
¤¤¤«¤ËÆ°ºî¤¹¤ë¤«¤¬Íý²ò¤Ç¤­¤ë¤À¤±¤Ç¤Ê¤¯¡¤
¤½¤³¤«¤éLisp¥×¥í¥°¥é¥ß¥ó¥°°ìÈÌ¤ËÄÌ¤¸¤ë¶µ·±¤¬ÆÀ¤é¤ì¤ë¤«¤é¤À¡¥
Âè3.4Àá¤Ç¿¨¤ì¤¿¤è¤¦¤Ë¡¤Lisp¥×¥í¥°¥é¥à¤Ï°Õ¿ÞÅª¤Ë¥Æ¥¹¥È¤·¤ä¤¹¤¤¤è¤¦¤Ë½ñ¤¯¤³¤È¤¬¤Ç¤­¤ë¡¥
¤Û¤È¤ó¤É¤Î¥³¡¼¥É¤Ç¤Ï¡¤¤½¤Î¤è¤¦¤Ë½ñ¤­¤¿¤¤Íßµá¤ÈÂ®ÅÙ¤ò½Ð¤¹É¬Í×À­¤È¤Î¥Ð¥é¥ó¥¹¤ò¼è¤é¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤¦¤Þ¤¤¤³¤È¤Ë¡¤Âè7.8Àá¤ÇÀâÌÀ¤·¤¿¤è¤¦¤Ë¡¤¥Þ¥¯¥íÅ¸³«¥³¡¼¥É¤Ë¤È¤Ã¤ÆÂ®ÅÙ¤Ï½ÅÍ×¤Ç¤Ï¤Ê¤¤¡¥
¥Þ¥¯¥í¤ÎÅ¸³«·Á¤òÀ¸À®¤¹¤ë¥³¡¼¥É¤ò½ñ¤¯¤È¤­¤Ë¤Ï¡¤¼«Ê¬¼«¿È¤Î¿ÍÀ¸¤ò³Ú¤Ë¤¹¤ë¤è¤¦¤Ë½ñ¤¤¤Æ¤è¤¤¡¥
\verb|dbind|¤ÎÅ¸³«·Á¤Ï¡¤2¸Ä¤Î´Ø¿ô\verb|destruc|¤È\verb|dbind-ex|¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ë¡¥
¶²¤é¤¯Á´¤Æ¤òÃ±°ì¥Ñ¥¹¤Ç¹Ô¤¦1¸Ä¤Î´Ø¿ô¤Ë¤³¤ì¤é¤ò¤Þ¤È¤á¤ë¤³¤È¤â¤Ç¤­¤ë¤À¤í¤¦¡¥
¤·¤«¤·¤É¤¦¤·¤Æ¤½¤ó¤Ê¤³¤È¤Ë¹´¤ë¤À¤í¤¦¤«¡©
2¸Ä¤ÎÊÌ¡¹¤Ê´Ø¿ô¤Ç¤¢¤ì¤Ð¡¤¥Æ¥¹¥È¤Ï´ÊÃ±¤À¡¥
¤É¤¦¤·¤Æ¤³¤ÎÍøÅÀ¤ò¡¤É¬Í×¤â¤Ê¤¤Â®ÅÙ¤È¸ò´¹¤Ë¤«¤±¤ë¤À¤í¤¦¤«¡©

1¸ÄÌÜ¤Î´Ø¿ô\verb|destruc|¤Ï¼Â¹Ô»þ¤Ë¥Ñ¥¿¡¼¥ó¤òÃµº÷¤·¡¤
³Æ¡¹¤ÎÊÑ¿ô¤òÂÐ±þ¤¹¤ë¥ª¥Ö¥¸¥§¥¯¥È¤Î°ÌÃÖ¤È´ØÏ¢¤Å¤±¤ë¡¥
\begin{verbatim}
> (destruc '(a b c) 'seq #'atom)
((A (ELT SEQ 0)) (B (ELT SEQ 1)) (C (ELT SEQ 2)))
\end{verbatim}
Âè3°ú¿ô¤Ï¥ª¥×¥·¥ç¥ó¤Î½Ò¸ì¤Ç¡¤¤½¤ì¤Ï¥Ñ¥¿¡¼¥ó¹½Â¤¤È¥Ñ¥¿¡¼¥ó¤ÎÆâÍÆ¤ò¶èÊÌ¤¹¤ë¤Î¤Ë»È¤ï¤ì¤ë¡¥

¥¢¥¯¥»¥¹¤ò¸úÎ¨Åª¤Ë¤¹¤ë¤¿¤á¡¤¿·¤·¤¤ÊÑ¿ô¡Êgensym¡Ë¤¬ÉôÊ¬¥·¡¼¥¯¥§¥ó¥¹¤½¤ì¤¾¤ì¤ËÂ«Çû¤µ¤ì¤ë¡¥
\begin{verbatim}
> (destruc '(a (b . c) &rest d) 'seq)
((A (ELT SEQ 0))
 ((#:G2 (ELT SEQ 1)) (B (ELT #:G2 0)) (C (SUBSEQ #:G2 1)))
 (D (SUBSEQ SEQ 2)))
\end{verbatim}

\verb|destruc|¤Î½ÐÎÏ¤Ï\verb|dbind-ex|¤ËÁ÷¤é¤ì¡¤¥Þ¥¯¥í¤ÎËÄÂç¤ÊÅ¸³«·Á¤¬À¸À®¤µ¤ì¤ë¡¥
¤½¤ì¤Ï\verb|destruc|¤ÎÀ¸À®¤·¤¿¥Ä¥ê¡¼¤òÆþ¤ì»Ò¤Ë¤Ê¤Ã¤¿´ö¤Ä¤«¤Î\verb|let|¤ËÊÑ·Á¤¹¤ë¡¥
\begin{verbatim}
> (dbind-ex (destruc '(a (b . c) &rest d) 'seq) '(body))
(LET ((A (ELT SEQ 0))
      (#:G4 (ELT SEQ 1))
      (D (SUBSEQ SEQ 2)))
  (LET ((B (ELT #:G4 0))
        (C (SUBSEQ #:G4 1)))
    (PROGN BODY)))
\end{verbatim}

\verb|dbind|¤Ï¡¤\verb|destructuring-bind|¤ÈÆ±ÍÍ¤Ë¡¤
Ãµ¤·¤Æ¤¤¤ë¥ê¥¹¥È¹½Â¤¤¬Á´¤Æ¸«¤Ä¤«¤ë¤â¤Î¤È²¾Äê¤·¤Æ¤¤¤ë¤³¤È¤ËÃí°Õ¤·¤è¤¦¡¥
ÂÐ±þ¤¹¤ë¼°¤Î¤Ê¤«¤Ã¤¿ÊÑ¿ô¤Ï¡¤\verb|multiple-value-bind|¤Î¤è¤¦¤Ë\verb|nil|¤Ë¤ÏÂ«Çû¤µ¤ì¤Ê¤¤¡¥
¼Â¹Ô»þ¤ËÍ¿¤¨¤é¤ì¤¿¥·¡¼¥¯¥§¥ó¥¹¤ËÍ½´ü¤µ¤ì¤¿Í×ÁÇ¤¬´ö¤Ä¤«¸«¤Ä¤«¤é¤Ê¤«¤Ã¤¿¤È¤­¤Ï¡¤
¹½Â¤²½ÂåÆþ¥ª¥Ú¥ì¡¼¥¿¤Ï¥¨¥é¡¼¤òÀ¸À®¤¹¤ë¡¥
\begin{verbatim}
> (dbind (a b c) (list 1 2))
>>Error: 2 is not a valid index for the sequence (1 2)
\end{verbatim}

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro with-matrix (pats ar &body body)
  (let ((gar (gensym)))
    `(let ((,gar ,ar))
       (let ,(let ((row -1))
               (mapcan
                 #'(lambda (pat)
                     (incf row)
                     (setq col -1)
                     (mapcar #'(lambda (p)
                                 `(,p (aref ,gar
                                            ,row
                                            ,(incf col))))
                             pat))
                 pats))
         ,@body))))

(defmacro with-array (pat ar &body body)
  (let ((gar (gensym)))
    `(let ((,gar ,ar))
       (let ,(mapcar #'(lambda (p)
                         `(,(car p) (aref ,gar ,@(cdr p))))
                     pat)
         ,@body))))
\end{FramedVerb}\end{center}
\caption{ÇÛÎó¤ËÂÐ¤¹¤ë¹½Â¤²½ÂåÆþ¡¥}
\label{fig:DestructuringOnArray}
\end{figure}

ÆâÉô¹½Â¤¤ò»ý¤Ä¥ª¥Ö¥¸¥§¥¯¥È¤ÏÂ¾¤Ë²¿¤¬¤¢¤ë¤À¤í¤¦¤«¡©
°ìÈÌ¤ÎÇÛÎó¤¬¤¢¤ë¡¥
¤³¤ì¤È¥ô¥§¥¯¥¿¤È¤Î°ã¤¤¤Ï¼¡¸µ¤¬1¤è¤êÂç¤­¤¤¤³¤È¤À¡¥
¹½Â¤²½ÂåÆþ¥Þ¥¯¥í¤òÇÛÎó¤ËÄêµÁ¤¹¤ë¤È¤·¤Æ¡¤¥Ñ¥¿¡¼¥ó¤ò¤É¤Î¤è¤¦¤Ë¤Ò¤ç¤¦¤²¤ó¤¹¤ì¤Ð¤è¤¤¤À¤í¤¦¡©
2¼¡¸µÇÛÎó¤ËÂÐ¤·¤Æ¤Ï¡¤¤ä¤Ï¤ê¥ê¥¹¥È¤ò»È¤¦¤Î¤¬¸úÎ¨Åª¤À¡¥
Âè\ref{fig:DestructuringOnArray}¿Þ¤Ë¤Ï¥Þ¥¯¥í\verb|with-matrix|¤ò¼¨¤·¤¿¡¥
¤³¤ì¤Ï2¼¡¸µÇÛÎó¤ËÂÐ¤·¤Æ¹½Â¤²½ÂåÆþ¤ò¹Ô¤¦¤¿¤á¤Î¤â¤Î¤À¡¥
\begin{verbatim}
> (setq ar (make-array '(3 3)))
#<Simple-Array T (3 3) C2D39E>
> (for (r 0 2)
    (for (c 0 2)
      (setf (aref ar r c) (+ (* r 10) c))))
NIL
> (with-matrix ((a b c)
                (d e f)
                (g h i)) ar
               (list a b c d e f g h i))
(0 1 2 10 11 12 20 21 22)
\end{verbatim}

Âç¤­¤¤ÇÛÎó¤ä3¼¡¸µ°Ê¾å¤ÎÇÛÎó¤ËÂÐ¤·¤Æ¤Ï¡¤°Û¤Ê¤Ã¤¿¥¢¥×¥í¡¼¥Á¤¬É¬Í×¤À¡¥
ÊÑ¿ô¤òÂç¤­¤¤ÇÛÎó¤ÎÍ×ÁÇ¤½¤ì¤¾¤ì¤ËÂ«Çû¤·¤¿¤¤¤³¤È¤Ï¤Þ¤º¤Ê¤¤¡¥
ÇÛÎó¤ÎÁÂÉ½¸½¤ò¹Ô¤¦¥Ñ¥¿¡¼¥ó¤òºî¤ëÊý¤¬¼ÂÍÑÅª¤À¤í¤¦¡¥
´ö¤Ä¤«¤ÎÍ×ÁÇ¤À¤±¤ËÂÐ±þ¤¹¤ëÊÑ¿ô¤È¡¤Í×ÁÇ¤òÁª¤Ö¤¿¤á¤ÎºÂÉ¸¤ò´Þ¤àÉ½¸½¤À¡¥
Âè\ref{fig:DestructuringOnArray}¿Þ¤Î2¸ÄÌÜ¤Î¥Þ¥¯¥í¤Ï¤³¤Î¸¶Â§¤Ë´ð¤Å¤¤¤Æºî¤é¤ì¤Æ¤¤¤ë¡¥
¾åµ­¤ÎÎã¤ÎÇÛÎó¤ÎÂÐ³ÑÀ®Ê¬¤òµá¤á¤ë¤Ë¤Ï¤³¤Î¤è¤¦¤Ë¤¹¤ë¡¥
\begin{verbatim}
> (with-array ((a 0 0) (d 1 1) (i 2 2)) ar
    (values a d i))
0 11 22
\end{verbatim}

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro with-struct ((name . fields) struct &body body)
  (let ((gs (gensym)))
    `(let ((,gs ,struct))
       (let ,(mapcar #'(lambda (f)
                         `(,f (,(symb name f) ,gs)))
                     fields)
         ,@body))))
\end{FramedVerb}\end{center}
\caption{¹½Â¤ÂÎ¤ËÂÐ¤¹¤ë¹½Â¤²½ÂåÆþ¡¥}
\label{fig:DestructuringOnStruc}
\end{figure}

¤³¤Î¥Þ¥¯¥í¤Ë¤è¤Ã¤Æ¡¤Í×ÁÇ¤¬°ìÄê¤Î½çÈÖ¤Ç¸½¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¥Ñ¥¿¡¼¥ó¤òÂ´¶È¤·¤Ä¤Ä¤¢¤ë¡¥
ÊÑ¿ô¤ò\verb|defstruct|¤ÇÄêµÁ¤µ¤ì¤¿¹½Â¤ÂÎ¤Î¥Õ¥£¡¼¥ë¥É¡ÊÌõÃí: ¥á¥ó¥Ð¤È¤â¡Ë¤ËÂ«Çû¤¹¤ë¤¿¤á¤Î¡¤
Îà»÷¤Î¥Þ¥¯¥í¤¬ºî¤ì¤ë¡¥
¤½¤Î¤è¤¦¤Ê¥Þ¥¯¥í¤òÂè\ref{fig:DestructuringOnStruc}¿Þ¤Ë¼¨¤·¤¿¡¥
¥Ñ¥¿¡¼¥ó¤ÎÂè1Í×ÁÇ¤Ï¹½Â¤ÂÎÌ¾¤Ë´ØÏ¢ÉÕ¤±¤é¤ì¤¿°ì¼ï¤ÎÀÜÆ¬¼­¤È¤·¤Æ¡¤»Ä¤ê¤Ï¥Õ¥£¡¼¥ë¥ÉÌ¾¤È¤·¤Æ°·¤ï¤ì¤ë¡¥
¥¢¥¯¥»¥¹¸Æ¤Ó½Ð¤·¤ò¹Ô¤¦¤¿¤á¡¤¤³¤Î¥Þ¥¯¥í¤Ï\verb|symb|¡Êlgw¥Ú¡¼¥¸¡Ë¤ò»È¤Ã¤Æ¤¤¤ë¡¥
\begin{verbatim}
> (defstruct visitor name title firm)
VISITOR
> (setq theo (make-visitor :name "Theodebert"
                           :title 'king
                           :firm 'franks))
#S(VISITOR NAME "Theodebert" TITLE KING FIRM FRANKS)
> (with-struct (visitor- name firm title) theo
    (list name firm title))
("Theodebert" FRANKS KING)
\end{verbatim}
%}}}
\subsection{»²¾È}   %{{{
CLOS¤Ï¥¤¥ó¥¹¥¿¥ó¥¹¤ËÂÐ¤·¤Æ¹½Â¤²½ÂåÆþ¤ò¹Ô¤¦¥Þ¥¯¥í¤òÄó¶¡¤¹¤ë¡¥
\verb|tree|¤¬3¸Ä¤Î¥¹¥í¥Ã¥È¡ÊÌõÃí: ¥¯¥é¥¹¤Î¥¤¥ó¥¹¥¿¥ó¥¹ÊÑ¿ô¤È¤â¡Ë\verb|species|¡¤
\verb|age|¤È\verb|height|¤ò»ý¤Ä¥¯¥é¥¹¤Ç¡¤\verb|my-tree|¤¬\verb|tree|¤Î¥¤¥ó¥¹¥¿¥ó¥¹¤À¤È¤·¤è¤¦¡¥
¼¡¤Î¼°¤ÎÃæ¤Ç¤Ï¡¤
\begin{verbatim}
(with-slots (species age height) my-tree
  ...)
\end{verbatim}
\verb|my-tree|¤Î¥¹¥í¥Ã¥È¤Ï¡¤¤¢¤¿¤«¤âÉáÄÌ¤ÎÊÑ¿ô¤Ç¤¢¤ë¤«¤Î¤è¤¦¤Ë»²¾È¤Ç¤­¤ë¡¥
\verb|with-slots|¤ÎËÜÂÎÆâ¤Ç¤Ï¡¤¥·¥ó¥Ü¥ë\verb|height|¤Ï¥¹¥í¥Ã¥È\verb|height|¤ò»²¾È¤¹¤ë¡¥
¤½¤³¤ËÊÝ»ý¤µ¤ì¤¿ÃÍ¤ËÂ«Çû¤µ¤ì¤¿¤È¤¤¤¦¤À¤±¤Ç¤Ê¤¯¥¹¥í¥Ã¥È¤½¤Î¤â¤Î¤ò»²¾È¤¹¤ë¤Î¤Ç¡¤
¼¡¤Î¤è¤¦¤Ë½ñ¤¯¤È¡¤
\begin{verbatim}
(setq height 72)
\end{verbatim}
\verb|my-tree|¤Î¥¹¥í¥Ã¥È\verb|height|¤Ë¤Ï72¤È¤¤¤¦ÃÍ¤¬Í¿¤¨¤é¤ì¤ë¡¥
¤³¤Î¥Þ¥¯¥í¤Ï\verb|height|¤ò¥¹¥í¥Ã¥È¤Î»²¾È¤ËÅ¸³«¤µ¤ì¤ë¥·¥ó¥Ü¥ë¡¦¥Þ¥¯¥í¡ÊÂè7.11Àá¡Ë¤È¤·¤Æ
ÄêµÁ¤¹¤ë¤³¤È¤Çµ¡Ç½¤·¤Æ¤¤¤ë¡¥
¼ÂºÝ¡¤\verb|symbol-macrolet|¤¬Common Lisp¤ËÄÉ²Ã¤µ¤ì¤¿¤Î¤Ï
\verb|with-slots|Åù¤Î¥Þ¥¯¥í¤ò¼Â¸½¤¹¤ë¤¿¤á¤À¡¥

\verb|with-slots|¤¬ËÜÅö¤Î¹½Â¤²½ÂåÆþ¥Þ¥¯¥í¤Ç¤¢¤í¤¦¤È¤Ê¤«¤í¤¦¤È¡¤
¼ÂÍÑÅª¤Ë¤Ï\verb|destructuring-bind|¤ÈÆ±¤¸Ìò³ä¤ò»ý¤Ä¡¥
¸ÅÅµÅª¤Ê¹½Â¤²½ÂåÆþ¤¬ÃÍÅÏ¤·¤Ç¤¢¤ë¤Î¤ËÂÐ¤·¡¤¤³¤Î¼ï¤Î¤â¤Î¤Ï»²¾ÈÅÏ¤·¤À¡¥
¤½¤ì¤ò²¿¤È¸Æ¤Ö¤Ë¤·¤Æ¤â¡¤ÊØÍø¤Ê¤Î¤Ï´Ö°ã¤¤¤Ê¤µ¤½¤¦¤À¡¥
Æ±¤¸¸¶Â§¤Ë´ð¤Å¤¤¤Æ¡¤¤É¤ó¤Ê¥Þ¥¯¥í¤¬Â¾¤ËÄêµÁ¤Ç¤­¤ë¤À¤í¤¦¤«¡©

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro with-places (pat seq &body body)
  (let ((gseq (gensym)))
    `(let ((,gseq ,seq))
       ,(wplac-ex (destruc pat gseq #'atom) body))))

(defun wplac-ex (binds body)
  (if (null binds)
      `(progn ,@body)
      `(symbol-macrolet ,(mapcar #'(lambda (b)
                                     (if (consp (car b))
                                         (car b)
                                         b))
                                 binds)
                        ,(wplac-ex (mapcan #'(lambda (b)
                                               (if (consp (car b))
                                                   (cdr b)))
                                           binds)
                                   body))))
\end{FramedVerb}\end{center}
\caption{¥·¡¼¥¯¥§¥ó¥¹¤ËÂÐ¤¹¤ë¹½Â¤²½ÂåÆþ¤Î»²¾ÈÅÏ¤·ÈÇ¡¥}
\label{fig:RefDestructuringOnSeq}
\end{figure}
\begin{verbatim}
\end{verbatim}

Ç¤°Õ¤Î¹½Â¤²½ÂåÆþ¥Þ¥¯¥í¤Î»²¾ÈÅÏ¤·ÈÇ¤¬¡¤
\verb|let|¤Ç¤Ê¤¯\verb|symbol-macrolet|¤ËÅ¸³«¤¹¤ë¤è¤¦¤Ë¤¹¤ë¤³¤È¤ÇÄêµÁ¤Ç¤­¤ë¡¥
Âè\ref{fig:RefDestructuringOnSeq}¿Þ¤Ë¤Ï¡¤
\verb|dbind|¤ò\verb|with-slots|¤Î¤è¤¦¤Ë¿¶¤ëÉñ¤¦¤è¤¦¤Ë½¤Àµ¤·¤¿¤â¤Î¤ò¼¨¤·¤¿¡¥
\verb|with-places|¤Ï¡¤\verb|dbind|¤ò»È¤¦¤Î¤ÈÆ±¤¸¤è¤¦¤Ë»È¤¨¤ë¡¥
\begin{verbatim}
> (with-places (a b c) #(1 2 3)
    (list a b c))
(1 2 3)
\end{verbatim}

¤·¤«¤·¤³¤Î¿·¥Þ¥¯¥í¤ò»È¤¦¤È¡¤\verb|with-slots|¤Ç¹Ô¤¦¤Î¤ÈÆ±ÍÍ¤Ë¡¤
¥·¡¼¥¯¥§¥ó¥¹Æâ¤Î¤¢¤ë°ÌÃÖ¤Ë\verb|setf|¤òÅ¬ÍÑ¤¹¤ë¤³¤È¤â¤Ç¤­¤ë¡¥
\begin{verbatim}
> (let ((lst '(1 (2 3) 4)))
    (with-places (a (b . c) d) lst
      (setf a 'uno)
      (setf c '(tre)))
    lst)
(UNO (2 TRE) 4)
\end{verbatim}
¤³¤³¤Ç¤Ï\verb|with-slots|¤Î¾ì¹ç¤ÈÆ±ÍÍ¡¤ÊÑ¿ô¤Ï¹½Â¤ÂÎ¤ÎÂÐ±þ¤¹¤ë¾ì½ê¤ò»²¾È¤·¤Æ¤¤¤ë¡¥
¤·¤«¤·Â¾¤Ë¤â½ÅÍ×¤Ê°ã¤¤¤¬¤¢¤ë¡¥
¤½¤ì¤é¤Îµ¿»÷ÊÑ¿ô¤ËÃÍ¤òÀßÄê¤¹¤ë¤Ë¤Ï\verb|setq|¤Ç¤Ê¤¯\verb|setf|¤ò»È¤ï¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¥Þ¥¯¥í\verb|with-slots|¤ÏËÜÂÎÆâ¤Ç»È¤ï¤ì¤¿\verb|setq|¤ò\verb|setf|¤ËÃÖ¤­´¹¤¨¤ë¤¿¤á¤Ë
\verb|code-walker|¡Êrcx¥Ú¡¼¥¸¡Ë¤ò¸Æ¤Ó½Ð¤µ¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤³¤³¤Ç\verb|code-walker|¤ò½ñ¤¤¤Æ¤â¡¤¥³¡¼¥ÉÎÌ¤Î³ä¤Ë²þÁ±ÅÀ¤Ï¾®¤µ¤¯¤Ê¤Ã¤Æ¤·¤Þ¤¦¡¥

\verb|with-places|¤¬\verb|dbind|¤è¤ê°ìÈÌÅª¤À¤È¸À¤¦¤Ê¤é¡¤¤É¤¦¤·¤Æ¤½¤Á¤é¤ò¾ï¤Ë»È¤ï¤Ê¤¤¤Î¤À¤í¤¦¤«¡©
\verb|dbind|¤ÏÊÑ¿ô¤òÃÍ¤ËÂ«Çû¤¹¤ë¤¬¡¤
\verb|with-places|¤ÏÊÑ¿ô¤ò¡¤ÃÍ¤ò¸«¤Ä¤±¤ë¤¿¤á¤Î°ìÏ¢¤Î»Ø¼¨¤Ë´ØÏ¢ÉÕ¤±¤ë¡¥
»²¾È¤ÎÅÙ¤Ë¸¡º÷¤¬É¬Í×¤Ë¤Ê¤ë¡¥
\verb|dbind|¤¬ÊÑ¿ô\verb|c|¤ò\verb|(elt x 2)|¤ÎÃÍ¤ËÂ«Çû¤¹¤ë½ê¤ò¡¤
\verb|with-places|¤Ï\verb|c|¤ò\verb|(elt x 2)|¤ËÅ¸³«¤µ¤ì¤ë¥·¥ó¥Ü¥ë¡¦¥Þ¥¯¥í¤Ë¤¹¤ë¡¥
¤À¤«¤é\verb|c|¤¬ËÜÂÎÆâ¤Ç$n$²óÉ¾²Á¤µ¤ì¤ë¤È¤­¤Ï¡¤\verb|elt|¤Î¸Æ¤Ó½Ð¤·¤ò$n$²óÈ¼¤¦¡¥
¹½Â¤²½ÂåÆþ¤Çºî¤é¤ì¤¿ÊÑ¿ô¤ËËÜÅö¤Ë\verb|setf|¤ò»È¤¤¤¿¤¤¤È¤­¤Ç¤Ê¤±¤ì¤Ð¡¤
\verb|dbind|¤ÎÊý¤¬Â®¤¤¤À¤í¤¦¡¥

\verb|with-places|¤ÎÄêµÁ¤Ï\verb|dbind|¤ÎÄêµÁ¡ÊÂè\ref{fig:GeneralSeqDestructuringOp}¤È
¤ï¤º¤«¤Ë°Û¤Ê¤ë¤À¤±¤À¡¥
\verb|wplac-ex|¡Ê\verb|dbind-ex|¤Î²þÎÉÈÇ¡Ë¤ÎÃæ¤Ç¤Ï\verb|let|¤Ï\verb|symbol-macrolet|¤ËÊÑ¤ï¤Ã¤Æ¤¤¤ë¡¥
»÷¤¿¤è¤¦¤ÊÊÑ¹¹¤Ë¤è¤Ã¤Æ¡¤Ç¤°Õ¤ÎÉáÄÌ¤Î¹½Â¤²½ÂåÆþ¥Þ¥¯¥í¤Î»²¾ÈÅÏ¤·ÈÇ¤òºî¤ì¤ë¡¥
%}}}
\subsection{¥Þ¥Ã¥Á¥ó¥°}   %{{{
¹½Â¤²½ÂåÆþ¤¬ÂåÆþ¤Î°ìÈÌ²½¤Ç¤¢¤ë¤Î¤ÈÆ±ÍÍ¡¤¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¥ó¥°¤Ï¹½Â¤²½ÂåÆþ¤Î°ìÈÌ²½¤À¡¥
¡Ö¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¥ó¥°¡×¤È¤¤¤¦¸ÀÍÕ¤Ë¤Ï´ö¤Ä¤â°ÕÌ£¤¬¤¢¤ë¡¥
¤³¤³¤Ç¤ÎÊ¸Ì®¤Ç¤Ï¡¤¤½¤ì¤Ï¡Ê¤È¤­¤Ë¤ÏÊÑ¿ô¤ò´Þ¤à¡Ë2¤Ä¤Î¹½Â¤¤òÈæ³Ó¤·¡¤
¤½¤ì¤é¤òÆ±°ì¤Ë¤¹¤ë¤è¤¦¤ÊÊÑ¿ô¤Ø¤ÎÃÍ¤ÎÂåÆþÊýË¡¤¬¤Ê¤¤¤«¤É¤¦¤«Ä´¤Ù¤ë¤³¤È¤À¡¥
Îã¤¨¤Ð\verb|?x|¤È\verb|?y|¤¬ÊÑ¿ô¤Ê¤é¤Ð¡¤
¼¡¤Î2¤Ä¤Î¥ê¥¹¥È¤Ï$\verb|?x| = \verb|a|$¤«¤Ä$\verb|?y| = \verb|b|$¤Î¤È¤­¤Ë¥Þ¥Ã¥Á¤¹¤ë¡¥
\begin{verbatim}
   (p ?x ?y c ?x)
   (p a b c a)
\end{verbatim}
¤Þ¤¿¼¡¤Î¥ê¥¹¥È¤Ï$\verb|?x| = \verb|?y| = \verb|c|$¤Î¤È¤­¤Ë¥Þ¥Ã¥Á¤¹¤ë¡¥
\begin{verbatim}
   (p ?x b ?y a)
   (p ?y b c a)
\end{verbatim}

³°Éô¤È¥á¥Ã¥»¡¼¥¸¤ò¤ä¤ê¤È¤ê¤¹¤ë¤³¤È¤ÇÆ°ºî¤¹¤ë¥×¥í¥°¥é¥à¤ò¹Í¤¨¤è¤¦¡¥
¥á¥Ã¥»¡¼¥¸¤ËÈ¿±þ¤¹¤ë¤Ë¤Ï¡¤¤½¤Î¥á¥Ã¥»¡¼¥¸¤¬¤É¤Î¼ïÎà¤Î¤â¤Î¤«È½ÊÌ¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤º¡¤
¤Þ¤¿¤½¤Î¥á¥Ã¥»¡¼¥¸¤ÎÆâÍÆ¤òÃê½Ð¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¥Þ¥Ã¥Á¥ó¥°¡¦¥ª¥Ú¥ì¡¼¥¿¤ò»È¤¦¤È¡¤2¤Ä¤ÎÃÊ³¬¤òÁÈ¤ß¹ç¤ï¤»¤é¤ì¤ë¡¥

¤½¤Î¤è¤¦¤Ê¥ª¥Ú¥ì¡¼¥¿¤ò½ñ¤±¤ë¤è¤¦¤Ë¤¹¤ë¤Ë¤Ï¡¤ÊÑ¿ô¤òÂ¾¤«¤é¶èÊÌ¤¹¤ëÊýË¡¤¬É¬Í×¤Ë¤Ê¤ë¡¥
¥·¥ó¥Ü¥ë¤Ï¤ß¤ÊÊÑ¿ô¤À¤Ê¤É¤È¸À¤¦¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡¥
¥·¥ó¥Ü¥ë¤Ë¤Ï°ú¿ô¤È¤·¤Æ¥Ñ¥¿¡¼¥óÆâ¤Ë¸½¤ì¤Æ¤Û¤·¤¤¤«¤é¤À¡¥
¤³¤³¤Ç¤Ï¥Ñ¥¿¡¼¥óÊÑ¿ô¤Ï¥¯¥¨¥¹¥Á¥ç¥ó¥Þ¡¼¥¯¤Ç»Ï¤Þ¤ëÊÑ¿ô¤È¤·¤è¤¦¡¥
¤½¤ì¤ÇÉÔÊØ¤Ê¤³¤È¤¬¤¢¤Ã¤¿¤é¡¤½Ò¸ì\verb|var?|¤òºÆÄêµÁ¤¹¤ë¤À¤±¤Ç¤½¤Î·è¤Þ¤ê¤òÊÑ¹¹¤Ç¤­¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defun match (x y &optional binds)
  (acond2
    ((or (eql x y) (eql x '_) (eql y '_)) (values binds t))
    ((binding x binds) (match it y binds))
    ((binding y binds) (match x it binds))
    ((varsym? x) (values (cons (cons x y) binds) t))
    ((varsym? y) (values (cons (cons y x) binds) t))
    ((and (consp x) (consp y) (match (car x) (car y) binds))
     (match (cdr x) (cdr y) it))
    (t (values nil nil))))

(defun varsym? (x)
  (and (symbolp x) (eq (char (symbol-name x) 0) #\?)))

(defun binding (x binds)
  (labels ((recbind (x binds)
                    (aif (assoc x binds)
                         (or (recbind (cdr it) binds)
                             it))))
    (let ((b (recbind x binds)))
      (values (cdr b) b))))
\end{FramedVerb}\end{center}
\caption{¥Þ¥Ã¥Á¥ó¥°´Ø¿ô¡¥}
\label{fig:MatchingFunc}
\end{figure}

Âè\ref{fig:MatchingFunc}¿Þ¤Ë¤Ï¡¤´ö¤Ä¤«¤ÎLispÆþÌç½ñ¤Ë½Ð¤ÆÍè¤ë¤Î¤È»÷¤¿¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¥ó¥°´Ø¿ô¤ò¼¨¤·¤¿¡¥
\verb|match|¤Ë¤Ï2¤Ä¤Î¥ê¥¹¥È¤òÍ¿¤¨¤ë¡¥
¤½¤ì¤é¤¬¥Þ¥Ã¥Á¤¹¤ë¤è¤¦¤Ë¤Ç¤­¤ë¤Ê¤é¤Ð¡¤¤½¤Î¥Þ¥Ã¥Á¤ò¼Â¸½¤¹¤ë¥ê¥¹¥È¤¬ÊÖ¤µ¤ì¤ë¡¥
\begin{verbatim}
> (match '(p a b c a) '(p ?x ?y c ?x))
((?Y . B) (?X . A))
T
> (match '(p ?x b ?y a) '(p ?y b c a))
((?Y . C) (?X . ?Y))
T> (match '(a b c) '(a a a))
NIL
NIL
\end{verbatim}

\verb|match|¤Ï°ú¿ô¤òÍ×ÁÇËè¤ËÈæ³Ó¤·¤Ä¤Ä¡¤
Â«Çû¤È¸Æ¤Ð¤ì¤ë¡¤ÊÑ¿ô¤Ø¤ÎÃÍ¤Î´ØÏ¢ÉÕ¤±¤òÀ¸À®¤·¡¤ÊÑ¿ô\verb|binds|¤ÎÃæ¤ËÊÝ»ý¤¹¤ë¡¥
\verb|match|¤Ï¥Þ¥Ã¥Á¤ËÀ®¸ù¤¹¤ë¤ÈÀ¸À®¤µ¤ì¤¿Â«Çû¤òÊÖ¤·¡¤¼ºÇÔ¤¹¤ë¤È\verb|nil|¤òÊÖ¤¹¡¥
¥Þ¥Ã¥Á¤¬À®¸ù¤·¤Æ¤âÉ¬¤º¤·¤âÂ«Çû¤¬À¸À®¤µ¤ì¤ëÌõ¤Ç¤Ï¤Ê¤¤¤Î¤Ç¡¤
\verb|match|¤Ï\verb|gethash|¤ÈÆ±ÍÍ¤ËÂè2ÊÖ¤êÃÍ¤Ç¥Þ¥Ã¥Á¤ËÀ®¸ù¤·¤¿¤«¤É¤¦¤«¤òÉ½¤¹¡¥
\begin{verbatim}
> (match '(p ?x) '(p ?x))
NIL
T
\end{verbatim}
\verb|match|¤¬¾å¤Î¤è¤¦¤Ë\verb|nil|¤È\verb|t|¤òÊÖ¤·¤¿¤È¤­¤Ï¡¤
¥Þ¥Ã¥Á¤ËÀ®¸ù¤·¤¿¤¬Â«Çû¤Ïºî¤é¤ì¤Ê¤«¤Ã¤¿¤³¤È¤ò¼¨¤¹¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro if-match (pat seq then &optional else)
  `(aif2 (match ',pat ,seq)
         (let ,(mapcar #'(lambda (v)
                           `(,v (binding ',v it)))
                       (vars-in then #'atom))
           ,then)
         ,else))

(defun vars-in (expr &optional (atom? #'atom))
  (if (funcall atom? expr)
      (if (var? expr) (list expr))
      (union (vars-in (car expr) atom?)
             (vars-in (cdr expr) atom?))))

(defun var? (x)
  (and (symbolp x) (eq (char (symbol-name x) 0) #\?)))
\end{FramedVerb}\end{center}
\caption{ÃÙ¤¤¥Þ¥Ã¥Á¥ó¥°¥ª¥Ú¥ì¡¼¥¿}
\label{fig:SlowMatchingOp}
\end{figure}

Prolog¤ÈÆ±ÍÍ¡¤\verb|match|¤Ï\,\verb|_|\,¡Ê²¼Àþ¡Ë¤ò¥ï¥¤¥ë¥É¥«¡¼¥É¤È¤·¤Æ°·¤¦¡¥
¤³¤ì¤ÏÁ´¤Æ¤Ë¥Þ¥Ã¥Á¤·¡¤Â«Çû¤Ë¤Ï±Æ¶Á¤·¤Ê¤¤¡¥
\begin{verbatim}
> (match '(a ?x b) '(_ 1 _))
((?X . 1))
T
\end{verbatim}

\verb|match|¤¬¤¢¤ì¤Ð¡¤¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¥ó¥°¤ò¹Ô¤¦\verb|dbind|¤ò½ñ¤¯¤Î¤ÏÍÆ°×¤À¡¥
Âè\ref{fig:SlowMatchingOp}¿Þ¤Ë¤Ï\verb|if-match|¤È¤¤¤¦¥Þ¥¯¥í¤ò¼¨¤·¤¿¡¥
\verb|dbind|¤ÈÆ±ÍÍ¡¤Âè1¡¤Âè2°ú¿ô¤Ï¥Ñ¥¿¡¼¥ó¤È¥·¡¼¥¯¥§¥ó¥¹¤Ç¡¤
¥Ñ¥¿¡¼¥ó¤ò¥·¡¼¥¯¥§¥ó¥¹¤ÈÈæ³Ó¤¹¤ë¤³¤È¤ÇÂ«Çû¤¬À¸À®¤µ¤ì¤ë¡¥
¤·¤«¤·ËÜÂÎ¤ÎÂå¤ï¤ê¤Ë°ú¿ô¤¬¤µ¤é¤Ë2¤Ä¤¢¤ë¡¥
\verb|match|¤¬¥Þ¥Ã¥Á¥ó¥°¤ËÀ®¸ù¤·¤¿¤È¤­¡¤¤½¤³¤Çºî¤é¤ì¤¿Â«Çû¤Î²¼¤ÇÉ¾²Á¤µ¤ì¤ëthenÀá¤È¡¤
¥Þ¥Ã¥Á¥ó¥°¤Ë¼ºÇÔ¤·¤¿¤È¤­¤ËÉ¾²Á¤µ¤ì¤ëelseÀá¤À¡¥
¼¡¤Ë\verb|if-match|¤ò»È¤Ã¤¿´ÊÃ±¤Ê´Ø¿ô¤ò¼¨¤¹¡¥
\begin{verbatim}
(defun abab (seq)
  (if-match (?x ?y ?x ?y) seq
            (values ?x ?y)
            nil))
\end{verbatim}
¥Þ¥Ã¥Á¤ËÀ®¸ù¤¹¤ë¤È¡¤\verb|?x|¤È\verb|?y|¤ËÂÐ±þ¤¹¤ëÃÍ¤¬Äê¤á¤é¤ì¡¤ÊÖ¤êÃÍ¤Ë¤Ê¤ë¡¥
\begin{verbatim}
> (abab '(hi ho hi ho))
HI
HO
\end{verbatim}

´Ø¿ô\verb|vars-in|¤Ï¥Ñ¥¿¡¼¥óÆâ¤ÎÁ´¤Æ¤Î¥Ñ¥¿¡¼¥óÊÑ¿ô¤òÊÖ¤¹¡¥
¤³¤ì¤Ï\verb|var?|¤ò¸Æ¤ó¤ÇÊÑ¿ô¤«¤É¤¦¤«¤ÎÈ½ÃÇ¤ò¹Ô¤Ã¤Æ¤¤¤ë¡¥
¤³¤Î»þÅÀ¤Ç¤Ï\verb|var?|¤Ï\verb|varsym?|¡ÊÂè\ref{fig:MatchingFunc}¿Þ¡Ë¤ÈÆ±°ì¤Î´Ø¿ô¤À¡¥
¤³¤ì¤ÏÂ«Çû¥ê¥¹¥ÈÆâ¤ÎÊÑ¿ô¤òÈ½ÊÌ¤¹¤ë¤Î¤Ë»È¤ï¤ì¤ë¡¥
2¤Ä¤Î´Ø¿ô¤ò¸ÄÊÌ¤ËÍÑ°Õ¤·¤¿¤Î¤Ï¡¤ 2¼ïÎà¤ÎÊÑ¿ô¤Ë°Û¤Ê¤Ã¤¿É½¸½¤ò»È¤¤¤¿¤¯¤Ê¤Ã¤¿¤È¤­¤Î¤¿¤á¤À¡¥

Âè\ref{fig:SlowMatchingOp}¿Þ¤ò¸«¤ë¤È¡¤\verb|if-match|¤ÏÃ»¤¤¤¬¡¤Í¾¤ê¸úÎ¨¤¬¤è¤¯¤Ê¤¤¡¥
½èÍý¤ò¼Â¹Ô»þ¤Ë¹Ô¤¤²á¤®¤ë¡¥
Âè1¤Î¥·¡¼¥¯¥§¥ó¥¹¤¬¥³¥ó¥Ñ¥¤¥ë»þ¤ËÊ¬¤«¤Ã¤Æ¤¤¤ë¤È¤­¤Ç¤¹¤é¡¤
Î¾Êý¤Î¥·¡¼¥¯¥§¥ó¥¹¤ò¼Â¹Ô»þ¤ËÃµº÷¤¹¤ë¤è¤¦¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥
¤µ¤é¤Ë¤¤¤±¤Ê¤¤¤Î¤¬¡¤
¥Þ¥Ã¥Á¥ó¥°¤Î²áÄø¤ÇÊÑ¿ôÂ«Çû¤òÊÝ»ý¤¹¤ë¤¿¤á¤Ë¥ê¥¹¥È¤ò°ì¡¹¥³¥ó¥·¥ó¥°¤·¤Æ¤¤¤ëÅÀ¤À¡¥
¥³¥ó¥Ñ¥¤¥ë»þ¤ËÃÎ¤é¤ì¤Æ¤¤¤ë¾ðÊó¤ò³èÍÑ¤·¤Æ\verb|if-match|¤Î¿·ÈÇ¤ò½ñ¤±¤Ð¡¤
ÉÔÉ¬Í×¤ÊÈæ³Ó¤ò¹Ô¤ï¤º¡¤Á´¤¯¥³¥ó¥·¥ó¥°¤·¤Ê¤¤¤è¤¦¤Ë¤Ç¤­¤ë¡¥

¥·¡¼¥¯¥§¥ó¥¹¤ÎÊÒÊý¤¬¥³¥ó¥Ñ¥¤¥ë»þ¤ËÃÎ¤é¤ì¤Æ¤ª¤ê¡¤¤½¤Á¤é¤À¤±¤¬ÊÑ¿ô¤ò´Þ¤à¤È¤­¤Ï¡¤ÊÌ¤Î¤ä¤êÊý¤Ç¹Ô¤±¤ë¡¥
\verb|match|¤ò¸Æ¤Ó½Ð¤¹¤È¤­¤Ï¡¤¤É¤Á¤é¤Î°ú¿ô¤¬ÊÑ¿ô¤ò´Þ¤ó¤Ç¤â¤è¤¤¤³¤È¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥
ÊÑ¿ô¤ò\verb|if-match|¤ÎÂè1°ú¿ô¤Î¤ß¤ËÀ©¸Â¤¹¤ë¤³¤È¤Ç¡¤
¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¤É¤ÎÊÑ¿ô¤¬¥Þ¥Ã¥Á¥ó¥°¤Ë´Ø¤ï¤ë¤«¤òÈ½Äê¤Ç¤­¤ë¡¥
¤¹¤ë¤ÈÊÑ¿ôÂ«Çû¤Î¥ê¥¹¥È¤òºî¤é¤º¤Ë¡¤ÊÑ¿ô¤ÎÃÍ¤òÊÑ¿ô¤½¤Î¤â¤Î¤ÎÃæ¤ËÊÝ»ý¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro if-match (pat seq then &optional else)
  `(let ,(mapcar #'(lambda (v) `(,v ',(gensym)))
                 (vars-in pat #'simple?))
     (pat-match ,pat ,seq ,then ,else)))

(defmacro pat-match (pat seq then else)
  (if (simple? pat)
      (match1 `((,pat ,seq)) then else)
      (with-gensyms (gseq gelse)
                    `(labels ((,gelse () ,else))
                       ,(gen-match (cons (list gseq seq)
                                         (destruc pat gseq #'simple?))
                                   then
                                   `(,gelse))))))

(defun simple? (x) (or (atom x) (eq (car x) 'quote)))

(defun gen-match (refs then else)
  (if (null refs)
      then
      (let ((then (gen-match (cdr refs) then else)))
        (if (simple? (caar refs))
            (match1 refs then else)
            (gen-match (car refs) then else)))))

(defun match1 (refs then else)
  (dbind ((pat expr) . rest) refs
         (cond ((gensym? pat)
                `(let ((,pat ,expr))
                   (if (and (typep ,pat 'sequence)
                            ,(length-test pat rest))
                       ,then
                       ,else)))
               ((eq pat '_) then)
               ((var? pat)
                (let ((ge (gensym)))
                  `(let ((,ge ,expr))
                     (if (or (gensym? ,pat) (equal ,pat ,ge))
                         (let ((,pat ,ge)) ,then)
                         ,else))))
               (t `(if (equal ,pat ,expr) ,then ,else)))))

(defun gensym? (s)
  (and (symbolp s) (not (symbol-package s))))

(defun length-test (pat rest)
  (let ((fin (caadar (last rest))))
    (if (or (consp fin) (eq fin 'elt))
        `(= (length ,pat) ,(length rest))
        `(> (length ,pat) ,(- (length rest) 2)))))
\end{FramedVerb}\end{center}
\caption{¹âÂ®¥Þ¥Ã¥Á¥ó¥°¡¦¥ª¥Ú¥ì¡¼¥¿¡¥}
\label{fig:FastMatchOp}
\end{figure}

\verb|if-match|¤Î¿·ÈÇ¤ÏÂè\ref{fig:FastMatchOp}¿Þ¤Ë¼¨¤·¤¿¡¥
¤É¤Î¥³¡¼¥É¤¬¼Â¹Ô»þ¤ËÉ¾²Á¤µ¤ì¤ë¤«Í½Â¬¤¬¤Ä¤¯¤È¤­¤Ï¡¤¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¥³¡¼¥É¤òÀ¸À®¤Ç¤­¤ë¡¥
¤³¤³¤Ç¤Ï\verb|match|¤Î¸Æ¤Ó½Ð¤·¤ØÅ¸³«¤µ¤»¤ëÂå¤ï¤ê¤Ë¡¤É¬Í×¤ÊÈæ³Ó¤À¤±¤ò¹Ô¤¦¥³¡¼¥É¤òÀ¸À®¤¹¤ë¤³¤È¤Ë¤¹¤ë¡¥

ÊÑ¿ô\verb|?x|¤ò»È¤Ã¤Æ\verb|?x|¤ÎÂ«Çû¤òÊÝ»ý¤¹¤ë¤Ä¤â¤ê¤Ê¤é¡¤
¤Þ¤À¥Þ¥Ã¥Á¥ó¥°¤Ë¤è¤Ã¤ÆÂ«Çû¤¬·èÄê¤µ¤ì¤Æ¤¤¤Ê¤¤ÊÑ¿ô¤ò¤É¤Î¤è¤¦¤ËÉ½¸½¤¹¤ì¤Ð¤è¤¤¤À¤í¤¦¤«¡©
¤³¤³¤Ç¤Ï¥Ñ¥¿¡¼¥óÊÑ¿ô¤¬gensym¤ËÂ«Çû¤µ¤ì¤Æ¤¤¤ë¤È¤­¤ËÌ¤Â«Çû¤òÉ½¤¹¤³¤È¤Ë¤¹¤ë¡¥
¤è¤Ã¤Æ\verb|if-match|¤Ï¡¤¥Ñ¥¿¡¼¥óÆâ¤ÎÊÑ¿ô¤òÁ´¤Ægensym¤ËÂ«Çû¤¹¤ë¥³¡¼¥É¤ÎÀ¸À®¤«¤é»Ï¤Þ¤ë¡¥
¤³¤Î¾ì¹ç\verb|with-gensyms|¤Ø¤ÈÅ¸³«¤»¤º¤Ë¡¤¥³¥ó¥Ñ¥¤¥ë»þ¤Ë°ìÅÙ¤Ëgensym¤òÀ¸À®¤·¤Æ¡¤
Å¸³«·ÁÆâ¤ËÄ¾ÀÜÁÞÆþ¤·¤Æ¤âÂç¾æÉ×¤À¡¥

Å¸³«·Á¤Î»Ä¤ê¤Ï\verb|pat-match|¤¬À¸À®¤¹¤ë¡¥
¤³¤Î¥Þ¥¯¥í¤Ï\verb|if-match|¤ÈÆ±¤¸°ú¿ô¤ò¼è¤ë¡¥
Í£°ì¤Î°ã¤¤¤Ï¡¤¤³¤Á¤é¤Ï¥Ñ¥¿¡¼¥óÊÑ¿ô¤Ë¤Ï¿·¤·¤¤Â«Çû¤òÀß¤±¤Ê¤¤ÅÀ¤À¡¥
¾õ¶·¤Ë¤è¤Ã¤Æ¤Ï¤³¤ÎÊý¤¬ÅÔ¹ç¤¬¤è¤¤¡¥
¤Þ¤¿Âè19¾Ï¤Ç¤Ï\verb|pat-match|¤Ê¤é¤Ç¤Ï¤ÎÍÑË¡¤¬½Ð¤ÆÍè¤ë¡¥

¿·¥Þ¥Ã¥Á¥ó¥°¥ª¥Ú¥ì¡¼¥¿¤Ç¤Ï¡¤
¥Ñ¥¿¡¼¥ó¤ÎÃæ¿È¤È¥Ñ¥¿¡¼¥ó¤Î¹½Â¤¤È¤Î¶èÊÌ¤Ï´Ø¿ô\verb|simple?|¤Ë¤è¤Ã¤ÆÄêµÁ¤µ¤ì¤ë¡¥
¥Ñ¥¿¡¼¥óÆâ¤Ë¥¯¥©¡¼¥È¤µ¤ì¤¿¥ê¥Æ¥é¥ë¤ò»È¤¨¤ë¤è¤¦¤Ë¤·¤¿¤¤¤Ê¤é¡¤
¹½Â¤²½ÂåÆþ¤ò¹Ô¤¦¥³¡¼¥É¡ÊµÚ¤Ó\verb|vars-in|¡Ë¤Ï¡¤
Âè1Í×ÁÇ¤¬¥¯¥©¡¼¥È¤Ç¤¢¤ë¥ê¥¹¥È¤ÎÃæ¤Ë¤Ï¿Ê¤Þ¤Ê¤¤¤è¤¦¤Ë»Ø¼¨¤µ¤ì¤Ê¤¯¤Æ¤Ï¤Ê¤é¤Ê¤¤¡¥
¿·¥Þ¥Ã¥Á¥ó¥°¡¦¥ª¥Ú¥ì¡¼¥¿¤Ç¤Ï¡¤Ã±¤Ë¥ê¥¹¥È¤ò¥¯¥©¡¼¥È¤¹¤ë¤À¤±¤Ç¥Ñ¥¿¡¼¥ó¤ÎÍ×ÁÇ¤È¤·¤Æ»È¤¨¤ë¡¥

\verb|dbind|¤ÈÆ±ÍÍ¡¤\verb|pat-match|¤Ï\verb|destruc|¤ò¸Æ¤ó¤Ç¡¤
¼Â¹Ô»þ¤Ë°ú¿ô¤òÀÚ¤êÊ¬¤±¤Æ¤¯¤ì¤ë´Ø¿ô¸Æ¤Ó½Ð¤·¤Î¥ê¥¹¥È¤òÆÀ¤Æ¤¤¤ë¡¥
¤³¤Î¥ê¥¹¥È¤Ï¡¤¥Í¥¹¥È¤·¤¿¥Ñ¥¿¡¼¥óÍÑ¤Î¥Þ¥Ã¥Á¥ó¥°¥³¡¼¥É¤òºÆµ¢Åª¤ËÀ¸À®¤¹¤ë\verb|gen-match|¤ËÅÏ¤µ¤ì¡¤
¼¡¤Ë¡¤¥Ñ¥¿¡¼¥ó¤Î¥Ä¥ê¡¼¤ÎÍÕ¤½¤ì¤¾¤ì¤ËÂÐ¤¹¤ë¥Þ¥Ã¥Á¥ó¥°¥³¡¼¥É¤òÀ¸À®¤¹¤ë\verb|match1|¤ËÅÏ¤µ¤ì¤ë¡¥

\verb|if-match|¤ÎÅ¸³«·ÁÆâ¤Î¥³¡¼¥É¤ÎÂçÉôÊ¬¤Ï¡¤Âè\ref{fig:FastMatchOp}¿Þ¤Î\verb|match1|¤Ë°ø¤ë¤â¤Î¤À¡¥
¤³¤Î´Ø¿ô¤Ï4ÄÌ¤ê¤Î¾ì¹ç¤ò¹ÍÎ¸¤·¤Æ¤¤¤ë¡¥
¥Ñ¥¿¡¼¥ó¤ÎÍ×ÁÇ¤¬gensym¤Î¤È¤­¤Ï¡¤
¤½¤ì¤ÏÉôÊ¬¥ê¥¹¥È¤ÎÊÝ»ý¤Î¤¿¤á¤Ë\verb|destruc|¤Ëºî¤é¤ì¤¿ÉÔ²Ä»ë¤ÊÊÑ¿ô¤Î°ì¤Ä¤Ç¤¢¤Ã¤Æ¡¤
¼Â¹Ô»þ¤Ë¹Ô¤¦É¬Í×¤¬¤¢¤ë¤Î¤Ï¡¤¤½¤ì¤¬Å¬ÀÚ¤ÊÄ¹¤µ¤ò»ý¤Ã¤Æ¤¤¤ë¤«Ä´¤Ù¤ë¤³¤È¤À¤±¤À¡¥
Í×ÁÇ¤¬¥ï¥¤¥ë¥É¥«¡¼¥É¡Ê\,\verb|_|\,¡Ë¤Î¤È¤­¤Ï¡¤¥³¡¼¥É¤òÀ¸À®¤¹¤ëÉ¬Í×¤Ï¤Ê¤¤¡¥
Í×ÁÇ¤¬ÊÑ¿ô¤Î¤È¤­¤Ï¡¤\verb|match1|¤¬¡¤
¤½¤ÎÊÑ¿ô¤ò¼Â¹Ô»þ¤ËÍ¿¤¨¤é¤ì¤ë¥·¡¼¥¯¥§¥ó¥¹¤ÎÂÐ±þ¤¹¤ëÉôÊ¬¤ËÂÐ¤·¤Æ¥Þ¥Ã¥Á¤¹¤ë¥³¡¼¥É
¤Þ¤¿¤Ï¤½¤ÎÊÑ¿ô¤ËÂÐ±þ¤¹¤ëÉôÊ¬¤òÂåÆþ¤¹¤ë¥³¡¼¥É¤òÀ¸À®¤¹¤ë¡¥
¤³¤ì¤é°Ê³°¤Î¤È¤­¤Ï¡¤Í×ÁÇ¤Ï¥ê¥Æ¥é¥ëÃÍ¤È¤·¤Æ°·¤ï¤ì¡¤
\verb|match1|¤Ï¤½¤ì¤ò¥·¡¼¥¯¥§¥ó¥¹¤ÎÂÐ±þ¤¹¤ë¾ì½ê¤ÈÈæ³Ó¤¹¤ë¥³¡¼¥É¤òÀ¸À®¤¹¤ë¡¥

\begin{figure}\begin{center}
\fbox{~\,\begin{minipage}{\FrameWidth}\narrowbaselines
\vspace{3pt}
\begin{center}\begin{minipage}{240pt}\texttt{%
(if-match (?x 'a) seq\\
~~(print ?x))
}\end{minipage}\end{center}
\hspace{12zw}¤³¤ì¤Ï¼¡¤Î¤è¤¦¤ËÅ¸³«¤µ¤ì¤ë¡§
\begin{center}\begin{minipage}{260pt}\texttt{%
(let ((?x '\#:g1))\\
~~(labels ((\#:g3 nil nil))\\
~~~~(let ((\#:g2 seq))\\
~~~~~~(if (and (typep \#:g2 'sequence)\\
~~~~~~~~~~~~~~~(= (length \#:g2) 2))\\
~~~~~~~~~~(let ((\#:g5 (elt \#:g2 0)))\\
~~~~~~~~~~~~(if (or (gensym? x) (equal ?x \#:g5))\\
~~~~~~~~~~~~~~~~(let ((?x \#:g5))\\
~~~~~~~~~~~~~~~~~~(if (equal 'a (elt \#:g2 1))\\
~~~~~~~~~~~~~~~~~~~~~~(print ?x)\\
~~~~~~~~~~~~~~~~~~~~~~(\#:g3)))\\
~~~~~~~~~~~~~~~~(\#:g3)))\\
~~~~~~~~~~(\#:g3)))))
}\end{minipage}\end{center}
\vspace{1.3em}\end{minipage}~\,}\end{center}
\caption{\texttt{if-match}¤ÎÅ¸³«·Á¡¥}
\label{fig:ExpansionOfIfmatch}
\end{figure}

Å¸³«·Á¤Î°ìÉô¤¬À¸À®¤µ¤ì¤ëÍÍ»Ò¤ÎÎã¤ò¸«¤è¤¦¡¥
¼¡¤Î¥Þ¥¯¥í¸Æ¤Ó½Ð¤·¤«¤é»Ï¤á¤ë¡¥
\begin{verbatim}
(if-match (?x 'a) seq
  (print ?x)
  nil)
\end{verbatim}
¥Ñ¥¿¡¼¥ó¤Ï¡¤¥·¡¼¥¯¥§¥ó¥¹¤òÉ½¸½¤¹¤ë´ö¤Ä¤«¤Îgensym¡ÊÆÉ¤ß°×¤¯¤¹¤ë¤¿¤á¤Ë\verb|g|¤È¸Æ¤Ü¤¦¡Ë
¤È¶¦¤Ë\verb|destruc|¤ËÅÏ¤µ¤ì¤ë¡¥
\begin{verbatim}
(destruc '(?x 'a) 'g #'simple?)
\end{verbatim}
¤³¤Î·ë²Ì¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ë¡¥
\begin{verbatim}
((?x (elt g 0)) ((quote a) (elt g 1)))
\end{verbatim}
¤³¤Î¥ê¥¹¥È¤ÎÀèÆ¬¤Ë\verb|(g seq)|¤ò¥³¥ó¥¹¤·¡¤
\begin{verbatim}
((g seq) (?x (elt g 0)) ((quote a) (elt g 1)))
\end{verbatim}
¤³¤ÎÁ´ÂÎ¤ò\verb|gen-match|¤ËÁ÷¤ë¡¥
\verb|length|¤Î¥Ê¥¤¡¼¥ô¤Ê¼ÂÁõ¡Êgrs¥Ú¡¼¥¸¡Ë¤ÈÆ±ÍÍ¤Ë¡¤
\verb|gen-match|¤ÏºÇ½é¤Ë¥ê¥¹¥ÈËöÈø¤Þ¤Ç¤¨¤ó¤¨¤ó¤ÈºÆµ¢Åª¤ËºîÍÑ¤·¡¤Ìá¤ë²áÄø¤ÇÊÖ¤êÃÍ¤ò¹½ÃÛ¤¹¤ë¡¥
Í×ÁÇ¤¬¿Ô¤­¤ë¤È\verb|gen-match|¤ÏthenÉô¤òÊÖ¤¹¤¬¡¤¤½¤ì¤¬\verb|?x|¤Ë¤Ê¤ë¡¥
ºÆµ¢¤«¤éÌá¤ë²áÄø¤Ç¡¤¤³¤ÎÊÖ¤êÃÍ¤Ï\verb|match1|¤ËthenÉô¤È¤·¤ÆÅÏ¤µ¤ì¤ë¡¥
¤³¤¦¤·¤Æ¼¡¤Î¤è¤¦¤Ê¸Æ¤Ó½Ð¤·¤¬ÆÀ¤é¤ì¡¤
\begin{verbatim}
(match1 '(((quote a) (elt g 1))) '(print ?x) ' else function )
\end{verbatim}
¤³¤Î·ë²Ì¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ë¡¥
\begin{verbatim}
(if (equal (quote a) (elt g 1))
    (print ?x)
    else function)
\end{verbatim}
º£ÅÙ¤Ï¤³¤ì¤¬\verb|match1|¤ÎÊÌ¤Î¸Æ¤Ó½Ð¤·¤ÎthenÉô¤Ë¤Ê¤ê¡¤
¤½¤ÎÃÍ¤¬ºÇ¸å¤Î\verb|match1|¤ÎthenÉô¤Ë¤Ê¤ë¡¥
¤³¤Î\verb|if-match|¤ÎÅ¸³«·Á¤ÎÁ´ËÆ¤ÏÂè\ref{fig:ExpansionOfIfmatch}¿Þ¤Ë¼¨¤·¤¿¡¥

¤³¤ÎÅ¸³«·Á¤Ç¤Ï¡¤gensym¤ÏÁ´¤¯´ØÏ¢¤Î¤Ê¤¤2ÄÌ¤ê¤Ç»È¤ï¤ì¤Æ¤¤¤ë¡¥
¤Þ¤º¼Â¹Ô»þ¤Ë¥Ä¥ê¡¼¤Î°ìÉô¤òÊÝ»ý¤¹¤ëÊÑ¿ô¤Ï¡¤ÊáÂª¤òÈò¤±¤ë¤¿¤á¤Ëgensym¤ÎÌ¾Á°¤ò»ý¤Ã¤Æ¤¤¤ë¡¥
¤Þ¤¿ÊÑ¿ô\verb|?x|¤Î½é´üÃÍ¤Ë¤Ï¡¤
¥Þ¥Ã¥Á¥ó¥°¤Ë¤è¤Ã¤ÆÃÍ¤òÂåÆþ¤µ¤ì¤Æ¤¤¤Ê¤¤¤³¤È¤òÉ½¤¹¤¿¤ágensym¤¬»È¤ï¤ì¤ë¡¥

¿·¤·¤¤\verb|if-match|¤Ç¤Ï¡¤¥Ñ¥¿¡¼¥ó¤ÎÍ×ÁÇ¤Ï¡¤°ÅÌÛ¤ÎÆâ¤Ë¥¯¥©¡¼¥È¤µ¤ì¤º¤ËÉ¾²Á¤µ¤ì¤ë¡¥
¤³¤ì¤ÏLisp¤ÎÊÑ¿ô¤¬¡¤¥¯¥©¡¼¥È¤µ¤ì¤¿¼°¤ÈÆ±ÍÍ¤Ë¥Ñ¥¿¡¼¥óÆâ¤Ë»È¤¨¤ë¤È¤¤¤¦¤³¤È¤À¡¥
\begin{verbatim}
> (let ((n 3))
    (if-match (?x n 'n '(a b)) '(1 3 n (a b))
      ?x))
1
\end{verbatim}

¿·ÈÇ¤Ï\verb|destruc|¡ÊÂè\ref{fig:GeneralSeqDestructuringOp}¿Þ¡Ë¤ò¸Æ¤ó¤Ç¤¤¤ë¤Î¤Ç¡¤
²þÁ±ÅÀ¤¬¤µ¤é¤Ë2¤Ä½Ð¤ÆÍè¤ë¡¥
¥Ñ¥¿¡¼¥ó¤Ë¥­¡¼¥ï¡¼¥É\verb|&rest|¤ä\verb|&body|¤¬»È¤¨¤ë¤è¤¦¤Ë¤Ê¤Ã¤¿
¡Ê\verb|match|¤Ï¤³¤ì¤é¤¬¤¢¤Ã¤ÆÌäÂê¤Ë¤Ï¤Ê¤é¤Ê¤¤¡Ë¡¥
¤Þ¤¿\verb|destruc|¤Ï¥·¡¼¥¯¥§¥ó¥¹°ìÈÌÍÑ¤Î¥ª¥Ú¥ì¡¼¥¿\verb|elt|¤È\verb|subseq|¤ò»È¤Ã¤Æ¤¤¤ë¤Î¤Ç¡¤
\verb|if-match|¤Î¿·ÈÇ¤Ï¤É¤Î¤è¤¦¤Ê¥·¡¼¥¯¥§¥ó¥¹¤Ë¤Ä¤¤¤Æ¤â»È¤¨¤ë¡¥
\verb|abab|¤¬¿·ÈÇ\verb|if-match|¤ÇÄêµÁ¤µ¤ì¤ë¤È¡¤¥ô¥§¥¯¥¿¤äÊ¸»úÎó¤Ë¤â»È¤¨¤ë¤è¤¦¤Ë¤Ê¤ë¡¥
\begin{verbatim}
> (abab "abab")
#\a
#\b
> (abab #(1 2 1 2))
1 2
\end{verbatim}
¼ÂºÝ¡¤¥Ñ¥¿¡¼¥ó¤Ï\verb|dbind|¤ËÅÏ¤»¤ë¤â¤Î¤ÈÆ±¤¸°ÌÊ£»¨¤Ç¤¢¤Ã¤Æ¤â¤è¤¤¡¥
\begin{verbatim}
> (if-match (?x (1 . ?y) . ?x) '((a b) #(1 2 3) a b)
    (values ?x ?y))
(A B)
#(2 3)
\end{verbatim}
Âè2ÊÖ¤êÃÍ¤Ç¥ô¥§¥¯¥¿¤ÎÍ×ÁÇ¤¬É½¼¨¤µ¤ì¤Æ¤¤¤ë¤³¤È¤ËÃí°Õ¡¥
¥ô¥§¥¯¥¿¤ò¤³¤Î¤è¤¦¤ËÉ½¼¨¤¹¤ë¤Ë¤Ï¡¤\verb|*print-array*|¤ò\verb|t|¤ËÀßÄê¤¹¤ë¤³¤È¡¥

¤³¤Î¾Ï¤Ç¤Ï¡¤¥×¥í¥°¥é¥ß¥ó¥°¤Î¿·¤¿¤ÊÎÎ°è¤Ø¤Î°ìÊâ¤òÆ§¤ß½Ð¤·¤¿¡¥
¹½Â¤²½ÂåÆþ¤Î¤¿¤á¤ÎÃ±½ã¤Ê¥Þ¥¯¥í¤«¤éÏÃ¤Ï»Ï¤Þ¤Ã¤¿¡¥
\verb|if-match|¤ÎºÇ½ªÈÇ¤Ç¤Ï¡¤¤à¤·¤íÆÈ¼«¤Î¸À¸ì¤Ë¸«¤¨¤ë¤è¤¦¤Ê¤â¤Î¤¬ÆÀ¤é¤ì¤¿¡¥
°Ê¹ß¤Î¾Ï¤Ç¤Ï¡¤Æ±¤¸¹Í¤¨¤Ë´ð¤Å¤¤¤ÆÆ¯¤¯¼ïÎà¤Î¥×¥í¥°¥é¥àÁ´ÂÎ¤Ë¤Ä¤¤¤ÆÀâÌÀ¤¹¤ë¡¥
%}}}
%}}}
\section{¥¯¥¨¥ê¡¦¥³¥ó¥Ñ¥¤¥é} % {{{
Á°¾Ï¤ÇÄêµÁ¤·¤¿¥Þ¥¯¥í¤Î´ö¤Ä¤«¤ÏÂçµ¬ÌÏ¤Ê¤â¤Î¤À¤Ã¤¿¡¥
\verb|if-match|¤ÎÅ¸³«·Á¤òÆÀ¤ë¤¿¤á¤Ë¤Ï¡¤\reffig{fig:FastMatchOp}¤Î¥³¡¼¥ÉÁ´¤Æ¤Ë²Ã¤¨¡¤
\reffig{fig:GeneralSeqDestructuringOp}¤Î\verb|destruc|¤¬É¬Í×¤Ë¤Ê¤ë¡¥
¤³¤ì°Ì¤ÎÂç¤­¤µ¤Î¥Þ¥¯¥í¤«¤é¤Ï¡¤ºÇ¸å¤ÎÏÀÅÀ¤Ø¤È¼«Á³¤ËÏÃ¤¬¤Ä¤Ê¤¬¤ë¡¥
Ëä¤á¹þ¤ß¸À¸ì¤À¡¥
¾®¤µ¤Ê¥Þ¥¯¥í¤¬Lisp¤Î³ÈÄ¥¤ËÅö¤¿¤ë¤Ê¤é¡¤
Âçµ¬ÌÏ¤Ê¥Þ¥¯¥í¤ÏLispÆâÉô¤ËÉôÊ¬¸À¸ì¤òÄêµÁ¤·¤Æ¤¤¤ë\wadash
¤½¤³¤Ë¤ÏÆÈ¼«¤Î¹½Ê¸¤äÀ©¸æ¹½Â¤¤¬È÷¤ï¤Ã¤Æ¤¤¤ë¤³¤È¤â¤¢¤ë¡¥
¤½¤ì¤Ø¤ÎÂè°ìÊâ¤ò\verb|if-match|¤ÎÃæ¤Ë¸«¤¿¡¥
¤³¤ì¤ÏÊÑ¿ô¤òÆÈ¼«¤ÎÊýË¡¤ÇÉ½¸½¤·¤Æ¤¤¤¿¡¥

Lisp¤ÎÃæ¤Ë¼ÂÁõ¤µ¤ì¤¿¸À¸ì¤ÏËä¤á¹þ¤ß¸À¸ì¤È¸Æ¤Ð¤ì¤ë¡¥
¡Ö¥æ¡¼¥Æ¥£¥ê¥Æ¥£¡×¤ÈÆ±ÍÍ¡¤¤³¤Î¸ÀÍÕ¤ËÀµ³Î¤ÊÄêµÁ¤Ï¤Ê¤¤¡¥
\verb|if-match|¤Ï¶²¤é¤¯¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤Ë¿ô¤¨¤é¤ì¤è¤¦¤¬¡¤¶­³¦Àþ¤Ë¤º¤¤¤Ö¤ó¶áÉÕ¤¤¤Æ¤¤¤ë¡¥

Ëä¤á¹þ¤ß¸À¸ì¤Ï¡¤¸ÅÅµÅª¤Ê¥³¥ó¥Ñ¥¤¥é¤ä¥¤¥ó¥¿¥×¥ê¥¿¤Ç¼ÂÁõ¤µ¤ì¤¿¸À¸ì¤È¤Ï°Û¤Ê¤ë¡¥
¤½¤ì¤Ï´ûÂ¸¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ÎÆâÉô¤Ë¡¤ÉáÄÌ¤Ï¥³¡¼¥ÉÊÑ·Á¤òÍÑ¤¤¤Æ¼ÂÁõ¤µ¤ì¤ë¡¥
´ðÈ×¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È³ÈÄ¥ÉôÊ¬¤Î´Ö¤Ë¶­³¦¤ÏÉ¬Í×¤Ê¤¤¡¥
Æó¤Ä¤Ï¼«Í³¤Ë¸ò¤¸¤ê¹ç¤ï¤»¤ë¤³¤È¤¬¤Ç¤­¤ë¤Ù¤­¤À¡¥
¼ÂÁõ¼Ô¤Ë¤È¤Ã¤Æ¤Ï¡¤¤³¤ì¤ÏÏ«ÎÏ¤ÎÂç¤­¤Êºï¸º¤Ë¤Ê¤êÆÀ¤ë¡¥
É¬Í×¤ÊÉôÊ¬¤À¤±¤òËä¤á¹þ¤ó¤Ç¡¤»Ä¤ê¤Ï´ðÈ×¤È¤Ê¤Ã¤¿¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤òÍøÍÑ¤¹¤ì¤Ð¤è¤¤¡¥

Lisp¤Ë¤ª¤¤¤Æ¤Ï¡¤¥³¡¼¥ÉÊÑ·Á¤Ï¥Þ¥¯¥í¤ò¼¨º¶¤¹¤ë¡¥
¥×¥ê¥×¥í¥»¥Ã¥µ¤òÍÑ¤¤¤Æ¤â¡¤¤¢¤ëÄøÅÙ¤ÏËä¤á¹þ¤ß¸À¸ì¤ò¼ÂÁõ¤Ç¤­¤ë¡¥
¤·¤«¤·ÉáÄÌ¥×¥ê¥×¥í¥»¥Ã¥µ¤Ï¥Æ¥­¥¹¥È¤Ë¤Î¤ßºîÍÑ¤¹¤ë¤¬¡¤
¥Þ¥¯¥í¤ÏLisp¤ÎÆÈÆÃ¤ÊÀ­¼Á¤ò³èÍÑ¤Ç¤­¤ë¡¥
¥ê¡¼¥À¤È¥³¥ó¥Ñ¥¤¥é¤Î´Ö¤Ç¤Ï¡¤ Lisp¥×¥í¥°¥é¥à¤ÏLisp¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Î¥ê¥¹¥È¤È¤·¤ÆÉ½¸½¤µ¤ì¤ë¡¥
¤³¤ÎÃÊ³¬¤Ç¥³¡¼¥ÉÊÑ·Á¤òÈó¾ï¤Ë¹ª¤¯¹Ô¤¦¤³¤È¤¬¤Ç¤­¤ë¡¥

Ëä¤á¹þ¤ß¸À¸ì¤ÎÎã¤Ç°ìÈÖÍ­Ì¾¤Ê¤Î¤Ï¡¤CLOS¤¹¤Ê¤ï¤ÁCommon Lisp Object System¤À¡¥
´ûÂ¸¤Î¸À¸ì¤Î¥ª¥Ö¥¸¥§¥¯¥È»Ø¸þÈÇ¤¬Íß¤·¤¯¤Ê¤Ã¤¿¤é¡¤¿·¤·¤¤¥³¥ó¥Ñ¥¤¥é¤ò½ñ¤«¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤À¤í¤¦¡¥
Lisp¤Ç¤Ï¤½¤¦¤Ç¤Ï¤Ê¤¤¡¥
¥³¥ó¥Ñ¥¤¥é¤Î¥Á¥å¡¼¥Ë¥ó¥°¤ÏCLOS¤ÎÀ­Ç½¤ò¸þ¾å¤µ¤»¤ë¤À¤í¤¦¤¬¡¤
¸¶Â§Åª¤Ë¤Ï¥³¥ó¥Ñ¥¤¥é¤òÊÑ¹¹¤¹¤ëÉ¬Í×¤Ï°ìÀÚ¤Ê¤¤¡¥
Á´¤Æ¤òLisp¤Ç½ñ¤¯¤³¤È¤¬¤Ç¤­¤ë¡¥

°Ê¹ß¤Î¾Ï¤Ç¤ÏËä¤á¹þ¤ß¸À¸ì¤ÎÎã¤ò¼¨¤¹¡¥
¤³¤Î¾Ï¤Ç¤ÏLisp¤ÎÃæ¤Ë¥Ç¡¼¥¿¥Ù¡¼¥¹¤Ø¤Î¥¯¥¨¥ê¤ËÅú¤¨¤ë¥×¥í¥°¥é¥à¤òËä¤á¹þ¤àÊýË¡¤òÀâÌÀ¤¹¤ë¡¥
¡Ê¤½¤Î¥×¥í¥°¥é¥à¤Ï¤¢¤ë°ÕÌ£¤Ç\verb|if-match|¤È»÷¤Æ¤¤¤ë¤³¤È¤Ëµ¤¤Å¤¯¤À¤í¤¦¡¥¡Ë
Âè1Àá¤Ç¤Ï¥¯¥¨¥ê¤ò²ò¼á¤¹¤ë¥·¥¹¥Æ¥à¤Î½ñ¤­Êý¤òÀâÌÀ¤¹¤ë¡¥
¤µ¤é¤Ë¤½¤Î¥×¥í¥°¥é¥à¤ò¥¯¥¨¥ê¡¦¥³¥ó¥Ñ¥¤¥é\wadash
ËÜ¼ÁÅª¤Ë¤Ï1¤Ä¤ÎÂç¤­¤Ê¥Þ¥¯¥í\wadash ¤È¤·¤ÆºÆ¼ÂÁõ¤¹¤ë¡¥
¤¹¤ë¤È¸úÎ¨¤Ï¸þ¾å¤·¡¤Lisp¤È¤ÎÅý¹çÀ­¤â¹â¤Þ¤ë¡¥
\subsection{¥Ç¡¼¥¿¥Ù¡¼¥¹}   %{{{
ÅöÌÌ¤ÎÌÜÉ¸¤Î¤¿¤á¤Ë¤Ï¡¤¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î¥¹¥­¡¼¥Þ¤ÏÂç¤·¤¿ÌäÂê¤Ë¤Ê¤é¤Ê¤¤¡¥
¤³¤³¤Ç¤Ï´ÊÊØ¤µ¤ò¼è¤ê¡¤¾ðÊó¤ò¥ê¥¹¥È¤Î·Á¤ÇÊÝÂ¸¤¹¤ë¤³¤È¤Ë¤¹¤ë¡¥
Îã¤¨¤ÐJoshua Reynolds¤¬±Ñ¹ñ¿Í²è²È¤Ç¡¤1723Ç¯¤«¤é1792Ç¯¤Þ¤ÇÀ¸¤­¤¿¤È¤¤¤¦»ö¼Â¤Ï¡¤¼¡¤Î¤è¤¦¤ËÉ½¸½¤¹¤ë¡¥
\begin{verbatim}
(painter reynolds joshua english)
(dates reynolds 1723 1792)
\end{verbatim}
¾ðÊó¤ò¥ê¥¹¥È¤Ë¤Þ¤È¤á¤ë·è¤Þ¤Ã¤¿ÊýË¡¤Ï¤Ê¤¤¡¥
Âç¤­¤Ê1¤Ä¤Î¥ê¥¹¥È¤ò»È¤Ã¤Æ¤â¤è¤¤¤À¤í¤¦¡¥
\begin{verbatim}
(painter reynolds joshua 1723 1792 english)
\end{verbatim}

¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î¥¨¥ó¥È¥ê¤ò¤É¤Î¤è¤¦¤Ë¹½À®¤¹¤ë¤«¤Ï¥æ¡¼¥¶¼¡Âè¤À¡¥
Í£°ì¤ÎÀ©¸Â¤Ï¡¤¥¨¥ó¥È¥ê¡Ê»ö¼Â¡Ë¤ÏÂè1Í×ÁÇ¡Ê½Ò¸ì¡Ë¤ò¥­¡¼¤Ë¶èÊÌ¤µ¤ì¤ë¤È¤¤¤¦¤³¤È¤À¡¥
¤½¤ÎÀ©¸Â¤Ë½¾¤¦¸Â¤ê¤É¤ó¤Ê·Á¼°¤Ç¤â°ì´ÓÀ­¤¬¤¢¤ì¤Ð¤è¤¤¡¥
¤¿¤À¡¤·Á¼°¤Ë¤è¤Ã¤Æ¥¯¥¨¥ê¤Ø¤ÎÈ¿±þ¤ËÂ®¤¤ÃÙ¤¤¤Î°ã¤¤¤¬½Ð¤ë¤³¤È¤¬¤¢¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defun make-db (&optional (size 100))
  (make-hash-table :size size))

(defvar *default-db* (make-db))

(defun clear-db (&optional (db *default-db*))
  (clrhash db))

(defmacro db-query (key &optional (db '*default-db*))
  `(gethash ,key ,db))

(defun db-push (key val &optional (db *default-db*))
  (push val (db-query key db)))

(defmacro fact (pred &rest args)
  `(progn (db-push ',pred ',args)
          ',args))
\end{FramedVerb}\end{center}
\caption{¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î´ðËÜ¤È¤Ê¤ë´Ø¿ô¡¥}
\label{fig:BasicDatabaseFunc}
\end{figure}

¤É¤Î¥Ç¡¼¥¿¥Ù¡¼¥¹¤Ë¤âºÇÄã2¤Ä¤Îµ¡Ç½¤¬É¬¿Ü¤À¡¥
¤¹¤Ê¤ï¤Á¥Ç¡¼¥¿¥Ù¡¼¥¹¤ÎÆâÍÆ¤Î½¤Àµ¤È¡¤ÆâÍÆ¤ÎÌä¤¤¹ç¤ï¤»¤À¡¥
\reffig{fig:BasicDatabaseFunc}¤Î¥³¡¼¥É¤Ï¤½¤ì¤é¤Îµ¡Ç½¤ò´ðËÜÅª¤Ê·Á¤ÇÄó¶¡¤¹¤ë¡¥
¥Ç¡¼¥¿¥Ù¡¼¥¹¤Ï¡¤»ö¼Â¤Î¥ê¥¹¥È¤«¤éÀ®¤ê¡¤¤½¤ì¤é¤Î½Ò¸ì¤ò¥­¡¼¤È¤¹¤ë¥Ï¥Ã¥·¥åÉ½¤ÇÉ½¸½¤µ¤ì¤ë¡¥

\reffig{fig:BasicDatabaseFunc}¤ÇÄêµÁ¤µ¤ì¤¿¥Ç¡¼¥¿¥Ù¡¼¥¹´Ø¿ô¤ÏÊ£¿ô¤Î¥Ç¡¼¥¿¥Ù¡¼¥¹¤ËÂÐ±þ¤·¤Æ¤¤¤ë¤¬¡¤
¥Ç¥Õ¥©¥ë¥È¤Ç¤Ï\verb|*default-db*|¤ËÂÐ¤·¤ÆºîÍÑ¤¹¤ë¡¥
Common Lisp¤Î¥Ñ¥Ã¥±¡¼¥¸¥·¥¹¥Æ¥à¤ÈÆ±ÍÍ¡¤
Ê£¿ô¤Î¥Ç¡¼¥¿¥Ù¡¼¥¹¤¬É¬Í×¤Ç¤Ê¤¤¥×¥í¥°¥é¥à¤Ï¤É¤Î¥Ç¡¼¥¿¥Ù¡¼¥¹¤ò»È¤¦¤«¤Ë¤Ä¤¤¤Æ°ìÀÚ¿¨¤ì¤ëÉ¬Í×¤¬¤Ê¤¤¡¥
¤³¤ÎÀá¤Ç¤Ï¡¤Á´¤Æ¤ÎÎã¤Ç\verb|*default-db*|¤Î¤ß¤ò»È¤¦¡¥

¥·¥¹¥Æ¥à¤Î½é´ü²½¤Ë¤Ï\verb|clear-db|¤ò¸Æ¤Ö¡¥
¤³¤ì¤Ï¸½ºß»È¤Ã¤Æ¤¤¤ë¥Ç¡¼¥¿¥Ù¡¼¥¹¤ò¶õ¤Ë¤¹¤ë¡¥
Í¿¤¨¤é¤ì¤¿½Ò¸ì¤«¤é»ö¼Â¤ò¸¡º÷¤¹¤ë¤Ë¤Ï\verb|db-query|¤ò¡¤
¿·¤·¤¤»ö¼Â¤ò¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î¥¨¥ó¥È¥ê¤ËÁÞÆþ¤¹¤ë¤Ë¤Ï\verb|db-push|¤ò»È¤¦¡¥
Âè12.1Àá¤ÇÀâÌÀ¤·¤¿¤è¤¦¤Ë¡¤
¥¤¥ó¥ô¥¡¡¼¥¸¥ç¥ó²ÄÇ½¤Ê»²¾È¤ËÅ¸³«¤µ¤ì¤ë¥Þ¥¯¥í¤Ï¤½¤ì¼«¿È¥¤¥ó¥ô¥¡¡¼¥¸¥ç¥ó²ÄÇ½¤À¡¥
\verb|db-query|¤Ï¤½¤Î¤è¤¦¤ËÄêµÁ¤µ¤ì¤Æ¤¤¤ë¤Î¤Ç¡¤
½Ò¸ì¤Ç\verb|db-query|¤ò¸Æ¤ó¤À·ë²Ì¤Ë\verb|push|¤Ç¿·¤·¤¤»ö¼Â¤ò¤¿¤À¥×¥Ã¥·¥å¤¹¤ì¤Ð¤è¤¤¡¥
Common Lisp¤Ç¤Ï¥Ï¥Ã¥·¥åÉ½¤Î¥¨¥ó¥È¥ê¤Ï¡Ê»ØÄê¤Î¤Ê¤¤¸Â¤ê¡Ë\verb|nil|¤Ë½é´ü²½¤µ¤ì¤ë¤Î¤Ç¡¤
¤É¤Î¥­¡¼¤Ë¤âºÇ½é¤Ë¤Ï¶õ¥ê¥¹¥È¤¬´ØÏ¢ÉÕ¤±¤é¤ì¤Æ¤¤¤ë¡¥
ºÇ¸å¤Ë¡¤¥Þ¥¯¥í\verb|fact|¤¬¥Ç¡¼¥¿¥Ù¡¼¥¹¤Ë¿·¤·¤¤»ö¼Â¤òÄÉ²Ã¤¹¤ë¡¥

\begin{verbatim}
> (fact painter reynolds joshua english)
(REYNOLDS JOSHUA ENGLISH)
> (fact painter canale antonio venetian)
(CANALE ANTONIO VENETIAN)
> (db-query 'painter)
((CANALE ANTONIO VENETIAN)
     (REYNOLDS JOSHUA ENGLISH))
T
\end{verbatim}

\verb|db-query|¤ÎÂè2ÊÖ¤êÃÍ¤È¤·¤Æ\verb|t|¤¬ÊÖ¤µ¤ì¤Æ¤¤¤ë¤Î¤Ï¡¤
\verb|db-query|¤¬\verb|gethash|¤ËÅ¸³«¤µ¤ì¤ë¤»¤¤¤À¡¥
¥¨¥ó¥È¥ê¤¬¸«¤Ä¤«¤é¤Ê¤¤¾ì¹ç¤È¡¤ÃÍ¤¬\verb|nil|¤Î¥¨¥ó¥È¥ê¤òÈ¯¸«¤·¤¿¾ì¹ç¤ò¶èÊÌ¤¹¤ë¤¿¤á¡¤
\verb|gethash|¤ÏÂè2ÊÖ¤êÃÍ¤Ë¥Õ¥é¥°¤òÊÖ¤¹¡¥
%}}}
\subsection{Pattern-Matching¥¯¥¨¥ê}   %{{{
\verb|db-query|¤ò¸Æ¤Ö¤Î¤Ï¡¤¥Ç¡¼¥¿¥Ù¡¼¥¹¤ÎÍøÍÑÊýË¡¤È¤·¤Æ¤Ï½ÀÆð¤µ¤Ë·ç¤±¤ë¡¥
ÉáÄÌ¡¤¥æ¡¼¥¶¤Ï»ö¼Â¤ÎÂè1Í×ÁÇ¤À¤±¤Ë°ÍÂ¸¤¹¤ë¼ÁÌä¤À¤±¤ò¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¤¡¥
¥¯¥¨¥ê¸À¸ì¤È¤Ï¡¤Ê£»¨¤Ê¼ÁÌä¤òÉ½¸½¤¹¤ë¤¿¤á¤Î¸À¸ì¤À¡¥
Åµ·¿Åª¤Ê¥¯¥¨¥ê¸À¸ì¤Ç¤Ï¡¤
¥æ¡¼¥¶¤Ï¾ò·ï¤ÎÅ¬Åö¤ÊÁÈ¹ç¤»¤òËþ¤¿¤¹Á´¤Æ¤ÎÃÍ¤ò¸¡º÷¤Ç¤­¤ë¡¥
Îã¤¨¤Ð¡Ö1697Ç¯À¸¤Þ¤ì¤ÎÁ´¤Æ¤Î²è²È¤ÎÌ¾»ú¡×¤À¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
query    : (symbol  argument *)
         : (not  query )
         : (and  query *)
         : (or  query *)
argument : ? symbol
         :  symbol
         :  number
\end{FramedVerb}\end{center}
\caption{¥¯¥¨¥ê¤ÎÊ¸Ë¡}
\label{fig:SytaxOfQuery}
\end{figure}

¤³¤ì¤«¤éÀë¸ÀÅª¥¯¥¨¥ê¸À¸ì¤òÄó¶¡¤¹¤ë¥×¥í¥°¥é¥à¤òºî¤ë¡¥
Àë¸ÀÅª¥¯¥¨¥ê¸À¸ì¤Ç¤Ï¡¤Åú¤¨¤¬Ëþ¤¿¤¹É¬Í×¤Î¤¢¤ë¾ò·ï¤ò¥æ¡¼¥¶¤¬»ØÄê¤·¡¤¥·¥¹¥Æ¥à¤ËÅú¤¨¤ÎÀ¸À®¤òÇ¤¤»¤ë¡¥
¤³¤Î¤è¤¦¤Ê¥¯¥¨¥ê¤ÎÉ½¸½¤Ï¡¤»äÃ£¤¬Æü¾ï²ñÏÃ¤Ç»È¤¦·Á¼°¤Ë¶á¤¤¡¥
²æ¡¹¤Î¥×¥í¥°¥é¥à¤Ç¤Ï¡¤
\verb|(painter x ...)|¤È¤¤¤¦·Á¤Î»ö¼Â¤È\verb|(dates x 1697 ...)|¤È¤¤¤¦·Á¤Î»ö¼Â¤¬
Â¸ºß¤¹¤ë¤è¤¦¤ÊÁ´¤Æ¤Î\verb|x|¤òÃµ¤¹¤è¤¦Ì¿¤¸¤ë¤³¤È¤Ç¥¯¥¨¥ê¤òÉ½¸½¤Ç¤­¤ë¤è¤¦¤Ë¤·¤è¤¦¡¥
1697Ç¯À¸¤Þ¤ì¤ÎÁ´¤Æ¤Î²è²È¤ò»ØÄê¤¹¤ë¤Ë¤Ï¡¤¼¡¤Î¤è¤¦¤Ë¤¹¤ë¡¥
\begin{verbatim}
(and (painter ?x ?y ?z)
        (dates ?x 1697 ?w))
\end{verbatim}
²æ¡¹¤Î¥×¥í¥°¥é¥à¤Ï¡¤½Ò¸ì¤È´ö¤Ä¤«¤Î°ú¿ô¤«¤éÀ®¤ëÃ±½ã¤Ê¥¯¥¨¥ê¤ÎÂ¾¡¤
\verb|and|¡¤\verb|or|Åù¤ÎÏÀÍý±é»»»Ò¤ÇÁÈ¤ß¹ç¤ï¤µ¤ì¤¿Ç¤°Õ¤ÎÊ£»¨¤Ê¥¯¥¨¥ê¤Ë²òÅú¤Ç¤­¤ë¤è¤¦¤Ë¤¹¤ë¡¥
¥¯¥¨¥ê¸À¸ì¤ÎÊ¸Ë¡¤Ï\reffig{fig:SytaxOfQuery}¤Ë¼¨¤·¤¿¡¥

»ö¼Â¤Ï½Ò¸ì¤Ç¶èÊÌ¤µ¤ì¤ë¤Î¤Ç¡¤ÊÑ¿ô¤¬½Ò¸ì¤Î°ÌÃÖ¤ËÍè¤ë¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡¥
½Ò¸ì¤Ë¤Ä¤¤¤Æ½çÈÖÉÕ¤±¤Î¤Ç¤­¤ëÍøÅÀ¤òÄü¤á¤Æ¤è¤¤¤Ê¤é¡¤
¾ï¤ËÆ±¤¸½Ò¸ì¤ò»È¤¤¡¤Âè1°ú¿ô¤ò»ö¼Â¾å¤Î½Ò¸ì¤È¤·¤Æ°·¤¦¤³¤È¤Ç¤³¤ÎÀ©¸Â¤ò²óÈò¤Ç¤­¤ë¡¥

Îà»÷¤ÎÂ¿¤¯¤Î¥·¥¹¥Æ¥à¤ÈÆ±ÍÍ¤Ë¡¤¤³¤Î¥×¥í¥°¥é¥à¤Ï»ö¼Â¤ËÂÐ¤·¤Æ²ûµ¿Åª¤À¡¥
Ê¬¤«¤Ã¤Æ¤¤¤ë´ö¤Ä¤«¤Î»ö¼Â¤ÎÂ¾¤Ïµ¶¤Ç¤¢¤ë¤È¤¹¤ë¡¥
±é»»»Ò\verb|not|¤Ï¡¤Ìä¤ï¤ì¤¿»ö¼Â¤¬¥Ç¡¼¥¿¥Ù¡¼¥¹Æâ¤Ë¤Ê¤¤¤È¤­¤Ë¥Þ¥Ã¥Á¤ËÀ®¸ù¤¹¤ë¡¥
¡Öµ¶¡×¤È¤¤¤¦¤³¤È¤òÌÀ¼¨Åª¤Ë»ØÄê¤¹¤ë¤Ë¤Ï¡¤Wayne's World¤ÎÊýË¡¤¬¤¢¤ëÄøÅÙ»È¤¨¤ë¡¥
\begin{verbatim}
(edible motor-oil not)
\end{verbatim}
¤·¤«¤·±é»»»Ò\verb|not|¤Ï¤³¤ì¤é¤Î»ö¼Â¤òÂ¾¤Î»ö¼Â¤ÈÁ´¤¯Æ±ÍÍ¤Ë°·¤¦¡¥

¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ë¤È¤Ã¤Æ¡¤¥¤¥ó¥¿¥×¥ê¥¿¤È¥³¥ó¥Ñ¥¤¥é¤Î°ã¤¤¤Ïº¬¸µÅª¤À¡¥
¤³¤Î¾Ï¤Ç¤Ï¡¤¥¯¥¨¥ê¤Ë¤Ä¤¤¤ÆÆ±¤¸µ¿Ìä¤òºÆ¤Ó¹Í¤¨¤ë¡¥
¥¯¥¨¥ê¡¦¥¤¥ó¥¿¥×¥ê¥¿¤Ï¼õ¤±¼è¤Ã¤¿¥¯¥¨¥ê¤ò¸µ¤Ë¥Ç¡¼¥¿¥Ù¡¼¥¹¤«¤éÅú¤¨¤ò°ú¤­½Ð¤¹¡¥
¥¯¥¨¥ê¡¦¥³¥ó¥Ñ¥¤¥é¤Ï¥¯¥¨¥ê¤ò¼õ¤±¼è¤Ã¤Æ¡¤¼Â¹Ô»þ¤ËÆ±¤¸·ë²Ì¤òÍ¿¤¨¤ë¥×¥í¥°¥é¥à¤òÀ¸À®¤¹¤ë¡¥
°Ê¹ß¤ÎÀá¤Ç¤Ï¤Þ¤º¥¯¥¨¥ê¡¦¥¤¥ó¥¿¥×¥ê¥¿¤ò¡¤¼¡¤Ë¥¯¥¨¥ê¡¦¥³¥ó¥Ñ¥¤¥é¤òÀâÌÀ¤¹¤ë¡¥
%}}}
\subsection{¥¯¥¨¥ê¡¦¥¤¥ó¥¿¥×¥ê¥¿}   %{{{
\begin{figure}\begin{center}\begin{FramedVerb}
(defmacro with-answer (query &body body)
  (let ((binds (gensym)))
       `(dolist (,binds (interpret-query ',query))
             (let ,(mapcar #'(lambda (v)
                                 `(,v (binding ',v ,binds)))
                             (vars-in query #'atom))
              ,@body))))

(defun interpret-query (expr &optional binds)
  (case (car expr)
       (and (interpret-and (reverse (cdr expr)) binds))
       (or      (interpret-or (cdr expr) binds))
       (not (interpret-not (cadr expr) binds))
       (t       (lookup (car expr) (cdr expr) binds))))

(defun interpret-and (clauses binds)
  (if (null clauses)
        (list binds)
        (mapcan #'(lambda (b)
                       (interpret-query (car clauses) b))
                   (interpret-and (cdr clauses) binds))))

(defun interpret-or (clauses binds)
  (mapcan #'(lambda (c)
                   (interpret-query c binds))
                clauses))

(defun interpret-not (clause binds)
  (if (interpret-query clause binds)
        nil
        (list binds)))

(defun lookup (pred args &optional binds)
  (mapcan #'(lambda (x)
                   (aif2 (match x args binds) (list it)))
                (db-query pred)))
\end{FramedVerb}\end{center}
\caption{¥¯¥¨¥ê¡¦¥¤¥ó¥¿¥×¥ê¥¿¡¥}
\label{fig:QueryInterpreter}
\end{figure}

Àë¸ÀÅª¥¯¥¨¥ê¸À¸ì¤ò¼ÂÁõ¤¹¤ë¤¿¤á¤Ë¡¤
Âè18.4Àá¤ÇÄêµÁ¤·¤¿¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¥ó¥°¡¦¥æ¡¼¥Æ¥£¥ê¥Æ¥£¤ò»È¤¦¡¥
\reffig{fig:QueryInterpreter}¤Ë¼¨¤·¤¿´Ø¿ô¤Ï¡¤\reffig{fig:SytaxOfQuery}¤Ë¼¨¤·¤¿·Á¤Î¥¯¥¨¥ê¤ò²ò¼á¤¹¤ë¡¥
Ãæ³Ë¤È¤Ê¤ë´Ø¿ô¤Ï\verb|interpret-query|¤Ç¡¤Ê£»¨¤Ê¥¯¥¨¥ê¤Î¹½Â¤¤ËÂÐ¤·ºÆµ¢Åª¤ËÆ°ºî¤·¡¤
Â«Çû¤ò½ç¡¹¤ËÀ¸À®¤¹¤ë¡¥
Ê£»¨¤Ê¥¯¥¨¥ê¤ÎÉ¾²Á¤Ï¡¤Common Lisp¤Î´Ø¿ô¤Î°ú¿ô¤ÎÉ¾²Á¤ÈÆ±ÍÍ¡¤º¸¤«¤é±¦¤Î½ç¤Ç¹Ô¤ï¤ì¤ë¡¥

ºÆµ¢¤¬»ö¼Â¤òÉ½¤¹¥Ñ¥¿¡¼¥ó¤Þ¤ÇÃ©¤êÃå¤¯¤È¡¤\verb|interpret-query|¤Ï\verb|lookup|¤ò¸Æ¤Ó½Ð¤¹¡¥
¤³¤³¤Ç¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¥ó¥°¤¬¹Ô¤ï¤ì¤ë¡¥
´Ø¿ô\verb|lookup|¤Ï¡¤½Ò¸ì¤È°ú¿ô¥ê¥¹¥È¤«¤éÀ®¤ë¥Ñ¥¿¡¼¥ó¤ò°ú¿ô¤Ë¼è¤ê¡¤
¥Ñ¥¿¡¼¥ó¤¬¥Ç¡¼¥¿¥Ù¡¼¥¹Æâ¤Î¤¤¤º¤ì¤«¤Î»ö¼Â¤Ë¥Þ¥Ã¥Á¤¹¤ë¤è¤¦¤ÊÂ«ÇûÁ´¤Æ¤«¤éÀ®¤ë¥ê¥¹¥È¤òÊÖ¤¹¡¥
\verb|lookup|¤Ï½Ò¸ì¤ËÂÐ±þ¤¹¤ë¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î¥¨¥ó¥È¥ê¤½¤ì¤¾¤ì¤Ë¤Ä¤¤¤Æ¡¤
\verb|match|¡Êxck¥Ú¡¼¥¸¡Ë¤ò¸Æ¤ó¤Ç¥Ñ¥¿¡¼¥ó¤ÈÈæ¤Ù¤ë¡¥
¥Þ¥Ã¥Á¤¬À®¸ù¤¹¤ëÅÙ¤ËÂ«Çû¤Î¥ê¥¹¥È¤¬ÊÖ¤µ¤ì¤ë¤¬¡¤
\verb|lookup|¤Ï¤½¤ì¤é¤Î¥ê¥¹¥ÈÁ´¤Æ¤«¤éÀ®¤ë¥ê¥¹¥È¤òÊÖ¤¹¡¥

\begin{verbatim}
> (lookup 'painter '(?x ?y english))
(((?Y . JOSHUA) (?X . REYNOLDS)))
\end{verbatim}

\begin{figure}\begin{center}\begin{FramedVerb}
(clear-db)
(fact painter hogarth william english)
(fact painter canale antonio venetian)
(fact painter reynolds joshua english)
(fact dates hogarth 1697 1772)
(fact dates canale 1697 1768)
(fact dates reynolds 1723 1792)
\end{FramedVerb}\end{center}
\caption{»ö¼Â¤ÎÎã¡¥}
\label{fig:AssertionOfSampleFacts}
\end{figure}

¤³¤ì¤é¤Î»ö¼Â¤Ï¡¤³°Â¦¤ÎÏÀÍý±é»»»Ò¤Ë¤è¤Ã¤Æ½èÍý¤µ¤ì¤¿¤êÁÈ¤ß¹ç¤ï¤µ¤ì¤ë¡¥
ºÇ½ª·ë²Ì¤ÏÂ«Çû¤Î½¸¹ç¤«¤éÀ®¤ë¥ê¥¹¥È¤È¤·¤ÆÊÖ¤µ¤ì¤ë¡¥
\reffig{fig:AssertionOfSampleFacts}¤Ë¼¨¤·¤¿»ö¼Â¤¬¤¢¤ë¤È¤·¤Æ¡¤
¤³¤Î¾Ï¤Î»Ï¤á¤ÎÊý¤Ç¼¨¤·¤¿Îã¤ò¼Â¹Ô¤·¤Æ¤ß¤¿¡¥
\begin{verbatim}
> (interpret-query '(and (painter ?x ?y ?z)
                         (dates ?x 1697 ?w)))
(((?W . 1768) (?Z . VENETIAN) (?Y . ANTONIO) (?X . CANALE))
 ((?W . 1772) (?Z . ENGLISH) (?Y . WILLIAM) (?X . HOGARTH)))
\end{verbatim}

°ìÈÌÂ§¤È¤·¤Æ¡¤¥¯¥¨¥ê¤òÁÈ¤ß¹ç¤ï¤»¤¿¤êÆþ¤ì»Ò¤Ë¤¹¤ëºÝ¤ËÀ©¸Â¤Ï¤Ê¤¤¡¥
¾ì¹ç¤Ë¤è¤Ã¤Æ¤Ï¥¯¥¨¥ê¤ÎÊ¸Ë¡¤Îº³ºÙ¤ÊÀ©¸Â¤¬¸²ºß²½¤¹¤ë¤¬¡¤
¤½¤ÎÅÀ¤Ë¤Ä¤¤¤Æ¤Ï¤³¤Î¥³¡¼¥É¤Î»È¤ï¤ìÊý¤ÎÎã¤ò´ö¤Ä¤«¸«¤¿¸å¤Ë¹Í¤¨¤¿Êý¤¬¤è¤¤¡¥

¥Þ¥¯¥í\verb|with-answer|¤Ï¡¤¤³¤Î¥¯¥¨¥ê¡¦¥¤¥ó¥¿¥×¥ê¥¿¤òLisp¥×¥í¥°¥é¥àÆâ¤Ç¤¦¤Þ¤¯»È¤¦ÊýË¡¤òÄó¶¡¤¹¤ë¡¥
Âè1°ú¿ô¤Ë¤ÏÇ¤°Õ¤Î²ÄÇ½¤Ê¥¯¥¨¥ê¤ò¼è¤ê¡¤»Ä¤ê¤Î°ú¿ô¤ÏËÜÂÎ¥³¡¼¥É¤È¤Ê¤ë¡¥
\verb|with-answer|¤Ï¡¤¥¯¥¨¥ê¤ÎÀ¸À®¤·¤¿Â«ÇûÁ´¤Æ¤ò½¸¤á¡¤
¥¯¥¨¥êÆâ¤ÎÊÑ¿ô¤ò¤½¤ì¤¾¤ì¤ÎÂ«Çû¤¬»ØÄê¤¹¤ëÄÌ¤ê¤ËÂ«Çû¤·¤ÆËÜÂÎ¥³¡¼¥É¤ò·«¤êÊÖ¤¹¥³¡¼¥É¤ËÅ¸³«¤µ¤ì¤ë¡¥
\verb|with-answer|¤ËÅÏ¤·¤¿¥¯¥¨¥êÆâ¤Ë½Ð¤ÆÍè¤ëÊÑ¿ô¤Ï¡ÊÂçÄñ¤Ï¡ËËÜÂÎ¥³¡¼¥ÉÆâ¤Ç¤â»È¤¨¤ë¡¥
¥¯¥¨¥ê¤¬¡¤À®¸ù¤Ï¤¹¤ë¤â¤Î¤ÎÊÑ¿ô¤ò´Þ¤Þ¤Ê¤¤¤È¤­¤Ï¡¤\verb|with-answer|¤ÏËÜÂÎ¥³¡¼¥É¤ò1ÅÙ¤À¤±É¾²Á¤¹¤ë¡¥

\begin{figure}\begin{center}
\fbox{~\,\begin{minipage}{\FrameWidth}\narrowbaselines
\vspace{3pt}\hspace{8zw}Hogarth¤È¤¤¤¦Ì¾»ú¤ÎÁ´¤Æ¤Î²è²È¤Î¥Õ¥¡¡¼¥¹¥È¥Í¡¼¥à¤È¹ñÀÒ¡¥
\begin{center}\begin{minipage}{240pt}\texttt{%
> (with-answer (painter hogarth ?x ?y)\\
     (princ (list ?x ?y)))\\
(WILLIAM ENGLISH)\\
NIL
}\end{minipage}\end{center}
\hspace{8zw}1697Ç¯¤ËÀ¸¤Þ¤ì¤¿Á´¤Æ¤Î²è²È¤Î¥é¥¹¥È¥Í¡¼¥à¡¥¡ÊºÇ½é¤ËÄó¼¨¤·¤¿Îã¡Ë
\begin{center}\begin{minipage}{240pt}\texttt{%
> (with-answer (and (painter ?x \_ \_)\\
                    (dates ?x 1697 \_))\\
    (princ (list ?x)))\\
(CANALE)(HOGARTH)\\
NIL
}\end{minipage}\end{center}
\hspace{8zw}1772Ç¯¤Þ¤¿¤Ï1792Ç¯¤ËË´¤¯¤Ê¤Ã¤¿¿Í¤Î¥é¥¹¥È¥Í¡¼¥à¤ÈÃÂÀ¸Ç¯¡¥
\begin{center}\begin{minipage}{240pt}\texttt{%
> (with-answer (or (dates ?x ?y 1772)\\
                   (dates ?x ?y 1792))\\
    (princ (list ?x ?y)))\\
(HOGARTH 1697)(REYNOLDS 1723)\\
NIL
}\end{minipage}\end{center}
\hspace{8zw}¥ô¥§¥Í¥Ä¥£¥¢¤Î²è²È¤ÎÃ¯¤È¤âÆ±¤¸Ç¯¤ËÀ¸¤Þ¤ì¤Æ¤¤¤Ê¤¤Á´¤Æ¤Î±Ñ¹ñ¿Í²è²È¤Î¥é¥¹¥È¥Í¡¼¥à¡¥
\begin{center}\begin{minipage}{240pt}\texttt{%
> (with-answer (and (painter ?x \_ english)\\
                    (dates ?x ?b \_)\\
                    (not (and (painter ?x2 \_ venetian)\\
                              (dates ?x2 ?b \_))))\\
    (princ ?x))\\
REYNOLDS\\
NIL
}\end{minipage}\end{center}
\vspace{1.3em}\end{minipage}~\,}\end{center}
\caption{¥¯¥¨¥ê¡¦¥¤¥ó¥¿¥×¥ê¥¿¤ÎÍÑÎã¡¥}
\label{fig:QueryInterpreterInUse}
\end{figure}

\reffig{fig:AssertionOfSampleFacts}¤ÇÄêµÁ¤·¤¿¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î²¼¤Ç¥¯¥¨¥ê¤ò¹Ô¤Ã¤¿Îã¤ò¡¤
\reffig{fig:QueryInterpreterInUse}¤Ë¡¤¼«Á³¸À¸ì¤Ø¤ÎËÝÌõÉÕ¤­¤Ç¼¨¤·¤¿¡¥
¥Ñ¥¿¡¼¥ó¥Þ¥Ã¥Á¥ó¥°¤¬\verb|match|¤Ë¤è¤Ã¤Æ¹Ô¤ï¤ì¤Æ¤¤¤ë¤¿¤á¡¤
¥Ñ¥¿¡¼¥óÆâ¤Ç¥¢¥ó¥À¡¼¥¹¥³¥¢¡Ê²¼Àþ¡¤\verb|_|¡Ë¤ò¥ï¥¤¥ë¥É¥«¡¼¥É¤È¤·¤Æ»È¤¨¤ë¡¥

Îã¤òÄ¹¤¯¤·¤Ê¤¤¤¿¤á¤Ë¡¤¥¯¥¨¥ê¤ÎËÜÂÎÆâ¤Ç¤Ï·ë²Ì¤ÎÉ½¼¨°Ê³°¤Î¤³¤È¤ò¹Ô¤Ã¤Æ¤¤¤Ê¤¤¡¥
¤·¤«¤·¡¤°ìÈÌ¤Ë¤Ï\verb|with-answer|¤ÎËÜÂÎ¤Ë¤ÏÇ¤°Õ¤ÎLisp¤Î¼°¤¬»È¤¨¤ë¡¥
%}}}
\subsection{Â«Çû¤Ë´Ø¤¹¤ëÀ©¸Â}   %{{{
¥¯¥¨¥ê¤¬ÊÑ¿ô¤òÂ«Çû¤¹¤ëºÝ¤ËÀ©¸Â¤¬´ö¤Ä¤«¤¢¤ë¡¥
Îã¤¨¤Ð¼¡¤Î¥¯¥¨¥ê¤Ï¡¤
\begin{verbatim}
(not (painter ?x ?y ?z))
\end{verbatim}
¤É¤¦¤·¤Æ\verb|?x|¤È\verb|?y|¤ËÂ«Çû¤ò°ìÀÚÍ¿¤¨¤Ê¤¤¤Î¤À¤í¤¦¡©\
²è²È¤ÎÆâ¤ÎÃ¯¤«¤ÎÌ¾Á°¤Ç¤Ê¤¤\verb|?x|¤È\verb|?y|¤Ë¤ÏÌµ¸ÂÄÌ¤ê¤ÎÁÈ¹ç¤»¤¬¤¢¤ë¡¥
¤è¤Ã¤Æ¡¤¼¡¤ÎÀ©¸Â¤ò²Ã¤¨¤ë¤³¤È¤Ë¤¹¤ë¡¥
±é»»»Ò\verb|not|¤Ï¡¤¼¡¤Î¤è¤¦¤Ë¡¤´û¤ËÀ¸À®¤µ¤ì¤¿Â«Çû¤ËÂÐ¤·¤Æ½èÍý¤ò¹Ô¤¦¤¬¡¤
\begin{verbatim}
(and (painter ?x ?y ?z) (not (dates ?x 1772 ?d)))
\end{verbatim}
¤½¤ì¼«¿È¤À¤±¤ÇÂ«Çû¤òºî¤Ã¤Æ¤¯¤ì¤ë¤â¤Î¤Ç¤Ï¤Ê¤¤¡¥
²è²È¤òÃµ¤·¤ÆÂ«Çû¤Î½¸¹ç¤òÀ¸À®¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤ï¤±¤À¤¬¡¤
¤½¤ì¤ò¤¹¤ë¤Î¤Ï1772Ç¯¤ËÀ¸¤Þ¤ì¤Æ¤¤¤Ê¤¤¿ÍÊª¤òÁª¤Ó½Ð¤»¤ë¤è¤¦¤Ë¤Ê¤ëÁ°¤À¡¥
Àá¤òµÕ½ç¤Ë»ØÄê¤·¤Æ¤¤¤¿¤é¡¤
\begin{verbatim}
(and (not (dates ?x 1772 ?d)) (painter ?x ?y ?z))                        ; wrong
\end{verbatim}
1772Ç¯¤ËÀ¸¤Þ¤ì¤¿²è²È¤¬°ì¿Í¤Ç¤â¤¤¤¿¤é·ë²Ì¤È¤·¤Æ\verb|nil|¤òÆÀ¤ë¤À¤í¤¦¡¥
Âè1¤ÎÎã¤Ç¤¹¤é¡¤\verb|?d|¤ÎÃÍ¤¬\verb|with-answer|¼°¤ÎÆâÉô¤Ç»È¤¨¤ë¤È´üÂÔ¤·¤Æ¤Ï¤Ê¤é¤Ê¤¤¤Î¤À¡¥

¤Þ¤¿\verb|(or q1 ... qn)|¤È¤¤¤¦·Á¤Î¼°¤Ç¤Ï¡¤
Â«Çû¤¬Í¿¤¨¤é¤ì¤ë¤³¤È¤¬ÊÝ¾Ú¤µ¤ì¤Æ¤¤¤ë¤Î¤ÏÁ´¤Æ¤Î\verb|qi|¤ÎÃæ¤Ë¸½¤ì¤ëÊÑ¿ô¤ËÂÐ¤·¤Æ¤Î¤ß¤À¡¥
\verb|with-answer|¤Ë¼¡¤Î·Á¤Î¥¯¥¨¥ê¤¬´Þ¤Þ¤ì¤Æ¤¤¤¿¤È¤­¡¤
\begin{verbatim}
(or (painter ?x ?y ?z) (dates ?x ?b ?d))
\end{verbatim}
\verb|?x|¤Ë¤ÏÉ¬¤ºÂ«Çû¤¬Í¿¤¨¤é¤ì¤ë¡¥
2¤Ä¤ÎÉôÊ¬¥¯¥¨¥ê¤Î¤É¤Á¤é¤¬À®¸ù¤·¤Æ¤â¡¤\verb|?x|¤Ë¤ÏÂ«Çû¤¬Í¿¤¨¤é¤ì¤ë¤«¤é¤À¡¥
¤·¤«¤·\verb|?y|¤È\verb|?b|¤Î¤¤¤º¤ì¤Ë¤Ä¤¤¤Æ¤â¡¤¥¯¥¨¥ê¤¬Â«Çû¤òÍ¿¤¨¤ëÊÝ¾Ú¤Ï¤Ê¤¤¡¥
¡Ê¤É¤Á¤é¤«ÊÒÊý¤ÏÉ¬¤ºÂ«Çû¤¬Í¿¤¨¤é¤ì¤ë¤Î¤À¤¬¡¥¡Ë
¥¯¥¨¥ê¤¬Â«Çû¤òÍ¿¤¨¤Ê¤«¤Ã¤¿¥Ñ¥¿¡¼¥óÊÑ¿ô¤Ï¡¤·«¤êÊÖ¤·¤ÎÆâ¤Î¤½¤Î²ó¤Î´Ö¤Ï\verb|nil|¤Ë¤Ê¤ë¡¥
%}}}
\subsection{¥¯¥¨¥ê¡¦¥³¥ó¥Ñ¥¤¥é}   %{{{
\reffig{fig:QueryInterpreter}¤Î¥³¡¼¥É¤Ï½êË¾¤ÎÆ°ºî¤ò¼Â¸½¤¹¤ë¤¬¡¤¸úÎ¨¤¬¤è¤¯¤Ê¤¤¡¥
¤³¤ì¤Ï¥¯¥¨¥ê¤Î¹½Â¤¤ò¼Â¹Ô»þ¤Ë²òÀÏ¤·¤Æ¤¤¤ë¤¬¡¤¹½Â¤¤Ï¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¤â¤¦Ê¬¤«¤Ã¤Æ¤¤¤ë¡¥
¤Þ¤¿¡¤ÊÑ¿ôÂ«Çû¤òÊÝ»ý¤¹¤ë¤¿¤á¤Ë¥ê¥¹¥È¤ò¥³¥ó¥·¥ó¥°¤·¤Æ¤¤¤ë¤¬¡¤ÊÑ¿ô¼«¿È¤ËÃÍ¤ò»ý¤¿¤»¤Æ¤â¤è¤¤¤Ï¤º¤À¡¥
¤É¤Á¤é¤ÎÌäÂêÅÀ¤â¡¤\verb|with-answer|¤ÎÊÌ¤Î¼ÂÁõ¤Ç²ò·è¤Ç¤­¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
 (defmacro with-answer (query &body body)
   `(with-gensyms ,(vars-in query #'simple?)
         ,(compile-query query `(progn ,@body))))

 (defun compile-query (q body)
   (case (car q)
        (and (compile-and (cdr q) body))
        (or     (compile-or (cdr q) body))
        (not (compile-not (cadr q) body))
        (lisp `(if ,(cadr q) ,body))
        (t      (compile-simple q body))))

 (defun compile-simple (q body)
   (let ((fact (gensym)))
        `(dolist (,fact (db-query ',(car q)))
              (pat-match ,(cdr q) ,fact ,body nil))))

 (defun compile-and (clauses body)
   (if (null clauses)
         body
         (compile-query (car clauses)
                              (compile-and (cdr clauses) body))))

 (defun compile-or (clauses body)
   (if (null clauses)
         nil
         (let ((gbod (gensym))
                  (vars (vars-in body #'simple?)))
               `(labels ((,gbod ,vars ,body))
                 ,@(mapcar #'(lambda (cl)
                                   (compile-query cl `(,gbod ,@vars)))
                              clauses)))))

 (defun compile-not (q body)
   (let ((tag (gensym)))
        `(if (block ,tag
                 ,(compile-query q `(return-from ,tag nil))
                 t)
               ,body)))
\end{FramedVerb}\end{center}
\caption{¥¯¥¨¥ê¡¦¥³¥ó¥Ñ¥¤¥é¡¥}
\label{fig:QueryCompiler}
\end{figure}

\reffig{fig:QueryCompiler}¤Ç¤Ï¿·¤·¤¤\verb|with-answer|¤òÄêµÁ¤·¤Æ¤¤¤ë¡¥
¿··¿¤Ï\verb|avg|¡Êxlx¥Ú¡¼¥¸¡Ë¤«¤é»Ï¤Þ¤ê¡¤\verb|if-match|¡Êrez¥Ú¡¼¥¸¡Ë¤Ø¤Ä¤Ê¤¬¤Ã¤¿·¹¸þ¤Ë±è¤Ã¤Æ¤¤¤ë¡¥
¤¹¤Ê¤ï¤Á¡¤µì·¿¤¬¼Â¹Ô»þ¤Ë¹Ô¤Ã¤Æ¤¤¤¿½èÍý¤ÎÂçÈ¾¤ò¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¹Ô¤Ã¤Æ¤¤¤ë¡¥
\reffig{fig:QueryCompiler}¤Î¥³¡¼¥É¤Ï°ì¸«\reffig{fig:QueryInterpreter}¤Î¥³¡¼¥É¤È»÷¤Æ¤¤¤ë¤¬¡¤
¤½¤ÎÃæ¤Î¥³¡¼¥É¤Ç¼Â¹Ô»þ¤Ë¸Æ¤Ð¤ì¤ë¤â¤Î¤Ï°ìÀÚ¤Ê¤¤¡¥
Â«Çû¤òÀ¸À®¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¯¡¤\verb|with-answer|¤ÎÅ¸³«·Á¤Î°ìÉô¤ò¤Ê¤¹¥³¡¼¥É¤òÀ¸À®¤¹¤ë¡¥
¼Â¹Ô»þ¤Ë¤Ï¡¤¤½¤Î¥³¡¼¥É¤Ï¥Ç¡¼¥¿¥Ù¡¼¥¹¤Î¸½¾õ¤Ë´ð¤Å¤¤¤Æ¥¯¥¨¥ê¤òËþ¤¿¤¹Á´¤Æ¤ÎÂ«Çû¤òÀ¸À®¤¹¤ë¡¥

\begin{figure}\begin{center}
\fbox{~\,\begin{minipage}{\FrameWidth}\narrowbaselines
\vspace{3pt}
\begin{center}\begin{minipage}{240pt}\texttt{%
(with-answer (painter ?x ?y ?z)\\
~~(format t "\~{}A \~{}A is a painter.~{}\%" ?y ?x))
}\end{minipage}\end{center}
\hspace{8zw}¤³¤ì¤Ï¥¯¥¨¥ê¡¦¥¤¥ó¥¿¥×¥ê¥¿¤Ë¤è¤ê¼¡¤Î¤è¤¦¤ËÅ¸³«¤µ¤ì¤ë¡§
\begin{center}\begin{minipage}{280pt}\texttt{%
(dolist (\#:g1 (interpret-query '(painter ?x ?y ?z)))\\
~~(let ((?x (binding '?x \#:g1))\\
~~~~~~~~(?y (binding '?y \#:g1))\\
~~~~~~~~(?z (binding '?z \#:g1)))\\
~~~~(format t "\~{}A \~{}A is a painter.\~{}\%" ?y ?x)))
}\end{minipage}\end{center}
\hspace{8zw}¤½¤·¤Æ¥¯¥¨¥ê¡¦¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤ê¼¡¤Î¤è¤¦¤ËÅ¸³«¤µ¤ì¤ë¡§
\begin{center}\begin{minipage}{280pt}\texttt{%
(with-gensyms (?x ?y ?z)\\
~~(dolist (\#:g1 (db-query 'painter))\\
~~~~(pat-match (?x ?y ?z) \#:g1\\
~~~~~~(progn\\
~~~~~~~~(format t "\~{}A \~{}A is a painter.\~{}\%" ?y ?x))\\
~~~~~~~~nil)))\\
}\end{minipage}\end{center}
\vspace{1.3em}\end{minipage}~\,}\end{center}
\caption{Æ±¤¸¥¯¥¨¥ê¤Î2ÄÌ¤ê¤ÎÅ¸³«·Á¡¥}
\label{fig:TwoExpansionsOftheSameQuery}
\end{figure}

¼ÂºÝ¤Î¤È¤³¤í¡¤¤³¤Î¥×¥í¥°¥é¥à¤Ï°ì¤Ä¤ÎµðÂç¤Ê¥Þ¥¯¥í¤Ê¤Î¤À¡¥
\reffig{fig:TwoExpansionsOftheSameQuery}¤Ë¤Ï\verb|with-answer|¤ÎÅ¸³«·Á¤ò¼¨¤·¤¿¡¥
½èÍý¤ÎÂçÈ¾¤Ï\verb|pat-match|¡Êwgc¥Ú¡¼¥¸¡Ë¤¬¹Ô¤¦¤¬¡¤¤½¤ì¤â¤Þ¤¿¥Þ¥¯¥í¤À¡¥
¤¹¤ë¤È¼Â¹Ô»þ¤ËÉ¬Í×¤Ë¤Ê¤ë¿·¤¿¤Ê´Ø¿ô¤Ï¡¤
\reffig{fig:BasicDatabaseFunc}¤Ë¼¨¤·¤¿´ðËÜÅª¥Ç¡¼¥¿¥Ù¡¼¥¹´Ø¿ô¤À¤±¤À¡¥

\verb|with-answer|¤¬¥È¥Ã¥×¥ì¥Ù¥ë¤«¤é¸Æ¤Ð¤ì¤ë¤È¡¤¥¯¥¨¥ê¤Î¥³¥ó¥Ñ¥¤¥ë¤ÏÍøÅÀ¤ò¤Û¤È¤ó¤ÉÀ¸¤«¤»¤Ê¤¤¡¥
¥¯¥¨¥ê¤òÉ½¸½¤¹¤ë¥³¡¼¥É¤ÏÀ¸À®¤µ¤ì¡¤É¾²Á¤µ¤ì¤¿¸å¡¤ÇÑ´þ¤µ¤ì¤ë¡¥
¤·¤«¤·\verb|with-answer|¤¬Lisp¥×¥í¥°¥é¥à¤ÎÃæ¤Ç»È¤ï¤ì¤¿¤È¤­¤Ï¡¤
¥¯¥¨¥ê¤ËÂÐ±þ¤¹¤ë¥³¡¼¥É¤Ï¥Þ¥¯¥íÅ¸³«¤Î°ìÉô¤È¤Ê¤ë¡¥
¤è¤Ã¤Ã¤Æ¤½¤ì¤ò´Þ¤à¥×¥í¥°¥é¥à¤¬¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤¿¤È¤­¡¤
Á´¤Æ¤Î¥¯¥¨¥ê¤ËÂÐ¤¹¤ë¥³¡¼¥É¤¬¥×¥í¥»¥¹¤ÎÃæ¤Ë¥¤¥ó¥é¥¤¥ó¤Ç¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë¡¥

¿·¼êË¡¤ÎºÇÂç¤ÎÍøÅÀ¤ÏÂ®ÅÙ¤À¤¬¡¤
\verb|with-answer|¤ò¸Æ¤Ó½Ð¤¹¥³¡¼¥É¤È¤ÎÅý¹çÀ­¤ò¹â¤á¤ë¤³¤È¤Ë¤â¤Ä¤Ê¤¬¤Ã¤Æ¤¤¤ë¡¥
¤½¤Î¤³¤È¤Ï2¤«½ê¤Î²þÁ±¤È¤·¤Æ¸½¤ï¤ì¤ë¡¥
¤Þ¤º¡¤¥¯¥¨¥êÆâÉô¤Î°ú¿ô¤¬É¾²Á¤µ¤ì¤ë¤è¤¦¤Ë¤Ê¤ë¤Î¤Ç¡¤¼¡¤Î¤è¤¦¤Ë½ñ¤±¤ë¡¥
\begin{verbatim}
> (setq my-favorite-year 1723)
1723
> (with-answer (dates ?x my-favorite-year ?d)
        (format t "~A was born in my favorite year.~%" ?x))
REYNOLDS was born in my favorite year.
NIL
\end{verbatim}
¥¯¥¨¥ê¡¦¥¤¥ó¥¿¥×¥ê¥¿¤Ç¤Ç¤­¤Ê¤¤Ìõ¤Ç¤Ï¤Ê¤¤¤¬¡¤\verb|eval|¤òÌÀ¼¨Åª¤Ë¸Æ¤Ö¤È¤¤¤¦Âå½þ¤òÊ§¤ï¤Ê¤¤¤È¤¤¤±¤Ê¤¤¡¥
¤½¤Î¤È¤­¤Ç¤µ¤¨¡¤¥¯¥¨¥ê°ú¿ôÆâ¤Î¥ì¥­¥·¥«¥ëÊÑ¿ô¤ò»²¾È¤¹¤ë¤³¤È¤ÏÌµÍý¤À¡¥

\begin{figure}\begin{center}
\fbox{~\,\begin{minipage}{\FrameWidth}\narrowbaselines
\vspace{3pt}\hspace{6zw}Hogarth¤È¤¤¤¦Ì¾»ú¤ÎÁ´¤Æ¤Î²è²È¤Î¥Õ¥¡¡¼¥¹¥È¥Í¡¼¥à¤È¹ñÀÒ¡¥
\begin{center}\begin{minipage}{320pt}\texttt{%
> (with-answer (painter 'hogarth ?x ?y)\\
~~~~(princ (list ?x ?y)))\\
(WILLIAM ENGLISH)\\
NIL
}\end{minipage}\end{center}
\hspace{6zw}¥ô¥§¥Í¥Ä¥£¥¢¤Î¤É¤Î²è²È¤È¤âÆ±¤¸Ç¯¤ËÀ¸¤Þ¤ì¤Æ¤¤¤Ê¤¤±Ñ¹ñ¿Í²è²È¤Î¥é¥¹¥È¥Í¡¼¥à¡¥
\begin{center}\begin{minipage}{320pt}\texttt{%
> (with-answer (and (painter ?x \_ 'english)\\
~~~~~~~~~~~~~~~~~~~~(dates ?x ?b \_)\\
~~~~~~~~~~~~~~~~~~~~(not (and (painter ?x2 \_ 'venetian)\\
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(dates ?x2 ?b \_))))\\
~~~~(princ ?x))\\
REYNOLDS\\
NIL
}\end{minipage}\end{center}
\hspace{6zw}1770Ç¯¤«¤é1800Ç¯¤Î´Ö¤ËË´¤¯¤Ê¤Ã¤¿Á´¤Æ¤Î²è²È¤Î¥é¥¹¥È¥Í¡¼¥à¤ÈË×Ç¯¡¥
\begin{center}\begin{minipage}{320pt}\texttt{%
> (with-answer (and (painter ?x \_ \_)\\
~~~~~~~~~~~~~~~~~~~~(dates ?x \_ ?d)\\
~~~~~~~~~~~~~~~~~~~~(lisp (< 1770 ?d 1800)))\\
~~~~(princ (list ?x ?d)))\\
(REYNOLDS 1792)(HOGARTH 1772)\\
NIL
}\end{minipage}\end{center}
\vspace{1.3em}\end{minipage}~\,}\end{center}
\caption{¥¯¥¨¥ê¡¦¥³¥ó¥Ñ¥¤¥é¤ÎÍÑÎã¡¥}
\label{fig:QueryCompilerInUse}
\end{figure}

¥¯¥¨¥êÆâÉô¤Î°ú¿ô¤¬É¾²Á¤µ¤ì¤ë¤è¤¦¤Ë¤Ê¤ê¡¤
É¾²Á·ë²Ì¤¬¼«Ê¬¼«¿È¤Ë¤Ê¤é¤Ê¤¤Ç¤°Õ¤Î¥ê¥Æ¥é¥ë°ú¿ô¡Ê¼«Á³¸À¸ìÊ¸¤Ê¤É¡Ë¤Ë¤Ï¥¯¥©¡¼¥È¤ò¤Ä¤±¤ëÉ¬Í×¤¬¤¢¤ë¡¥
¡Ê\reffig{fig:QueryCompilerInUse}¤ò»²¾È¡Ë

¿·¼êË¡¤ÎÍøÅÀ¤½¤Î2¤Ï¡¤°ìÈÌ¤ÎLisp¤Î¼°¤ò¥¯¥¨¥êÆâ¤Ëº®¤¼¤ë¤³¤È¤¬¤º¤Ã¤ÈÍÆ°×¤Ë¤Ê¤Ã¤¿¤³¤È¤À¡¥
¥¯¥¨¥ê¡¦¥³¥ó¥Ñ¥¤¥é¤Ç¤Ï¥ª¥Ú¥ì¡¼¥¿\verb|lisp|¤òÄÉ²Ã¤µ¤ì¤¿¤¬¡¤¤½¤ì¤Ë¤ÏÇ¤°Õ¤ÎLisp¼°¤òÂ³¤±¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
±é»»»Ò\verb|not|¤ÈÆ±ÍÍ¡¤\verb|lisp|¼«¿È¤ÏÂ«Çû¤òºî¤ì¤Ê¤¤¤¬¡¤
¼°¤¬\verb|nil|¤òÊÖ¤¹¤è¤¦¤ÊÂ«Çû¤òÁª¤Ó½Ð¤¹¤³¤È¤Ï¤Ç¤­¤ë¡¥
¥ª¥Ú¥ì¡¼¥¿\verb|lisp|¤Ï \verb|>| ¤Ê¤É¤ÎÁÈ¹þ¤ß½Ò¸ì¤òÍøÍÑ¤¹¤ë¤Î¤ËÊØÍø¤À¡¥
\begin{verbatim}
> (with-answer (and (dates ?x ?b ?d)
                    (lisp (> (- ?d ?b) 70)))
               (format t "~A lived over 70 years.~%" ?x))
CANALE lived over 70 years.
HOGARTH lived over 70 years.
NIL
\end{verbatim}

¹âÅÙ¤Ëºî¤ê¤³¤Þ¤ì¤¿Ëä¤á¹þ¤ß¸À¸ì¤Ï¡¤
´ðÈ×¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤È°ìÂÎ²½¤·¤¿¥¤¥ó¥¿¥Õ¥§¥¤¥¹¤ò»ý¤Ä¤³¤È¤¬¤Ç¤­¤ë¡¥

¤³¤ì¤é¤ÎÄÉ²Ãµ¡Ç½\wadash °ú¿ô¤ÎÉ¾²Á¤È¥ª¥Ú¥ì¡¼¥¿\verb|lisp|\wadash ¤ò½ü¤±¤Ð¡¤
¥¯¥¨¥ê¡¦¥³¥ó¥Ñ¥¤¥é¤ÎÄó¶¡¤¹¤ë¥¯¥¨¥ê¸À¸ì¤Ï¥¤¥ó¥¿¥×¥ê¥¿¤ÎÄó¶¡¤¹¤ë¤â¤Î¤ÈÆ±¤¸¤À¡¥
\reffig{fig:QueryCompilerInUse}¤Ë¤Ï¡¤
\reffig{fig:AssertionOfSampleFacts}¤ÇÄêµÁ¤µ¤ì¤¿¥Ç¡¼¥¿¥Ù¡¼¥¹¤Ë´ð¤Å¤¤¤¿
¥¯¥¨¥ê¡¦¥³¥ó¥Ñ¥¤¥é¤ÎÆ°ºî·ë²Ì¤ÎÎã¤ò¼¨¤·¤¿¡¥

Âè17.2Àá¤Ç¤Ï¡¤¼°¤ò¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤³¤È¤¬\verb|eval|¤Ë¥ê¥¹¥È¤È¤·¤ÆÅÏ¤¹¤³¤È¤è¤êÍ¥¤ì¤Æ¤¤¤ëÍýÍ³¤ò2¤Äµó¤²¤¿¡¥
¥³¥ó¥Ñ¥¤¥ë¤·¤¿Êý¤¬Â®¤¤¤·¡¤¼°¤ò¤½¤Î³°Â¦¤Î¥ì¥­¥·¥«¥ë´Ä¶­Æâ¤ÇÉ¾²Á¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
¥¯¥¨¥ê¤Î¥³¥ó¥Ñ¥¤¥ë¤ÎÍøÅÀ¤âÁ´¤¯Æ±¤¸¤³¤È¤À¡¥
º£¤Þ¤Ç¼Â¹Ô»þ¤Ë¹Ô¤ï¤ì¤Æ¤¤¤¿½èÍý¤¬¡¤¥³¥ó¥Ñ¥¤¥ë»þ¤Ë¹Ô¤ï¤ì¤ë¤è¤¦¤Ë¤Ê¤Ã¤¿¡¥
¥¯¥¨¥ê¤¬¤½¤Î³°Â¦¤ÎLisp¥³¡¼¥É¤ÎÃÇÊÒ¤È¶¦¤Ë¥³¥ó¥Ñ¥¤¥ë¤µ¤ì¤ë¤»¤¤¤Ç¡¤¥ì¥­¥·¥«¥ë¡¦¥³¥ó¥Æ¥­¥¹¥È¤¬³èÍÑ¤Ç¤­¤ë¡¥
%}}}
% }}}
\section{·ÑÂ³} %{{{
·ÑÂ³¤È¤Ï¡¤Æ°ºîÃæ¤ËÅà·ë¤·¤¿¥×¥í¥°¥é¥à¤À¡¥
¤¹¤Ê¤ï¤Á·×»»½èÍý¤Î¾õÂÖ¤ò´Þ¤ó¤À°ì¤Ä¤Î´Ø¿ôÅª¥ª¥Ö¥¸¥§¥¯¥È¤À¡¥
ÊÝÂ¸¤µ¤ì¤¿·×»»½èÍý¤Ï¡¤¤½¤ì¤¬ÃæÃÇ¤µ¤ì¤¿»þÅÀ¤«¤éºÆ³«¤¹¤ë¡¥
¥×¥í¥°¥é¥à¤Î¾õÂÖ¤òÊÝÂ¸¤·¡¤¸å¤ËºÆ³«¤Ç¤­¤ëÇ½ÎÏ¤Ï¡¤¤¢¤ë¼ï¤ÎÌäÂê²ò·è¤ËÁÇÀ²¤·¤¤°ÒÎÏ¤òÈ¯´ø¤¹¤ë¡¥
Îã¤¨¤ÐÊÂÎó½èÍý¤Ç¤Ï¡¤ÃæÃÇ¤µ¤ì¤¿¥×¥í¥»¥¹¤ò·ÑÂ³¤ÇÉ½¤¹¤Î¤¬ÊØÍø¤À¡¥
Èó·èÄêÅªÃµº÷ÌäÂê¤Ç¤Ï¡¤·ÑÂ³¤ÏÃµº÷¥Ä¥ê¡¼¤Î¥Î¡¼¥É¤òÉ½¸½¤Ç¤­¤ë¡¥

·ÑÂ³¤ÎÍý²ò¤ÏÆñ¤·¤¤¤«¤âÃÎ¤ì¤Ê¤¤¡¥
¤³¤Î¾Ï¤Ç¤Ï¤½¤ÎÏÃÂê¤Ë2ÃÊ³¬¤Ç¼è¤êÁÈ¤à¡¥
¤³¤Î¾Ï¤ÎÁ°È¾¤Ç¤Ï·ÑÂ³¤ÎÁÈ¹þ¤ß¥µ¥Ý¡¼¥È¤Î¤¢¤ëScheme¤Ç¤ÎÍÑÎã¤ò¸«¤ë¡¥
·ÑÂ³¤Î¿¶Éñ¤òÀâÌÀ¤·½ª¤ï¤Ã¤¿¤é¡¤¸åÈ¾¤Ç¤ÏCommon Lisp¥×¥í¥°¥é¥à¤Ç·ÑÂ³¤òÀ¸À®¤¹¤ë¥Þ¥¯¥í¤Î»È¤¤Êý¤ò¼¨¤¹¡¥
Âè22--24¾Ï¤Î¤¤¤º¤ì¤Ç¤â¡¤¤³¤³¤ÇÄêµÁ¤·¤¿¥Þ¥¯¥í¤òÍøÍÑ¤¹¤ë¡¥
\subsection{Scheme¤Î·ÑÂ³}   %{{{
\begin{figure}\begin{center}
\fbox{~\,\begin{minipage}{\FrameWidth}\narrowbaselines
\vspace{3pt}
\begin{center}\begin{minipage}{.85\textwidth}
Common Lisp¤Ç¥·¥ó¥Ü¥ë¤Î¡Ö¥·¥ó¥Ü¥ëÃÍ¡×¤È¡Ö¥·¥ó¥Ü¥ë´Ø¿ô¡×¤È¸Æ¤Ö¤â¤Î¤òScheme¤Ç¤Ï¶èÊÌ¤·¤Ê¤¤¡¥
Scheme¤ÎÊÑ¿ô¤ÏÃ±°ì¤ÎÃÍ¤ò»ý¤Ä¤¬¡¤¤½¤ì¤Ï´Ø¿ô¤Ç¤â²¿¤é¤«¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ç¤â¤è¤¤¡¥
¤½¤Î¤¿¤á¡¤¥·¥ã¡¼¥×¡¦¥¯¥©¡¼¥È¤ä\texttt{funcall}¤ÏScheme¤Ç¤ÏÉ¬Í×¤Ê¤¤¡¥
Common Lisp¤Î¤³¤Î¥³¡¼¥É¤Ï¡¤
\\[4pt] \texttt{%
(let ((f \#'(lambda (x) (1+ x))))\\
~~(funcall f 2))\\[4pt]
}
Scheme¤Ç¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ë¡¥
\\[4pt] \texttt{%
(let ((f (lambda (x) (1+ x))))
~~(f 2))\\[4pt]
}
Scheme¤ÎÌ¾Á°¶õ´Ö¤Ï1¤Ä¤À¤±¤Ê¤Î¤Ç¡¤ÂåÆþ¤¹¤ë¤¿¤á¤Î¥ª¥Ú¥ì¡¼¥¿¤¬¤½¤ì¤¾¤ì¸ÄÊÌ¤Ë
¡Ê\texttt{defun}¤È\texttt{setq}¤Î¤è¤¦¤Ë¡ËÂ¸ºß¤·¤Ê¤¯¤Æ¤â¤è¤¤¡¥
Âå¤ï¤ê¤Ë\texttt{defvar}¤Ë»÷¤¿\texttt{define}¤È¡¤
\texttt{setq}¤ÎÂå¤ï¤ê¤Ë¤Ê¤ë\texttt{set!}\,¤¬Â¸ºß¤¹¤ë¡¥
¥°¥í¡¼¥Ð¥ëÊÑ¿ô¤Ï\texttt{define}¤ÇÄêµÁ¤·¤Æ¤«¤é¤Ç¤Ê¤¤¤È\texttt{set!}\,¤ÇÃÍ¤òÀßÄê¤Ç¤­¤Ê¤¤¡¥

Scheme¤Ç¤ÏÌ¾Á°¤ÎÉÕ¤¤¤¿´Ø¿ô¤ÏÉáÄÌ¤Ï\texttt{define}¤ÇÄêµÁ¤µ¤ì¤ë¡¥
\texttt{defvar}¤À¤±¤Ç¤Ê¤¯\texttt{defun}¤ÎÌò³ä¤â¤¢¤ë¤Î¤À¡¥
Common Lisp¤Î¤³¤Î¥³¡¼¥É¤Ï¡¤
\\[4pt] \texttt{%
(defun foo (x) (1+ x))\\[4pt]
}
Scheme¤Ç¤Ï2ÄÌ¤ê¤Ë½ñ¤±¤ë¡¥
\\[4pt] \texttt{%
(define foo (lambda (x) (1+ x)))\\
(define (foo x) (1+ x))
} \vspace*{4pt}

Common Lisp¤Ç¤Ï¡¤´Ø¿ô¤Î°ú¿ô¤Ïº¸¤«¤é±¦¤Î½ç¤ËÉ¾²Á¤µ¤ì¤ë¡¥
Scheme¤Ç¤ÏÉ¾²Á½ç¤Ï°Õ¿ÞÅª¤ËÌ¤ÄêµÁ¤È¤µ¤ì¤¿¡¥
¡Ê¤½¤ì¤òËº¤ì¤¿¿Í´Ö¤Ï¹²¤Æ¤Õ¤¿¤á¤¤¤Æ¼ÂÁõ¼Ô¤Î¾Ð¤¤¤â¤Î¤Ë¤Ê¤ë¡¥¡Ë

\texttt{t}¤È\texttt{nil}¤ÎÂå¤ï¤ê¤Ë¡¤Scheme¤Ë¤Ï\,\texttt{\#t}¤È\,\texttt{\#f}¤¬¤¢¤ë¡¥
¶õ¥ê¥¹¥È\texttt{()}¤ò¿¿¤ËÉ¾²Á¤¹¤ë½èÍý·Ï¤â¤¢¤ì¤Ð
µ¶¤ËÉ¾²Á¤¹¤ë½èÍý·Ï¤â¤¢¤ë¡¥

¥ª¥Ú¥ì¡¼¥¿\texttt{cond}¤Ç¤Ï\texttt{default}Àá¡¤¥ª¥Ú¥ì¡¼¥¿\texttt{case}¤Ç¤Ï¥­¡¼\texttt{else}¤¬»È¤¨¤ë¤¬¡¤
¤³¤ì¤é¤ÏCommon Lisp¤Î\texttt{t}¤ÎÌò³ä¤ò»ý¤Ä¡¥

ÁÈ¹þ¤ß¥ª¥Ú¥ì¡¼¥¿¤ÎÌ¾Á°¤¬°ã¤¦¡¥\texttt{consp}¤¬\texttt{pair?}¤Ç\texttt{null}¤¬\texttt{null?}¡¤
\texttt{mapcar}¤Ï¡Ê¤Û¤Ü¡Ë\texttt{map}¤ËÂÐ±þ¤¹¤ë¡¤Åù¡¥
ÉáÄÌ¡¤Ê¸Ì®¤«¤é°ã¤¤¤ÏÌÀ¤é¤«¤À¡¥
\end{minipage}\end{center}
\vspace{1.3em}\end{minipage}~\,}\end{center}
\caption{Scheme¤ÈCommon Lisp¤ÎÁê°ÛÅÀ¡¥}
\label{fig:SomeDifferences}
\end{figure}

Scheme¤ÈCommon Lisp¤Î¼çÍ×¤ÊÁê°ÛÅÀ¤Ë¤Ï¡¤·ÑÂ³¤òÌÀ¼¨Åª¤Ë¥µ¥Ý¡¼¥È¤¹¤ëÅÀ¤¬¤¢¤ë¡¥
¤³¤ÎÀá¤Ç¤ÏScheme¤Ç·ÑÂ³¤¬¤É¤Î¤è¤¦¤ËÆ°ºî¤¹¤ë¤«¤ò¼¨¤¹¡¥
¡Ê\reffig{fig:SomeDifferences}¤Ë¤ÏScheme¤ÈCommon Lisp¤ÎÂ¾¤ÎÁê°ÛÅÀ¤òÎóµó¤·¤¿¡¥¡Ë

·ÑÂ³¤Ï·×»»½èÍý¤ÎÌ¤Íè¤òÉ½¸½¤¹¤ë´Ø¿ô¤À¡¥
¼°¤¬É¾²Á¤µ¤ì¤ë¤È¤­¤Ë¤Ï¡¤É¬¤º²¿¤«¤¬¤½¤ÎÊÖ¤êÃÍ¤òÂÔ¤Ã¤Æ¤¤¤ë¡¥
Îã¤¨¤Ð¼¡¤Î¥³¡¼¥É¤Ç\verb|(- x 1)|¤¬É¾²Á¤µ¤ì¤¿»þÅÀ¤Ç¤Ï¡¤
\begin{verbatim}
(/ (- x 1) 2)
\end{verbatim}
³°Â¦¤Î \verb|/| ¼°¤¬¤½¤ÎÃÍ¤òÂÔ¤Ã¤Æ¤ª¤ê¡¤¤µ¤é¤ËÊÌ¤Î²¿¤«¤¬ \verb|/| ¼°¤ÎÃÍ¤òÂÔ¤Ã¤Æ¤¤¤ë\ldots
Åù¤¬¡¤\verb|print|¤ÎÂÔ¤Ã¤Æ¤¤¤ë¥È¥Ã¥×¥ì¥Ù¥ë¤Þ¤Ç±ä¡¹¤ÈÂ³¤¯¡¥

Ç¤°Õ¤Î»þÅÀ¤Î·ÑÂ³¤Ï¡¤1°ú¿ô´Ø¿ô¤È¹Í¤¨¤é¤ì¤ë¡¥
¾å¤ÎÎã¤¬¥È¥Ã¥×¥ì¥Ù¥ë¤ËÂÇ¤Á¹þ¤Þ¤ì¤¿¤È¤­¡¤
ÉôÊ¬¼°\verb|(- x 1)|¤¬É¾²Á¤µ¤ì¤¿»þÅÀ¤Ç¤Î·ÑÂ³¤Ï¼¡¤Î¤è¤¦¤Ë¹Í¤¨¤é¤ì¤ë¡¥
\begin{verbatim}
(lambda (val) (/ val 2))
\end{verbatim}
¤¹¤Ê¤ï¤Á·×»»½èÍý¤Î»Ä¤ê¤Ï\verb|(- x 1)|¤ÎÊÖ¤êÃÍ¤ò¾å¤Î´Ø¿ô¤ËÍ¿¤¨¤ë¤³¤È¤ÇÌÏÊï¤Ç¤­¤ë¡¥
¤Þ¤¿¡¤¼°\verb|(- x 1)|¤¬¼¡¤ÎÊ¸Ì®¤ÎÃæ¤Ë¸½¤ï¤ì¤Æ¤ª¤ê¡¤\verb|f1|¤¬¥È¥Ã¥×¥ì¥Ù¥ë¤«¤é¸Æ¤Ð¤ì¤¿¾ì¹ç¤Ï¡¤
\begin{verbatim}
(define (f1 w)
  (let ((y (f2 w)))
    (if (integer? y) (list 'a y) 'b)))

(define (f2 x)
  (/ (- x 1) 2))
\end{verbatim}
\verb|(- x 1)|¤¬É¾²Á¤µ¤ì¤¿»þÅÀ¤Ç¤Î·ÑÂ³¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ë¡¥
\begin{verbatim}
(lambda (val)
  (let ((y (/ val 2)))
    (if (integer? y) (list 'a y) 'b)))
\end{verbatim}

Scheme¤Ç¤Ï¡¤·ÑÂ³¤Ï´Ø¿ô¤ÈÆ±³Ê¤Î¥Õ¥¡¡¼¥¹¥È¥¯¥é¥¹¡¦¥ª¥Ö¥¸¥§¥¯¥È¤À¡¥
Scheme¤Ç¤Ï¸½ºß¤Î·ÑÂ³ (current continuation) ¤òµá¤á¤ë¤È·×»»½èÍý¤ÎÌ¤Íè¤òÉ½¸½¤¹¤ë1°ú¿ô´Ø¿ô¤¬ÆÀ¤é¤ì¤ë¡¥
¤³¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ï¹¥¤­¤Ê¤è¤¦¤ËÊÝÂ¸¤Ç¤­¤ë¤·¡¤
ÊÝÂ¸¤·¤¿·ÑÂ³¤ò¸Æ¤Ó½Ð¤»¤Ð¡¤¤½¤ì¤¬À¸À®¤µ¤ì¤¿»þÅÀ¤Ç»Ï¤Þ¤í¤¦¤È¤·¤Æ¤¤¤¿·×»»½èÍý¤òºÆ³«¤¹¤ë¡¥

·ÑÂ³¤Ï¥¯¥í¡¼¥¸¥ã¤Î°ìÈÌ²½¤È¤·¤ÆÍý²ò¤Ç¤­¤ë¡¥
¥¯¥í¡¼¥¸¥ã¤È¤Ï¡¤´Ø¿ô¤È¤½¤ì¤¬À¸À®¤µ¤ì¤¿»þÅÀ¤Ç¸«¤¨¤Æ¤¤¤¿¥ì¥­¥·¥«¥ëÊÑ¿ô¤Ø¤Î¥Ý¥¤¥ó¥¿¤ò¤Þ¤È¤á¤¿¤â¤Î¤À¤Ã¤¿¡¥
·ÑÂ³¤È¤Ï¡¤´Ø¿ô¤È¤½¤ì¤¬À¸À®¤µ¤ì¤¿»þÅÀ¤ÇÎ¯¤Ã¤Æ¤¤¤ë¥¹¥¿¥Ã¥¯Á´ÂÎ¤Ø¤Î¥Ý¥¤¥ó¥¿¤ò¤Þ¤È¤á¤¿¤â¤Î¤À¡¥
·ÑÂ³¤¬É¾²Á¤µ¤ì¤ë¤È¡¤¸½ºß¤Î¥¹¥¿¥Ã¥¯¤òÌµ»ë¤·¡¤¤½¤ì¤¬ÊÝ»ý¤·¤Æ¤¤¤ë¥¹¥¿¥Ã¥¯¤Î¥³¥Ô¡¼¤Ë´ð¤Å¤¤¤ÆÃÍ¤òÊÖ¤¹¡¥
·ÑÂ³¤¬\verb|T1|¤ÇÀ¸À®¤µ¤ì\verb|T2|¤ÇÉ¾²Á¤µ¤ì¤¿¾ì¹ç¡¤
\verb|T1|¤Ë¤ª¤¤¤ÆÎ¯¤Ã¤Æ¤¤¤ë¥¹¥¿¥Ã¥¯¤Ë´ð¤Å¤¤¤¿É¾²Á¤¬¹Ô¤ï¤ì¤ë¡¥

Scheme¥×¥í¥°¥é¥à¤ÏÁÈ¹þ¤ß¥ª¥Ú¥ì¡¼¥¿\verb|call-with-current-continuation|¡ÊÎ¬¤·¤Æ\verb|call/cc|¡Ë
¤òÄÌ¤¸¤Æ¸½ºß¤Î·ÑÂ³¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤ë¡¥
¥×¥í¥°¥é¥à¤¬\verb|call/cc|¤ò1°ú¿ô´Ø¿ô¤ËÂÐ¤·¤Æ¸Æ¤Ó½Ð¤¹¤È¡¤
\begin{verbatim}
(call-with-current-continuation
  (lambda (cc)
    ...))
\end{verbatim}
¤½¤Î1°ú¿ô´Ø¿ô¤Ë¤Ï¸½ºß¤Î·ÑÂ³¤òÉ½¸½¤¹¤ëÊÌ¤Î´Ø¿ô¤¬ÅÏ¤µ¤ì¤ë¡¥
¾å¤Ç\verb|cc|¤ÎÃÍ¤ò¤É¤³¤«¤ËÊÝÂ¸¤¹¤ë¤³¤È¤Ç¡¤\verb|call/cc|¤Î»þÅÀ¤Ç¤Î·×»»½èÍý¤Î¾õÂÖ¤¬ÊÝÂ¸¤Ç¤­¤ë¡¥

¾å¤ÎÎã¤Ç¤Ï¡¤
ºÇ¸å¤ÎÍ×ÁÇ¤¬\verb|call/cc|¼°¤ÎÊÖ¤êÃÍ¤Ç¤¢¤ë¤è¤¦¤Ê¥ê¥¹¥È¤Ë\verb|append|¤òÅ¬ÍÑ¤·¤Æ¤¤¤ë¡¥
\begin{verbatim}
> (define frozen)
FROZEN
> (append '(the call/cc returned)
          (list (call-with-current-continuation
                  (lambda (cc)
                    (set! frozen cc)
                    'a))))
(THE CALL/CC RETURNED A)
\end{verbatim}
\verb|call/cc|¤Ï\verb|a|¤òÊÖ¤¹¤¬¡¤ºÇ½é¤Ë·ÑÂ³¤ò¥°¥í¡¼¥Ð¥ëÊÑ¿ô\verb|frozen|¤ËÊÝÂ¸¤¹¤ë¡¥

\verb|frozen|¤ò¸Æ¤Ó½Ð¤¹¤È¡¤\verb|call/cc|¤Î»þÅÀ¤Ç¤Î¸Å¤¤·×»»¤¬ºÆ³«¤µ¤ì¤ë¡¥
\verb|frozen|¤ËÅÏ¤·¤¿ÃÍ¤Ï¡¤¤¤¤º¤ì¤â\verb|call/cc|¤ÎÊÖ¤êÃÍ¤Ë¤Ê¤ë¡¥
\begin{verbatim}
> (frozen 'again)
(THE CALL/CC RETURNED AGAIN)
\end{verbatim}

·ÑÂ³¤Ï¡¤É¾²Á¤µ¤ì¤Æ¤â¾ÃÈñ¤Ï¤µ¤ì¤Ê¤¤¡¥Â¾¤ÎÉáÄÌ¤Î´Ø¿ô¤ÈÆ±ÍÍ¡¤·«¤ê¤«¤¨¤·¸Æ¤Ö¤³¤È¤â¤Ç¤­¤ë¡¥
\begin{verbatim}
> (frozen 'thrice)
(THE CALL/CC RETURNED THRICE)
\end{verbatim}

·ÑÂ³¤òÂ¾¤Î½èÍý¤ÎÆâÉô¤Ç¸Æ¤Ö¤È¤­¡¤¸Å¤¤¥¹¥¿¥Ã¥¯¤ËÎ©¤ÁÌá¤ë¤³¤È¤Î°ÕÌ£¤¬¤Ï¤Ã¤­¤ê¸«¤¨¤ë¤è¤¦¤Ë¤Ê¤ë¡¥
\begin{verbatim}
> (+ 1 (frozen 'safely))
(THE CALL/CC RETURNED SAFELY)
\end{verbatim}
¤³¤³¤Ç¤Ï¡¤\verb|frozen|¤¬¸Æ¤Ð¤ì¤ë¤È·ë²Ì¤òÂÔ¤Ã¤Æ¤¤¤ë \verb|+| ¤ÏÌµ»ë¤µ¤ì¤ë¡¥
\verb|frozen|¤Ï¡¤ºÇ½é¤ËÀ¸À®¤µ¤ì¤¿»þÅÀ¤ÇÎ¯¤Ã¤Æ¤¤¤¿¥¹¥¿¥Ã¥¯¤Ë½¾¤¤¡¤
¤Þ¤º\verb|list|¡¤¼¡¤Ë\verb|append|¤òÄÌ¤¸¡¤¥È¥Ã¥×¥ì¥Ù¥ë¤Þ¤ÇÌá¤ë¡¥
\verb|frozen|¤¬ÉáÄÌ¤Î´Ø¿ô¸Æ¤Ó½Ð¤·¤ÈÆ±ÍÍ¤ËÃÍ¤òÊÖ¤·¤Æ¤¤¤¿¤é¡¤
¾å¤Î¼°¤Ï \verb|+| ¤¬\verb|1|¤ò¥ê¥¹¥È¤ËÂ­¤·»»¤·¤è¤¦¤È¤·¤¿¤³¤È¤Ç¥¨¥é¡¼¤Ë¤Ê¤Ã¤Æ¤¤¤¿¤À¤í¤¦¡¥

·ÑÂ³¤Ï¥¹¥¿¥Ã¥¯¤Î¥³¥Ô¡¼¤ò¸ÄÊÌ¤ËÊÝ»ý¤¹¤ë¤Î¤Ç¤Ï¤Ê¤¤¡¥
Â¾¤Î·ÑÂ³¤ä¡¤¿Ê¹ÔÃæ¤Î·×»»½èÍý¤ÈÊÑ¿ô¤ò¶¦Í­¤Ç¤­¤ë¡¥
¼¡¤ÎÎã¤Ç¤Ï¡¤2¤Ä¤Î·ÑÂ³¤¬Æ±¤¸¥¹¥¿¥Ã¥¯¤ò¶¦Í­¤·¤Æ¤¤¤ë¡¥
\begin{verbatim}
> (define froz1)
FROZ1
> (define froz2)
FROZ2
> (let ((x 0))
    (call-with-current-continuation
      (lambda (cc)
        (set! froz1 cc)
        (set! froz2 cc)))
    (set! x (1+ x))
    x)
1
\end{verbatim}
¤è¤Ã¤Æ¤É¤Á¤é¤ò¸Æ¤ó¤Ç¤â1¤º¤ÄÁý¤¨¤ë¿ôÎó¤¬ÆÀ¤é¤ì¤ë¡¥
\begin{verbatim}
> (froz2 ())
2
> (froz1 ())
3
\end{verbatim}
\verb|call/cc|¼°¤ÎÃÍ¤ÏÇË´þ¤µ¤ì¤ë¤Î¤Ç¡¤\verb|froz1|¤ä\verb|froz2|¤ËÍ¿¤¨¤ë°ú¿ô¤Ï²¿¤Ç¤â¤è¤¤¡¥

\begin{figure}\begin{center}\begin{FramedVerb}



\end{FramedVerb}\end{center}
\caption{2¤Ä¤Î¥Ä¥ê¡¼}
\label{fig:TwoTrees}
\end{figure}

¤µ¤Æ¡¤·×»»½èÍý¤Î¾õÂÖ¤òÊÝÂ¸¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤Ã¤¿Ìõ¤À¤¬¡¤¤½¤ì¤Ç²¿¤ò¤¹¤ì¤Ð¤è¤¤¤Î¤À¤í¤¦¡©\
Âè21--24¾Ï¤Ï·ÑÂ³¤ò»È¤¦¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ë½¼¤Æ¤é¤ì¤Æ¤¤¤ë¡¥
¤³¤³¤Ç¤Ï¡ÖÊÝÂ¸¤µ¤ì¤¿¾õÂÖ¡×¤ò»È¤¦¥×¥í¥°¥é¥ß¥ó¥°¤ÎÊ·°Ïµ¤¤¬¤è¤¯¸½¤ï¤ì¤ëÃ±½ã¤ÊÎã¤ò¹Í¤¨¤è¤¦¡¥
¥Ä¥ê¡¼¤Î½¸¹ç¤¬Í¿¤¨¤é¤ì¤¿¤È¤­¡¤
³Æ¥Ä¥ê¡¼¤«¤éÍ×ÁÇ¤ò1¤Ä¤º¤Ä¼è¤Ã¤Æºî¤Ã¤¿¥ê¥¹¥È¤ò¡¤²¿¤é¤«¤Î¾ò·ï¤òËþ¤¿¤¹ÁÈ¹ç¤»¤Ë¤Ê¤ë¤Þ¤ÇÀ¸À®¤·¤è¤¦¡¥

¥Ä¥ê¡¼¤ÏÆþ¤ì»Ò¤Ë¤Ê¤Ã¤¿¥ê¥¹¥È¤È¤·¤ÆÉ½¸½¤Ç¤­¤ë¡¥
grq¥Ú¡¼¥¸¤Ç¤Ï¤¢¤ë¼ï¤Î¥Ä¥ê¡¼¤ò¥ê¥¹¥È¤È¤·¤ÆÉ½¸½¤¹¤ëÊýË¡¤òÀâÌÀ¤·¤¿¡¥
¤³¤³¤Ç¤ÏÊÌ¤ÎÊýË¡¤ò»È¤¤¡¤ÆâÉô¥Î¡¼¥É¤¬¡Ê¥¢¥È¥à¤Î¡ËÃÍ¤ò»ý¤Æ¡¤Ç¤°Õ¸Ä¤Î»Ò¤ò»ý¤Æ¤ë¤è¤¦¤Ë¤·¤¿¡¥
¤³¤ÎÉ½¸½¤Ç¤Ï¡¤ÆâÉô¥Î¡¼¥É¤Ï¥ê¥¹¥È¤Ë¤Ê¤ë¡¥
CarÉô¤Ï¥Î¡¼¥É¤È¤·¤Æ¤ÎÃÍ¤òÊÝ»ý¤·¡¤cdrÉô¤Ï¤½¤Î¥Î¡¼¥É¤Î»Ò¤ÎÉ½¸½¤òÊÝ»ý¤¹¤ë¡¥
Îã¤¨¤Ð\reffig{fig:TwoTrees}¤Î2¤Ä¤Î¥Ä¥ê¡¼¤Ï¼¡¤Î¤è¤¦¤ËÉ½¸½¤Ç¤­¤ë¡¥
\begin{verbatim}
(define t1 '(a (b (d h)) (c e (f i) g)))
(define t2 '(1 (2 (3 6 7) 4 5)))
\end{verbatim}

\begin{figure}\begin{center}\begin{FramedVerb}
(define (dft tree)
  (cond ((null? tree) ())
        ((not (pair? tree)) (write tree))
        (else (dft (car tree))
              (dft (cdr tree)))))

(define *saved* ())

(define (dft-node tree)
  (cond ((null? tree) (restart))
        ((not (pair? tree)) tree)
        (else (call-with-current-continuation
                (lambda (cc)
                  (set! *saved*
                    (cons (lambda ()
                            (cc (dft-node (cdr tree))))
                          *saved*))
                  (dft-node (car tree)))))))

(define (restart)
  (if (null? *saved*)
      'done
      (let ((cont (car *saved*)))
        (set! *saved* (cdr *saved*))
        (cont))))

(define (dft2 tree)
  (set! *saved* ())
  (let ((node (dft-node tree)))
    (cond ((eq? node 'done) ())
          (else (write node)
                (restart)))))
\end{FramedVerb}\end{center}
\caption{·ÑÂ³¤ò»È¤Ã¤¿¥Ä¥ê¡¼¤ÎÃµº÷¡¥}
\label{fig:TraversalUsingCont}
\end{figure}

\reffig{fig:TraversalUsingCont}¤Ë¤Ï¤½¤Î¤è¤¦¤Ê¥Ä¥ê¡¼¤ËÂÐ¤·¤Æ¿¼¤µÍ¥ÀèÃµº÷¤ò¹Ô¤¦´Ø¿ô¤ò¼¨¤·¤¿¡¥
¼ÂºÝ¤Î¥×¥í¥°¥é¥à¤Ç¤Ï¡¤¥Î¡¼¥É¤Ë¹Ô¤­Ãå¤¯¤´¤È¤Ë¤½¤ì¤ËÂÐ¤·¤Æ²¿¤«¤Î½èÍý¤ò¤·¤¿¤¯¤Ê¤ë¡¥
¤³¤³¤Ç¤ÏÃ±¤ËÉ½¼¨¤¹¤ë¤À¤±¤À¡¥
Èæ³Ó¤ËÍÑ¤¤¤ë´Ø¿ô\verb|dft|¤Ï¡¤ÄÌ¾ï¤Î¿¼¤µÍ¥ÀèÃµº÷¤ò¹Ô¤¦¡¥
\begin{verbatim}
> (dft t1)
ABDHCEFIG()
\end{verbatim}

´Ø¿ô\verb|dft-node|¤ÎÊý¤Ï¡¤¥Ä¥ê¡¼¤ÎÃ©¤êÊý¤ÏÆ±¤¸¤À¤¬¥Î¡¼¥É¤ò¸ÄÊÌ¤Ë°·¤¦¡¥
\verb|dft-node|¤¬¥Î¡¼¥É¤ËÃ£¤¹¤ë¤È¡¤¥Î¡¼¥É¤ÎcarÉô¤Ë¿Ê¤ß¡¤
cdrÉô¤òÃµº÷¤¹¤ë¤È¤¤¤¦·ÑÂ³¤ò \verb|*saved*| ¤Ë¥×¥Ã¥·¥å¤¹¤ë¡¥
\begin{verbatim}
> (dft-node t1)
A
\end{verbatim}
\verb|restart|¤ò¸Æ¤Ö¤ÈºÇ¸å¤ËÊÝÂ¸¤µ¤ì¤¿·ÑÂ³¤ò¥Ý¥Ã¥×¤·¤Æ¸Æ¤Ó½Ð¤¹¤³¤È¤ÇÃµº÷¤¬ºÆ³«¤µ¤ì¤ë¡¥
\begin{verbatim}
> (restart)
B
\end{verbatim}
ºÇ¸å¤ËÊÝÂ¸¤µ¤ì¤¿¾õÂÖ¤¬»È¤¤²Ì¤¿¤µ¤ì¤ë¤È¡¤\verb|restart|¤Ï\verb|done|¤òÊÖ¤¹¤³¤È¤Ç¤½¤ì¤òÃÎ¤é¤»¤ë¡¥
\begin{verbatim}
...> (restart)
G> (restart)
DONE
\end{verbatim}
ºÇ¸å¤Ë¡¤´Ø¿ô\verb|dft2|¤Ï¾å¤Ç¼êÆ°¤Ç¹Ô¤Ã¤Æ¤¤¤¿¤³¤È¤ò¤­¤ì¤¤¤Ë±£ÊÃ¤¹¤ë¡¥
\begin{verbatim}
> (dft2 t1)
ABDHCEFIG()
\end{verbatim}

\verb|dft2|¤ÎÄêµÁ¤Ë¤ÏÌÀ¼¨Åª¤ÊºÆµ¢¤âÈ¿Éü¤â¤Ê¤¤¤³¤È¤ËÃí°Õ¡¥
¥Î¡¼¥É¤¬¼¡¡¹¤ÈÉ½¼¨¤µ¤ì¤ë¤Î¤Ï¡¤\verb|restart|¤Î¸Æ¤Ó½Ð¤·¤¿·ÑÂ³¤Ë¤è¤ê¡¤
É¬¤º\verb|dft-node|¤ÎÆ±¤¸\verb|cond|Àá¤Ë¤Þ¤ÇÌá¤ë¤«¤é¤À¡¥

¤³¤Î¼ï¤Î¥×¥í¥°¥é¥à¤Ï¹ÛÌ®¤Î¤è¤¦¤ËÆ¯¤¯¡¥
\verb|dft-node|¤ò¸Æ¤Ó½Ð¤¹¤³¤È¤ÇºÇ½é¤Î·ê¤ò·¡¤ë¡¥
ÊÖ¤êÃÍ¤¬\verb|done|¤Ç¤Ê¤¤¸Â¤ê¡¤\verb|dft-node|¤Î¸Æ¤Ó½Ð¤·¤ËÂ³¤¯¥³¡¼¥É¤Ï\verb|restart|¤ò¸Æ¤Ó¡¤
¤½¤ì¤¬ºÆ¤Ó¥¹¥¿¥Ã¥¯¤ËÀ©¸æ¤òÁ÷¤ë¡¥
¡ÊÌõÃí: ¤³¤Î¤¢¤¿¤ê¤ÏÛ£Ëæ¤ÊÉ½¸½¤¬Â¿¤¯¤Æ°ÕÌ£ÉÔÌÀ¡Ë
¤³¤Î·Ð²á¤Ï¤Þ¤ÇÊÖ¤êÃÍ¤¬¹ÛÌ®¤Ï¶õ¤Ç¤¢¤ë¤ÈÃÎ¤é¤»¤ë¤Þ¤Ç·ÑÂ³¤¹¤ë¡¥
¤½¤ÎÃÍ¤òÉ½¼¨¤¹¤ëÂå¤ï¤ê¤Ë¡¤\verb|dft2|¤Ï\verb|#f|¤òÊÖ¤¹¡¥
·ÑÂ³¤Ë¤è¤ëÃµº÷¤Ï¡¤¥×¥í¥°¥é¥à¤Ë´Ø¤¹¤ë¿·¤¿¤Ê¹Í¤¨Êý¤òÉ½¸½¤·¤Æ¤¤¤ë¡¥
Å¬ÀÚ¤Ê¥³¡¼¥É¤ò¥¹¥¿¥Ã¥¯¤ËÆþ¤ì¡¤·«¤ê¤«¤¨¤·¤½¤³¤ËÌá¤ë¤³¤È¤Ç·ë²Ì¤ò¼ê¤Ë¤¹¤ë¤Î¤À¡¥

\verb|dft2|¤Î¤è¤¦¤Ë°ìÅÙ¤Ë°ì¤Ä¤Î¥Ä¥ê¡¼¤·¤«°·¤ï¤Ê¤¤¤Ê¤é¡¤¤³¤Î¼êË¡¤Ë¤³¤À¤ï¤ëÍýÍ³¤Ï¤Ê¤¤¡¥
\verb|dft-node|¤ÎÍøÅÀ¤ÏÆ±»þ¤ËÊ£¿ô¤Î½èÍý¤ò¿Ê¹Ô¤µ¤»¤é¤ì¤ë¤³¤È¤À¡¥
2¤Ä¤Î¥Ä¥ê¡¼¤ËÂÐ¤·¡¤¿¼¤µÍ¥ÀèÃµº÷¤ÇÍ×ÁÇ¤ÎÄ¾ÀÑ¤òÆÀ¤¿¤¤¤È¤·¤è¤¦¡¥
\begin{verbatim}
> (set! *saved* ())
()
> (let ((node1 (dft-node t1)))
        (if (eq? node1 'done)
             'done
             (list node1 (dft-node t2))))
(A 1)
> (restart)
(A 2)
...
> (restart)
(B 1)
...
\end{verbatim}
ÉáÄÌ¤Î¼êË¡¤ò»È¤¦¤È¡¤
2¤Ä¤Î¥Ä¥ê¡¼¤Ë¤ª¤±¤ë°ÌÃÖ¤òÊÝÂ¸¤¹¤ëÃÊ³¬¤òÌÀ¼¨Åª¤ËÆ§¤àÉ¬Í×¤¬¤¢¤ë¡¥
·ÑÂ³¤ò»È¤¦¤È¡¤2¤Ä¤Î¼Â¹ÔÃæ¤ÎÃµº÷¤Î¾õÂÖ¤Ï¼«Æ°Åª¤Ë°·¤ï¤ì¤ë¡¥
¤³¤Î¤è¤¦¤ÊÃ±½ã¤ÊÎã¤Ç¤Ï¡¤¥Ä¥ê¡¼Ãæ¤Î°ÌÃÖ¤òÊÝÂ¸¤¹¤ë¤³¤È¤ÏÂç¤·¤ÆÆñ¤·¤¯¤Ê¤¤¡¥
¥Ä¥ê¡¼¤ÏÉÔÊÑ¤Ê¥Ç¡¼¥¿¹½Â¤¤À¤«¤é¡¤¥Ä¥ê¡¼Æâ¤Î¡Ö¼«Ê¬¤Î¾ì½ê¡×¤òÇÄ°®¤¹¤ëÊýË¡¤Ï¾¯¤Ê¤¯¤È¤â²¿¤«¤¢¤ë¡¥
·ÑÂ³¤¬¤¹¤Ð¤é¤·¤¤¤Î¤Ï¡¤ÂÐ±þ¤¹¤ëÉÔÊÑ¤Ê¥Ç¡¼¥¿¹½Â¤¤¬¤Ê¤¤¾ì¹ç¤Ç¤¹¤é¡¤
Ç¤°Õ¤Î·×»»½èÍý¤ÎÅÓÃæ¤ÇÍÆ°×¤Ë¿Ê¤ß¶ñ¹ç¤òÊÝÂ¸¤Ç¤­¤ëÅÀ¤À¡¥
·×»»½èÍý¤Î¾õÂÖ¤Ï¡¤ºÆ³«¤·¤¿¤¤¤â¤Î¤¬Í­¸Â¸Ä¤Ç¤¢¤ë¸Â¤ê¡¤Í­¸Â¸Ä¤Ç¤¢¤ëÉ¬Í×¤¹¤é¤Ê¤¤¡¥

Âè24¾Ï¤Ç¸«¤ë¤è¤¦¤Ë¡¤¤½¤ì¤é¤Î¹ÍÎ¸¤ÎÎ¾Êý¤¬Prolog¤Î¼ÂÁõ¤Ç½ÅÍ×¤À¤ÈÊ¬¤«¤ë¡¥
Prolog¥×¥í¥°¥é¥à¤Ç¤Ï¥×¥í¥°¥é¥à¤¬·ë²Ì¤òÀ¸À®¤¹¤ë¾å¤Ç¤Î¡ÖÃµº÷¥Ä¥ê¡¼¡×¤Ï¼ÂºÝ¤Î¥Ç¡¼¥¿¹½Â¤¤Ç¤Ï¤Ê¤¯¡¤
°ÅÌÛ¤Î¤â¤Î¤Ç¤¢¤ë¡¥
¤½¤ì¤é¥Ä¥ê¡¼¤Ï¤·¤Ð¤·¤ÐÌµ¸Â¤ÎÂç¤­¤µ¤ò»ý¤Ä¤¬¡¤
¤½¤Î¾ì¹ç¡¤¤¢¤ë¥Ä¥ê¡¼Á´ÂÎ¤ÎÃµº÷¤ò¡¤ÊÌ¤Î¥Ä¥ê¡¼¤ÎÃµº÷¤ÎÁ°¤Ë¹Ô¤¦¤³¤È¤Ï´üÂÔ¤Ç¤­¤Ê¤¤¡¥
¤É¤¦¤Ë¤«¤·¤Æ¡Ö¾ì½ê¡×¤òÊÝÂ¸¤¹¤ëÂ¾¤ËÁªÂò»è¤Ï¤Ê¤¤¤Î¤À¡¥
%}}}
\subsection{·ÑÂ³ÅÏ¤·¥Þ¥¯¥í}   %{{{
Common Lisp¤Ï\verb|call/cc|¤òÄó¶¡¤·¤Ê¤¤¤¬¡¤¾¯¡¹¤ÎÏ«ÎÏ¤ÇScheme¤ÈÆ±¤¸¤³¤È¤¬¤Ç¤­¤ë¤è¤¦¤Ë¤Ê¤ë¡¥
¤³¤ÎÀá¤Ç¤Ï¡¤¥Þ¥¯¥í¤ò»È¤Ã¤ÆCommon Lisp¥×¥í¥°¥é¥à¤Ç·ÑÂ³¤ò¼Â¸½¤¹¤ëÊýË¡¤ò¼¨¤¹¡¥
Scheme¤Î·ÑÂ³¤Ï2¼ïÎà¤Î¤â¤Î¤òÄó¶¡¤·¤Æ¤¯¤ì¤¿¡¥
\begin{enumerate}
    \item ·ÑÂ³¤¬À¸À®¤µ¤ì¤¿»þÅÀ¤Ç¤ÎÁ´¤Æ¤ÎÊÑ¿ô¤ÎÂ«Çû¡¥
    \item ·×»»½èÍý¤Î¾õÂÖ\wadash ¤½¤Î¸å¤Ë²¿¤¬¤ª¤­¤ë¤Ï¤º¤À¤Ã¤¿¤«¡¥
\end{enumerate}
¥ì¥­¥·¥«¥ë¡¦¥¹¥³¡¼¥×¤ò»ý¤ÄLisp¤Ç¤Ï¡¤¥¯¥í¡¼¥¸¥ã¤ÇÂè1¤Îµ¡Ç½¤¬ÆÀ¤é¤ì¤ë¡¥
¼Â¤Ï¥¯¥í¡¼¥¸¥ã¤ò»È¤Ã¤Æ·×»»½èÍý¤Î¾õÂÖ¤âÊÑ¿ôÂ«Çû¤Ë³ÊÇ¼¤¹¤ì¤ÐÂè2¤Îµ¡Ç½¤âÆÀ¤é¤ì¤ë¤³¤È¤¬Ê¬¤«¤ë¡¥

\reffig{fig:ContPassMacro}¤Î¥Þ¥¯¥í¤ò»È¤¦¤È¡¤·ÑÂ³¤òÊÝÂ¸¤·¤Ä¤Ä´Ø¿ô¤ò¸Æ¤Ó½Ð¤»¤ë¡¥
¤³¤ì¤é¤Î¥Þ¥¯¥í¤ÏCommon Lisp¤Ç´Ø¿ô¤òÄêµÁ¤·¤¿¤ê¸Æ¤Ó½Ð¤·¤¿¤ê¡¤
ÃÍ¤òÊÖ¤¹¤¿¤á¤ÎÁÈ¹þ¤ß¥ª¥Ú¥ì¡¼¥¿¤ÎÂå¤ï¤ê¤Ë¤Ê¤ë¡¥

·ÑÂ³¤òÍøÍÑ¤·¤¿¤¤´Ø¿ô¡Ê¤â¤·¤¯¤Ï·ÑÂ³¤òÍøÍÑ¤¹¤ë´Ø¿ô¤ò¸Æ¤Ó¤¿¤¤´Ø¿ô¡Ë¤Ï
\verb|defun|¤Ç¤Ê¤¯\verb|=defun|¤ò»È¤Ã¤ÆÄêµÁ¤¹¤ë¡¥
\verb|=defun|¤Î¹½Ê¸¤Ï\verb|defun|¤ÈÆ±¤¸¤À¤¬¡¤µ¡Ç½¤ÏÈùÌ¯¤Ë°Û¤Ê¤ë¡¥
Ã±¤Ë´Ø¿ô¤òÄêµÁ¤¹¤ë¤À¤±¤Ç¤Ê¤¯¡¤\verb|=defun|¤Ï´Ø¿ô¤òÄêµÁ¤·¡¤
¤½¤Î´Ø¿ô¤Î¸Æ¤Ó½Ð¤·¤ËÅ¸³«¤µ¤ì¤ë¥Þ¥¯¥í¤òÄêµÁ¤¹¤ë¡¥
¡Ê¤½¤Î¥Þ¥¯¥í¤Ï¡¤´Ø¿ô¤¬¼«Ê¬¼«¿È¤ò¸Æ¤Ó½Ð¤¹¾ì¹ç¤ËÈ÷¤¨¤ÆºÇ½é¤ËÄêµÁ¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥¡Ë
´Ø¿ô¤ÎËÜÂÎ¤Ï\verb|=defun|¤ËÅÏ¤µ¤ì¤¿¤â¤Î¤Ë¤Ê¤ë¤¬¡¤°ú¿ô¥ê¥¹¥È¤Ë¤Ï \verb|*cont*| ¤¬ÄÉ²Ã¤µ¤ì¤ë¡¥
¥Þ¥¯¥í¤ÎÅ¸³«·Á¤Ç¤Ï¡¤ÄêµÁ¤µ¤ì¤¿´Ø¿ô¤Ï \verb|*cont*| ¤òÂ¾¤Î°ú¿ô¤È°ì½ï¤Ë¼õ¤±¼è¤ë¡¥
¤è¤Ã¤Æ¼¡¤Î´Ø¿ôÄêµÁ¤Ï¡¤
\begin{verbatim}
(=defun add1 (x) (=values (1+ x)))
\end{verbatim}
¼¡¤Î¤è¤¦¤ËÅ¸³«¤µ¤ì¤ë¡¥
\begin{verbatim}
(progn (defmacro add1 (x)
         `(=add1 *cont* ,x))
       (defun =add1 (*cont* x)
         (=values (1+ x))))
\end{verbatim}

\verb|add1|¤ò¸Æ¤Ö¤È¤­¼ÂºÝ¤Ë¸Æ¤Ð¤ì¤ë¤Î¤Ï´Ø¿ô¤Ç¤Ê¤¯¥Þ¥¯¥í¤À¡¥
¥Þ¥¯¥í¤Ï´Ø¿ô¸Æ¤Ó½Ð¤·¤ËÅ¸³«¤µ¤ì¤ë
\footnote{\texttt{=defun}¤Ë¤Ï¥¤¥ó¥¿¡¼¥ó¤µ¤ì¤¿Ì¾Á°¤¬°Õ¿ÞÅª¤Ë»È¤ï¤ì¤ë¤¬¡¤
¤½¤ì¤Ï¥È¥ì¡¼¥¹¤Ç¤­¤ë¤è¤¦¤Ë¤¹¤ë¤¿¤á¤À¡¥
¥È¥ì¡¼¥¹¤¬É¬Í×¤Ç¤Ê¤¤¤ÈÊ¬¤«¤Ã¤Æ¤¤¤ì¤Ð¡¤Ì¾Á°¤Ëgensym¤ò»È¤¦¤Î¤¬°ÂÁ´¤À¤í¤¦¡¥}
¤¬¡¤°ú¿ô\,\verb|*cont*|\,¤ò1¤ÄÍ¾·×¤Ë¼õ¤±¼è¤Ã¤Æ¤¤¤ë¡¥

¤è¤Ã¤Æ \verb|=defun|¤ÇÄêµÁ¤µ¤ì¤¿¥ª¥Ú¥ì¡¼¥¿¤Î¸Æ¤Ó½Ð¤·¤ÎºÝ¤Ë¤Ï¡¤
¤½¤Î»þÅÀ¤Ç¤Î \verb|*cont*| ¤ÎÃÍ¤¬É¬¤ºÅÏ¤µ¤ì¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(setq *cont* #'identity)

(defmacro =lambda (parms &body body)
   `#'(lambda (*cont* ,@parms) ,@body))

(defmacro =defun (name parms &body body)
   (let ((f (intern (concatenate 'string
                                          "=" (symbol-name name)))))
       `(progn
            (defmacro ,name ,parms
               `(,',f *cont* ,,@parms))
            (defun ,f (*cont* ,@parms) ,@body))))

(defmacro =bind (parms expr &body body)
   `(let ((*cont* #'(lambda ,parms ,@body))) ,expr))

(defmacro =values (&rest retvals)
   `(funcall *cont* ,@retvals))

(defmacro =funcall (fn &rest args)
   `(funcall ,fn *cont* ,@args))

(defmacro =apply (fn &rest args)
   `(apply ,fn *cont* ,@args))
\end{FramedVerb}\end{center}
\caption{·ÑÂ³ÅÏ¤·¥Þ¥¯¥í¡¥}
\label{fig:ContPassMacro}
\end{figure}

\verb|*cont*| ¤Ï²¿¤Î¤¿¤á¤Ë¤¢¤ë¤Î¤«¡©\
¤½¤ì¤Ï¸½ºß¤Î·ÑÂ³¤ËÂ«Çû¤µ¤ì¤ë¡¥
\verb|=values|¤ÎÄêµÁ¤òÆÉ¤à¤È¤½¤Î·ÑÂ³¤Î»È¤¤Êý¤¬Ê¬¤«¤ë¡¥
\verb|=defun|¤ÇÄêµÁ¤µ¤ì¤¿Ç¤°Õ¤Î´Ø¿ô¤Ï \verb|=values|¤ò»È¤Ã¤ÆÀ©¸æ¤òÌá¤¹¤«¡¤,
¤½¤ì¤ò¹Ô¤¦ÊÌ¤Î´Ø¿ô¤ò¸Æ¤Ð¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¡¥
\verb|=values|¤Î¹½Ê¸¤ÏCommon Lisp¤ÎÁÈ¹þ¤ß¥ª¥Ú¥ì¡¼¥¿\verb|values|¤ÈÆ±¤¸¤À¡¥
Â¿ÃÍ¤òÊÖ¤¹¤Ë¤Ï¡¤\verb|=bind|¤ËÆ±¤¸¿ô¤Î²¾°ú¿ô¤òÍ¿¤¨¤Æ¤ª¤¯¡¥
¤·¤«¤·¥È¥Ã¥×¥ì¥Ù¥ë¤ËÂ¿ÃÍ¤òÊÖ¤¹¤³¤È¤Ï¤Ç¤­¤Ê¤¤¡¥

²¾°ú¿ô \verb|*cont*| ¤Ï¡¤ \verb|=defun|¤ÇÄêµÁ¤µ¤ì¤¿´Ø¿ô¤Ë¡¤ÊÖ¤êÃÍ¤ËÂÐ¤·¤Æ²¿¤ò¹Ô¤¦¤«¤òÅÁ¤¨¤ë¡¥
\verb|=values|¤¬¥Þ¥¯¥íÅ¸³«¤µ¤ì¤ë¤È \verb|*cont*| ¤òÊáÂª¤¹¤ë¤è¤¦¤Ë¤Ê¤ê¡¤
¤½¤ì¤Ë¤è¤Ã¤Æ´Ø¿ô¤«¤éÌá¤ë¤³¤È¤ò¥·¥ß¥å¥ì¡¼¥È¤¹¤ë¡¥
¼¡¤Î¼°¤Ï¡¤
\begin{verbatim}
> (=values (1+ n))
\end{verbatim}
¼¡¤Î¤è¤¦¤ËÅ¸³«¤µ¤ì¤ë¡¥
\begin{verbatim}
(funcall *cont* (1+ n))
\end{verbatim}

¥È¥Ã¥×¥ì¥Ù¥ë¤Ç¤Ï \verb|*cont*| ¤ÎÃÍ¤Ï\verb|identity|¤À¡¥
¤³¤ì¤ÏÅÏ¤µ¤ì¤¿ÃÍ¤ò¤½¤Î¤Þ¤ÞÊÖ¤¹´Ø¿ô¤À¡¥
¥È¥Ã¥×¥ì¥Ù¥ë¤«¤é\verb|(add1 2)|¤ò¸Æ¤Ö¤È¡¤¤½¤ì¤ÏÅù²Á¤Ê¼¡¤Î¥³¡¼¥É¤ËÅ¸³«¤µ¤ì¤ë¡¥
\begin{verbatim}
(funcall #'(lambda (*cont* n) (=values (1+ n))) *cont* 2)
\end{verbatim}

\verb|*cont*| ¤Î»²¾È¤Ï¤³¤Î¾ì¹ç¥°¥í¡¼¥Ð¥ë¤ÊÂ«Çû¤ò»ý¤Ä¡¥
\verb|=values|¼°¤ÏÅù²Á¤Ê¼¡¤Î¼°¤ËÅ¸³«¤µ¤ì¤ë¡¥
\begin{verbatim}
(funcall #'identity (1+ n))
\end{verbatim}
¤³¤ì¤ÏÃ±¤Ë1¤«¤é$n$¤Þ¤Ç¤òÂ­¤·¹ç¤ï¤»¤ÆÊÖ¤¹¤â¤Î¤À¡¥

\verb|add1|¤Ê¤É¤Î´Ø¿ô¤Ç¤Ï¡¤
we go through all this trouble just to simulate what Lisp function call and return do anyway:
\begin{verbatim}
> (=defun bar (x)
        (=values (list 'a (add1 x))))
BAR
> (bar 5)
(A 6)
\end{verbatim}
Âç»ö¤Ê¤Î¤Ï¡¤º£¤ä»äÃ£¤ÏÆÈ¼«¤ËÀ©¸æ¤Ç¤­¤ë´Ø¿ô¸Æ¤Ó½Ð¤·¤ÈÌá¤êreturn¤ò¼ê¤Ë¤·¤Æ¤ª¤ê¡¤
Â¾¤Î¤³¤È¤â¤½¤Îµ¤¤Ë¤Ê¤ì¤Ð¤Ç¤­¤ë¤È¤¤¤¦¤³¤È¤À¡¥

·ÑÂ³¤Î¸ú²Ì¤Ï¡¤ \verb|*cont*| ¤òÄÌ¤¸¤ÆÍøÍÑ¤¹¤ë¡¥
\verb|*cont*| ¤Ï¥°¥í¡¼¥Ð¥ë¤ÊÃÍ¤ò»ý¤Ã¤Æ¤Ï¤¤¤ë¤¬¡¤¥°¥í¡¼¥Ð¥ë¤ÊÃÍ¤½¤Î¤â¤Î¤¬»È¤ï¤ì¤ë¤³¤È¤Ï¤Þ¤º¤Ê¤¤¡¥
\verb|*cont*| ¤Ï¤Û¤È¤ó¤É¾ï¤Ë\verb|=values|¤ä \verb|=defun|¤ÇÄêµÁ¤µ¤ì¤¿¥Þ¥¯¥í¤ËÊáÂª¤µ¤ì¤ë²¾°ú¿ô¤À¡¥
Îã¤¨¤Ð\verb|add1|¤ÎÆâÉô¤Ç¤Ï \verb|*cont*| ¤Ï²¾°ú¿ô¤Ç¥°¥í¡¼¥Ð¥ëÊÑ¿ô¤Ç¤Ï¤Ê¤¤¡¥
¤³¤Î¶èÊÌ¤¬½ÅÍ×¤Ê¤Î¤Ï¡¤¤³¤ì¤é¤Î¥Þ¥¯¥í¤Ï \verb|*cont*| ¤¬¥í¡¼¥«¥ëÊÑ¿ô¤À¤«¤é¤³¤½µ¡Ç½¤¹¤ë¤«¤é¤À¡¥
¤À¤«¤é¤³¤½ \verb|*cont*| ¤Ë½é´üÃÍ¤òÍ¿¤¨¤ë¤¿¤á¤Ë\verb|defvar|¤Ç¤Ê¤¯\verb|setq|¤ò»È¤Ã¤Æ¤¤¤ë¡¥
\verb|defvar|¤Ç¤Ï¥¹¥Ú¥·¥ã¥ëÊÑ¿ô¤òÄêµÁ¤¹¤ë¤³¤È¤Ë¤Ê¤Ã¤Æ¤·¤Þ¤¦¡¥

\reffig{fig:ContPassMacro}¤Î3ÈÖÌÜ¤Î¥Þ¥¯¥í \verb|=bind|¤Ï¡¤
\verb|multiple-value-bind|¤ÈÆ±ÍÍ¤ÎÍÑÅÓ¤òÁÛÄê¤·¤Æ¤¤¤ë¡¥
°ú¿ô¤Ë¤Ï²¾°ú¿ô¤Î¥ê¥¹¥È¡¤¼°¡¤¼Â¹ÔÉôËÜÂÎ¤È¤Ê¤ë¥³¡¼¥É¤ò¼è¤ë¡¥
²¾°ú¿ô¤ÏÅÏ¤µ¤ì¤¿¼°¤ÎÊÖ¤êÃÍ¤ËÂ«Çû¤µ¤ì¡¤¤½¤Î²¼¤ÇËÜÂÎ¥³¡¼¥É¤¬É¾²Á¤µ¤ì¤ë¡¥
\verb|=defun|¤ÇÄêµÁ¤µ¤ì¤¿´Ø¿ô¤Î¸Æ¤Ó½Ð¤·¸å¤ËÉÕ²ÃÅª¤Ê¼°¤¬É¾²Á¤µ¤ì¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¤È¤­¤Ë¤Ï
¤³¤Î¥Þ¥¯¥í¤ò»È¤ï¤Ê¤±¤ì¤Ð¤¤¤±¤Ê¤¤¡¥
\begin{verbatim}
> (=defun message ()
          (=values 'hello 'there))
MESSAGE
> (=defun baz ()
          (=bind (m n) (message)
                 (=values (list m n))))
BAZ
> (baz)
(HELLO THERE)
\end{verbatim}

\verb|=bind|¤ÎÅ¸³«·Á¤Ï¿·ÊÑ¿ô \verb|*cont*| ¤òºî¤Ã¤Æ¤¤¤ë¤³¤È¤ËÃí°Õ¡¥
\verb|baz|¤ÎËÜÂÎ¤Ï¼¡¤Î¤è¤¦¤Ë¥Þ¥¯¥íÅ¸³«¤µ¤ì¤ë¡¥
\begin{verbatim}
(let ((*cont* #'(lambda (m n)
                  (=values (list m n)))))
  (message))
\end{verbatim}
¤½¤·¤Æ¤µ¤é¤Ë¼¡¤Î¤è¤¦¤Ë¤Ê¤ë¡¥
\begin{verbatim}
(let ((*cont* #'(lambda (m n)
                  (funcall *cont* (list m n)))))
  (=message *cont*))
\end{verbatim}

\verb|*cont*| ¤Î¿·¤·¤¤ÃÍ¤Ï \verb|=bind|¼°¤ÎËÜÂÎ¤Ë¤Ê¤ë¤Î¤Ç¡¤
\verb|*cont*| ¤Ë\verb|funcall|¤òÅ¬ÍÑ¤¹¤ë¤³¤È¤Ç\verb|message|¤«¤é¡ÖÌá¤ë¡×¤È¤­¤Ë¤Ï¡¤
·ë²Ì¤Ï¡Ö¥³¡¼¥ÉËÜÂÎ¤òÉ¾²Á¤¹¤ë¤³¤È¡×¤Ë¤Ê¤ë¡¥
¤·¤«¤·¡Ê¤³¤³¤¬Âç»ö¤Ê¤Î¤À¤¬¡Ë \verb|=bind|¤ÎËÜÂÎÆâ¤Ç¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤Ã¤Æ¤ª¤ê¡¤
\begin{verbatim}
#'(lambda (m n)
    (funcall *cont* (list m n)))
\end{verbatim}
\verb|=baz|¤Ë°ú¿ô¤È¤·¤ÆÅÏ¤µ¤ì¤¿ \verb|*cont*| ¤¬¸«¤¨¤ë¤Þ¤Þ¤Ê¤Î¤Ç¡¤
¥³¡¼¥ÉËÜÂÎ¤¬ \verb|=values|¤òÉ¾²Á¤¹¤ëÈÖ¤Ë¤Ê¤ë¤È¡¤
¸µ¤Î¸Æ½ÐÂ¦´Ø¿ô¤ËÌá¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
¥¯¥í¡¼¥¸¥ã¤Ï¸ß¤¤¤ËË¥¤¤¹ç¤ï¤µ¤ì¤Æ¤¤¤ë:
\verb|*cont*| ¤Î¸Ä¡¹¤ÎÂ«Çû¤Ï \verb|*cont*| ¤Î°ÊÁ°¤ÎÂ«Çû¤ò´Þ¤à¥¯¥í¡¼¥¸¥ã¤Ç¡¤
¥°¥í¡¼¥Ð¥ë¤ÊÃÍ¤ËÌá¤Ã¤Æ¤æ¤¯¤Þ¤Ç¤ÎÏ¢º¿¤ò·ÁÀ®¤¹¤ë¡¥

Æ±¤¸¸½¾Ý¤ò¡¤¤â¤Ã¤È¾®¤µ¤Ê¥¹¥±¡¼¥ë¤Ç´Ñ»¡¤Ç¤­¤ë¡¥
\begin{verbatim}
> (let ((f #'identity))
    (let ((g #'(lambda (x) (funcall f (list 'a x)))))
      #'(lambda (x) (funcall g (list 'b x)))))
#<Interpreted-Function BF6326>
> (funcall * 2)
(A (B 2))
\end{verbatim}
¤³¤ÎÎã¤Ç¤Ï\verb|g|¤Ø¤Î»²¾È¤ò´Þ¤à¥¯¥í¡¼¥¸¥ã¤òºî¤Ã¤Æ¤¤¤ë¤¬¡¤
\verb|g|¤½¤Î¤â¤Î¤â\verb|f|¤Ø¤Î»²¾È¤ò´Þ¤à¥¯¥í¡¼¥¸¥ã¤Ç¤¢¤ë¡¥
¤³¤ì¤È»÷¤¿¥¯¥í¡¼¥¸¥ã¤ÎÏ¢º¿¤¬¡¤xez¥Ú¡¼¥¸¤Î¥Í¥Ã¥È¥ï¡¼¥¯¡¦¥³¥ó¥Ñ¥¤¥é¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ë¡¥

»Ä¤ê¤Î¥Þ¥¯¥í \verb|=apply|¤È \verb|=funcall|¤Ï \verb|=lambda|¤ÇÄêµÁ¤µ¤ì¤¿´Ø¿ô¤È¶¦¤Ë»È¤¦¡¥
\verb|=defun|¤ÇÄêµÁ¤µ¤ì¤¿¡Ö´Ø¿ô¡×¤Ï¼ÂºÝ¤Ï¥Þ¥¯¥í¤Ê¤Î¤Ç¡¤
\verb|apply|¤ä\verb|funcall|¤Î°ú¿ô¤Ë»È¤¨¤Ê¤¤¤³¤È¤ËÃí°Õ¡¥
¤³¤ÎÌäÂê¤Î²ò·èºö¤Ïldt¥Ú¡¼¥¸¤Ç¿¨¤ì¤¿¥È¥ê¥Ã¥¯¤Ë»÷¤Æ¤¤¤ë¡¥
¤Ä¤Þ¤ê¸Æ¤Ó½Ð¤·¤òÊÌ¤Î\verb|=lambda|¤ÎÆâÉô¤Ë¤¯¤ë¤ó¤Ç¤·¤Þ¤¦¡¥
\begin{verbatim}
> (=defun add1 (x)
        (=values (1+ x)))
ADD1
> (let ((fn (=lambda (n) (add1 n))))
        (=bind (y) (=funcall fn 9)
           (format nil "9 + 1 = ~A" y)))
"9+1=10"
\end{verbatim}

\begin{enumerate}
\item \verb|=defun|¤ÇÄêµÁ¤µ¤ì¤¿´Ø¿ô¤Î°ú¿ô¥ê¥¹¥È¤Ï²¾°ú¿ôÌ¾°Ê³°¤ò´Þ¤ó¤Ç¤Ï¤Ê¤é¤Ê¤¤¡¥
\item ·ÑÂ³¤òÍøÍÑ¤¹¤ë´Ø¿ô¡¤¤â¤·¤¯¤Ï¤½¤Î¤è¤¦¤Ê´Ø¿ô¤ò¸Æ¤Ó½Ð¤¹´Ø¿ô¤Ï¡¤
 \verb|=lambda|¤Þ¤¿¤Ï \verb|=defun|¤ÇÄêµÁ¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
\item ¤½¤Î¤è¤¦¤Ê´Ø¿ô¤¬½ªÎ»¤¹¤ë¤È¤­¤Ï¡¤ \verb|=values|¤ÇÃÍ¤òÊÖ¤¹¤«
    Æ±ÍÍ¤Ê´Ø¿ô¤ò¸Æ¤Ó½Ð¤¹¤«¤Î¤¤¤º¤ì¤«¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
\item \verb|=bind|¡¤\verb|=values|¡¤\verb|=apply|¤Þ¤¿¤Ï\verb|=funcall|¤¬
    ¥³¡¼¥É¤Î°ìÉô¤Ë»È¤ï¤ì¤Æ¤¤¤ë¾ì¹ç¡¤¤½¤ì¤ÏËöÈø¸Æ¤Ó½Ð¤·¤Ç¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
    \verb|=bind|¤Î¸å¤ËÉ¾²Á¤µ¤ì¤ë¤Ù¤­¥³¡¼¥É¤Ï¡¤É¬¤º¤½¤ÎËÜÂÎÆâ¤ËÆþ¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
    ¤è¤Ã¤ÆÊ£¿ô¤Î\verb|=binds|¤ò½ç¤Ë»È¤¤¤¿¤¤¾ì¹ç¡¤¤½¤ì¤é¤ÏÆþ¤ì»Ò¤Ë¤Ê¤é¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
\end{enumerate}

\begin{figure}\begin{center}\begin{FramedVerb}
(=defun foo (x)
        (=bind (y) (bar x)
               (format t "Ho ")
               (=bind (z) (baz x)
                      (format t "Hum.")
                      (=values x y z))))
\end{FramedVerb}\end{center}
\caption{·ÑÂ³ÅÏ¤·¥Þ¥¯¥í¤ËÉÕ¿ï¤¹¤ëÀ©¸Â¡¥}
\label{fig:RestrictionsContPassMacros}
\end{figure}

\reffig{fig:RestrictionsContPassMacros}¤Ë¤Ï·ÑÂ³ÅÏ¤·¥Þ¥¯¥í¤Ë¤è¤Ã¤ÆÀ¸¤¸¤ëÀ©¸Â¤ò¤Þ¤È¤á¤¿¡¥
·ÑÂ³¤òÊÝÂ¸¤·¤Ê¤¤¤·¡¤·ÑÂ³¤òÊÝÂ¸¤¹¤ë´Ø¿ô¤ò¸Æ¤Ó½Ð¤·¤â¤·¤Ê¤¤´Ø¿ô¤Ï¡¤
¤³¤ì¤é¤Î¥Þ¥¯¥í¤ò»È¤¦É¬Í×¤Ï¤Ê¤¤¡¥
Îã¤¨¤Ð\verb|list|¤Ê¤É¤ÎÁÈ¹þ¤ß´Ø¿ô¤Ï½ü¤«¤ì¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defun dft (tree)
  (cond ((null tree) nil)
        ((atom tree) (princ tree))
        (t (dft (car tree))
           (dft (cdr tree)))))

(setq *saved* nil)

(=defun dft-node (tree)
        (cond ((null tree) (restart))
              ((atom tree) (=values tree))
              (t (push #'(lambda () (dft-node (cdr tree)))
                       *saved*)
                 (dft-node (car tree)))))

(=defun restart ()
        (if *saved*
            (funcall (pop *saved*))
            (=values 'done)))

(=defun dft2 (tree)
        (setq *saved* nil)
        (=bind (node) (dft-node tree)
               (cond ((eq node 'done) (=values nil))
                     (t (princ node)
                        (restart)))))
\end{FramedVerb}\end{center}
\caption{·ÑÂ³ÅÏ¤·¥Þ¥¯¥í¤ò»È¤Ã¤¿¥Ä¥ê¡¼¤ÎÃµº÷¡¥}
\label{fig:TreeTraversalUsingContPassMacros}
\end{figure}

\reffig{fig:TreeTraversalUsingContPassMacros}¤Ï¡¤
\reffig{fig:ContPassMacro}¤ÎScheme¥³¡¼¥É¤òCommon Lisp¤ËÄ¾¤·¤¿¤â¤Î¤ò´Þ¤ß¡¤
·ÑÂ³ÅÏ¤·¥Þ¥¯¥í¤òScheme¤Î·ÑÂ³¤ÎÂå¤ï¤ê¤Ë»È¤Ã¤Æ¤¤¤ë¡¥
Æ±¤¸Îã¤Î¥Ä¥ê¡¼¤ËÂÐ¤·¤Æ\verb|dft2|¤ÏÁ´¤¯Æ±ÍÍ¤ËÆ°ºî¤¹¤ë¡¥
\begin{verbatim}
> (setq t1 '(a (b (d h)) (c e (f i) g))
           t2 '(1 (2 (3 6 7) 4 5)))
(1 (2 (3 6 7) 4 5))
> (dft2 t1)
ABDHCEFIG
NIL
\end{verbatim}

Ê£¿ô¤ÎÃµº÷¤Î¾õÂÖ¤òÊÝÂ¸¤¹¤ë¤Î¤âScheme¤ÈÆ±ÍÍ¤Ëµ¡Ç½¤¹¤ë¤¬¡¤Îã¤Ï¾¯¤·Ä¹¤¯¤Ê¤ë¡¥
\begin{verbatim}
> (=bind (node1) (dft-node t1)
        (if (eq node1 'done)
             'done
             (=bind (node2) (dft-node t2)
               (list node1 node2))))
(A 1)
> (restart)
(A 2)
...> (restart)
(B 1)
...
\end{verbatim}

¥ì¥­¥·¥«¥ë¡¦¥¯¥í¡¼¥¸¥ã¤ÎÏ¢º¿¤ò¤Ä¤Ê¤®¹ç¤ï¤»¤ë¤³¤È¤Ç¡¤
Common Lisp¥×¥í¥°¥é¥à¤Ç¤âÆÈ¼«¤Î·ÑÂ³¤òºî¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
¤¦¤Þ¤¤¤³¤È¤Ë¡¤
\reffig{fig:ContPassMacro}¤Î¹þ¤ßÆþ¤Ã¤¿¥Þ¥¯¥í¤Ë¤è¤Ã¤Æ¥¯¥í¡¼¥¸¥ã¤Ï¤Ä¤Ê¤®¹ç¤ï¤µ¤ì¤Æ¤ª¤ê¡¤
¥æ¡¼¥¶¤Ï¼Â¸½²áÄø¤òÁÛÁü¤¹¤ëÉ¬Í×¤Ï¤Ê¤¯¡¤¤­¤ì¤¤¤ÊÂ¦ÌÌ¤À¤±¤ò¸«¤Æ¤¤¤ì¤Ð¤è¤¤¡¥

Âè21--24¾Ï¤Ï¤¤¤º¤ì¤â¤¢¤ë°ÕÌ£¤Ç·ÑÂ³¤Ë°ÍÂ¸¤·¤Æ¤¤¤ë¡¥
¤³¤ì¤é¤Î¾Ï¤Ç¤Ï¡¤·ÑÂ³¤¬¤¹¤µ¤Þ¤¸¤¤ÎÏ¤ÎÃê¾Ý²½¤Ç¤¢¤ë¤³¤È¤ò¼¨¤¹¡¥
·ÑÂ³¤Ï¡¤ÆÃ¤Ë¤¢¤ë¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¾å¤Î¥Þ¥¯¥í¤È¤·¤Æ¼ÂÁõ¤µ¤ì¤¿¾ì¹ç¤Ë¤Ï¡¤ºÇ¹â¤ËÂ®¤¤¤È¤Ï¸À¤¨¤Ê¤¤¡¥
¤·¤«¤·¤½¤ì¤é¤òÍøÍÑ¤·¤Æ¹Ô¤¨¤ëÃê¾Ý²½¤Ë¤è¤ê¡¤¤¢¤ë¼ï¤Î¥×¥í¥°¥é¥à¤Ï¤Ï¤ë¤«¤ËÂ®¤¯½ñ¤±¤ë¤è¤¦¤Ë¤Ê¤ê¡¤
¤½¤Î¤è¤¦¤ÊÂ®ÅÙ¤Î¥×¥í¥°¥é¥à¤â½ÅÊõ¤¹¤ë¾ì¹ç¤È¤¤¤¦¤â¤Î¤Ï¤¢¤ë¡¥
%}}}
\subsection{Code-Walkers ¤È CPSÊÑ´¹}   %{{{
Á°Àá¤ÇÀâÌÀ¤·¤¿¥Þ¥¯¥í¤ÏÂÅ¶¨¤Î»ºÊª¤À¡¥
·ÑÂ³¤ÎÎÏ¤¬ÆÀ¤é¤ì¤ë¤¬¡¤¤½¤ì¤Ï¥×¥í¥°¥é¥à¤òÆÃÄê¤Î·Á¤Ç½ñ¤¤¤¿¤È¤­¤Ë¸Â¤é¤ì¤ë¡¥
\reffig{fig:RestrictionsContPassMacros}¤Î¥ë¡¼¥ë4¤Ë¤è¤ì¤Ð¡¤É¬¤º¼¡¤Î¤è¤¦¤Ë¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤º¡¤
\begin{verbatim}
(=bind (x) (fn y)
       (list 'a x))
\end{verbatim}
¼¡¤Î¤è¤¦¤Ë¤Ï¤Ç¤­¤Ê¤¤¡¥
\begin{verbatim}
(list 'a                                                        ; wrong
      (=bind (x) (fn y) x))
\end{verbatim}

ËÜÊª¤Î\verb|call/cc|¤Ï¥×¥í¥°¥é¥Þ¤Ë¤½¤Î¤è¤¦¤ÊÀ©¸Â¤ò²Ý¤¹¤³¤È¤Ï¤Ê¤¤¡¥
\verb|call/cc|¤ÏÇ¤°Õ¤Î»þÅÀ¤ÇÇ¤°Õ¤Î·Á¤Î¥×¥í¥°¥é¥à¤Î·ÑÂ³¤ò¼è¤ê½Ð¤»¤ë¡¥
\verb|call/cc|¤ÎÎÏ¤ÎÁ´¤Æ¤ò¼Â¸½¤¹¤ë¥ª¥Ú¥ì¡¼¥¿¤ò¼ÂÁõ¤¹¤ë¤³¤È¤â¤Ç¤­¤ë¤¬¡¤
¤½¤ì¤Ë¤Ï¤µ¤é¤Ë¼ê´Ö¤¬¤«¤«¤ë¤À¤í¤¦¡¥
¤³¤ÎÀá¤Ç¤Ï¤½¤ÎÊýË¡¤Î³µÍ×¤ò¼¨¤¹¡¥

Lisp¥×¥í¥°¥é¥à¤Ï¡Ö·ÑÂ³ÅÏ¤·¥¹¥¿¥¤¥ë¡×¤È¤¤¤¦·Á¤ËÊÑ´¹¤Ç¤­¤ë¡¥
´°Á´¤ËCPSÊÑ´¹¤ò»Ü¤·¤¿¥×¥í¥°¥é¥à¤ÏÆÉ¤á¤¿¤â¤Î¤Ç¤Ï¤Ê¤¤¤¬¡¤
ÉôÊ¬Åª¤ËÊÑ´¹¤µ¤ì¤¿¥³¡¼¥É¤òÆÉ¤à¤³¤È¤Ç¤½¤Î²áÄø¤Î¥¨¥Ã¥»¥ó¥¹¤òÄÏ¤à¤³¤È¤Ï¤Ç¤­¤ë¡¥
¼¡¤Î´Ø¿ô¤Ï¥ê¥¹¥È¤òµÕÅ¾¤µ¤»¤ë¤â¤Î¤À¤¬¡¤
\begin{verbatim}
(defun rev (x)
  (if (null x)
      nil
      (append (rev (cdr x)) (list (car x)))))
\end{verbatim}
Åù²Á¤Ê·ÑÂ³ÅÏ¤·ÈÇ¥³¡¼¥É¤Ï¼¡¤Î¤è¤¦¤Ë¤Ê¤ë¡¥
\begin{verbatim}
(defun rev2 (x)
  (revc x #'identity))

(defun revc (x k)
  (if (null x)
      (funcall k nil)
      (revc (cdr x)
            #'(lambda (w)
                (funcall k (append w (list (car x))))))))
\end{verbatim}
·ÑÂ³ÅÏ¤·¥¹¥¿¥¤¥ë¤Ç¤Ï¡¤
´Ø¿ô¤Ë¤Ï°ú¿ô¡Ê¤³¤³¤Ç¤Ï\verb|k|¡Ë¤¬Í¾Ê¬¤ËÁý¤¨¤ë¡¥
¤½¤ÎÃÍ¤Ï·ÑÂ³¤Ë¤Ê¤ë¡¥
·ÑÂ³¤Ï¡¤¤½¤Î´Ø¿ô¤Î¸½ºß¤ÎÃÍ¤ò»È¤Ã¤Æ²¿¤ò¤¹¤Ù¤­¤«¤òÉ½¸½¤¹¤ë¥¯¥í¡¼¥¸¥ã¤À¡¥
ºÆµ¢¤ÎºÇ½é¤ÎÃÊ³¬¤Ç¤Ï·ÑÂ³¤Ï¹±Åù´Ø¿ô¤À¡¥
²¿¤ò¤¹¤Ù¤­¤«¤È¸À¤¨¤Ð¡¤´Ø¿ô¤Ï¸½ºß¤ÎÃÍ¤ò¤½¤Î¤Þ¤ÞÊÖ¤»¤Ð¤è¤¤¡¥
ºÆµ¢¤ÎÂè2ÃÊ³¬¤Ç¤Ï¡¤·ÑÂ³¤Ï¼¡¤ÈÅù²Á¤À¡¥
\begin{verbatim}
#'(lambda (w)
        (identity (append w (list (car x)))))
\end{verbatim}
¤Ä¤Þ¤ê¡¤²¿¤ò¤¹¤ë¤Ù¤­¤«¤È¸À¤¨¤Ð¡¤¥ê¥¹¥È¤ÎcarÉô¤ò¸½ºß¤ÎÃÍ¤ËÉÕ²Ã¤·¤ÆÊÖ¤¹¤È¤¤¤¦¤³¤È¤À¡¥

CPSÊÑ´¹¤ò³Ð¤¨¤ì¤Ð\verb|call/cc|¤ò½ñ¤¯¤Î¤Ï´ÊÃ±¤À¡¥
CPSÊÑ´¹¤ò·Ð¤¿¥×¥í¥°¥é¥à¤Ç¤Ï¡¤Á´ÂÎ¤ËÂÐ¤¹¤ë¸½ºß¤Î·ÑÂ³¤¬¾ï¤ËÂ¸ºß¤·¡¤
\verb|call/cc|¤Ï¤½¤Î°ú¿ô¤È¤·¤Æ²¿¤é¤«¤Î´Ø¿ô¤ò¸Æ¤Ó½Ð¤¹Ã±½ã¤Ê¥Þ¥¯¥í¤È¤·¤Æ¼ÂÁõ¤Ç¤­¤ë¡¥

CPSÊÑ´¹¤Ë¤Ï¡¤code-walker,
¤¹¤Ê¤ï¤Á¥×¥í¥°¥é¥à¤Î¥½¡¼¥¹¥³¡¼¥É¤òÉ½¸½¤¹¤ë¥Ä¥ê¡¼¤òÃµº÷¤¹¤ë¥×¥í¥°¥é¥à¤¬É¬Í×¤Ë¤Ê¤ë¡¥
Common Lisp¤ËÂÐ¤¹¤ëcode-walker¤ò½ñ¤¯¤Î¤Ï¤Ò¤É¤¤¹üÀÞ¤ê¤À¡¥
»È¤¨¤ë¤â¤Î¤Ë¤Ê¤ë¤Ë¤Ï¡¤code-walker¤ÏÃ±¤Ë¼°¤òÃµº÷¤¹¤ë¤À¤±¤Ç¤ÏºÑ¤Þ¤º¡¤¡¥
¤½¤Î¼°¤Î°ÕÌ£¤â¤«¤Ê¤êÍý²ò¤Ç¤­¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
Îã¤¨¤Ð¡¤code-walker¤Ï¥·¥ó¥Ü¥ë¤À¤±¤ò¹Í¤¨¤Æ¤¤¤ì¤ÐºÑ¤à¤â¤Î¤Ç¤Ï¤Ê¤¤¡¥
¥·¥ó¥Ü¥ë¤¬É½¸½¤¹¤ë¤Î¤Ï¡¤¤¤¤¯¤Ä¤«µó¤²¤ë¤È¡¤
¥·¥ó¥Ü¥ë¼«¿È¡¤´Ø¿ô¡¤ÊÑ¿ô¡¤¥Ö¥í¥Ã¥¯Ì¾¡¤\verb|go|¤Î¤¿¤á¤Î¥¿¥°¤Ê¤É¤À¡¥
Code-walker¤ÏÊ¸Ì®¤«¤é¥·¥ó¥Ü¥ë¤Î¼ïÎà¤òÈ½ÊÌ¤·¡¤¤½¤ì¤Ë½¾¤Ã¤ÆÆ°ºî¤·¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥

Code-walker¤ò½ñ¤¯¤Î¤Ï¤³¤ÎËÜ¤ÎÈÏ°Ï¤òÄ¶¤¨¤ë¤Î¤Ç¡¤¤³¤Î¾Ï¤ÇÀâÌÀ¤·¤¿¥Þ¥¯¥í¤Ï¼ÂÍÑÅª¤ÊÂåÍýÉÊ¤Ë²á¤®¤Ê¤¤¡¥
¤³¤Î¾Ï¤Î¥Þ¥¯¥í¤Ï·ÑÂ³¤ò¹½ÃÛ¤¹¤ë»Å»ö¤ò¥æ¡¼¥¶¤ÈÊ¬Ã´¤·¤Æ¹Ô¤¦¡¥
¥æ¡¼¥¶¤¬CPS¤Ë½½Ê¬¶á¤¤¥×¥í¥°¥é¥à¤ò½ñ¤±¤Ð¡¤»Ä¤ê¤Ï¥Þ¥¯¥í¤¬¤ä¤Ã¤Æ¤¯¤ì¤ë¡¥
Âè4¤Îµ¬Â§¤ÏËÜÅö¤Ï¤½¤¦¤¤¤¦¤³¤È¤À¡¥
\verb|=bind|¤Î¸å¤ËÂ³¤¯½èÍý¤¬¤½¤ÎËÜÂÎÆâ¤Ë¤¢¤ì¤Ð¡¤
\verb|*cont*| ¤ÎÃÍ¤È \verb|=bind|¤ÎËÜÂÎÆâ¤Î¥³¡¼¥É¤Î´Ö¤Ç¡¤
¥×¥í¥°¥é¥à¤Ï¸½ºß¤Î·ÑÂ³¤òºî¤ë¤¿¤á¤Î½½Ê¬¤Ê¾ðÊó¤òÆÀ¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥

¥Þ¥¯¥í \verb|=bind|¤Ï¤³¤Î¥¹¥¿¥¤¥ë¤Î¥×¥í¥°¥é¥ß¥ó¥°¤ò¼«Á³¤Ë»×¤ï¤»¤ë°Õ¿Þ¤ò»ý¤Ã¤Æ½ñ¤«¤ì¤¿¡¥
¼ÂºÝ¤Ë¤Ï·ÑÂ³ÅÏ¤·¥Þ¥¯¥í¤Î²Ý¤¹À©¸Â¤Ï²æËý¤ÎÈÏ°ÏÆâ¤À¤í¤¦¡¥
%}}}
%}}}
\section{Ê£¿ô¥×¥í¥»¥¹} %{{{
Á°¾Ï¤Ç¤Ï¡¤·ÑÂ³¤òÍøÍÑ¤¹¤ì¤Ð¼Â¹ÔÃæ¤Î¥×¥í¥°¥é¥à¤¬¼«Ê¬¤Î¾õÂÖ¤òÇÄ°®¤·¡¤
¤½¤ì¤òÊÝÂ¸¤·¤Æ¸å¤ÇºÆ³«¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¤³¤È¤ò¼¨¤·¤¿¡¥
¤³¤Î¾Ï¤Ç°·¤¦·×»»½èÍý¤Î¥â¥Ç¥ë¤Ï¡¤
·×»»µ¡¤¬Ã±°ì¤Î¥×¥í¥°¥é¥à¤ò¼Â¹Ô¤¹¤ë¤Î¤Ç¤Ê¤¯¡¤ÆÈÎ©¤·¤¿¥×¥í¥»¥¹¤Î½¸¹ç¤ò¼Â¹Ô¤¹¤ë¤È¤¤¤¦¤â¤Î¤À¡¥
¥×¥í¥»¥¹¤Î³µÇ°¤Ï¥×¥í¥°¥é¥à¤Î¾õÂÖ¤È¤¤¤¦³µÇ°¤È¿¼¤¤ÂÐ±þ´Ø·¸¤Ë¤¢¤ë¡¥
Á°¾Ï¤Ç¼¨¤·¤¿¥Þ¥¯¥í¤Î¾å¤Ë¤µ¤é¤Ë¤â¤¦°ìÁØ¤Î¥Þ¥¯¥í¤ò½ñ¤¯¤³¤È¤Ç¡¤
Common Lisp¥×¥í¥°¥é¥à¤ÎÃæ¤ËÊ£¿ô¥×¥í¥»¥¹¤òËä¤á¹þ¤à¤³¤È¤¬¤Ç¤­¤ë¡¥
\subsection{¥×¥í¥»¥¹¤ÎÃê¾Ý²½}   %{{{
Ê£¿ô¥×¥í¥»¥¹¤Ï¡¤Ê£¿ô¤Î½èÍý¤òÆ±»þ¤Ë¹Ô¤ï¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¥×¥í¥°¥é¥à¤òÉ½¸½¤¹¤ë¤Î¤ËÊØÍø¤À¡¥
ÅÁÅýÅª¤ÊCPU¤Ï¥¤¥ó¥¹¥È¥é¥¯¥·¥ç¥ó¤ò1¤Ä¤º¤Ä¼Â¹Ô¤¹¤ë¡¥
¡ÖÊ£¿ô¥×¥í¥»¥¹¤ÏÆ±»þ¤ËÊ£¿ô¤Î½èÍý¤ò¹Ô¤¦¡×¤È¤¤¤¦¤Î¤Ï¡¤
¤³¤Î¥Ï¡¼¥É¥¦¥§¥¢¾å¤ÎÀ©¸Â¤ò¤É¤¦¤Ë¤«¾è¤ê±Û¤¨¤ë¤È¤¤¤¦°ÕÌ£¤Ç¤Ï¤Ê¤¤¡¥
¤½¤ì¤ò»È¤Ã¤Æ¡¤Ãê¾Ý²½¤Î¿·¤¿¤ÊÃÊ³¬¤Ç¤â¤Î¤ò¹Í¤¨¤é¤ì¤ë¤è¤¦¤Ë¤Ê¤ë¤È¤¤¤¦¤³¤È¤À¡¥
¤Ä¤Þ¤ê¥³¥ó¥Ô¥å¡¼¥¿¤¬¤¢¤ë»þÅÀ¤Ç²¿¤ò¹Ô¤¦¤«¡¤Ãà°ì»ØÄê¤·¤Ê¤¯¤È¤â¤è¤¤¡¥
²¾ÁÛ¥á¥â¥ê¤Ë¤è¤Ã¤Æ¡¤¥³¥ó¥Ô¥å¡¼¥¿¤¬¼ÂºÝ¤ËÈ÷¤¨¤Æ¤¤¤ë¤è¤êÂ¿¤¯¤Î¥á¥â¥ê¤¬¤¢¤ë¤«¤Î¤è¤¦¤Ë»×¤¨¤ë¤Î¤ÈÆ±ÍÍ¡¤
¥×¥í¥»¥¹¤Î³µÇ°¤Ë¤è¤Ã¤Æ¡¤¥³¥ó¥Ô¥å¡¼¥¿¤¬Æ±»þ¤ËÊ£¿ô¤Î¥×¥í¥°¥é¥à¤ò¼Â¹Ô¤Ç¤­¤ë¤«¤Î¤è¤¦¤Ë»×¤Ã¤Æ¤¤¤é¤ì¤ë¡¥

¥×¥í¥»¥¹¤Î¸¦µæ¤ÏÅÁÅýÅª¤Ë¤ÏOS¤ÎÊ¬Ìî¤Ç¹Ô¤ï¤ì¤Æ¤¤¤¿¡¥
¤·¤«¤·Ãê¾Ý²½¤Î´ÑÅÀ¤È¤·¤Æ¤Î¥×¥í¥»¥¹¤ÎÍøÊØÀ­¤ÏOS¤ÎÀ¤³¦¤Ë¸Â¤é¤ì¤Æ¤Ï¤¤¤Ê¤¤¡¥
¥×¥í¥»¥¹¤ÏÂ¾¤Î¥ê¥¢¥ë¥¿¥¤¥à¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤ä¥·¥ß¥å¥ì¡¼¥·¥ç¥ó¤Ç¤âÆ±ÍÍ¤ËÊØÍø¤Ê¤â¤Î¤À¡¥

Ê£¿ô¥×¥í¥»¥¹¤Ë´ð¤Å¤¤¤Æ¤Ê¤µ¤ì¤¿»Å»ö¤ÎÂçÉôÊ¬¤Ï¡¤¤¢¤ë¼ï¤ÎÌäÂê¤Î²óÈò¤ËÈñ¤µ¤ì¤Æ¤­¤¿¡¥
¥Ç¥Ã¥É¥í¥Ã¥¯¤ÏÊ£¿ô¥×¥í¥»¥¹¤ËÈ¼¤¦¸ÅÅµÅªÌäÂê¤Î°ì¤Ä¤À¡¥
¤¹¤Ê¤ï¤Á¡¤Áê¼ê¤è¤êÀè¤ËÉßµï¤ò±Û¤¨¤ë¤Î¤ò¸ß¤¤¤Ëµñ¤à2¿Í¤Î¿Í¤Î¤è¤¦¤Ë¡¤
2¤Ä¤Î¥×¥í¥»¥¹¤¬²¿¤â¤»¤º¤Ë¡¤¶¦¤Ë¤â¤¦ÊÒÊý¤¬²¿¤«¤ò¹Ô¤¦¤Î¤òÂÔ¤ÁÂ³¤±¤ë¤³¤È¤À¡¥
Â¾¤Ë¤â¡¤°ì´Ó¤·¤Æ¤¤¤Ê¤¤¾õÂÖ¤Ë¤¢¤ë¥·¥¹¥Æ¥à¤ËÂÐ¤¹¤ë¥¯¥¨¥ê¤ÎÌäÂê¤â¤¢¤ë¡¥
Îã¤¨¤Ð¡¤¥·¥¹¥Æ¥à¤¬ÍÂ¶â¤ò¤¢¤ë¸ýºÂ¤«¤éÊÌ¤Î¸ýºÂ¤Ë°Ü¤·¤Æ¤¤¤ëºÇÃæ¤Ë»Ä¹â¤¬Ìä¤¤¹ç¤ï¤»¤é¤ì¤ë¾ì¹ç¤À¡¥
¤³¤Î¾Ï¤Ç°·¤¦¤Î¤Ï¥×¥í¥»¥¹¤Ë¤è¤ëÃê¾Ý²½¤Î¤ß¤À¡¥
¤³¤³¤Ç¼¨¤µ¤ì¤¿¥³¡¼¥É¤Ï¡¤
¥Ç¥Ã¥É¥í¥Ã¥¯¤ä°ì´Ó¤·¤Æ¤¤¤Ê¤¤¾õÂÖ¤òËÉ¤°¥¢¥ë¥´¥ê¥º¥à¤Î¥Æ¥¹¥È¤Ë»È¤¨¤ë¤«¤â¤·¤ì¤Ê¤¤¤¬¡¤
¥³¡¼¥É¤½¤Î¤â¤Î¤Ï¤½¤ì¤é¤ÎÌäÂê¤ËÂÐ¤¹¤ëËÉ¸æÁ¼ÃÖ¤ò°ìÀÚ¼è¤Ã¤Æ¤¤¤Ê¤¤¡¥

¤³¤Î¾Ï¤Ë¤ª¤±¤ë¼ÂÁõ¤Ï¡¤¤³¤ÎËÜ¤ÎÁ´¤Æ¤Î¥×¥í¥°¥é¥à¤¬°ÅÌÛ¤Ë½¾¤Ã¤Æ¤¤¤ëµ¬Â§¤Ë½¾¤Ã¤Æ¤¤¤ë¡¥
¤¹¤Ê¤ï¤Á¡Ö¤Ê¤ë¤À¤±Lisp¤È¤Ö¤Ä¤«¤ë¤Ê¡×¤À¡¥
µ¤»ý¤Á¤È¤·¤Æ¤Ï¡¤¥×¥í¥°¥é¥à¤Ï¤Ç¤­¤ë¸Â¤ê¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Î½¤Àµ¤Ë¶áÉÕ¤¯¤Ù¤­¤Ç¡¤
¤½¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç½ñ¤«¤ì¤¿¸ÄÊÌ¤Î¥¢¥×¥ê¥±¡¼¥·¥ç¥ó¤Ë¤Ê¤ë¤Ù¤­¤Ç¤Ï¤Ê¤¤¡¥
¥×¥í¥°¥é¥à¤òLisp¤ÈÄ´ÏÂ¤¹¤ë¤è¤¦¤Ëºî¤ì¤Ð¡¤¤Ô¤Ã¤¿¤ê¹ç¤Ã¤¿ÉôÉÊ¤Çºî¤é¤ì¤¿µ¡³£¤Î¤è¤¦¤Ë´è·ò¤Ë¤Ê¤ë¡¥
¤Þ¤¿¡¤Ï«ÎÏ¤ÎÀáÌó¤Ë¤â¤Ê¤ë¡¥
¶Ã¤¯Äø¤ÎÎÌ¤Î½èÍý¤òLisp¤Ë¸ªÂå¤ê¤µ¤»¤é¤ì¤ë¤³¤È¤â¤¢¤ë¡¥

¤³¤Î¾Ï¤ÎÌÜÅª¤Ï¡¤Ê£¿ô¥×¥í¥»¥¹¤ËÂÐ±þ¤·¤¿¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤òºî¤ë¤³¤È¤À¡¥
¤³¤³¤Ç¤ÎÀïÎ¬¤Ï¡¤¿·¥ª¥Ú¥ì¡¼¥¿¤ò¤¤¤¯¤Ä¤«ÄÉ²Ã¤·¤Æ¡¤Lisp¤ò¤½¤Î¤è¤¦¤Ê¤â¤Î¤ËÊÑ¤¨¤Æ¤æ¤¯¤³¤È¤À¡¥
¿·¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Î´ðËÜÍ×ÁÇ¤Ï¼¡¤Î¤è¤¦¤Ê¤â¤Î¤À¡¥

´Ø¿ô¤Ï¡¤Á°¾Ï¤Î¥Þ¥¯¥í\,\verb|=defun|¤ä\,\verb|=lambda|¤ÇÄêµÁ¤µ¤ì¤ë¡¥

¥×¥í¥»¥¹¤Ï´Ø¿ô¸Æ¤Ó½Ð¤·¤Ë¤è¤Ã¤ÆÀ¸À®¤µ¤ì¤ë¡¥
¡Ê°ì¤Ä¤Î´Ø¿ô¤«¤éÀ¸À®¤µ¤ì¤Æ¤¤¤Æ¤â¡Ë¥¢¥¯¥Æ¥£¥Ö¤Ê¥×¥í¥»¥¹¤Î¿ô¤ËÀ©¸Â¤Ï¤Ê¤¤¡¥
³Æ¥×¥í¥»¥¹¤Ë¤ÏÍ¥ÀèÅÙ¤¬Äê¤Þ¤Ã¤Æ¤ª¤ê¡¤¤½¤Î½é´üÃÍ¤Ï¥×¥í¥»¥¹¤òÀ¸À®¤¹¤ë¤È¤­¤Î°ú¿ô¤ÇÍ¿¤¨¤é¤ì¤ë¡¥

\verb|wait|¼°¤ò´Ø¿ôÆâ¤Ç»È¤¦¤³¤È¤¬¤Ç¤­¤ë¡¥
\verb|wait|¼°¤Ï¡¤ÊÑ¿ô¤È¥Æ¥¹¥È¼°¤È¡¤¼Â¹ÔËÜÂÎ¤È¤Ê¤ë¥³¡¼¥É¤ò°ú¿ô¤Ë¼è¤ë¡¥
¥×¥í¥»¥¹¤¬\verb|wait|¼°¤Ë½Ð²ñ¤¦¤È¡¤¥Æ¥¹¥È¼°¤¬¿¿¤òÊÖ¤¹¤Þ¤Ç¤½¤Î»þÅÀ¤Ç½èÍý¤¬ÃæÃÇ¤µ¤ì¤ë¡¥
¥×¥í¥»¥¹¤¬ºÆ»ÏÆ°¤¹¤ë¤È¡¤
\verb|wait|¼°¤ËÍ¿¤¨¤¿ÊÑ¿ô¤¬¥Æ¥¹¥È¼°¤ÎÊÖ¤êÃÍ¤ËÂ«Çû¤µ¤ì¤¿¾õÂÖ¤Ç¥³¡¼¥ÉËÜÂÎ¤¬É¾²Á¤µ¤ì¤ë¡¥
¥Æ¥¹¥È¼°¤ÏÉáÄÌ¤ÏÉûºîÍÑ¤ò»ý¤Ä¤Ù¤­¤Ç¤Ï¤Ê¤¤¡¥
¤¤¤Ä¡¤¤É¤Î°Ì¤ÎÉÑÅÙ¤ÇÉ¾²Á¤¬¹Ô¤ï¤ì¤ë¤«¤ÎÊÝ¾Ú¤¬¤Ê¤¤¤«¤é¤À¡¥

¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤ÏÍ¥ÀèÅÙ¤Ë´ð¤Å¤¤¤Æ¹Ô¤ï¤ì¤ë¡¥
ºÆ»ÏÆ°¤·ÆÀ¤ëÁ´¤Æ¤Î¥×¥í¥»¥¹¤Î¤¦¤Á¡¤ºÇ¹â¤ÎÍ¥ÀèÅÙ¤ò»ý¤Ä¥×¥í¥»¥¹¤ò¥·¥¹¥Æ¥à¤¬Áª¤ó¤Ç»ÏÆ°¤µ¤»¤ë¡¥

Â¾¤Ë»ÏÆ°¤¹¤ë¥×¥í¥»¥¹¤¬¤Ê¤¤¤È¤­¤Ë¤Ï¥Ç¥Õ¥©¥ë¥È¡¦¥×¥í¥»¥¹¤¬»ÏÆ°¤¹¤ë¡¥
¤½¤ì¤Ïread-eval-print¥ë¡¼¥×¤Î°ì¼ï¤À¡¥

ÂçÄñ¤Î¥ª¥Ö¥¸¥§¥¯¥È¤Ï¼Â¹ÔÃæ¤ËÀ¸À®¤äÇË´þ¤¬¤Ç¤­¤ë¡¥
¼Â¹ÔÃæ¤Î¥×¥í¥»¥¹¤Ç¿·¤·¤¤´Ø¿ô¤òÄêµÁ¤¹¤ë¤³¤È¤â¤Ç¤­¤ë¤·¡¤
ÊÌ¤Î¥×¥í¥»¥¹¤ò»ÏÆ°¤·¤¿¤ê½ªÎ»¤µ¤»¤¿¤ê¤â¤Ç¤­¤ë¡¥

·ÑÂ³¤Ë¤è¤ê¡¤Lisp¥×¥í¥°¥é¥à¤Î¾õÂÖ¤òÊÝ»ý¤¹¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
Ê£¿ô¤Î¾õÂÖ¤òÆ±»þ¤ËÊÝ»ý¤·¤Æ¤¤¤é¤ì¤ë¤³¤È¤Ï¡¤Ê£¿ô¤Î¥×¥í¥»¥¹¤¬¤¢¤ë¤³¤È¤ÈÂç¤·¤Æ°ã¤ï¤Ê¤¤¡¥
Ê£¿ô¥×¥í¥»¥¹¤ò¼ÂÁõ¤¹¤ë¤Ë¤Ï¡¤Á°¾Ï¤ÇÄêµÁ¤·¤¿¥Þ¥¯¥í¤«¤é»Ï¤á¤Æ60¹Ô¼å¤Î¥³¡¼¥É¤·¤«É¬Í×¤Ê¤¤¡¥
%}}}
\subsection{¼ÂÁõ}   %{{{
\begin{figure}\begin{center}\begin{FramedVerb}
(defstruct proc pri state wait)

(proclaim '(special *procs* *proc*))

(defvar *halt* (gensym))

(defvar *default-proc*
  (make-proc :state #'(lambda (x)
                        (format t "~%>> ")
                        (princ (eval (read)))
                        (pick-process))))

(defmacro fork (expr pri)
  `(prog1 ',expr
     (push (make-proc
             :state #'(lambda (,(gensym))
                        ,expr
                        (pick-process))
             :pri      ,pri)
           *procs*)))

(defmacro program (name args &body body)
  `(=defun ,name ,args
           (setq *procs* nil)
           ,@body
           (catch *halt* (loop (pick-process)))))
\end{FramedVerb}\end{center}
\caption{¥×¥í¥»¥¹¹½Â¤ÂÎ¤È¤½¤ÎÀ¸À®¡¥}
\label{fig:ProcessStructInstantiation}
\end{figure}

\begin{figure}\begin{center}\begin{FramedVerb}
 (defun pick-process ()
       (multiple-value-bind (p val) (most-urgent-process)
        (setq *proc* p
                  *procs* (delete p *procs*))
        (funcall (proc-state p) val)))

 (defun most-urgent-process ()
       (let ((proc1 *default-proc*) (max -1) (val1 t))
        (dolist (p *procs*)
          (let ((pri (proc-pri p)))
             (if (> pri max)
                   (let ((val (or (not (proc-wait p))
                                      (funcall (proc-wait p)))))
                     (when val
                       (setq proc1 p
                               max     pri
                               val1 val))))))
        (values proc1 val1)))

 (defun arbitrator (test cont)
       (setf (proc-state *proc*) cont
             (proc-wait *proc*) test)
       (push *proc* *procs*)
       (pick-process))

 (defmacro wait (parm test &body body)
       `(arbitrator #'(lambda () ,test)
                      #'(lambda (,parm) ,@body)))

 (defmacro yield (&body body)
       `(arbitrator nil #'(lambda (,(gensym)) ,@body)))

 (defun setpri (n) (setf (proc-pri *proc*) n))

 (defun halt (&optional val) (throw *halt* val))

 (defun kill (&optional obj &rest args)
       (if obj
          (setq *procs* (apply #'delete obj *procs* args))
          (pick-process)))
\end{FramedVerb}\end{center}
\caption{¥×¥í¥»¥¹¤Î¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¡¥}
\label{fig:ProcessScheduling}
\end{figure}

\reffig{fig:ProcessStructInstantiation}¤È\reffig{fig:ProcessScheduling}¤Ë¤Ï¡¤
Ê£¿ô¥×¥í¥»¥¹¤ËÂÐ±þ¤¹¤ë¤¿¤á¤ËÉ¬Í×¤ÊÁ´¤Æ¤Î¥³¡¼¥É¤ò¼¨¤·¤¿¡¥
\reffig{fig:ProcessStructInstantiation}¤Î¥³¡¼¥É¤Ï¡¤´ðËÜÅª¥Ç¡¼¥¿¹½Â¤¡¤¥Ç¥Õ¥©¥ë¥È¡¦¥×¥í¥»¥¹¡¤
¥×¥í¥»¥¹¤Î½é´ü²½¤äÀ¸À®¤Î¤¿¤á¤Î¤â¤Î¤À¡¥
¥×¥í¥»¥¹¤¹¤Ê¤ï¤Á\verb|procs|¤Ï°Ê²¼¤Î¹½Â¤¤ò»ý¤Ä¡¥
\begin{description}
    \item[pri]¤Ï¥×¥í¥»¥¹¤ÎÍ¥ÀèÅÙ¤Ç¡¤Àµ¤ÎÀ°¿ô¡¥
    \item[state]¤ÏÃæÃÇ¤µ¤ì¤¿¥×¥í¥»¥¹¤Î¾õÂÖ¤òÉ½¤¹·ÑÂ³¡¥
        ¥×¥í¥»¥¹¤ÎºÆ»ÏÆ°¤Ï¡¤¤³¤Î¾õÂÖ¤ò\verb|funcall|¤ËÅÏ¤¹¤³¤È¤Ç¹Ô¤ï¤ì¤ë¡¥
    \item[wait]¤Ï´Ø¿ô¤Ç¡¤¤³¤ì¤¬¿¿¤òÊÖ¤µ¤Ê¤¤¤È¥×¥í¥»¥¹¤ÏºÆ»ÏÆ°¤Ç¤­¤Ê¤¤¡¥
        ¤·¤«¤·¿·¤¿¤ËÀ¸À®¤µ¤ì¤¿¤Ð¤«¤ê¤Î¥×¥í¥»¥¹¤Ç¤Ï\verb|nil|¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥
        \verb|wait|¤¬\verb|nil|¤Î¥×¥í¥»¥¹¤Ï¾ï¤ËºÆ»ÏÆ°¤Ç¤­¤ë¡¥
\end{description}

¥×¥í¥°¥é¥à¤Ï3¤Ä¤Î¥°¥í¡¼¥Ð¥ëÊÑ¿ô¤ò»È¤¦¡¥
\verb|*procs*|¤ÏÃæÃÇÃæ¤Î¥×¥í¥»¥¹¤Î¥ê¥¹¥È¡¤\verb|*proc*|¤Ï¼Â¹ÔÃæ¤Î¥×¥í¥»¥¹¡¤
\verb|*default-proc*|¤Ï¥Ç¥Õ¥©¥ë¥È¡¦¥×¥í¥»¥¹¤ò³ÊÇ¼¤¹¤ë¡¥

¥Ç¥Õ¥©¥ë¥È¡¦¥×¥í¥»¥¹¤¬¼Â¹Ô¤µ¤ì¤ë¤Î¤Ï¡¤Â¾¤Ë¼Â¹Ô¤Ç¤­¤ë¥×¥í¥»¥¹¤¬¤Ê¤¤¤È¤­¤À¡¥
¤Á¤ç¤¦¤ÉLisp¤Î¥È¥Ã¥×¥ì¥Ù¥ë´Ä¶­¤Ë»÷¤»¤Æ¤¤¤ë¡¥
¥æ¡¼¥¶¤Ï¤³¤Î¥ë¡¼¥×Æâ¤Ç¡¤
¥×¥í¥°¥é¥à¤òÄä»ß¤µ¤»¤¿¤ê¡¤ÃæÃÇÃæ¤Î¥×¥í¥»¥¹¤òºÆ»ÏÆ°¤µ¤»¤é¤ì¤ë¼°¤òÆþÎÏ¤·¤¿¤ê¤Ç¤­¤ë¡¥
¥Ç¥Õ¥©¥ë¥È¡¦¥×¥í¥»¥¹¤Ï\verb|eval|¤òÍÛ¤Ë¸Æ¤ó¤Ç¤¤¤ë¤³¤È¤ËÃí°Õ¡¥
¤³¤³¤Ï¤½¤¦¤¹¤ë¤³¤È¤¬Íý¤ËÅ¬¤¦¿ô¾¯¤Ê¤¤¾õ¶·¤Î°ì¤Ä¤À¡¥
°ìÈÌ¤Ë¡¤¼Â¹Ô»þ¤Ë\verb|eval|¤ò¸Æ¤Ö¤Î¤Ï¤è¤¤¹Í¤¨¤Ç¤Ï¤Ê¤¤¡¥
¤½¤ÎÍýÍ³¤Ï°Ê²¼¤Î2¤Ä¤À¡¥
\begin{description}
    \item[¸úÎ¨¤¬°­¤¤]
        \verb|eval|¤ÏÀ¸¤Î¥ê¥¹¥È¤òÅÏ¤µ¤ì¤ë¤¬¡¤
        ¤½¤ì¤ò¤½¤Î¾ì¤Ç¥³¥ó¥Ñ¥¤¥ë¤Ê¤ê¥¤¥ó¥¿¥×¥ê¥¿¤ò»È¤Ã¤ÆÉ¾²Á¤Ê¤ê¤»¤¶¤ë¤òÆÀ¤Ê¤¤¡¥
        ¤É¤Á¤é¤Ë¤»¤è¡¤¥³¡¼¥É¤òÍ½¤á¥³¥ó¥Ñ¥¤¥ë¤·¤Æ¤ª¤¤¤Æ¸Æ¤Ó½Ð¤¹¤À¤±¤Î¤È¤­¤è¤êÃÙ¤¯¤Ê¤ë¡¥
    \item[É½¸½ÎÏ¤¬Äã¤¤]
        ¼°¤¬¥ì¥­¥·¥«¥ë¡¦¥³¥ó¥Æ¥­¥¹¥È¤Ê¤·¤ÇÉ¾²Á¤µ¤ì¤ë¤«¤é¤À¡¥
        ¤È¤ê¤ï¤±¡¤É¾²Á¤µ¤ì¤ë¼°¤Î³°Â¦¤Ç¸«¤¨¤Æ¤¤¤ëÉáÄÌ¤ÎÊÑ¿ô¤Ë¥¢¥¯¥»¥¹¤Ç¤­¤Ê¤¤¡¥
\end{description}

ÉáÄÌ¡¤\verb|eval|¤òÍÛ¤Ë¸Æ¤Ö¤³¤È¤Ï¶õ¹Á¤ÎÅÚ»ºÊª²°¤ÇÇã¤¤¤â¤Î¤ò¤¹¤ë¤è¤¦¤Ê¤â¤Î¤À¡¥
±ä¡¹¤ÈÂÔ¤¿¤µ¤ì¤¿¤¢¤²¤¯¡¤ÉÊÂ·¤¨¤Î°­¤¤¡¤¤½¤ì¤âÆóÎ®ÉÊ¤Ð¤«¤ê¤ÎÅ¹¤Ë¹â¤¤¶â¤ò»ÙÊ§¤¦¤³¤È¤Ë¤Ê¤ë¡¥

º£¤Î¾õ¶·¤Ï¾å¤ÎµÄÏÀ¤¬¤É¤Á¤é¤âÅö¤Æ¤Ï¤Þ¤é¤Ê¤¤µ©¤ÊÎã¤À¡¥
¤³¤³¤Ç¤Ï¼°¤òÍ½¤á¥³¥ó¥Ñ¥¤¥ë¤¹¤ë¤³¤È¤Ï¤¢¤êÆÀ¤Ê¤¤¡¥
¤½¤Î»þÅÀ¤ÇÆÉ¤ß¹þ¤ó¤Ç¤¤¤ë¤Î¤À¤«¤é¡¤Í½¤á¤Ê¤É¤È¤¤¤¦¤â¤Î¤Ï¤Ê¤¤¡¥
Æ±ÍÍ¤Ë¡¤¼°¤Ï¤½¤ì¤òÊñ¤à¥ì¥­¥·¥«¥ë´Ä¶­¤ò¸µ¡¹»²¾È¤Ç¤­¤Ê¤¤¡¥
¥È¥Ã¥×¥ì¥Ù¥ë¤ËÆþÎÏ¤µ¤ì¤¿¼°¤Ï¥Ì¥ë¡¦¥ì¥­¥·¥«¥ë´Ä¶­¤ÎÃæ¤Ë¤¢¤ë¤«¤é¤À¡¥
¼ÂºÝ¡¤¤³¤Î´Ø¿ô¤ÎÄêµÁ¤Ï¡Ö¥æ¡¼¥¶¤¬ÆþÎÏ¤·¤¿¤â¤Î¤òÆÉ¤ß¹þ¤ó¤ÇÉ¾²Á¤¹¤ë¡×¤ò¤½¤Î¤Þ¤ÞÈ¿±Ç¤·¤Æ¤¤¤ë¡¥

¥Þ¥¯¥í\verb|fork|¤Ï´Ø¿ô¸Æ¤Ó½Ð¤·¤Ë¤è¤Ã¤Æ¥×¥í¥»¥¹¤òÀ¸À®¤¹¤ë¡¥
´Ø¿ô¤Ï\,\verb|=defun|¤Ë¤è¤Ã¤ÆÄÌ¾ïÄÌ¤êÄêµÁ¤Ç¤­¤ë¡¥
\begin{verbatim}
(=defun foo (x)
  (format t "Foo was called with ~A.~%" x)
  (=values (1+ x)))
\end{verbatim}
¤µ¤Æ´Ø¿ô¸Æ¤Ó½Ð¤·¤ÈÍ¥ÀèÅÙ¤ò°ú¿ô¤Ë\verb|fork|¤ò¸Æ¤Ó½Ð¤¹¤È¡¤
\begin{verbatim}
(fork (foo 2) 25)
\end{verbatim}
¿·¤·¤¤¥×¥í¥»¥¹¤¬\,\verb|*procs*|\,¤Ë¥×¥Ã¥·¥å¤µ¤ì¤ë¡¥
¤½¤Î¿·¥×¥í¥»¥¹¤ÏÍ¥ÀèÅÙ¤¬25¤Ç¡¤
¡Ê\verb|proc|¤Î¡Ë\verb|wait|¥Õ¥£¡¼¥ë¥É¤¬\verb|nil|¡Ê¤Þ¤À»ÏÆ°¤µ¤»¤é¤ì¤Æ¤¤¤Ê¤¤¤¿¤á¡Ë¡¤
\verb|state|¥Õ¥£¡¼¥ë¥É¤¬2¤ò°ú¿ô¤È¤·¤¿\verb|foo|¤Î¸Æ¤Ó½Ð¤·¤Ë¤Ê¤Ã¤Æ¤¤¤ë¡¥

¥Þ¥¯¥í\verb|program|¤Ë¤è¤Ã¤Æ¡¤°ì·²¤Î¥×¥í¥»¥¹¤òÀ¸À®¤·¡¤°ì½ï¤Ë¼Â¹Ô¤Ç¤­¤ë¡¥
¼¡¤ÎÄêµÁ¤Ï¡¤2¤Ä¤Î\verb|fork|¼°¤¬¡¤
ÃæÃÇ¤µ¤ì¤¿¥×¥í¥»¥¹¤ò¾Ãµî¤¹¤ë¥³¡¼¥É¤È¼Â¹Ô¤¹¤ë¥×¥í¥»¥¹¤ò·«¤êÊÖ¤·Áª¤Ö¥³¡¼¥É¤Ë
¶´¤Þ¤ì¤¿¤â¤Î¤Ë¥Þ¥¯¥íÅ¸³«¤µ¤ì¤ë¡¥
\begin{verbatim}
(program two-foos (a b)
  (fork (foo a) 99)
  (fork (foo b) 99))
\end{verbatim}
¤³¤Î¥ë¡¼¥×¤Î³°Â¦¤Ç¤Ï¥Þ¥¯¥í¤¬¥¿¥°¤òÀßÄê¤·¤Æ¤ª¤ê¡¤¤½¤³¤ËÀ©¸æ¤ò°Ü¤¹¤³¤È¤Ç¥×¥í¥°¥é¥à¤ò½ªÎ»¤Ç¤­¤ë¡¥
¤³¤Î¥¿¥°¤Ïgensym¤Ê¤Î¤Ç¡¤¥æ¡¼¥¶¤Î¥³¡¼¥É¤¬ÀßÄê¤·¤¿¥¿¥°¤È¾×ÆÍ¤·¤Ê¤¤¡¥
\verb|program|¤ÇÄêµÁ¤µ¤ì¤¿¥×¥í¥»¥¹¤¿¤Á¤ÏÆÃ¤ËÃÍ¤òÊÖ¤µ¤º¡¤
¥È¥Ã¥×¥ì¥Ù¥ë¤«¤é¸Æ¤Ð¤ì¤ë¤³¤È¤Î¤ß¤ò°Õ¿Þ¤·¤Æ¤¤¤ë¡¥

¥×¥í¥»¥¹¤¬À¸À®¤µ¤ì¤¿¸å¡¤
\reffig{fig:ProcessScheduling}¤Ë¼¨¤·¤¿¥×¥í¥»¥¹¤Î¥¹¥±¥¸¥å¡¼¥ê¥ó¥°ÍÑ¤Î¥³¡¼¥É¤¬Æþ¤ìÂØ¤ï¤ê¤Ëµ¯Æ°¤¹¤ë¡¥
´Ø¿ô\verb|pick-process|¤Ï¡¤ºÆ»ÏÆ°²ÄÇ½¤Ê¥×¥í¥»¥¹¤Î¤¦¤ÁÍ¥ÀèÅÙ¤¬°ìÈÖ¹â¤¤¤â¤Î¤òÁª¤ó¤Ç»ÏÆ°¤µ¤»¤ë¡¥
¤½¤Î¥×¥í¥»¥¹¤òÁª¤Ö¤Î¤Ï\verb|most-urgent-process|¤Î»Å»ö¤À¡¥
Ää»ßÃæ¤Î¥×¥í¥»¥¹¤¬»ÏÆ°¤Ç¤­¤ë¤Î¤Ï¡¤\verb|wait|¼°¤¬Ãæ¤Ë¤Ê¤¤¤«¡¤
¤Þ¤¿¤Ï\verb|wait|¼°¤¬¿¿¤òÊÖ¤·¤¿¤È¤­¤À¡¥
»ÏÆ°²ÄÇ½¤Ê¥×¥í¥»¥¹¤Î¤¦¤Á¤ÇºÇ¤âÍ¥ÀèÅÙ¤¬¹â¤¤¤â¤Î¤¬Áª¤Ð¤ì¤ë¡¥
Áª¤Ð¤ì¤¿¥×¥í¥»¥¹¤È¡¤¤½¤ÎÃæ¤Ë\verb|wait|¼°¤¬¤¢¤ì¤Ð¤½¤ÎÊÖ¤êÃÍ¤¬\verb|pick-process|¤ËÅÏ¤µ¤ì¤ë¡¥
¥Ç¥Õ¥©¥ë¥È¡¦¥×¥í¥»¥¹¤¬¾ï¤Ë»ÏÆ°¤·¤è¤¦¤È¤·¤Æ¤¤¤ë¤Î¤Ç¡¤É¬¤º¤¤¤º¤ì¤«¤Î¥×¥í¥»¥¹¤¬Áª¤Ð¤ì¤ë¤³¤È¤Ë¤Ê¤ë¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(defvar *open-doors* nil)

(=defun pedestrian ()
  (wait d (car *open-doors*)
    (format t "Entering ~A~%" d)))

(program ped ()
  (fork (pedestrian) 1))
\end{FramedVerb}\end{center}
\caption{\texttt{wait}¼°1¤Ä¤ò»ý¤Ä¥×¥í¥»¥¹¡¥}
\label{fig:OneProcessOneWait}
\end{figure}

\reffig{fig:ProcessScheduling}¤Î»Ä¤ê¤Î¥³¡¼¥É¤Ï
¥×¥í¥»¥¹´Ö¤ÇÀ©¸æ¤òÀÚÂØ¤¨¤ë¤¿¤á¤Î¥ª¥Ú¥ì¡¼¥¿¤òÄêµÁ¤·¤Æ¤¤¤ë¡¥
ÂÔµ¡¤¹¤ë¤¿¤á¤ÎÉ¸½àÅª¤Ê¼°¤Ï\verb|wait|¤Ç¡¤
\reffig{fig:ProcessScheduling}Æâ¤Î´Ø¿ô\verb|pedestrian|¤Ç¤â»È¤ï¤ì¤Æ¤¤¤ë¡¥
¤³¤ÎÎã¤Ç¤Ï¡¤¥×¥í¥»¥¹¤Ï¥ê¥¹¥È\,\verb|*open-doors*|\,¤ËÍ×ÁÇ¤¬´Þ¤Þ¤ì¤Ê¤¤´Ö¤ÏÂÔµ¡¤·¡¤
Í×ÁÇ¤¬¤¢¤ë¤È¤­¤Ï¥á¥Ã¥»¡¼¥¸¤òÉ½¼¨¤¹¤ë¡¥
\begin{verbatim}
> (ped)
>> (push 'door2 *open-doors*)
Entering DOOR2
>> (halt)
NIL
\end{verbatim}

\begin{figure}\begin{center}\begin{FramedVerb}
(defvar *bboard* nil)

(defun claim   (&rest f) (push f *bboard*))

(defun unclaim (&rest f) (pull f *bboard* :test #'equal))

(defun check   (&rest f) (find f *bboard* :test #'equal))

(=defun visitor (door)
  (format t "Approach ~A. " door)
  (claim 'knock door)
  (wait d (check 'open door)
    (format t "Enter ~A. " door)
    (unclaim 'knock door)
    (claim 'inside door)))

(=defun host (door)
  (wait k (check 'knock door)
    (format t "Open ~A. " door)
    (claim 'open door)
    (wait g (check 'inside door)
      (format t "Close ~A.~%" door)
      (unclaim 'open door))))

(program ballet ()
  (fork (visitor 'door1) 1)
  (fork (host 'door1) 1)
  (fork (visitor 'door2) 1)
  (fork (host 'door2) 1))
\end{FramedVerb}\end{center}
\caption{¹õÈÄ¤ò»È¤Ã¤¿Æ±´ü¡¥}
\label{fig:SynchroWithBlackboard}
\end{figure}

\verb|wait|¤Ï\,\verb|=bind|¡Êxgo¥Ú¡¼¥¸¡Ë¤Ë»÷¤Æ¤ª¤ê¡¤
¤½¤ì¤ÈÆ±ÍÍ¤Ë¡¤ºÇ¸å¤ËÉ¾²Á¤µ¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤È¤¤¤¦À©¸Â¤ò»ý¤Ä¡¥
\verb|wait|¤Î¸å¤Ë¹Ô¤¤¤¿¤¤½èÍý¤Ï¡¤Á´¤Æ¤½¤ÎÃæ¤ËÆþ¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤è¤Ã¤Æ\verb|wait|¤òÊ£¿ô²ó»È¤¤¤¿¤±¤ì¤Ð¡¤\verb|wait|¼°¤Ï¥Í¥¹¥È¤µ¤»¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¸ß¤¤¤ò¹ÍÎ¸¤·¤¿»ö¼Â¤ò²¾Äê¤¹¤ë¤³¤È¤Ç¡¤
¥×¥í¥»¥¹¤Ï\reffig{fig:SynchroWithBlackboard}¤Î¤è¤¦¤Ë¥´¡¼¥ë¤ËÅþÃ£¤¹¤ë¤¿¤á¤Î¶¦Æ±ºî¶È¤¬¹Ô¤¨¤ë¡¥

\verb|visitor|¤È\verb|host|¤Ë¤è¤êÀ¸À®¤µ¤ì¤¿¥×¥í¥»¥¹¤Ï¡¤
Æ±¤¸¥É¥¢¤òÍ¿¤¨¤é¤ì¤¿¤È¤­¡¤¹õÈÄ¾å¤Î¥á¥Ã¥»¡¼¥¸¤òÄÌ¤¸¤ÆÀ©¸æ¤ò¤ä¤ê¤È¤ê¤¹¤ë¡¥
\begin{verbatim}
> (ballet)
Approach DOOR2. Open DOOR2. Enter DOOR2. Close DOOR2.
Approach DOOR1. Open DOOR1. Enter DOOR1. Close DOOR1.
>>
\end{verbatim}

Â¾¤Ë\verb|wait|¼°¤ÎÃ±½ã¤Ê¤â¤Î¤¬¤¢¤ë¡¥
\verb|yield|¤ÎÌÜÅª¤Ï¡¤Â¾¤ÎÍ¥ÀèÅÙ¤Î¹â¤¤¥×¥í¥»¥¹¤Ë»ÏÆ°¤òµ¡²ñ¤ò¾ù¤ë¤³¤È¤À¤±¤À¡¥
¥×¥í¥»¥¹¤Ï¼°\verb|setpri|¡Ê¤³¤ì¤Ï¥«¥ì¥ó¥È¡¦¥×¥í¥»¥¹¤ÎÍ¥ÀèÅÙ¤òºÆÀßÄê¤¹¤ë¡Ë¤Î¼Â¹Ô¸å¤Ë
\verb|yield|¤ò¼Â¹Ô¤¹¤ë¤È¤è¤¤¤«¤â¤·¤ì¤Ê¤¤¡¥
\verb|wait|¤ÈÆ±ÍÍ¤Ë¡¤
\verb|yield|¤Î¸å¤Ë¼Â¹Ô¤·¤¿¤¤¥³¡¼¥É¤ÏÁ´¤Æ¤½¤ÎÆâÉô¤ËÆþ¤ì¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥

\begin{figure}\begin{center}\begin{FramedVerb}
(wait d (car *bboard*) (=values d))

(=defun capture (city)
  (take city)
  (setpri 1)
  (yield
    (fortify city)))

(=defun plunder (city)
  (loot city)
  (ransom city))

(defun take    (c) (format t "Liberating ~A.~%" c))
(defun fortify (c) (format t "Rebuilding ~A.~%" c))
(defun loot    (c) (format t "Nationalizing ~A.~%" c))
(defun ransom  (c) (format t "Refinancing ~A.~%" c))

(program barbarians ()
  (fork (capture 'rome) 100)
  (fork (plunder 'rome) 98))
\end{FramedVerb}\end{center}
\caption{Í¥ÀèÅÙ¤ÎÊÑ¹¹¤Î¸ú²Ì¡¥}
\label{fig:EffectOfChangingPriority}
\end{figure}

\reffig{fig:EffectOfChangingPriority}¤Î¥×¥í¥°¥é¥à¤Ç¤Ï¡¤
¤³¤ì¤é¤Î¥ª¥Ú¥ì¡¼¥¿¤¬¤É¤Î¤è¤¦¤Ë¶¨Ä´¤·¤ÆÆ°ºî¤¹¤ë¤«¤ò¼¨¤·¤¿¡¥
¡ÊÌõÃí¡§ capture¤Ï¡ÖÊá¤é¤¨¤ë¡×¡¤plunder¤Ï¡ÖÎ¬Ã¥¤¹¤ë¡×¡¤take¤Ï¡Ö¼è¤ë¡×¡¤
liberate¤Ï¡Ö¡Ê»ÙÇÛ¤«¤é²ò¤­Êü¤Ã¤Æ¡Ë¼«Í³¤Ë¤¹¤ë¡×¡¤
fortify¤Ï¡ÖÍ×ºÉ²½¤¹¤ë¡×¡¤loot¤Ï¡ÖÎ¬Ã¥¤¹¤ë¡×¡¤ransom¤Ï¡Ö¿ÈÂå¶â¤òÍ×µá¤¹¤ë¡×¡¤
refinance¤Ï¡ÖºâÌ³¤òºÆ¹½ÃÛ¤¹¤ë¡×¤È¤¤¤¦Äø¤Î°ÕÌ£¡¥¡Ë
ºÇ½é¡¤ÈÚÂ² (barbarians) ¤Ë¤Ï2¤Ä¤ÎÌÜÅª¤¬¤¢¤ë¡¥
¥í¡¼¥Þ¤ÎÀ©°µ¤È¤½¤³¤Ç¤ÎÎ¬Ã¥¤À¡¥
¥í¡¼¥Þ¤ÎÀ©°µ¤ÎÊý¤¬¡Ê¤ï¤º¤«¤Ë¡ËÍ¥ÀèÅÙ¤¬¹â¤¤¤Î¤Ç¡¤¤½¤Á¤é¤¬Àè¤Ë¼Â¹Ô¤µ¤ì¤ë¡¥
¤·¤«¤·¥í¡¼¥Þ¤¬À©°µ¤µ¤ì¤¿¸å¤Ï¡¤¥×¥í¥»¥¹\verb|capture|¤ÎÍ¥ÀèÅÙ¤Ï1¤Ë²¼¤¬¤ë¡¥
¤½¤³¤Ç¥×¥í¥»¥¹ÁªÂò¤¬¹Ô¤ï¤ì¡¤¤½¤Î·ë²Ì¡¤Í¥ÀèÅÙ¤¬ºÇÂç¤Î¥×¥í¥»¥¹\verb|plunder|¤¬»ÏÆ°¤¹¤ë¡¥
\begin{verbatim}
> (barbarians)
Liberating ROME.
Nationalizing ROME.
Refinancing ROME.
Rebuilding ROME.
>>
\end{verbatim}
ÈÚÂ²¤¬¥í¡¼¥Þ¤ÎµÜÅÂ¤ÇÎ¬Ã¥¤ò¹Ô¤¤¡¤µ®Â²¤Î¿ÈÂå¶â¤òÃ¥¤Ã¤¿¸å¤Ë¤Î¤ß¥×¥í¥»¥¹\verb|capture|¤ÏÄä»ß¤·¡¤
ÈÚÂ²¤ÏµòÅÀ¤ÎÍ×ºÉ²½¤Ë°Ü¤ë¡¥

´ðÈ×¤È¤Ê¤Ã¤Æ¤¤¤ë¼°\verb|wait|¤Ï¡¤\verb|arbitrator|¤ò°ìÈÌ²½¤·¤¿¤â¤Î¤À¡¥
¤³¤Î´Ø¿ô¤Ï¥«¥ì¥ó¥È¡¦¥×¥í¥»¥¹¤òÊÝÂ¸¤·¡¤
\verb|pick-process|¤ò¸Æ¤ó¤Ç¡¤²¿¤é¤«¤Î¥×¥í¥»¥¹¡ÊÂçÄñ¤ÏÆ±¤¸¤â¤Î¡Ë¤ò»ÏÆ°¤µ¤»¤ë¡¥
¤³¤ì¤Ï2¤Ä¤Î°ú¿ô¡¤¥Æ¥¹¥È¼°¤È·ÑÂ³¤ò¼è¤ë¡¥
¥Æ¥¹¥È¼°¤ÏÄä»ßÃæ¤Î¥×¥í¥»¥¹¤Î\verb|proc-wait|¤È¤·¤ÆÊÝ»ý¤µ¤ì¡¤
¤½¤ì¤òºÆ»ÏÆ°¤¹¤ë¤«¤É¤¦¤«·èÄê¤¹¤ë¤¿¤á¤Ë¸å¤Ç¸Æ¤Ó½Ð¤µ¤ì¤ë¡¥
·ÑÂ³¤Ï\verb|proc-state|¤ËÊÝ»ý¤µ¤ì¤ë¤¬¡¤
¤³¤ì¤ò¸Æ¤Ó½Ð¤¹¤ÈÄä»ß¤·¤Æ¤¤¤ë¥×¥í¥»¥¹¤¬ºÆ»ÏÆ°¤¹¤ë¤³¤È¤Ë¤Ê¤ë¡¥

¥Þ¥¯¥í\verb|wait|¤È\verb|yield|¤Ï¤½¤Î·ÑÂ³´Ø¿ô¤òÀ¸À®¤¹¤ë¤¬¡¤
¤ä¤Ã¤Æ¤¤¤ë¤³¤È¤ÏÃ±¤Ë¤½¤ÎËÜÂÎ¤ò$\lambda$¼°¤ÇÊñ¤à¤³¤È¤À¤±¤À¡¥
Îã¤¨¤Ð¡¤
\begin{verbatim}
(wait d (car *bboard*) (=values d))
\end{verbatim}
¤Ï
\begin{verbatim}
(arbitrator #'(lambda () (car *bboard*))
  #'(lambda (d) (=values d)))
\end{verbatim}
¤ËÅ¸³«¤µ¤ì¤ë¡¥

¥³¡¼¥É¤¬\reffig{fig:RestrictionsContPassMacros}¤ÎÀ©¸Â¤òËþ¤¿¤·¤Æ¤¤¤ì¤Ð¡¤
\verb|wait|ËÜÂÎ¤Î¥¯¥í¡¼¥¸¥ã¤òÀ¸À®¤¹¤ë¤È¤­¡¤¸½ºß¤Î·ÑÂ³Á´ÂÎ¤¬ÊÝÂ¸¤µ¤ì¤ë¡¥
Âè2°ú¿ô¤Î\verb|=values|¤¬Å¸³«¤µ¤ì¤ë¤È¡¤¼¡¤Î¤è¤¦¤Ë¤Ê¤ë¡¥
\begin{verbatim}
#'(lambda (d) (funcall *cont* d))
\end{verbatim}
¥¯¥í¡¼¥¸¥ã¤¬\verb|*cont*|¤Ø¤Î»²¾È¤ò´Þ¤à¤¿¤á¡¤
´Ø¿ô\verb|wait|¤ÇÄä»ß¤µ¤»¤é¤ì¤¿¥×¥í¥»¥¹¤Ï¡¤Ää»ß¤·¤¿»þÅÀ¤Ç¤Ï¤É¤³¤ËÃÖ¤«¤ì¤Æ¤¤¤¿¤«¡¤
¤È¤¤¤¦ÌÜ°õ¤ò»ý¤Ä¤³¤È¤Ë¤Ê¤ë¡¥

¥ª¥Ú¥ì¡¼¥¿\verb|halt|¤Ï¡¤
À©¸æ¤ò¥×¥í¥°¥é¥à¤ÎÅ¸³«·Á¤¬ÀßÄê¤·¤¿¥¿¥°¤Ë°Ü¤¹¤³¤È¤Ç¥×¥í¥°¥é¥àÁ´ÂÎ¤òÄä»ß¤µ¤»¤ë¡¥
¥ª¥×¥·¥ç¥Ê¥ë°ú¿ô¤Ë¤Ï¥×¥í¥°¥é¥àÁ´ÂÎ¤ÎÃÍ¤È¤·¤ÆÊÖ¤¹¤¿¤á¤ÎÃÍ¤òÅÏ¤»¤ë¡¥
¥Ç¥Õ¥©¥ë¥È¡¦¥×¥í¥»¥¹¤¬¾ï¤Ë»ÏÆ°¤·¤è¤¦¤È¤·¤Æ¤¤¤ë¤Î¤Ç¡¤
¥×¥í¥°¥é¥à¤Î½ªÎ»¤Ë¤ÏÌÀ¼¨Åª¤Ë\verb|halt|¤ò¸Æ¤Ö¤·¤«¤Ê¤¤¡¥
\verb|halt|¤Î¸å¤Ë¤É¤Î¤è¤¦¤Ê¥³¡¼¥É¤¬Â³¤¤¤Æ¤â¡¤É¾²Á¤µ¤ì¤ë¤³¤È¤¬¤Ê¤¤¤Î¤Ç°ÕÌ£¤¬¤Ê¤¤¡¥

³Æ¥×¥í¥»¥¹¤Ï¼°\verb|kill|¤ò¸Æ¤Ö¤³¤È¤Ç½ªÎ»¤µ¤»¤é¤ì¤ë¡¥
°ú¿ôÌµ¤·¤Ç¤³¤ì¤ò¸Æ¤Ö¤È¸½ºß¼Â¹ÔÃæ¤Î¥×¥í¥»¥¹¤¬½ªÎ»¤µ¤»¤é¤ì¤ë¡¥
¤½¤Î¾ì¹ç¡¤\verb|kill|¤Ï¥«¥ì¥ó¥È¡¦¥×¥í¥»¥¹¤Î¾õÂÖ¤òÊÝ»ý¤·¤Ê¤¤\verb|wait|¤Î°ì¼ï¤Î¤è¤¦¤Ê¤â¤Î¤À¡¥
\verb|kill|¤ËÅÏ¤·¤¿°ú¿ô¤Ï¡¤¥×¥í¥»¥¹¤Î¥ê¥¹¥È¤«¤éºï½ü¤¹¤ë¤â¤Î¤ò»ØÄê¤¹¤ë¡¥
¸½¾õ¤Î¥×¥í¥°¥é¥à¤Ç¤Ï»²¾È¤¹¤Ù¤­¥×¥í¥»¥¹¤ÎÂ°À­¤¬Â¿¤¯¤Ê¤¤¤Î¤Ç¡¤
\verb|kill|¤Ë¤Ä¤¤¤ÆÀâÌÀ¤¹¤ë¤³¤È¤ÏÂç¤·¤Æ¤Ê¤¤¡¥
¤·¤«¤·¤â¤Ã¤È¼ê¤Î¹þ¤ó¤À¥·¥¹¥Æ¥à¤Ç¤Ï¡¤
Â¾¤Ë¥¿¥¤¥à¥¹¥¿¥ó¥×¡¤¥ª¡¼¥ÊÅù¤Î¾ðÊó¤ò¥×¥í¥»¥¹¤Ë´ØÏ¢¤Å¤±¤ë¤³¤È¤Ë¤Ê¤ë¤À¤í¤¦¡¥
¥Ç¥Õ¥©¥ë¥È¡¦¥×¥í¥»¥¹¤Ï¥ê¥¹¥È\,\verb|*procs*|\,¤Ë´Þ¤Þ¤ì¤Æ¤¤¤Ê¤¤¤Î¤Ç¡¤\verb|kill|¤òÅ¬ÍÑ¤Ç¤­¤Ê¤¤¡¥
%}}}
\subsection{¡ÖÁá¤¤¡×¤À¤±¤Ç¤Ï¤Ê¤¤¥×¥í¥È¥¿¥¤¥×}   %{{{
·ÑÂ³¤ò»È¤Ã¤ÆÌÏÊï¤·¤¿¥×¥í¥»¥¹¤Ë¤Ï¡¤ËÜÊª¤ÎOS¤Î¥×¥í¥»¥¹Äø¤Î¸úÎ¨¤ÏË¾¤á¤Ê¤¤¡¥
¤Ê¤é¤Ð¡¤¤³¤Î¾Ï¤Ç¼¨¤·¤¿¥×¥í¥°¥é¥à¤ÎÍÑÅÓ¤Ï°ìÂÎ²¿¤À¤í¤¦¡©

¤½¤ì¤é¤ÎÊØÍø¤µ¤Ï¡¤¤Á¤ç¤¦¤É¥¹¥±¥Ã¥Á¤ÈÆ±¤¸¤À¡¥
¼Â¸³Åª¤Ê¥×¥í¥°¥é¥ß¥ó¥°¤ä¥é¥Ô¥Ã¥É¡¦¥×¥í¥È¥¿¥¤¥Ô¥ó¥°¤Ç¤Ï¡¤
¥×¥í¥°¥é¥à¤Ï¤½¤ì¼«¿È¤Ç´°À®ÉÊ¤Ê¤Î¤Ç¤Ï¤Ê¤¯¡¤¤à¤·¤í¹Í¤¨¤òÅ¸³«¤µ¤»¤ë¤¿¤á¤Î¾è¤êÊª¤À¡¥
Â¾¤ÎÂ¿¤¯¤ÎÎÎ°è¤Ç¤Ï¡¤¤³¤ÎÌÜÅª¤Ë»È¤ï¤ì¤ë¤â¤Î¤Ï¥¹¥±¥Ã¥Á¤È¸Æ¤Ð¤ì¤ë¡¥
·úÃÛ²È¤Ï¡¤¸¶Â§Åª¤Ë¤Ï¡¤·úÊªÁ´ÂÎ¤òÆ¬¤ÎÃæ¤ÇÁÏ¤ê¾å¤²¤ë¤³¤È¤¬¤Ç¤­¤ë¡¥
¤·¤«¤·¡¤¤Û¤È¤ó¤É¤Î·úÃÛ²È¤Ï±ôÉ®¤ò¼ê¤Ë¤·¤Æ¤¤¤¿Êý¤¬¹Í¤¨¤¬¿Ê¤à¤è¤¦¤À¡¥
ÉáÄÌ¡¢·úÊª¤Î¥Ç¥¶¥¤¥ó¤Ï¼ê»Ï¤á¤Ë¥¹¥±¥Ã¥Á¤ò²¿Ëç¤«ÉÁ¤¯Ãæ¤Ç¹Í¤¨¤ë¡¥

¥é¥Ô¥Ã¥É¡¦¥×¥í¥È¥¿¥¤¥Ô¥ó¥°¤Ï¥½¥Õ¥È¥¦¥§¥¢¤Î¥¹¥±¥Ã¥Á¤À¡¥
·úÃÛ²È¤Î²¼ÉÁ¤­¤Î¤è¤¦¤Ë¡¤¥½¥Õ¥È¥¦¥§¥¢¤Î¥×¥í¥È¥¿¥¤¥×¤Ï·Ú¡¹¤È¤·¤¿¥¿¥Ã¥Á¤ÇÉÁ¤«¤ì¤ë¤³¤È¤¬Â¿¤¤¡¥
¥¢¥¤¥Ç¥£¥¢¤ò·Á¤Ë¤¹¤ëºÇ½é´ü¤Î°ìÊâ¤Ç¤Ï¡¤ÈñÍÑ¤È¸úÎ¨¤Î¹ÍÎ¸¤ÏÌµ»ë¤µ¤ì¤ë¡¥
¤³¤ÎÃÊ³¬¤Ç¤Î·ë²Ì¤Ï¡¤·úÃÛÉÔ²ÄÇ½¤Ê·úÊª¤ä¡¤µß¤¤¤è¤¦¤â¤Ê¤¯Èó¸úÎ¨Åª¤Ê¥½¥Õ¥È¥¦¥§¥¢¤Ë¤Ê¤ê¤¬¤Á¤À¡¥
¤½¤ì¤Ç¤¢¤Ã¤Æ¤â¥¹¥±¥Ã¥Á¤Î²ÁÃÍ¤ÏÊÑ¤ï¤é¤Ê¤¤¡¥
¤Ê¤¼¤Ê¤é
\begin{enumerate}
    \item ¾ðÊó¤ò´Ê·é¤Ë±¿¤ÖÆþ¤ìÊª¤Ç¤¢¤ê¡¤
    \item ¼Â¸³¤¹¤ëµ¡²ñ¤òÍ¿¤¨¤ë
\end{enumerate}
¤«¤é¤À¡¥

¤³¤Î¾Ï¤ÇÀâÌÀ¤·¤¿¥×¥í¥°¥é¥à¤Ï¡¤¤½¤ÎÁ°¤Î¾Ï¤Î¥×¥í¥°¥é¥à¤ÈÆ±ÍÍ¡¤¥¹¥±¥Ã¥Á¤Ç¤¢¤ê¡¤
Ê£¿ô¥×¥í¥»¥¹¤Î³µÍ×¤òÂç»¨ÇÄ¤ÊÉ®¸¯¤¤¤ÇÄó¼¨¤·¤Æ¤¤¤ë¡¥
¾¦ÍÑ¥½¥Õ¥È¥¦¥§¥¢¤Ç»È¤¨¤ëÄø¸úÎ¨Åª¤Ç¤Ï¤Ê¤¤¤À¤í¤¦¤¬¡¤
Ê£¿ô¥×¥í¥»¥¹¤ÎÂ¾¤ÎÂ¦ÌÌ¤ò»È¤Ã¤Æ¡¤¥¹¥±¥¸¥å¡¼¥ê¥ó¥°¤Î¥¢¥ë¥´¥ê¥º¥à¤Ê¤É¤ò¼Â¸³¤¹¤ë¤Ë¤Ï¤È¤Æ¤âÊØÍø¤À¡¥

Âè22--24¾Ï¤Ç¤Ï¡¤·ÑÂ³¤ÎÂ¾¤Î±þÍÑ¤ò¼¨¤¹¡¥
¤¤¤º¤ì¤â¾¦ÍÑ¥½¥Õ¥È¥¦¥§¥¢¤Ç»È¤¨¤ëÄø¸úÎ¨¤Î¤è¤¤¤â¤Î¤Ç¤Ï¤Ê¤¤¡¥
Lisp¤È¥é¥Ô¥Ã¥É¥×¥í¥È¥¿¥¤¥Ô¥ó¥°¤Ï¶¦¤ËÈ¯Å¸¤·¤Æ¤­¤¿¤Î¤Ç¡¤
Lisp¤Ë¤ÏÆÃ¤Ë¥×¥í¥È¥¿¥¤¥×¤ò°Õ¿Þ¤·¤¿¡¤
Â°À­¥ê¥¹¥È¡¤¥­¡¼¥ï¡¼¥É°ú¿ô¡¤¤½¤·¤Æ¥ê¥¹¥È¤È¤¤¤Ã¤¿Èó¸úÎ¨Åª¤À¤¬ÊØÍø¤Êµ¡Ç½¤¬Âô»³È÷¤ï¤Ã¤Æ¤¤¤ë¡¥
·ÑÂ³¤â¶²¤é¤¯¤³¤ÎÃç´Ö¤ËÆþ¤ë¡¥
·ÑÂ³¤Ï¥×¥í¥°¥é¥à¤¬É¬Í×¤Ë¤¹¤ë¤è¤êÂ¿¤¯¤Î¾õÂÖ¤òÊÝÂ¸¤¹¤ë¡¥
¤À¤«¤é¡¤Îã¤¨¤Ð¸å¤Ç½Ð¤Æ¤¯¤ë·ÑÂ³¥Ù¡¼¥¹¤Ç¼ÂÁõ¤µ¤ì¤¿Prolog¤Ï¡¤
¤½¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤òÍý²ò¤¹¤ëÊýË¡¤È¤·¤Æ¤Ï¤è¤¤¤¬¡¤¼ÂÁõÊýË¡¤È¤·¤Æ¤ÏÈó¸úÎ¨Åª¤À¡¥

¤³¤ÎËÜ¤¬½Å»ë¤¹¤ë¤Î¤ÏLisp¤Ç¼Â¸½¤Ç¤­¤ëÃê¾Ý²½¤Ç¤¢¤Ã¤Æ¡¤¸úÎ¨À­¤Ë´Ø¤ï¤ëÏÃÂê¤Ç¤Ï¤Ê¤¤¡¥
¤·¤«¤·¡¤Lisp¤Ï¥×¥í¥È¥¿¥¤¥×¤ò½ñ¤¯¤¿¤á¤Î¸À¸ì¤Ç¤¢¤ë¤Ð¤«¤ê¤Ç¤Ê¤¯¡¤
¾¦ÍÑ¥½¥Õ¥È¥¦¥§¥¢¤ò½ñ¤¯¤¿¤á¤Î¸À¸ì¤Ç¤â¤¢¤ë¤È¤¤¤¦¤³¤È¤òÇ§¼±¤·¤Æ¤ª¤¯¤³¤È¤Ï½ÅÍ×¤À¡¥
¡ÖLisp¤ÏÃÙ¤¤¡×¤È¤ÎÉ¾È½¤¬¤¢¤ë¤È¤¹¤ì¤Ð¡¤
¤½¤ì¤ÏÂ¿Ê¬¤ËÂ¿¤¯¤Î¥×¥í¥°¥é¥Þ¤¬¥×¥í¥È¥¿¥¤¥×¤Ç»ß¤Þ¤Ã¤Æ¤·¤Þ¤Ã¤¿¤»¤¤¤À¡¥
Lisp¤Ç¤ÏÂ®¤¤¥×¥í¥°¥é¥à¤ò´ÊÃ±¤Ë½ñ¤±¤ë¤¬¡¤»ÄÇ°¤Ê¤³¤È¤Ë¡¤ÃÙ¤¤¥×¥í¥°¥é¥à¤â´ÊÃ±¤Ë½ñ¤±¤ë¡¥
Lisp¥×¥í¥°¥é¥à¤Î½é´üÈÇ¤Ï¥À¥¤¥¢¥â¥ó¥É¤Î¤è¤¦¤Ê¤â¤Î¤À¡¥
¾®¤µ¤¯¡¤Æ©¤­ÄÌ¤Ã¤Æ¤¤¤Æ¡¤¤½¤·¤ÆÈó¾ï¤Ë¹â²Á¤À¡¥
¤½¤ì¤ò¤½¤Î¤Þ¤Þ¤Ë¤·¤Æ¤ª¤­¤¿¤¤¤È¤¤¤¦Íßµá¤ÏÂç¤­¤¤¤«¤â¤·¤ì¤Ê¤¤¡¥

Â¾¤Î¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ï¡¤½ñ¤¤¤¿¥×¥í¥°¥é¥à¤òÆ°ºî¤µ¤»¤ë¤È¤¤¤¦¹ü¤ÎÀÞ¤ì¤ë²ÝÂê¤ËÀ®¸ù¤·¤µ¤¨¤¹¤ì¤Ð¡¤
¤½¤Î¸úÎ¨À­¤Ï¤¹¤Ç¤ËµöÍÆ²ÄÇ½¤Ê¤â¤Î¤À¤í¤¦¡¥
¾²¤Ë¥¿¥¤¥ë¤òÉß¤¯¤È¤­¡¤¥¿¥¤¥ë¤¬ÄÞÄø¤ÎÂç¤­¤µ¤À¤Ã¤¿¤é¡¤ÌµÂÌ¤Ë¤Ê¤ë¥¿¥¤¥ë¤â¾¯¤Ê¤¤¡¥
¤³¤Î¹Í¤¨¤Ë´ð¤Å¤¤¤Æ¥×¥í¥°¥é¥à¤ò³«È¯¤·¤Æ¤¤¤¿¿Í¤Ë¤Ï¡¤
¡Ö¥×¥í¥°¥é¥à¤¬Æ°ºî¤·¤¿¤é¤½¤³¤Ç³«È¯¤Ï´°Î»¤¹¤ë¡×¤È¤¤¤¦¹Í¤¨¤ò¾è¤ê±Û¤¨¤ë¤Î¤ÏÆñ¤·¤¤¤«¤â¤·¤ì¤Ê¤¤¡¥
¡ÖLisp¤ò»È¤¦¤È¥×¥í¥°¥é¥à¤¬¼ê´ÖÍ×¤é¤º¤Ç½ñ¤±¤ë¡¥
¤¢¤¢¡¤¤·¤«¤·¤½¤¦¤¹¤ë¤ÈÃÙ¤¤¤ó¤À¡¥¡×¤ÈÈà¤Ï»×¤¦¤«¤â¤·¤ì¤Ê¤¤¡¥
¼ÂºÝ¤Ï¡¤¤É¤Á¤é¤âÅö¤Æ¤Ï¤Þ¤é¤Ê¤¤¡¥
Â®¤¤¥×¥í¥°¥é¥à¤Ï¼Â¸½¤Ç¤­¤ë¤·¡¤¤·¤«¤·¤½¤ì¤Ë¤Ï¼ê´Ö¤ò¤«¤±¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¡¥
¤³¤ÎÅÀ¤Ç¤Ï¡¤Lisp¤ò»È¤¦¤Î¤Ï¡¤ÉÏ¤·¤¤¹ñ¤Ç¤Ê¤¯Ë­¤«¤Ê¹ñ¤ËÊë¤é¤¹¤è¤¦¤Ê¤â¤Î¤À¡¥
Áé¤»¤¿ÂÎ·¿¤ò°Ý»ý¤¹¤ë¤¿¤á¤ËÆ¯¤«¤Ê¤±¤ì¤Ð¤Ê¤é¤Ê¤¤¤Î¤Ïº¤¤Ã¤¿¤³¤È¤«¤â¤·¤ì¤Ê¤¤¤¬¡¤
Ì¿¤ò¤Ä¤Ê¤°¤¿¤á¤ËÆ¯¤¤¤Æ¤ª¤ê¡¤ÂÀ¤ë¤³¤È¤Ê¤ÉÌäÂê³°¡¤¤È¤¤¤¦¾õ¶·¤è¤ê¤Ï¤º¤Ã¤È¤è¤¤¡¥

Ãê¾ÝÅÙ¤ÎÄã¤¤¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ç¤Ï¡¤µ¡Ç½¤òµá¤á¤Æ³«È¯¤¹¤ë¤³¤È¤Ë¤Ê¤ë¡¥
Lisp¤Ç¤Ï¡¤Â®ÅÙ¤òµá¤á¤Æ³«È¯¤¹¤ë¤³¤È¤Ë¤Ê¤ë¡¥
¹¬±¿¤Ê¤³¤È¤Ë¡¤Â®ÅÙ¤òµá¤á¤Æ³«È¯¤¹¤ëÊý¤¬ÍÆ°×¤À¡¥
ÂçÄñ¤Î¥×¥í¥°¥é¥à¤Ç¤Ï¡¤¥¹¥Ô¡¼¥É¤Ë¿¼¹ï¤Ë±Æ¶Á¤¹¤ëÉôÊ¬¤Ï¿ô¤«½ê¤·¤«¤Ê¤¤¡¥
%}}}
%}}}
\section{Èó·èÄêÀ­} %{{{
¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤ò»È¤¦¤³¤È¤Ç¡¤ËÄÂç¤ÊÎÌ¤Î¾ÜºÙ¤Ë°û¤ß¹þ¤Þ¤ì¤Ê¤¤¤ÇºÑ¤ó¤Ç¤¤¤ë¡¥
Lisp¤¬¤è¤¤¥×¥í¥°¥é¥ß¥ó¥°¸À¸ì¤Ê¤Î¤Ï¡¤¤½¤ì¼«¿È¤¬Â¿¤¯¤Î¾ÜºÙ¤ò°·¤Ã¤Æ¤¯¤ì¤Æ¡¤
¥×¥í¥°¥é¥Þ¤¬ÂÑ¤¨¤é¤ì¤ëÊ£»¨¤µ¤Î¸Â³¦¤òÍ­¸ú¤Ë»È¤ï¤»¤Æ¤¯¤ì¤Æ¤¤¤ë¡¥
¤³¤Î¾Ï¤Ç¤Ï¥Þ¥¯¥í¤ÇLisp¤Ë¤µ¤é¤ËÊÌ¤Î¼ïÎà¤Î¾ÜºÙ¤ò°·¤ï¤»¤ëÊýË¡¤ò¼¨¤¹¡¥
Èó·èÄêÅª¤Ê¥¢¥ë¥´¥ê¥º¥à¤ò·èÄêÅª¤Ê¤â¤Î¤ËÊÑ´¹¤¹¤ë¤³¤È¤Î¾ÜºÙ¤À¡¥

¤³¤Î¾Ï¤Ï5¤Ä¤ÎÉôÊ¬¤ËÊ¬¤±¤é¤ì¤ë¡¥
¤Þ¤º¡¤Èó·èÄêÀ­¤È¤Ï²¿¤«¤òÀâÌÀ¤¹¤ë¡¥
¼¡¤Ë¡¤Èó·èÄêÅª¤Ê\emph{choose}¤È\emph{fail}¤ò·ÑÂ³¤ò»È¤Ã¤ÆScheme¤Ç¼ÂÁõ¤¹¤ë¡¥
3ÈÖÌÜ¤Ç¤Ï¡¤Âè20¾Ï¤Î·ÑÂ³ÅÏ¤·¥Þ¥¯¥í¤ò´ðÁÃ¤ËCommon Lisp¤Ç¼ÂÁõ¤·¤¿\emph{choose}¤È\emph{fail}¤ò¼¨¤¹¡¥
4ÈÖÌÜ¤Ç¤Ï¡¤¥ª¥Ú¥ì¡¼¥¿\emph{cut}¤òProlog¤È¤ÏÆÈÎ©¤ËÍý²ò¤¹¤ëÊýË¡¤ò¼¨¤¹¡¥
ºÇ¸å¤Ë¡¤Èó·èÄêÅª¥ª¥Ú¥ì¡¼¥¿¤Î²þÎÉ¤Ë¤Ä¤¤¤Æ¹Í»¡¤¹¤ë¡¥

¤³¤Î¾Ï¤ÇÄêµÁ¤µ¤ì¤ëÈó·èÄêÅª¤ÊÁªÂò¥ª¥Ú¥ì¡¼¥¿¤Ï¡¤
Âè23¾Ï¤ÎATN¥³¥ó¥Ñ¥¤¥é¤ÈÂè24¾Ï¤ÎËä¤á¹þ¤ßProlog¤ò¼ÂÁõ¤¹¤ë¤Î¤Ë»È¤ï¤ì¤ë¡¥
\subsection{³µÇ°}   %{{{
Èó·èÄêÅª¥¢¥ë¥´¥ê¥º¥à¤Ï¤¢¤ë°ÕÌ£¤Ç¤ÏÄ¶¼«Á³Åª¤ÊÍ½¸«¤Ë´ð¤Å¤¤¤ÆÆ°ºî¤¹¤ë¤â¤Î¤À¡¥
Ä¶Ç½ÎÏ¤ò»ý¤Ã¤¿¥³¥ó¥Ô¥å¡¼¥¿¤Ë¿¨¤ì¤ë¤³¤È¤Î¤Ê¤¤»äÃ£¤Ë¡¤¤É¤¦¤·¤Æ¤½¤ó¤Ê¤â¤Î¤¬É¬Í×¤Ê¤Î¤À¤í¤¦¤«¡©\ 
¤½¤ì¤ÏÈó·èÄêÅª¥¢¥ë¥´¥ê¥º¥à¤ò·èÄêÅª¥¢¥ë¥´¥ê¥º¥à¤Ç¥·¥ß¥å¥ì¡¼¥È¤Ç¤­¤ë¤«¤é¤À¡¥
½ã¿è¤Ë´Ø¿ôÅª¤Ê¥×¥í¥°¥é¥à\wadash ¤¹¤Ê¤ï¤ÁÉûºîÍÑ¤Î°ìÀÚ¤Ê¤¤¤â¤Î\wadash ¤Ç¤Ï¡¤
Èó·èÄêÀ­¤ÏÆÃ¤ËÄ¾Ù£Åª¤Ë¤Ê¤ë¡¥
½ã¿è¤Ë´Ø¿ôÅª¤Ê¥×¥í¥°¥é¥à¤Ç¤ÏÈó·èÄêÀ­¤Ï¥Ð¥Ã¥¯¥È¥é¥Ã¥¯¤òÍÑ¤¤¤¿Ãµº÷¤Ç¼Â¸½¤Ç¤­¤ë¡