<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5289049604340113831</id><updated>2011-10-17T14:58:01.946+09:00</updated><category term='Smiley Hackathon'/><category term='AIMA'/><category term='SQL'/><category term='Linux入門'/><category term='acl'/><category term='関数プログラミング'/><category term='GNU Autotools'/><category term='CL入門'/><category term='Semantics'/><category term='目標'/><category term='Prolog'/><category term='Scheme Code button'/><category term='Learn Prolog Now'/><category term='Portable Environment'/><category term='yason'/><category term='make'/><category term='プログラム検証論'/><category term='実践CL'/><category term='DSL'/><category term='C PROGRAMMING: A Moder Approach'/><category term='Mac'/><category term='基礎トレ'/><category term='maxima'/><category term='unicode'/><category term='bison'/><category term='libtool'/><category term='Elisp'/><category term='CLドリル'/><category term='データベース実践講義'/><category term='xml'/><category term='集合'/><category term='シプサ'/><category term='MySQL'/><category term='sbcl'/><category term='ELp入門'/><category term='flex'/><category term='Gnome'/><category term='apue.2e'/><category term='Automake'/><category term='POSIX'/><category term='統計学'/><category term='ANSI-CL'/><category term='Lisp Quote Backquote'/><category term='xemacs'/><category term='atom'/><category term='ロゼッタワールド'/><category term='vCard'/><category term='ubuntu'/><category term='saxon'/><category term='JavaScript'/><category term='例解UNIX'/><category term='subversion'/><category term='emacs packaging'/><category term='うんにゃら'/><category term='Gauche'/><category term='逆引きCommon Lisp'/><category term='clbuild'/><category term='Cリファレンスマニュアル'/><category term='ルイス・キャロルの意味論'/><category term='http'/><category term='ホーア論理'/><category term='PAIP'/><category term='MOP'/><category term='Language Proof and Logic'/><category term='Linkers and Loaders'/><category term='Shibuya.lisp'/><category term='パタヘネ'/><category term='rdf'/><category term='AIMAメモ'/><category term='shell'/><category term='RDB'/><category term='論理'/><category term='debian'/><category term='Processing'/><category term='Javaチュートリアル'/><category term='C言語'/><category term='GNU toolchain'/><category term='paredit'/><category term='DDD'/><category term='初めてのSQL'/><category term='Common Lisp'/><category term='JSON'/><category term='cl-bench'/><category term='Scheme'/><category term='実践C'/><category term='GNU Autoconf/Automake/Libtool'/><category term='emacs'/><category term='雑'/><category term='認知言語学'/><category term='On Lisp'/><category term='IMAP'/><category term='xslt'/><category term='日本語'/><category term='Java'/><category term='道具箱'/><category term='X'/><category term='FOL'/><category term='英語'/><category term='GTD'/><category term='入門Debianパッケージ'/><category term='Methods of Logic'/><category term='blogger'/><category term='リスト遊び'/><category term='プログラミングGauche'/><category term='Linux'/><category term='Cによるアルゴリズム'/><category term='eli'/><category term='Allegro Prolog'/><category term='かんにゃら'/><category term='xml visual quickstart guide'/><title type='text'>計算機とその周辺</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default?start-index=101&amp;max-results=100'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>787</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-2047907721723956579</id><published>2011-10-17T02:32:00.006+09:00</published><updated>2011-10-17T14:58:01.962+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C言語'/><category scheme='http://www.blogger.com/atom/ns#' term='C PROGRAMMING: A Moder Approach'/><title type='text'>[CP:AMA] 2 C Fundamentals</title><content type='html'>Chapter 2: Programing Projects&lt;br /&gt;&lt;br /&gt;1.&lt;br /&gt;&lt;pre class="prettyprint"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;int main(void)&lt;br /&gt;{&lt;br /&gt;  printf("       *\n");&lt;br /&gt;  printf("      *\n");&lt;br /&gt;  printf("     *\n");&lt;br /&gt;  printf("*   *\n");&lt;br /&gt;  printf(" * *\n");&lt;br /&gt;  printf("  *\n");&lt;br /&gt;&lt;br /&gt;  return 0;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;2.&lt;br /&gt;&lt;pre class="prettyprint"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#define PI 3.14f&lt;br /&gt;#define COEFFICIENT (4.0f / 3.0f)&lt;br /&gt;&lt;br /&gt;int main(void)&lt;br /&gt;{&lt;br /&gt;  float volume = 0, radius = 0;&lt;br /&gt;&lt;br /&gt;  printf("Enter the radius of your sphere:");&lt;br /&gt;  scanf("%f", &amp;radius);&lt;br /&gt;&lt;br /&gt;  volume = COEFFICIENT * PI * radius * radius * radius;&lt;br /&gt;&lt;br /&gt;  printf("The volume of the sphere: %.2f\n", volume);&lt;br /&gt;  &lt;br /&gt;  return 0;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;4.&lt;br /&gt;&lt;pre class="prettyprint"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;int main(void)&lt;br /&gt;{&lt;br /&gt;  float amount = 0;&lt;br /&gt;&lt;br /&gt;  printf("Enter an amount: ");&lt;br /&gt;  scanf("%f", &amp;amount);&lt;br /&gt;&lt;br /&gt;  printf("With tax added: %0.2f\n", amount * 1.05f);&lt;br /&gt;&lt;br /&gt;  return 0;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;5.&lt;br /&gt;&lt;pre class="prettyprint"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;int main(void)&lt;br /&gt;{&lt;br /&gt;  float x = 0;&lt;br /&gt;&lt;br /&gt;  printf("Enter x: ");&lt;br /&gt;  scanf("%f", &amp;x);&lt;br /&gt;&lt;br /&gt;  printf("The answer: %0.2f\n",&lt;br /&gt;  3 * x * x * x * x *x +&lt;br /&gt;  2 * x * x * x * x -&lt;br /&gt;  5 * x * x * x -&lt;br /&gt;  x * x +&lt;br /&gt;  7 * x -&lt;br /&gt;  6);&lt;br /&gt;  &lt;br /&gt;  return 0;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;6.&lt;br /&gt;&lt;pre class="prettyprint"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;int main(void)&lt;br /&gt;{&lt;br /&gt;  float x = 0;&lt;br /&gt;&lt;br /&gt;  printf("Enter x: ");&lt;br /&gt;  scanf("%f", &amp;x);&lt;br /&gt;&lt;br /&gt;  printf("The answer: %0.2f\n",&lt;br /&gt;  ((((3 * x + 2) - 5) * x - 1) * x + 7) * x - 6);&lt;br /&gt;  &lt;br /&gt;  return 0;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;7.&lt;br /&gt;&lt;pre class="prettyprint"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;int main(void)&lt;br /&gt;{&lt;br /&gt;  int amount = 0;&lt;br /&gt;  int bills20 = 0, bills10 = 0, bills05 = 0, bills01 = 0;&lt;br /&gt;  &lt;br /&gt;  printf("enter a dollar amount: ");&lt;br /&gt;  scanf("%d", &amp;amount);&lt;br /&gt;&lt;br /&gt;  bills20 = amount / 20;&lt;br /&gt;  bills10 = (amount - bills20 * 20) / 10;&lt;br /&gt;  bills05 = (amount - bills20 * 20 -bills10 * 10) / 5;&lt;br /&gt;  bills01 = amount - bills20 * 20 -bills10 * 10 - bills05 * 05;&lt;br /&gt;&lt;br /&gt;  printf("$20 bills: %d\n", bills20);&lt;br /&gt;  printf("$10 bills: %d\n", bills10);&lt;br /&gt;  printf(" $5 bills: %d\n", bills05);&lt;br /&gt;  printf(" $1 bills: %d\n", bills01);&lt;br /&gt;  &lt;br /&gt;  return 0;&lt;br /&gt;}&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;8.&lt;br /&gt;&lt;pre class="prettyprint"&gt;#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;&lt;br /&gt;int main(void)&lt;br /&gt;{&lt;br /&gt;  float amount_of_loan = 0.0f;&lt;br /&gt;  float interest_rate = 0.0f;&lt;br /&gt;  float monthly_payment = 0.0f;&lt;br /&gt;  float balance_after_first_payment = 0.0f, balance_after_second_payment = 0.0f, balance_after_third_payment = 0.0f;&lt;br /&gt;  float monthly_interest_rate = 0.0f;&lt;br /&gt;&lt;br /&gt;  printf("Enter amount of loan: ");&lt;br /&gt;  scanf("%f", &amp;amount_of_loan);&lt;br /&gt;  printf("Enter interest rate: ");&lt;br /&gt;  scanf("%f", &amp;interest_rate);&lt;br /&gt;  printf("Enter monthly payment: ");&lt;br /&gt;  scanf("%f", &amp;monthly_payment);&lt;br /&gt;&lt;br /&gt;  monthly_interest_rate = interest_rate / (100.0f * 12.0f);&lt;br /&gt;&lt;br /&gt;  amount_of_loan = (amount_of_loan) * (1.0f + monthly_interest_rate);&lt;br /&gt;  balance_after_first_payment = amount_of_loan - monthly_payment;&lt;br /&gt;  amount_of_loan = (amount_of_loan - monthly_payment) * (1.0f + monthly_interest_rate);&lt;br /&gt;  balance_after_second_payment = amount_of_loan - monthly_payment;&lt;br /&gt;  amount_of_loan = (amount_of_loan - monthly_payment) * (1.0f + monthly_interest_rate);&lt;br /&gt;  balance_after_third_payment = amount_of_loan - monthly_payment;&lt;br /&gt;&lt;br /&gt;  printf("Balance remaining after first payment: %.2f\n", balance_after_first_payment);&lt;br /&gt;  printf("Balance remaining after second payment: %.2f\n", balance_after_second_payment);&lt;br /&gt;  printf("Balance remaining after third payment: %.2f\n", balance_after_third_payment);&lt;br /&gt;&lt;br /&gt;  return 0;&lt;br /&gt;}&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-2047907721723956579?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/2047907721723956579/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=2047907721723956579' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/2047907721723956579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/2047907721723956579'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2011/10/cpama-2-c-fundamentals.html' title='[CP:AMA] 2 C Fundamentals'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-3050854651533685852</id><published>2011-05-03T03:45:00.000+09:00</published><updated>2011-05-03T03:56:04.732+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xml visual quickstart guide'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='xslt'/><title type='text'>[XML VQG] 2. XSLT (10)</title><content type='html'>I gave up to follow the examples in the book one by one.  So this example is the last one, and covers all the features regarding XSLT that explained in the chapter 2.&lt;br /&gt;&lt;br /&gt;Here's the list of additional features.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;xsl:sort&lt;/li&gt;&lt;br /&gt;&lt;li&gt;xsl:choose&lt;/li&gt;&lt;br /&gt;&lt;li&gt;xsl:template&lt;/li&gt;&lt;br /&gt;&lt;li&gt;xsl:apply-templates&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ cat vcard-rdf-sample.xml &lt;br /&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&amp;lt;rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"&lt;br /&gt;         xmlns:v="http://www.w3.org/2006/vcard/ns#"&amp;gt;&lt;br /&gt;           &lt;br /&gt;  &amp;lt;v:VCard rdf:about = "http://example.com/me/corky" &amp;gt;&lt;br /&gt;    &amp;lt;v:n&amp;gt;Corky Crystal&amp;lt;/v:n&amp;gt;&lt;br /&gt;    &amp;lt;v:fn&amp;gt;Corky Crystal&amp;lt;/v:fn&amp;gt;&lt;br /&gt;    &amp;lt;v:sound&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;&lt;br /&gt; &amp;lt;rdf:value&amp;gt;Corky&amp;lt;/rdf:value&amp;gt;&lt;br /&gt; &amp;lt;rdf:type rdf:resource="@@@X-irmc-n@@@"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;&lt;br /&gt;    &amp;lt;/v:sound&amp;gt;&lt;br /&gt;    &amp;lt;v:sort-string&amp;gt;Corky&amp;lt;/v:sort-string&amp;gt;&lt;br /&gt;    &amp;lt;v:x-phonetic-first-name&amp;gt;Corky&amp;lt;/v:x-phonetic-first-name&amp;gt;&lt;br /&gt;    &amp;lt;v:x-phonetic-last-name&amp;gt;Crystal&amp;lt;/v:x-phonetic-last-name&amp;gt;&lt;br /&gt;    &amp;lt;v:tel&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;rdf:value&amp;gt;+61 7 5555 5555&amp;lt;/rdf:value&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Voice"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:tel&amp;gt;&lt;br /&gt;    &amp;lt;v:email rdf:resource="mailto:corky@example.com"/&amp;gt;&lt;br /&gt;    &amp;lt;v:adr&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;v:street-address&amp;gt;111 Lake Drive&amp;lt;/v:street-address&amp;gt;&lt;br /&gt;        &amp;lt;v:locality&amp;gt;WonderCity&amp;lt;/v:locality&amp;gt;&lt;br /&gt;        &amp;lt;v:postal-code&amp;gt;5555&amp;lt;/v:postal-code&amp;gt;&lt;br /&gt;        &amp;lt;v:country-name&amp;gt;Australia&amp;lt;/v:country-name&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:adr&amp;gt;&lt;br /&gt;  &amp;lt;/v:VCard&amp;gt;&lt;br /&gt;  &amp;lt;v:VCard rdf:about = "http://example.com/me/al" &amp;gt;&lt;br /&gt;    &amp;lt;v:n&amp;gt;Al Pacino&amp;lt;/v:n&amp;gt;&lt;br /&gt;    &amp;lt;v:fn&amp;gt;Al Pacino&amp;lt;/v:fn&amp;gt;&lt;br /&gt;    &amp;lt;v:sound&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;&lt;br /&gt; &amp;lt;rdf:value&amp;gt;Al&amp;lt;/rdf:value&amp;gt;&lt;br /&gt; &amp;lt;rdf:type rdf:resource="@@@X-irmc-n@@@"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;&lt;br /&gt;    &amp;lt;/v:sound&amp;gt;&lt;br /&gt;    &amp;lt;v:sort-string&amp;gt;Al&amp;lt;/v:sort-string&amp;gt;&lt;br /&gt;    &amp;lt;v:x-phonetic-first-name&amp;gt;Al&amp;lt;/v:x-phonetic-first-name&amp;gt;&lt;br /&gt;    &amp;lt;v:x-phonetic-last-name&amp;gt;Pacino&amp;lt;/v:x-phonetic-last-name&amp;gt;&lt;br /&gt;    &amp;lt;v:tel&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;rdf:value&amp;gt;+61 7 6666 6666&amp;lt;/rdf:value&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Work"/&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Voice"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:tel&amp;gt;&lt;br /&gt;    &amp;lt;v:email rdf:resource="mailto:al@example.com"/&amp;gt;&lt;br /&gt;    &amp;lt;v:adr&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;v:street-address&amp;gt;301 West 57th Street, 16C&amp;lt;/v:street-address&amp;gt;&lt;br /&gt;        &amp;lt;v:locality&amp;gt;New York&amp;lt;/v:locality&amp;gt;&lt;br /&gt;        &amp;lt;v:region&amp;gt;New York&amp;lt;/v:region&amp;gt;&lt;br /&gt;        &amp;lt;v:postal-code&amp;gt;10017&amp;lt;/v:postal-code&amp;gt;&lt;br /&gt;        &amp;lt;v:country-name&amp;gt;USA&amp;lt;/v:country-name&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:adr&amp;gt;&lt;br /&gt;  &amp;lt;/v:VCard&amp;gt;&lt;br /&gt;  &amp;lt;v:VCard rdf:about = "http://example.com/me/ethan" &amp;gt;&lt;br /&gt;    &amp;lt;v:n&amp;gt;Ethan Hawke&amp;lt;/v:n&amp;gt;&lt;br /&gt;    &amp;lt;v:fn&amp;gt;Ethan Hawke&amp;lt;/v:fn&amp;gt;&lt;br /&gt;    &amp;lt;v:sound&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;&lt;br /&gt; &amp;lt;rdf:value&amp;gt;Ethan&amp;lt;/rdf:value&amp;gt;&lt;br /&gt; &amp;lt;rdf:type rdf:resource="@@@X-irmc-n@@@"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;&lt;br /&gt;    &amp;lt;/v:sound&amp;gt;&lt;br /&gt;    &amp;lt;v:sort-string&amp;gt;Ethan&amp;lt;/v:sort-string&amp;gt;&lt;br /&gt;    &amp;lt;v:x-phonetic-first-name&amp;gt;Ethan&amp;lt;/v:x-phonetic-first-name&amp;gt;&lt;br /&gt;    &amp;lt;v:x-phonetic-last-name&amp;gt;Hawke&amp;lt;/v:x-phonetic-last-name&amp;gt;&lt;br /&gt;    &amp;lt;v:tel&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;rdf:value&amp;gt;+61 7 7777 7777&amp;lt;/rdf:value&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Voice"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:tel&amp;gt;&lt;br /&gt;    &amp;lt;v:email rdf:resource="mailto:ethan@example.com"/&amp;gt;&lt;br /&gt;    &amp;lt;v:adr&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;v:street-address&amp;gt;c/o 1775 Broadway 701&amp;lt;/v:street-address&amp;gt;&lt;br /&gt;        &amp;lt;v:locality&amp;gt;New York&amp;lt;/v:locality&amp;gt;&lt;br /&gt;        &amp;lt;v:region&amp;gt;New York&amp;lt;/v:region&amp;gt;&lt;br /&gt;        &amp;lt;v:postal-code&amp;gt;10019&amp;lt;/v:postal-code&amp;gt;&lt;br /&gt;        &amp;lt;v:country-name&amp;gt;USA&amp;lt;/v:country-name&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:adr&amp;gt;&lt;br /&gt;  &amp;lt;/v:VCard&amp;gt;&lt;br /&gt;  &amp;lt;v:VCard rdf:about = "http://example.com/me/brad" &amp;gt;&lt;br /&gt;    &amp;lt;v:n&amp;gt;Brad Pitt&amp;lt;/v:n&amp;gt;&lt;br /&gt;    &amp;lt;v:fn&amp;gt;Brad Pitt&amp;lt;/v:fn&amp;gt;&lt;br /&gt;    &amp;lt;v:sound&amp;gt;&lt;br /&gt;         &amp;lt;rdf:Description&amp;gt;&lt;br /&gt;            &amp;lt;rdf:value&amp;gt;Brad&amp;lt;/rdf:value&amp;gt;&lt;br /&gt;            &amp;lt;rdf:type rdf:resource="@@@X-irmc-n@@@"/&amp;gt;&lt;br /&gt;         &amp;lt;/rdf:Description&amp;gt;&lt;br /&gt;    &amp;lt;/v:sound&amp;gt;&lt;br /&gt;    &amp;lt;v:sort-string&amp;gt;Brad&amp;lt;/v:sort-string&amp;gt;&lt;br /&gt;         &amp;lt;v:x-phonetic-first-name&amp;gt;Brad&amp;lt;/v:x-phonetic-first-name&amp;gt;&lt;br /&gt;         &amp;lt;v:x-phonetic-last-name&amp;gt;Pitt&amp;lt;/v:x-phonetic-last-name&amp;gt;&lt;br /&gt;    &amp;lt;v:tel&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;rdf:value&amp;gt;+61 7 8888 8888&amp;lt;/rdf:value&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Work"/&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Voice"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:tel&amp;gt;&lt;br /&gt;    &amp;lt;v:email rdf:resource="mailto:brad@example.com"/&amp;gt;&lt;br /&gt;    &amp;lt;v:adr&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;v:street-address&amp;gt;9150 Wilshire Boulevard Suite 350&amp;lt;/v:street-address&amp;gt;&lt;br /&gt;        &amp;lt;v:locality&amp;gt;Beverly Hills&amp;lt;/v:locality&amp;gt;&lt;br /&gt;        &amp;lt;v:region&amp;gt;California&amp;lt;/v:region&amp;gt;&lt;br /&gt;        &amp;lt;v:postal-code&amp;gt;90212&amp;lt;/v:postal-code&amp;gt;&lt;br /&gt;        &amp;lt;v:country-name&amp;gt;USA&amp;lt;/v:country-name&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Work"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:adr&amp;gt;&lt;br /&gt;  &amp;lt;/v:VCard&amp;gt;&lt;br /&gt;&amp;lt;/rdf:RDF&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ cat xslt-sample.xsl &lt;br /&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&amp;lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&lt;br /&gt;  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"&lt;br /&gt;  xmlns:v="http://www.w3.org/2006/vcard/ns#"&lt;br /&gt;  version="1.0"&amp;gt;&lt;br /&gt;&amp;lt;xsl:output method="html"/&amp;gt;&lt;br /&gt;&amp;lt;xsl:template match="/"&amp;gt;&lt;br /&gt; &amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Addresses of VIP&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&lt;br /&gt;  &amp;lt;body&amp;gt;&lt;br /&gt;   &amp;lt;h1&amp;gt;Addresses of Five VIPs&amp;lt;/h1&amp;gt;&lt;br /&gt;   &amp;lt;table border="1"&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Country&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Tel&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;xsl:for-each select="rdf:RDF/v:VCard"&amp;gt;&lt;br /&gt;      &amp;lt;xsl:sort select="v:sort-string" order="descending" data-type="text"/&amp;gt;&lt;br /&gt;     &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&lt;br /&gt;       &amp;lt;strong&amp;gt;&lt;br /&gt;  &amp;lt;a&amp;gt;&amp;lt;xsl:attribute name="href"&amp;gt;&lt;br /&gt;    &amp;lt;xsl:value-of select="v:email/@rdf:resource"/&amp;gt;&lt;br /&gt;  &amp;lt;/xsl:attribute&amp;gt;&lt;br /&gt;  &amp;lt;xsl:value-of select="v:x-phonetic-first-name"/&amp;gt;&lt;br /&gt;  &amp;lt;/a&amp;gt;&lt;br /&gt;       &amp;lt;/strong&amp;gt;&amp;lt;br/&amp;gt;(&amp;lt;em&amp;gt;&amp;lt;xsl:value-of select="v:x-phonetic-last-name"/&amp;gt;&amp;lt;/em&amp;gt;)&amp;lt;/td&amp;gt;&lt;br /&gt;     &amp;lt;td&amp;gt;&lt;br /&gt;       &amp;lt;xsl:value-of select="v:adr/rdf:Description/v:country-name"/&amp;gt;&lt;br /&gt;       &amp;lt;xsl:choose&amp;gt;&lt;br /&gt;  &amp;lt;xsl:when test="v:adr/rdf:Description/rdf:type[@rdf:resource='http://www.w3.org/2006/vcard/ns#Home']"&amp;gt; [Home]&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;  &amp;lt;xsl:when test="v:adr/rdf:Description/rdf:type[@rdf:resource='http://www.w3.org/2006/vcard/ns#Work']"&amp;gt; [Work]&amp;lt;/xsl:when&amp;gt;&lt;br /&gt;  &amp;lt;xsl:otherwise&amp;gt; [Unknown]&amp;lt;/xsl:otherwise&amp;gt;&lt;br /&gt;       &amp;lt;/xsl:choose&amp;gt;&lt;br /&gt;     &amp;lt;/td&amp;gt;&lt;br /&gt;     &amp;lt;td&amp;gt;&lt;br /&gt;       &amp;lt;xsl:value-of select="v:tel/rdf:Description/rdf:value"/&amp;gt;&lt;br /&gt;       &amp;lt;xsl:apply-templates select="v:tel/rdf:Description/rdf:type[@rdf:resource='http://www.w3.org/2006/vcard/ns#Home']"/&amp;gt;&lt;br /&gt;     &amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;    &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;/table&amp;gt;&lt;br /&gt; &amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;xsl:template match="v:tel/rdf:Description/rdf:type[@rdf:resource='http://www.w3.org/2006/vcard/ns#Home']"&amp;gt;&lt;br /&gt; [Home]&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ java -cp ~/Dropbox/java/lib/saxon9he.jar net.sf.saxon.Transform -t -s:vcard-rdf-sample.xml -xsl:xslt-sample.xsl&lt;br /&gt;Saxon-HE 9.3.0.4J from Saxonica&lt;br /&gt;Java version 1.6.0_24&lt;br /&gt;Warning: at xsl:stylesheet on line 5 column 17 of xslt-sample.xsl:&lt;br /&gt;  Running an XSLT 1 stylesheet with an XSLT 2 processor&lt;br /&gt;Stylesheet compilation time: 392 milliseconds&lt;br /&gt;Processing file:/Volumes/Macintosh%20HD2/Dropbox/xml/vcard-rdf-sample.xml&lt;br /&gt;Using parser com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser&lt;br /&gt;Building tree for file:/Volumes/Macintosh%20HD2/Dropbox/xml/vcard-rdf-sample.xml using class net.sf.saxon.tree.tiny.TinyBuilder&lt;br /&gt;Tree built in 5 milliseconds&lt;br /&gt;Tree size: 273 nodes, 421 characters, 23 attributes&lt;br /&gt;&amp;lt;html xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:v="http://www.w3.org/2006/vcard/ns#"&amp;gt;&lt;br /&gt;   &amp;lt;head&amp;gt;&lt;br /&gt;      &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&amp;gt;&lt;br /&gt;      &amp;lt;title&amp;gt;Addresses of VIP&amp;lt;/title&amp;gt;&lt;br /&gt;   &amp;lt;/head&amp;gt;&lt;br /&gt;   &amp;lt;body&amp;gt;&lt;br /&gt;      &amp;lt;h1&amp;gt;Addresses of Five VIPs&amp;lt;/h1&amp;gt;&lt;br /&gt;      &amp;lt;table border="1"&amp;gt;&lt;br /&gt;         &amp;lt;tr&amp;gt;&lt;br /&gt;            &amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;&lt;br /&gt;            &amp;lt;th&amp;gt;Country&amp;lt;/th&amp;gt;&lt;br /&gt;            &amp;lt;th&amp;gt;Tel&amp;lt;/th&amp;gt;&lt;br /&gt;         &amp;lt;/tr&amp;gt;&lt;br /&gt;         &amp;lt;tr&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;a href="mailto:ethan@example.com"&amp;gt;Ethan&amp;lt;/a&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;(&amp;lt;em&amp;gt;Hawke&amp;lt;/em&amp;gt;)&lt;br /&gt;            &amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;USA [Unknown]&amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;+61 7 7777 7777&lt;br /&gt;               [Home]&lt;br /&gt;               &lt;br /&gt;            &amp;lt;/td&amp;gt;&lt;br /&gt;         &amp;lt;/tr&amp;gt;&lt;br /&gt;         &amp;lt;tr&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;a href="mailto:corky@example.com"&amp;gt;Corky&amp;lt;/a&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;(&amp;lt;em&amp;gt;Crystal&amp;lt;/em&amp;gt;)&lt;br /&gt;            &amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;Australia [Home]&amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;+61 7 5555 5555&lt;br /&gt;               [Home]&lt;br /&gt;               &lt;br /&gt;            &amp;lt;/td&amp;gt;&lt;br /&gt;         &amp;lt;/tr&amp;gt;&lt;br /&gt;         &amp;lt;tr&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;a href="mailto:brad@example.com"&amp;gt;Brad&amp;lt;/a&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;(&amp;lt;em&amp;gt;Pitt&amp;lt;/em&amp;gt;)&lt;br /&gt;            &amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;USA [Work]&amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;+61 7 8888 8888&amp;lt;/td&amp;gt;&lt;br /&gt;         &amp;lt;/tr&amp;gt;&lt;br /&gt;         &amp;lt;tr&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;a href="mailto:al@example.com"&amp;gt;Al&amp;lt;/a&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;(&amp;lt;em&amp;gt;Pacino&amp;lt;/em&amp;gt;)&lt;br /&gt;            &amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;USA [Home]&amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;+61 7 6666 6666&amp;lt;/td&amp;gt;&lt;br /&gt;         &amp;lt;/tr&amp;gt;&lt;br /&gt;      &amp;lt;/table&amp;gt;&lt;br /&gt;   &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;Execution time: 83ms&lt;br /&gt;Memory used: 4788984&lt;br /&gt;NamePool contents: 49 entries in 47 chains. 8 prefixes, 8 URIs&lt;br /&gt;$ &lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-3050854651533685852?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/3050854651533685852/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=3050854651533685852' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/3050854651533685852'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/3050854651533685852'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2011/05/xml-vqg-2-xslt-10.html' title='[XML VQG] 2. XSLT (10)'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-5382014899106709070</id><published>2011-05-02T01:40:00.001+09:00</published><updated>2011-05-02T01:44:52.396+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xml visual quickstart guide'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='xslt'/><title type='text'>[XML VQG] 2. XSLT (9)</title><content type='html'>Fourth example introduces xsl:if.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ cat vcard-rdf-sample.xml &lt;br /&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&amp;lt;rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"&lt;br /&gt;         xmlns:v="http://www.w3.org/2006/vcard/ns#"&amp;gt;&lt;br /&gt;           &lt;br /&gt;  &amp;lt;v:VCard rdf:about = "http://example.com/me/corky" &amp;gt;&lt;br /&gt;    &amp;lt;v:n&amp;gt;Corky Crystal&amp;lt;/v:n&amp;gt;&lt;br /&gt;    &amp;lt;v:fn&amp;gt;Corky Crystal&amp;lt;/v:fn&amp;gt;&lt;br /&gt;    &amp;lt;v:sound&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;&lt;br /&gt; &amp;lt;rdf:value&amp;gt;Corky&amp;lt;/rdf:value&amp;gt;&lt;br /&gt; &amp;lt;rdf:type rdf:resource="@@@X-irmc-n@@@"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;&lt;br /&gt;    &amp;lt;/v:sound&amp;gt;&lt;br /&gt;    &amp;lt;v:sort-string&amp;gt;Corky&amp;lt;/v:sort-string&amp;gt;&lt;br /&gt;    &amp;lt;v:x-phonetic-first-name&amp;gt;Corky&amp;lt;/v:x-phonetic-first-name&amp;gt;&lt;br /&gt;    &amp;lt;v:x-phonetic-last-name&amp;gt;Crystal&amp;lt;/v:x-phonetic-last-name&amp;gt;&lt;br /&gt;    &amp;lt;v:tel&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;rdf:value&amp;gt;+61 7 5555 5555&amp;lt;/rdf:value&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Voice"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:tel&amp;gt;&lt;br /&gt;    &amp;lt;v:email rdf:resource="mailto:corky@example.com"/&amp;gt;&lt;br /&gt;    &amp;lt;v:adr&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;v:street-address&amp;gt;111 Lake Drive&amp;lt;/v:street-address&amp;gt;&lt;br /&gt;        &amp;lt;v:locality&amp;gt;WonderCity&amp;lt;/v:locality&amp;gt;&lt;br /&gt;        &amp;lt;v:postal-code&amp;gt;5555&amp;lt;/v:postal-code&amp;gt;&lt;br /&gt;        &amp;lt;v:country-name&amp;gt;Australia&amp;lt;/v:country-name&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:adr&amp;gt;&lt;br /&gt;  &amp;lt;/v:VCard&amp;gt;&lt;br /&gt;  &amp;lt;v:VCard rdf:about = "http://example.com/me/al" &amp;gt;&lt;br /&gt;    &amp;lt;v:n&amp;gt;Al Pacino&amp;lt;/v:n&amp;gt;&lt;br /&gt;    &amp;lt;v:fn&amp;gt;Al Pacino&amp;lt;/v:fn&amp;gt;&lt;br /&gt;    &amp;lt;v:sound&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;&lt;br /&gt; &amp;lt;rdf:value&amp;gt;Al&amp;lt;/rdf:value&amp;gt;&lt;br /&gt; &amp;lt;rdf:type rdf:resource="@@@X-irmc-n@@@"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;&lt;br /&gt;    &amp;lt;/v:sound&amp;gt;&lt;br /&gt;    &amp;lt;v:sort-string&amp;gt;Al&amp;lt;/v:sort-string&amp;gt;&lt;br /&gt;    &amp;lt;v:x-phonetic-first-name&amp;gt;Al&amp;lt;/v:x-phonetic-first-name&amp;gt;&lt;br /&gt;    &amp;lt;v:x-phonetic-last-name&amp;gt;Pacino&amp;lt;/v:x-phonetic-last-name&amp;gt;&lt;br /&gt;    &amp;lt;v:tel&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;rdf:value&amp;gt;+61 7 6666 6666&amp;lt;/rdf:value&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Work"/&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Voice"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:tel&amp;gt;&lt;br /&gt;    &amp;lt;v:email rdf:resource="mailto:al@example.com"/&amp;gt;&lt;br /&gt;    &amp;lt;v:adr&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;v:street-address&amp;gt;301 West 57th Street, 16C&amp;lt;/v:street-address&amp;gt;&lt;br /&gt;        &amp;lt;v:locality&amp;gt;New York&amp;lt;/v:locality&amp;gt;&lt;br /&gt;        &amp;lt;v:region&amp;gt;New York&amp;lt;/v:region&amp;gt;&lt;br /&gt;        &amp;lt;v:postal-code&amp;gt;10017&amp;lt;/v:postal-code&amp;gt;&lt;br /&gt;        &amp;lt;v:country-name&amp;gt;USA&amp;lt;/v:country-name&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:adr&amp;gt;&lt;br /&gt;  &amp;lt;/v:VCard&amp;gt;&lt;br /&gt;  &amp;lt;v:VCard rdf:about = "http://example.com/me/ethan" &amp;gt;&lt;br /&gt;    &amp;lt;v:n&amp;gt;Ethan Hawke&amp;lt;/v:n&amp;gt;&lt;br /&gt;    &amp;lt;v:fn&amp;gt;Ethan Hawke&amp;lt;/v:fn&amp;gt;&lt;br /&gt;    &amp;lt;v:sound&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;&lt;br /&gt; &amp;lt;rdf:value&amp;gt;Ethan&amp;lt;/rdf:value&amp;gt;&lt;br /&gt; &amp;lt;rdf:type rdf:resource="@@@X-irmc-n@@@"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;&lt;br /&gt;    &amp;lt;/v:sound&amp;gt;&lt;br /&gt;    &amp;lt;v:sort-string&amp;gt;Al&amp;lt;/v:sort-string&amp;gt;&lt;br /&gt;    &amp;lt;v:x-phonetic-first-name&amp;gt;Ethan&amp;lt;/v:x-phonetic-first-name&amp;gt;&lt;br /&gt;    &amp;lt;v:x-phonetic-last-name&amp;gt;Hawke&amp;lt;/v:x-phonetic-last-name&amp;gt;&lt;br /&gt;    &amp;lt;v:tel&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;rdf:value&amp;gt;+61 7 7777 7777&amp;lt;/rdf:value&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Voice"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:tel&amp;gt;&lt;br /&gt;    &amp;lt;v:email rdf:resource="mailto:ethan@example.com"/&amp;gt;&lt;br /&gt;    &amp;lt;v:adr&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;v:street-address&amp;gt;c/o 1775 Broadway 701&amp;lt;/v:street-address&amp;gt;&lt;br /&gt;        &amp;lt;v:locality&amp;gt;New York&amp;lt;/v:locality&amp;gt;&lt;br /&gt;        &amp;lt;v:region&amp;gt;New York&amp;lt;/v:region&amp;gt;&lt;br /&gt;        &amp;lt;v:postal-code&amp;gt;10019&amp;lt;/v:postal-code&amp;gt;&lt;br /&gt;        &amp;lt;v:country-name&amp;gt;USA&amp;lt;/v:country-name&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:adr&amp;gt;&lt;br /&gt;  &amp;lt;/v:VCard&amp;gt;&lt;br /&gt;  &amp;lt;v:VCard rdf:about = "http://example.com/me/brad" &amp;gt;&lt;br /&gt;    &amp;lt;v:n&amp;gt;Brad Pitt&amp;lt;/v:n&amp;gt;&lt;br /&gt;    &amp;lt;v:fn&amp;gt;Brad Pitt&amp;lt;/v:fn&amp;gt;&lt;br /&gt;    &amp;lt;v:sound&amp;gt;&lt;br /&gt;         &amp;lt;rdf:Description&amp;gt;&lt;br /&gt;            &amp;lt;rdf:value&amp;gt;Brad&amp;lt;/rdf:value&amp;gt;&lt;br /&gt;            &amp;lt;rdf:type rdf:resource="@@@X-irmc-n@@@"/&amp;gt;&lt;br /&gt;         &amp;lt;/rdf:Description&amp;gt;&lt;br /&gt;    &amp;lt;/v:sound&amp;gt;&lt;br /&gt;    &amp;lt;v:sort-string&amp;gt;Al&amp;lt;/v:sort-string&amp;gt;&lt;br /&gt;         &amp;lt;v:x-phonetic-first-name&amp;gt;Brad&amp;lt;/v:x-phonetic-first-name&amp;gt;&lt;br /&gt;         &amp;lt;v:x-phonetic-last-name&amp;gt;Pitt&amp;lt;/v:x-phonetic-last-name&amp;gt;&lt;br /&gt;    &amp;lt;v:tel&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;rdf:value&amp;gt;+61 7 8888 8888&amp;lt;/rdf:value&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Work"/&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Voice"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:tel&amp;gt;&lt;br /&gt;    &amp;lt;v:email rdf:resource="mailto:brad@example.com"/&amp;gt;&lt;br /&gt;    &amp;lt;v:adr&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;v:street-address&amp;gt;9150 Wilshire Boulevard Suite 350&amp;lt;/v:street-address&amp;gt;&lt;br /&gt;        &amp;lt;v:locality&amp;gt;Beverly Hills&amp;lt;/v:locality&amp;gt;&lt;br /&gt;        &amp;lt;v:region&amp;gt;California&amp;lt;/v:region&amp;gt;&lt;br /&gt;        &amp;lt;v:postal-code&amp;gt;90212&amp;lt;/v:postal-code&amp;gt;&lt;br /&gt;        &amp;lt;v:country-name&amp;gt;USA&amp;lt;/v:country-name&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Work"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:adr&amp;gt;&lt;br /&gt;  &amp;lt;/v:VCard&amp;gt;&lt;br /&gt;&amp;lt;/rdf:RDF&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ cat 02-17.xsl&lt;br /&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&amp;lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&lt;br /&gt;  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"&lt;br /&gt;  xmlns:v="http://www.w3.org/2006/vcard/ns#"&lt;br /&gt;  version="1.0"&amp;gt;&lt;br /&gt;&amp;lt;xsl:output method="html"/&amp;gt;&lt;br /&gt;&amp;lt;xsl:template match="/"&amp;gt;&lt;br /&gt; &amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Addresses of VIP&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&lt;br /&gt;  &amp;lt;body&amp;gt;&lt;br /&gt;   &amp;lt;h1&amp;gt;Addresses of Five VIPs&amp;lt;/h1&amp;gt;&lt;br /&gt;   &amp;lt;table border="1"&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Country&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Tel&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;xsl:for-each select="rdf:RDF/v:VCard"&amp;gt;&lt;br /&gt;     &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;xsl:value-of select="v:x-phonetic-first-name"/&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;br/&amp;gt;(&amp;lt;em&amp;gt;&amp;lt;xsl:value-of select="v:x-phonetic-last-name"/&amp;gt;&amp;lt;/em&amp;gt;)&amp;lt;/td&amp;gt;&lt;br /&gt;     &amp;lt;td&amp;gt;&lt;br /&gt;       &amp;lt;xsl:value-of select="v:adr/rdf:Description/v:country-name"/&amp;gt;&lt;br /&gt;       &amp;lt;xsl:if test="v:adr/rdf:Description/rdf:type[@rdf:resource!='http://www.w3.org/2006/vcard/ns#Home']"&amp;gt;&lt;br /&gt;  [Not home]&lt;br /&gt;       &amp;lt;/xsl:if&amp;gt;&lt;br /&gt;     &amp;lt;/td&amp;gt;&lt;br /&gt;     &amp;lt;td&amp;gt;&lt;br /&gt;       &amp;lt;xsl:value-of select="v:tel/rdf:Description/rdf:value"/&amp;gt;&lt;br /&gt;       &amp;lt;xsl:if test="v:tel/rdf:Description/rdf:type[@rdf:resource='http://www.w3.org/2006/vcard/ns#Home']"&amp;gt;&lt;br /&gt;  [Home]&lt;br /&gt;       &amp;lt;/xsl:if&amp;gt;&lt;br /&gt;     &amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;    &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;/table&amp;gt;&lt;br /&gt; &amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ java -cp ~/Dropbox/java/lib/saxon9he.jar net.sf.saxon.Transform -t -s:vcard-rdf-sample.xml -xsl:02-17.xsl&lt;br /&gt;Saxon-HE 9.3.0.4J from Saxonica&lt;br /&gt;Java version 1.6.0_24&lt;br /&gt;Warning: at xsl:stylesheet on line 5 column 17 of 02-17.xsl:&lt;br /&gt;  Running an XSLT 1 stylesheet with an XSLT 2 processor&lt;br /&gt;Stylesheet compilation time: 365 milliseconds&lt;br /&gt;Processing file:/Volumes/Macintosh%20HD2/Dropbox/xml/vcard-rdf-sample.xml&lt;br /&gt;Using parser com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser&lt;br /&gt;Building tree for file:/Volumes/Macintosh%20HD2/Dropbox/xml/vcard-rdf-sample.xml using class net.sf.saxon.tree.tiny.TinyBuilder&lt;br /&gt;Tree built in 5 milliseconds&lt;br /&gt;Tree size: 276 nodes, 416 characters, 24 attributes&lt;br /&gt;&amp;lt;html xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:v="http://www.w3.org/2006/vcard/ns#"&amp;gt;&lt;br /&gt;   &amp;lt;head&amp;gt;&lt;br /&gt;      &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&amp;gt;&lt;br /&gt;      &amp;lt;title&amp;gt;Addresses of VIP&amp;lt;/title&amp;gt;&lt;br /&gt;   &amp;lt;/head&amp;gt;&lt;br /&gt;   &amp;lt;body&amp;gt;&lt;br /&gt;      &amp;lt;h1&amp;gt;Addresses of Five VIPs&amp;lt;/h1&amp;gt;&lt;br /&gt;      &amp;lt;table border="1"&amp;gt;&lt;br /&gt;         &amp;lt;tr&amp;gt;&lt;br /&gt;            &amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;&lt;br /&gt;            &amp;lt;th&amp;gt;Country&amp;lt;/th&amp;gt;&lt;br /&gt;            &amp;lt;th&amp;gt;Tel&amp;lt;/th&amp;gt;&lt;br /&gt;         &amp;lt;/tr&amp;gt;&lt;br /&gt;         &amp;lt;tr&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;&amp;lt;strong&amp;gt;Corky&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;(&amp;lt;em&amp;gt;Crystal&amp;lt;/em&amp;gt;)&lt;br /&gt;            &amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;Australia&amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;+61 7 5555 5555&lt;br /&gt;                 [Home]&lt;br /&gt;               &lt;br /&gt;            &amp;lt;/td&amp;gt;&lt;br /&gt;         &amp;lt;/tr&amp;gt;&lt;br /&gt;         &amp;lt;tr&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;&amp;lt;strong&amp;gt;Al&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;(&amp;lt;em&amp;gt;Pacino&amp;lt;/em&amp;gt;)&lt;br /&gt;            &amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;USA&amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;+61 7 6666 6666&amp;lt;/td&amp;gt;&lt;br /&gt;         &amp;lt;/tr&amp;gt;&lt;br /&gt;         &amp;lt;tr&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;&amp;lt;strong&amp;gt;Ethan&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;(&amp;lt;em&amp;gt;Hawke&amp;lt;/em&amp;gt;)&lt;br /&gt;            &amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;USA&amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;+61 7 7777 7777&lt;br /&gt;                 [Home]&lt;br /&gt;               &lt;br /&gt;            &amp;lt;/td&amp;gt;&lt;br /&gt;         &amp;lt;/tr&amp;gt;&lt;br /&gt;         &amp;lt;tr&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;&amp;lt;strong&amp;gt;Brad&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;(&amp;lt;em&amp;gt;Pitt&amp;lt;/em&amp;gt;)&lt;br /&gt;            &amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;USA&lt;br /&gt;                 [Not home]&lt;br /&gt;               &lt;br /&gt;            &amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;+61 7 8888 8888&amp;lt;/td&amp;gt;&lt;br /&gt;         &amp;lt;/tr&amp;gt;&lt;br /&gt;      &amp;lt;/table&amp;gt;&lt;br /&gt;   &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;Execution time: 99ms&lt;br /&gt;Memory used: 4916080&lt;br /&gt;NamePool contents: 44 entries in 42 chains. 8 prefixes, 8 URIs&lt;br /&gt;$ &lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-5382014899106709070?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/5382014899106709070/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=5382014899106709070' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/5382014899106709070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/5382014899106709070'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2011/05/xml-vqg-2-xslt-9.html' title='[XML VQG] 2. XSLT (9)'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-5281194120846012080</id><published>2011-05-02T00:55:00.000+09:00</published><updated>2011-05-02T00:58:06.942+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xml visual quickstart guide'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='xslt'/><title type='text'>[XML VQG] 2. XSLT (8)</title><content type='html'>Oops.  'vCard RDF' specification doesn't contain elements that have both a value and an attribute simultaneously.  So I couldn't create an XSLT style sheet that uses attribute selection mechanism.  Any way, here's third example.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ cat vcard-rdf-sample.xml &lt;br /&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&amp;lt;rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"&lt;br /&gt;         xmlns:v="http://www.w3.org/2006/vcard/ns#"&amp;gt;&lt;br /&gt;           &lt;br /&gt;  &amp;lt;v:VCard rdf:about = "http://example.com/me/corky" &amp;gt;&lt;br /&gt;    &amp;lt;v:n&amp;gt;Corky Crystal&amp;lt;/v:n&amp;gt;&lt;br /&gt;    &amp;lt;v:fn&amp;gt;Corky Crystal&amp;lt;/v:fn&amp;gt;&lt;br /&gt;    &amp;lt;v:sound&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;&lt;br /&gt; &amp;lt;rdf:value&amp;gt;Corky&amp;lt;/rdf:value&amp;gt;&lt;br /&gt; &amp;lt;rdf:type rdf:resource="@@@X-irmc-n@@@"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;&lt;br /&gt;    &amp;lt;/v:sound&amp;gt;&lt;br /&gt;    &amp;lt;v:sort-string&amp;gt;Corky&amp;lt;/v:sort-string&amp;gt;&lt;br /&gt;    &amp;lt;v:x-phonetic-first-name&amp;gt;Corky&amp;lt;/v:x-phonetic-first-name&amp;gt;&lt;br /&gt;    &amp;lt;v:x-phonetic-last-name&amp;gt;Crystal&amp;lt;/v:x-phonetic-last-name&amp;gt;&lt;br /&gt;    &amp;lt;v:tel&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;rdf:value&amp;gt;+61 7 5555 5555&amp;lt;/rdf:value&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Voice"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:tel&amp;gt;&lt;br /&gt;    &amp;lt;v:email rdf:resource="mailto:corky@example.com"/&amp;gt;&lt;br /&gt;    &amp;lt;v:adr&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;v:street-address&amp;gt;111 Lake Drive&amp;lt;/v:street-address&amp;gt;&lt;br /&gt;        &amp;lt;v:locality&amp;gt;WonderCity&amp;lt;/v:locality&amp;gt;&lt;br /&gt;        &amp;lt;v:postal-code&amp;gt;5555&amp;lt;/v:postal-code&amp;gt;&lt;br /&gt;        &amp;lt;v:country-name&amp;gt;Australia&amp;lt;/v:country-name&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:adr&amp;gt;&lt;br /&gt;  &amp;lt;/v:VCard&amp;gt;&lt;br /&gt;  &amp;lt;v:VCard rdf:about = "http://example.com/me/al" &amp;gt;&lt;br /&gt;    &amp;lt;v:n&amp;gt;Al Pacino&amp;lt;/v:n&amp;gt;&lt;br /&gt;    &amp;lt;v:fn&amp;gt;Al Pacino&amp;lt;/v:fn&amp;gt;&lt;br /&gt;    &amp;lt;v:sound&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;&lt;br /&gt; &amp;lt;rdf:value&amp;gt;Al&amp;lt;/rdf:value&amp;gt;&lt;br /&gt; &amp;lt;rdf:type rdf:resource="@@@X-irmc-n@@@"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;&lt;br /&gt;    &amp;lt;/v:sound&amp;gt;&lt;br /&gt;    &amp;lt;v:sort-string&amp;gt;Al&amp;lt;/v:sort-string&amp;gt;&lt;br /&gt;    &amp;lt;v:x-phonetic-first-name&amp;gt;Al&amp;lt;/v:x-phonetic-first-name&amp;gt;&lt;br /&gt;    &amp;lt;v:x-phonetic-last-name&amp;gt;Pacino&amp;lt;/v:x-phonetic-last-name&amp;gt;&lt;br /&gt;    &amp;lt;v:tel&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;rdf:value&amp;gt;+61 7 6666 6666&amp;lt;/rdf:value&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Voice"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:tel&amp;gt;&lt;br /&gt;    &amp;lt;v:email rdf:resource="mailto:al@example.com"/&amp;gt;&lt;br /&gt;    &amp;lt;v:adr&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;v:street-address&amp;gt;301 West 57th Street, 16C&amp;lt;/v:street-address&amp;gt;&lt;br /&gt;        &amp;lt;v:locality&amp;gt;New York&amp;lt;/v:locality&amp;gt;&lt;br /&gt;        &amp;lt;v:region&amp;gt;New York&amp;lt;/v:region&amp;gt;&lt;br /&gt;        &amp;lt;v:postal-code&amp;gt;10017&amp;lt;/v:postal-code&amp;gt;&lt;br /&gt;        &amp;lt;v:country-name&amp;gt;USA&amp;lt;/v:country-name&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:adr&amp;gt;&lt;br /&gt;  &amp;lt;/v:VCard&amp;gt;&lt;br /&gt;  &amp;lt;v:VCard rdf:about = "http://example.com/me/ethan" &amp;gt;&lt;br /&gt;    &amp;lt;v:n&amp;gt;Ethan Hawke&amp;lt;/v:n&amp;gt;&lt;br /&gt;    &amp;lt;v:fn&amp;gt;Ethan Hawke&amp;lt;/v:fn&amp;gt;&lt;br /&gt;    &amp;lt;v:sound&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;&lt;br /&gt; &amp;lt;rdf:value&amp;gt;Ethan&amp;lt;/rdf:value&amp;gt;&lt;br /&gt; &amp;lt;rdf:type rdf:resource="@@@X-irmc-n@@@"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;&lt;br /&gt;    &amp;lt;/v:sound&amp;gt;&lt;br /&gt;    &amp;lt;v:sort-string&amp;gt;Al&amp;lt;/v:sort-string&amp;gt;&lt;br /&gt;    &amp;lt;v:x-phonetic-first-name&amp;gt;Ethan&amp;lt;/v:x-phonetic-first-name&amp;gt;&lt;br /&gt;    &amp;lt;v:x-phonetic-last-name&amp;gt;Hawke&amp;lt;/v:x-phonetic-last-name&amp;gt;&lt;br /&gt;    &amp;lt;v:tel&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;rdf:value&amp;gt;+61 7 7777 7777&amp;lt;/rdf:value&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Voice"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:tel&amp;gt;&lt;br /&gt;    &amp;lt;v:email rdf:resource="mailto:ethan@example.com"/&amp;gt;&lt;br /&gt;    &amp;lt;v:adr&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;v:street-address&amp;gt;c/o 1775 Broadway 701&amp;lt;/v:street-address&amp;gt;&lt;br /&gt;        &amp;lt;v:locality&amp;gt;New York&amp;lt;/v:locality&amp;gt;&lt;br /&gt;        &amp;lt;v:region&amp;gt;New York&amp;lt;/v:region&amp;gt;&lt;br /&gt;        &amp;lt;v:postal-code&amp;gt;10019&amp;lt;/v:postal-code&amp;gt;&lt;br /&gt;        &amp;lt;v:country-name&amp;gt;USA&amp;lt;/v:country-name&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:adr&amp;gt;&lt;br /&gt;  &amp;lt;/v:VCard&amp;gt;&lt;br /&gt;  &amp;lt;v:VCard rdf:about = "http://example.com/me/brad" &amp;gt;&lt;br /&gt;    &amp;lt;v:n&amp;gt;Brad Pitt&amp;lt;/v:n&amp;gt;&lt;br /&gt;    &amp;lt;v:fn&amp;gt;Brad Pitt&amp;lt;/v:fn&amp;gt;&lt;br /&gt;    &amp;lt;v:sound&amp;gt;&lt;br /&gt;         &amp;lt;rdf:Description&amp;gt;&lt;br /&gt;            &amp;lt;rdf:value&amp;gt;Brad&amp;lt;/rdf:value&amp;gt;&lt;br /&gt;            &amp;lt;rdf:type rdf:resource="@@@X-irmc-n@@@"/&amp;gt;&lt;br /&gt;         &amp;lt;/rdf:Description&amp;gt;&lt;br /&gt;    &amp;lt;/v:sound&amp;gt;&lt;br /&gt;    &amp;lt;v:sort-string&amp;gt;Al&amp;lt;/v:sort-string&amp;gt;&lt;br /&gt;         &amp;lt;v:x-phonetic-first-name&amp;gt;Brad&amp;lt;/v:x-phonetic-first-name&amp;gt;&lt;br /&gt;         &amp;lt;v:x-phonetic-last-name&amp;gt;Pitt&amp;lt;/v:x-phonetic-last-name&amp;gt;&lt;br /&gt;    &amp;lt;v:tel&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;rdf:value&amp;gt;+61 7 8888 8888&amp;lt;/rdf:value&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Voice"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:tel&amp;gt;&lt;br /&gt;    &amp;lt;v:email rdf:resource="mailto:brad@example.com"/&amp;gt;&lt;br /&gt;    &amp;lt;v:adr&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;v:street-address&amp;gt;9150 Wilshire Boulevard Suite 350&amp;lt;/v:street-address&amp;gt;&lt;br /&gt;        &amp;lt;v:locality&amp;gt;Beverly Hills&amp;lt;/v:locality&amp;gt;&lt;br /&gt;        &amp;lt;v:region&amp;gt;California&amp;lt;/v:region&amp;gt;&lt;br /&gt;        &amp;lt;v:postal-code&amp;gt;90212&amp;lt;/v:postal-code&amp;gt;&lt;br /&gt;        &amp;lt;v:country-name&amp;gt;USA&amp;lt;/v:country-name&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:adr&amp;gt;&lt;br /&gt;  &amp;lt;/v:VCard&amp;gt;&lt;br /&gt;&amp;lt;/rdf:RDF&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ cat 02-14.xsl&lt;br /&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&amp;lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"&lt;br /&gt;  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"&lt;br /&gt;  xmlns:v="http://www.w3.org/2006/vcard/ns#"&lt;br /&gt;  version="1.0"&amp;gt;&lt;br /&gt;&amp;lt;xsl:output method="html"/&amp;gt;&lt;br /&gt;&amp;lt;xsl:template match="/"&amp;gt;&lt;br /&gt; &amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Addresses of VIP&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&lt;br /&gt;  &amp;lt;body&amp;gt;&lt;br /&gt;   &amp;lt;h1&amp;gt;Addresses of Five VIPs&amp;lt;/h1&amp;gt;&lt;br /&gt;   &amp;lt;table border="1"&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Country&amp;lt;/th&amp;gt;&amp;lt;th&amp;gt;Tel&amp;lt;/th&amp;gt;&amp;lt;/tr&amp;gt;&lt;br /&gt;&lt;br /&gt;    &amp;lt;xsl:for-each select="rdf:RDF/v:VCard"&amp;gt;&lt;br /&gt;     &amp;lt;tr&amp;gt;&amp;lt;td&amp;gt;&amp;lt;strong&amp;gt;&amp;lt;xsl:value-of select="v:x-phonetic-first-name"/&amp;gt;&amp;lt;/strong&amp;gt;&amp;lt;br/&amp;gt;(&amp;lt;em&amp;gt;&amp;lt;xsl:value-of select="v:x-phonetic-last-name"/&amp;gt;&amp;lt;/em&amp;gt;)&amp;lt;/td&amp;gt;&lt;br /&gt;     &amp;lt;td&amp;gt;&amp;lt;xsl:value-of select="v:adr/rdf:Description/v:country-name"/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;     &amp;lt;td&amp;gt;&amp;lt;xsl:value-of select="v:tel/rdf:Description/rdf:value"/&amp;gt;&amp;lt;/td&amp;gt;&lt;br /&gt;    &amp;lt;/tr&amp;gt;&lt;br /&gt;    &amp;lt;/xsl:for-each&amp;gt;&lt;br /&gt;&lt;br /&gt;   &amp;lt;/table&amp;gt;&lt;br /&gt; &amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ java -cp ~/Dropbox/java/lib/saxon9he.jar net.sf.saxon.Transform -t -s:vcard-rdf-sample.xml -xsl:02-14.xsl&lt;br /&gt;Saxon-HE 9.3.0.4J from Saxonica&lt;br /&gt;Java version 1.6.0_24&lt;br /&gt;Warning: at xsl:stylesheet on line 5 column 17 of 02-14.xsl:&lt;br /&gt;  Running an XSLT 1 stylesheet with an XSLT 2 processor&lt;br /&gt;Stylesheet compilation time: 351 milliseconds&lt;br /&gt;Processing file:/Volumes/Macintosh%20HD2/Dropbox/xml/vcard-rdf-sample.xml&lt;br /&gt;Using parser com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser&lt;br /&gt;Building tree for file:/Volumes/Macintosh%20HD2/Dropbox/xml/vcard-rdf-sample.xml using class net.sf.saxon.tree.tiny.TinyBuilder&lt;br /&gt;Tree built in 5 milliseconds&lt;br /&gt;Tree size: 276 nodes, 416 characters, 24 attributes&lt;br /&gt;&amp;lt;html xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:v="http://www.w3.org/2006/vcard/ns#"&amp;gt;&lt;br /&gt;   &amp;lt;head&amp;gt;&lt;br /&gt;      &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&amp;gt;&lt;br /&gt;      &amp;lt;title&amp;gt;Addresses of VIP&amp;lt;/title&amp;gt;&lt;br /&gt;   &amp;lt;/head&amp;gt;&lt;br /&gt;   &amp;lt;body&amp;gt;&lt;br /&gt;      &amp;lt;h1&amp;gt;Addresses of Five VIPs&amp;lt;/h1&amp;gt;&lt;br /&gt;      &amp;lt;table border="1"&amp;gt;&lt;br /&gt;         &amp;lt;tr&amp;gt;&lt;br /&gt;            &amp;lt;th&amp;gt;Name&amp;lt;/th&amp;gt;&lt;br /&gt;            &amp;lt;th&amp;gt;Country&amp;lt;/th&amp;gt;&lt;br /&gt;            &amp;lt;th&amp;gt;Tel&amp;lt;/th&amp;gt;&lt;br /&gt;         &amp;lt;/tr&amp;gt;&lt;br /&gt;         &amp;lt;tr&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;&amp;lt;strong&amp;gt;Corky&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;(&amp;lt;em&amp;gt;Crystal&amp;lt;/em&amp;gt;)&lt;br /&gt;            &amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;Australia&amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;+61 7 5555 5555&amp;lt;/td&amp;gt;&lt;br /&gt;         &amp;lt;/tr&amp;gt;&lt;br /&gt;         &amp;lt;tr&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;&amp;lt;strong&amp;gt;Al&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;(&amp;lt;em&amp;gt;Pacino&amp;lt;/em&amp;gt;)&lt;br /&gt;            &amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;USA&amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;+61 7 6666 6666&amp;lt;/td&amp;gt;&lt;br /&gt;         &amp;lt;/tr&amp;gt;&lt;br /&gt;         &amp;lt;tr&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;&amp;lt;strong&amp;gt;Ethan&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;(&amp;lt;em&amp;gt;Hawke&amp;lt;/em&amp;gt;)&lt;br /&gt;            &amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;USA&amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;+61 7 7777 7777&amp;lt;/td&amp;gt;&lt;br /&gt;         &amp;lt;/tr&amp;gt;&lt;br /&gt;         &amp;lt;tr&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;&amp;lt;strong&amp;gt;Brad&amp;lt;/strong&amp;gt;&amp;lt;br&amp;gt;(&amp;lt;em&amp;gt;Pitt&amp;lt;/em&amp;gt;)&lt;br /&gt;            &amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;USA&amp;lt;/td&amp;gt;&lt;br /&gt;            &amp;lt;td&amp;gt;+61 7 8888 8888&amp;lt;/td&amp;gt;&lt;br /&gt;         &amp;lt;/tr&amp;gt;&lt;br /&gt;      &amp;lt;/table&amp;gt;&lt;br /&gt;   &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;Execution time: 70ms&lt;br /&gt;Memory used: 21770992&lt;br /&gt;NamePool contents: 43 entries in 41 chains. 8 prefixes, 8 URIs&lt;br /&gt;$ &lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-5281194120846012080?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/5281194120846012080/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=5281194120846012080' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/5281194120846012080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/5281194120846012080'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2011/05/xml-vqg-2-xslt-8.html' title='[XML VQG] 2. XSLT (8)'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-6954574419678118012</id><published>2011-05-01T16:23:00.002+09:00</published><updated>2011-05-01T16:27:10.398+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xml visual quickstart guide'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='xslt'/><title type='text'>[XML VQG] 2. XSLT (7)</title><content type='html'>Second example.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ cat 02-07.xsl&lt;br /&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&amp;lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"&amp;gt;&lt;br /&gt;&amp;lt;xsl:output method="html"/&amp;gt;&lt;br /&gt;&amp;lt;xsl:template match="/"&amp;gt;&lt;br /&gt;  &amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Address list of VIPs&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&lt;br /&gt;  &amp;lt;body&amp;gt;&lt;br /&gt;    &amp;lt;p align="center"&amp;gt;&amp;lt;img src="corky.jpg" width="120" height="171"/&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;    &amp;lt;p&amp;gt;Blah, blah.&lt;br /&gt;    &amp;lt;/p&amp;gt;&lt;br /&gt;  &amp;lt;/body&amp;gt;&lt;br /&gt;  &amp;lt;/html&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ java -cp ~/Dropbox/java/lib/saxon9he.jar net.sf.saxon.Transform -t -s:02-01.xml -xsl:02-07.xsl&lt;br /&gt;Saxon-HE 9.3.0.4J from Saxonica&lt;br /&gt;Java version 1.6.0_24&lt;br /&gt;Warning: at xsl:stylesheet on line 2 column 80 of 02-07.xsl:&lt;br /&gt;  Running an XSLT 1 stylesheet with an XSLT 2 processor&lt;br /&gt;Stylesheet compilation time: 278 milliseconds&lt;br /&gt;Processing file:/Volumes/Macintosh%20HD2/Dropbox/xml/02-01.xml&lt;br /&gt;Using parser com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser&lt;br /&gt;Building tree for file:/Volumes/Macintosh%20HD2/Dropbox/xml/02-01.xml using class net.sf.saxon.tree.tiny.TinyBuilder&lt;br /&gt;Tree built in 6 milliseconds&lt;br /&gt;Tree size: 70 nodes, 100 characters, 6 attributes&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;   &amp;lt;head&amp;gt;&lt;br /&gt;      &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&amp;gt;&lt;br /&gt;      &amp;lt;title&amp;gt;Address list of VIPs&amp;lt;/title&amp;gt;&lt;br /&gt;   &amp;lt;/head&amp;gt;&lt;br /&gt;   &amp;lt;body&amp;gt;&lt;br /&gt;      &amp;lt;p align="center"&amp;gt;&amp;lt;img src="corky.jpg" width="120" height="171"&amp;gt;&amp;lt;/p&amp;gt;&lt;br /&gt;      &amp;lt;p&amp;gt;Blah, blah.&lt;br /&gt;         &lt;br /&gt;      &amp;lt;/p&amp;gt;&lt;br /&gt;   &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;Execution time: 42ms&lt;br /&gt;Memory used: 14636736&lt;br /&gt;NamePool contents: 39 entries in 38 chains. 8 prefixes, 8 URIs&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ &lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-6954574419678118012?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/6954574419678118012/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=6954574419678118012' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/6954574419678118012'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/6954574419678118012'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2011/05/xml-vqg-2-xslt-7.html' title='[XML VQG] 2. XSLT (7)'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-6975559891578208579</id><published>2011-04-30T21:55:00.001+09:00</published><updated>2011-04-30T22:58:01.232+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xml visual quickstart guide'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='xslt'/><title type='text'>[XML VQG] 2. XSLT (6)</title><content type='html'>First example.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;$ cat 02-01.xml&lt;br /&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;?xml-stylesheet type="text/xsl" href="02-03.xsl"?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"&lt;br /&gt;         xmlns:v="http://www.w3.org/2006/vcard/ns#"&amp;gt;&lt;br /&gt;           &lt;br /&gt;  &amp;lt;v:VCard rdf:about = "http://example.com/me/corky" &amp;gt;&lt;br /&gt;    &amp;lt;v:n&amp;gt;Corky Crystal&amp;lt;/v:n&amp;gt;&lt;br /&gt;    &amp;lt;v:fn&amp;gt;Corky Crystal&amp;lt;/v:fn&amp;gt;&lt;br /&gt;    &amp;lt;v:sound&amp;gt;&lt;br /&gt;         &amp;lt;rdf:Description&amp;gt;&lt;br /&gt;            &amp;lt;rdf:value&amp;gt;Corky&amp;lt;/rdf:value&amp;gt;&lt;br /&gt;            &amp;lt;rdf:type rdf:resource="@@@X-irmc-n@@@"/&amp;gt;&lt;br /&gt;         &amp;lt;/rdf:Description&amp;gt;&lt;br /&gt;    &amp;lt;/v:sound&amp;gt;&lt;br /&gt;    &amp;lt;v:sort-string&amp;gt;Corky&amp;lt;/v:sort-string&amp;gt;&lt;br /&gt;         &amp;lt;v:x-phonetic-first-name&amp;gt;Corky&amp;lt;/v:x-phonetic-first-name&amp;gt;&lt;br /&gt;         &amp;lt;v:x-phonetic-last-name&amp;gt;Crystal&amp;lt;/v:x-phonetic-last-name&amp;gt;&lt;br /&gt;    &amp;lt;v:tel&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;rdf:value&amp;gt;+61 7 5555 5555&amp;lt;/rdf:value&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Voice"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:tel&amp;gt;&lt;br /&gt;    &amp;lt;v:email rdf:resource="mailto:corky@example.com"/&amp;gt;&lt;br /&gt;    &amp;lt;v:adr&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;v:street-address&amp;gt;111 Lake Drive&amp;lt;/v:street-address&amp;gt;&lt;br /&gt;        &amp;lt;v:locality&amp;gt;WonderCity&amp;lt;/v:locality&amp;gt;&lt;br /&gt;        &amp;lt;v:postal-code&amp;gt;5555&amp;lt;/v:postal-code&amp;gt;&lt;br /&gt;        &amp;lt;v:country-name&amp;gt;Australia&amp;lt;/v:country-name&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:adr&amp;gt;&lt;br /&gt;  &amp;lt;/v:VCard&amp;gt;&lt;br /&gt;&amp;lt;/rdf:RDF&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ cat 02-03.xsl&lt;br /&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&lt;br /&gt;&amp;lt;xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0"&lt;br /&gt;  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"&lt;br /&gt;  xmlns:v="http://www.w3.org/2006/vcard/ns#"&amp;gt;&lt;br /&gt;&lt;br /&gt;  &amp;lt;xsl:template match="/"&amp;gt;&lt;br /&gt;    &amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;title&amp;gt;Addresses of World VIPs&amp;lt;/title&amp;gt;&amp;lt;/head&amp;gt;&lt;br /&gt;    &amp;lt;body&amp;gt;&lt;br /&gt;      &amp;lt;h1&amp;gt;Addresses of World VIPs&amp;lt;/h1&amp;gt;&lt;br /&gt;      &amp;lt;xsl:value-of select="rdf:RDF/v:VCard/v:n"/&amp;gt;&lt;br /&gt;      lives in&lt;br /&gt;      &amp;lt;xsl:value-of select="rdf:RDF/v:VCard/v:adr/rdf:Description/v:street-address"/&amp;gt;,&amp;lt;br/&amp;gt;&lt;br /&gt;      &amp;lt;xsl:value-of select="rdf:RDF/v:VCard/v:adr/rdf:Description/v:locality"/&amp;gt;,&amp;lt;br/&amp;gt;&lt;br /&gt;      &amp;lt;xsl:value-of select="rdf:RDF/v:VCard/v:adr/rdf:Description/v:postal-code"/&amp;gt;,&amp;lt;br/&amp;gt;&lt;br /&gt;      &amp;lt;xsl:value-of select="rdf:RDF/v:VCard/v:adr/rdf:Description/v:country-name"/&amp;gt;.&lt;br /&gt;    &amp;lt;/body&amp;gt;&lt;br /&gt;    &amp;lt;/html&amp;gt;&lt;br /&gt;  &amp;lt;/xsl:template&amp;gt;&lt;br /&gt;&amp;lt;/xsl:stylesheet&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ java -cp ~/Dropbox/java/lib/saxon9he.jar net.sf.saxon.Transform -t -s:02-01.xml -xsl:02-03.xsl&lt;br /&gt;Saxon-HE 9.3.0.4J from Saxonica&lt;br /&gt;Java version 1.6.0_24&lt;br /&gt;Warning: at xsl:stylesheet on line 5 column 46 of 02-03.xsl:&lt;br /&gt;  Running an XSLT 1 stylesheet with an XSLT 2 processor&lt;br /&gt;Stylesheet compilation time: 387 milliseconds&lt;br /&gt;Processing file:/Volumes/Macintosh%20HD2/Dropbox/xml/02-01.xml&lt;br /&gt;Using parser com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser&lt;br /&gt;Building tree for file:/Volumes/Macintosh%20HD2/Dropbox/xml/02-01.xml using class net.sf.saxon.tree.tiny.TinyBuilder&lt;br /&gt;Tree built in 2 milliseconds&lt;br /&gt;Tree size: 70 nodes, 100 characters, 6 attributes&lt;br /&gt;&amp;lt;html xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" xmlns:v="http://www.w3.org/2006/vcard/ns#"&amp;gt;&lt;br /&gt;   &amp;lt;head&amp;gt;&lt;br /&gt;      &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&amp;gt;&lt;br /&gt;      &amp;lt;title&amp;gt;Addresses of World VIPs&amp;lt;/title&amp;gt;&lt;br /&gt;   &amp;lt;/head&amp;gt;&lt;br /&gt;   &amp;lt;body&amp;gt;&lt;br /&gt;      &amp;lt;h1&amp;gt;Addresses of World VIPs&amp;lt;/h1&amp;gt;Corky Crystal&lt;br /&gt;      lives in&lt;br /&gt;      111 Lake Drive,&amp;lt;br&amp;gt;WonderCity,&amp;lt;br&amp;gt;5555,&amp;lt;br&amp;gt;Australia.&lt;br /&gt;      &lt;br /&gt;   &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;Execution time: 52ms&lt;br /&gt;Memory used: 21394744&lt;br /&gt;NamePool contents: 35 entries in 34 chains. 8 prefixes, 8 URIs&lt;br /&gt;$ &lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-6975559891578208579?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/6975559891578208579/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=6975559891578208579' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/6975559891578208579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/6975559891578208579'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2011/04/xml-vqg-2-xslt-6.html' title='[XML VQG] 2. XSLT (6)'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-4900486875658891534</id><published>2011-04-30T21:45:00.001+09:00</published><updated>2011-04-30T21:50:58.061+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xml visual quickstart guide'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='xslt'/><title type='text'>[XML VQG] 2. XSLT (5)</title><content type='html'>Let's resume learning XSLT.  I should start from clarify the basic terminology of XSLT.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;XSL&lt;/b&gt;: eXtensible Stylesheet Language&lt;br /&gt;&lt;br /&gt;XSL is a specification that provides several methods to format XML documents.&lt;br /&gt;W3C divided XSL into two parts:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;XSLT&lt;/b&gt;: XSL Transformations&lt;br /&gt;&lt;br /&gt;Typically used when transforming XML documents into another XML documents or HTML documents.  Some web browsers are capable of formatting XML files with XSLT.&lt;br /&gt;&lt;br /&gt;An &lt;b&gt;XSLT processor&lt;/b&gt; transforms an &lt;b&gt;XML document&lt;/b&gt; with an &lt;b&gt;XSLT style sheet document&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;The XSLT style sheet contains &lt;b&gt;templates&lt;/b&gt; that define instructions on how to transform nodes in the XML document.&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;XSL-FO&lt;/b&gt;: XSL Formatting Objects&lt;br /&gt;&lt;br /&gt;Typically used when transforming XML files into PDF files directly.  No browser can deal with XSL-FO, so it needs dedicated application.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-4900486875658891534?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/4900486875658891534/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=4900486875658891534' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/4900486875658891534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/4900486875658891534'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2011/04/xml-vqg-2-xslt-5.html' title='[XML VQG] 2. XSLT (5)'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-5535084325688740724</id><published>2011-04-24T00:12:00.001+09:00</published><updated>2011-04-24T00:13:45.567+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vCard'/><category scheme='http://www.blogger.com/atom/ns#' term='xml visual quickstart guide'/><category scheme='http://www.blogger.com/atom/ns#' term='rdf'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><title type='text'>[XML VQG] 2. XSLT (4)</title><content type='html'>Most important thing is always data.&lt;br /&gt;&lt;br /&gt;I consuleted &lt;a href="http://vipaddress.blogspot.com/p/list.html"&gt;VIP ADDRESS&lt;/a&gt; to create following RDF vCard example.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&amp;lt;rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"&lt;br /&gt;         xmlns:v="http://www.w3.org/2006/vcard/ns#"&amp;gt;&lt;br /&gt;           &lt;br /&gt;  &amp;lt;v:VCard rdf:about = "http://example.com/me/corky" &amp;gt;&lt;br /&gt;    &amp;lt;v:n&amp;gt;Corky Crystal&amp;lt;/v:n&amp;gt;&lt;br /&gt;    &amp;lt;v:fn&amp;gt;Corky Crystal&amp;lt;/v:fn&amp;gt;&lt;br /&gt;    &amp;lt;v:sound&amp;gt;&lt;br /&gt;         &amp;lt;rdf:Description&amp;gt;&lt;br /&gt;            &amp;lt;rdf:value&amp;gt;Corky&amp;lt;/rdf:value&amp;gt;&lt;br /&gt;            &amp;lt;rdf:type rdf:resource="@@@X-irmc-n@@@"/&amp;gt;&lt;br /&gt;         &amp;lt;/rdf:Description&amp;gt;&lt;br /&gt;    &amp;lt;/v:sound&amp;gt;&lt;br /&gt;    &amp;lt;v:sort-string&amp;gt;Corky&amp;lt;/v:sort-string&amp;gt;&lt;br /&gt;         &amp;lt;v:x-phonetic-first-name&amp;gt;Corky&amp;lt;/v:x-phonetic-first-name&amp;gt;&lt;br /&gt;         &amp;lt;v:x-phonetic-last-name&amp;gt;Crystal&amp;lt;/v:x-phonetic-last-name&amp;gt;&lt;br /&gt;    &amp;lt;v:tel&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;rdf:value&amp;gt;+61 7 5555 5555&amp;lt;/rdf:value&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Voice"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:tel&amp;gt;&lt;br /&gt;    &amp;lt;v:email rdf:resource="mailto:corky@example.com"/&amp;gt;&lt;br /&gt;    &amp;lt;v:adr&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;v:street-address&amp;gt;111 Lake Drive&amp;lt;/v:street-address&amp;gt;&lt;br /&gt;        &amp;lt;v:locality&amp;gt;WonderCity&amp;lt;/v:locality&amp;gt;&lt;br /&gt;        &amp;lt;v:postal-code&amp;gt;5555&amp;lt;/v:postal-code&amp;gt;&lt;br /&gt;        &amp;lt;v:country-name&amp;gt;Australia&amp;lt;/v:country-name&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:adr&amp;gt;&lt;br /&gt;  &amp;lt;/v:VCard&amp;gt;&lt;br /&gt;  &amp;lt;v:VCard rdf:about = "http://example.com/me/al" &amp;gt;&lt;br /&gt;    &amp;lt;v:n&amp;gt;Al Pacino&amp;lt;/v:n&amp;gt;&lt;br /&gt;    &amp;lt;v:fn&amp;gt;Al Pacino&amp;lt;/v:fn&amp;gt;&lt;br /&gt;    &amp;lt;v:sound&amp;gt;&lt;br /&gt;         &amp;lt;rdf:Description&amp;gt;&lt;br /&gt;            &amp;lt;rdf:value&amp;gt;Al&amp;lt;/rdf:value&amp;gt;&lt;br /&gt;            &amp;lt;rdf:type rdf:resource="@@@X-irmc-n@@@"/&amp;gt;&lt;br /&gt;         &amp;lt;/rdf:Description&amp;gt;&lt;br /&gt;    &amp;lt;/v:sound&amp;gt;&lt;br /&gt;    &amp;lt;v:sort-string&amp;gt;Al&amp;lt;/v:sort-string&amp;gt;&lt;br /&gt;         &amp;lt;v:x-phonetic-first-name&amp;gt;Al&amp;lt;/v:x-phonetic-first-name&amp;gt;&lt;br /&gt;         &amp;lt;v:x-phonetic-last-name&amp;gt;Pacino&amp;lt;/v:x-phonetic-last-name&amp;gt;&lt;br /&gt;    &amp;lt;v:tel&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;rdf:value&amp;gt;+61 7 6666 6666&amp;lt;/rdf:value&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Voice"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:tel&amp;gt;&lt;br /&gt;    &amp;lt;v:email rdf:resource="mailto:al@example.com"/&amp;gt;&lt;br /&gt;    &amp;lt;v:adr&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;v:street-address&amp;gt;301 West 57th Street, 16C&amp;lt;/v:street-address&amp;gt;&lt;br /&gt;        &amp;lt;v:locality&amp;gt;New York&amp;lt;/v:locality&amp;gt;&lt;br /&gt;        &amp;lt;v:region&amp;gt;New York&amp;lt;/v:region&amp;gt;&lt;br /&gt;        &amp;lt;v:postal-code&amp;gt;10017&amp;lt;/v:postal-code&amp;gt;&lt;br /&gt;        &amp;lt;v:country-name&amp;gt;USA&amp;lt;/v:country-name&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:adr&amp;gt;&lt;br /&gt;  &amp;lt;/v:VCard&amp;gt;&lt;br /&gt;  &amp;lt;v:VCard rdf:about = "http://example.com/me/ethan" &amp;gt;&lt;br /&gt;    &amp;lt;v:n&amp;gt;Ethan Hawke&amp;lt;/v:n&amp;gt;&lt;br /&gt;    &amp;lt;v:fn&amp;gt;Ethan Hawke&amp;lt;/v:fn&amp;gt;&lt;br /&gt;    &amp;lt;v:sound&amp;gt;&lt;br /&gt;         &amp;lt;rdf:Description&amp;gt;&lt;br /&gt;            &amp;lt;rdf:value&amp;gt;Ethan&amp;lt;/rdf:value&amp;gt;&lt;br /&gt;            &amp;lt;rdf:type rdf:resource="@@@X-irmc-n@@@"/&amp;gt;&lt;br /&gt;         &amp;lt;/rdf:Description&amp;gt;&lt;br /&gt;    &amp;lt;/v:sound&amp;gt;&lt;br /&gt;    &amp;lt;v:sort-string&amp;gt;Al&amp;lt;/v:sort-string&amp;gt;&lt;br /&gt;         &amp;lt;v:x-phonetic-first-name&amp;gt;Ethan&amp;lt;/v:x-phonetic-first-name&amp;gt;&lt;br /&gt;         &amp;lt;v:x-phonetic-last-name&amp;gt;Hawke&amp;lt;/v:x-phonetic-last-name&amp;gt;&lt;br /&gt;    &amp;lt;v:tel&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;rdf:value&amp;gt;+61 7 7777 7777&amp;lt;/rdf:value&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Voice"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:tel&amp;gt;&lt;br /&gt;    &amp;lt;v:email rdf:resource="mailto:ethan@example.com"/&amp;gt;&lt;br /&gt;    &amp;lt;v:adr&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;v:street-address&amp;gt;c/o 1775 Broadway 701&amp;lt;/v:street-address&amp;gt;&lt;br /&gt;        &amp;lt;v:locality&amp;gt;New York&amp;lt;/v:locality&amp;gt;&lt;br /&gt;        &amp;lt;v:region&amp;gt;New York&amp;lt;/v:region&amp;gt;&lt;br /&gt;        &amp;lt;v:postal-code&amp;gt;10019&amp;lt;/v:postal-code&amp;gt;&lt;br /&gt;        &amp;lt;v:country-name&amp;gt;USA&amp;lt;/v:country-name&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:adr&amp;gt;&lt;br /&gt;  &amp;lt;/v:VCard&amp;gt;&lt;br /&gt;  &amp;lt;v:VCard rdf:about = "http://example.com/me/brad" &amp;gt;&lt;br /&gt;    &amp;lt;v:n&amp;gt;Brad Pitt&amp;lt;/v:n&amp;gt;&lt;br /&gt;    &amp;lt;v:fn&amp;gt;Brad Pitt&amp;lt;/v:fn&amp;gt;&lt;br /&gt;    &amp;lt;v:sound&amp;gt;&lt;br /&gt;         &amp;lt;rdf:Description&amp;gt;&lt;br /&gt;            &amp;lt;rdf:value&amp;gt;Brad&amp;lt;/rdf:value&amp;gt;&lt;br /&gt;            &amp;lt;rdf:type rdf:resource="@@@X-irmc-n@@@"/&amp;gt;&lt;br /&gt;         &amp;lt;/rdf:Description&amp;gt;&lt;br /&gt;    &amp;lt;/v:sound&amp;gt;&lt;br /&gt;    &amp;lt;v:sort-string&amp;gt;Al&amp;lt;/v:sort-string&amp;gt;&lt;br /&gt;         &amp;lt;v:x-phonetic-first-name&amp;gt;Brad&amp;lt;/v:x-phonetic-first-name&amp;gt;&lt;br /&gt;         &amp;lt;v:x-phonetic-last-name&amp;gt;Pitt&amp;lt;/v:x-phonetic-last-name&amp;gt;&lt;br /&gt;    &amp;lt;v:tel&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;rdf:value&amp;gt;+61 7 8888 8888&amp;lt;/rdf:value&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Voice"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:tel&amp;gt;&lt;br /&gt;    &amp;lt;v:email rdf:resource="mailto:brad@example.com"/&amp;gt;&lt;br /&gt;    &amp;lt;v:adr&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;v:street-address&amp;gt;9150 Wilshire Boulevard Suite 350&amp;lt;/v:street-address&amp;gt;&lt;br /&gt;        &amp;lt;v:locality&amp;gt;Beverly Hills&amp;lt;/v:locality&amp;gt;&lt;br /&gt;        &amp;lt;v:region&amp;gt;California&amp;lt;/v:region&amp;gt;&lt;br /&gt;        &amp;lt;v:postal-code&amp;gt;90212&amp;lt;/v:postal-code&amp;gt;&lt;br /&gt;        &amp;lt;v:country-name&amp;gt;USA&amp;lt;/v:country-name&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:adr&amp;gt;&lt;br /&gt;  &amp;lt;/v:VCard&amp;gt;&lt;br /&gt;&amp;lt;/rdf:RDF&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-5535084325688740724?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/5535084325688740724/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=5535084325688740724' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/5535084325688740724'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/5535084325688740724'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2011/04/xml-vqg-2-xslt-4.html' title='[XML VQG] 2. XSLT (4)'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-1150868906970073175</id><published>2011-04-23T21:51:00.005+09:00</published><updated>2011-04-24T01:35:19.122+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vCard'/><category scheme='http://www.blogger.com/atom/ns#' term='xml visual quickstart guide'/><category scheme='http://www.blogger.com/atom/ns#' term='rdf'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><title type='text'>[XML VQG] 2. XSLT (3)</title><content type='html'>I've finished creating my example related to vCard and RDF.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Original vCard&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;BEGIN:VCARD&lt;br /&gt;VERSION:3.0&lt;br /&gt;N:Corky Crystal&lt;br /&gt;FN:Corky Crystal&lt;br /&gt;SOUND;X-IRMC-N:Corky;&lt;br /&gt;SORT-STRING:Corky&lt;br /&gt;X-PHONETIC-FIRST-NAME:Corky&lt;br /&gt;X-PHONETIC-LAST-NAME:Crystal&lt;br /&gt;TEL;HOME;VOIDE:+61 7 5555 5555&lt;br /&gt;EMAIL:corky@example.com&lt;br /&gt;ADR;HOME:;;111 Lake Drive;WonderCity;;5555;Australia&lt;br /&gt;END:VCARD&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;RDF vCard&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&amp;lt;?xml version="1.0"?&amp;gt;&lt;br /&gt;&amp;lt;rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"&lt;br /&gt;         xmlns:v="http://www.w3.org/2006/vcard/ns#"&amp;gt;&lt;br /&gt;           &lt;br /&gt;  &amp;lt;v:VCard rdf:about = "http://example.com/me/corky" &amp;gt;&lt;br /&gt;    &amp;lt;v:n&amp;gt;Corky Crystal&amp;lt;/v:n&amp;gt;&lt;br /&gt;    &amp;lt;v:fn&amp;gt;Corky Crystal&amp;lt;/v:fn&amp;gt;&lt;br /&gt;    &amp;lt;v:sound&amp;gt;&lt;br /&gt;         &amp;lt;rdf:Description&amp;gt;&lt;br /&gt;            &amp;lt;rdf:value&amp;gt;Corky&amp;lt;/rdf:value&amp;gt;&lt;br /&gt;            &amp;lt;rdf:type rdf:resource="@@@X-irmc-n@@@"/&amp;gt;&lt;br /&gt;         &amp;lt;/rdf:Description&amp;gt;&lt;br /&gt;    &amp;lt;/v:sound&amp;gt;&lt;br /&gt;    &amp;lt;v:sort-string&amp;gt;Corky&amp;lt;/v:sort-string&amp;gt;&lt;br /&gt;         &amp;lt;v:x-phonetic-first-name&amp;gt;Corky&amp;lt;/v:x-phonetic-first-name&amp;gt;&lt;br /&gt;         &amp;lt;v:x-phonetic-last-name&amp;gt;Crystal&amp;lt;/v:x-phonetic-last-name&amp;gt;&lt;br /&gt;    &amp;lt;v:tel&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;rdf:value&amp;gt;+61 7 5555 5555&amp;lt;/rdf:value&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Voice"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:tel&amp;gt;&lt;br /&gt;    &amp;lt;v:email rdf:resource="mailto:corky@example.com"/&amp;gt;&lt;br /&gt;    &amp;lt;v:adr&amp;gt;&lt;br /&gt;      &amp;lt;rdf:Description&amp;gt;  &lt;br /&gt;        &amp;lt;v:street-address&amp;gt;111 Lake Drive&amp;lt;/v:street-address&amp;gt;&lt;br /&gt;        &amp;lt;v:locality&amp;gt;WonderCity&amp;lt;/v:locality&amp;gt;&lt;br /&gt;        &amp;lt;v:postal-code&amp;gt;5555&amp;lt;/v:postal-code&amp;gt;&lt;br /&gt;        &amp;lt;v:country-name&amp;gt;Australia&amp;lt;/v:country-name&amp;gt;&lt;br /&gt;        &amp;lt;rdf:type rdf:resource="http://www.w3.org/2006/vcard/ns#Home"/&amp;gt;&lt;br /&gt;      &amp;lt;/rdf:Description&amp;gt;  &lt;br /&gt;    &amp;lt;/v:adr&amp;gt;&lt;br /&gt;  &amp;lt;/v:VCard&amp;gt;&lt;br /&gt;&amp;lt;/rdf:RDF&amp;gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-1150868906970073175?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/1150868906970073175/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=1150868906970073175' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/1150868906970073175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/1150868906970073175'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2011/04/xml-vqg-2-xslt-3.html' title='[XML VQG] 2. XSLT (3)'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-1643123999131857421</id><published>2011-04-12T10:30:00.003+09:00</published><updated>2011-04-12T22:43:31.987+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='vCard'/><category scheme='http://www.blogger.com/atom/ns#' term='xml visual quickstart guide'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='xslt'/><title type='text'>[XML VQG] 2. XSLT (2)</title><content type='html'>I was a bit disappointed at realizing that Google Chrome can't handle xml files with xsl.  Safari can handle them.&lt;br /&gt;And emacs seems to lack XML related tools, because there are no good elisps to deal with even XSLT.&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Here, how to use Saxon on cui to run the examples in the book.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;bash-3.2$ java -cp ~/Dropbox/java/lib/saxon9he.jar net.sf.saxon.Transform -t -s:02-01.xml -xsl:02-03.xsl&lt;br /&gt;Saxon-HE 9.3.0.4J from Saxonica&lt;br /&gt;Java version 1.6.0_24&lt;br /&gt;Warning: at xsl:stylesheet on line 2 column 80 of 02-03.xsl:&lt;br /&gt;  Running an XSLT 1 stylesheet with an XSLT 2 processor&lt;br /&gt;Stylesheet compilation time: 3222 milliseconds&lt;br /&gt;Processing file:/Volumes/Macintosh%20HD2/Dropbox/programming/xml-visual-quickstart-guide/Chapter_02_examples/02-01.xml&lt;br /&gt;Using parser com.sun.org.apache.xerces.internal.jaxp.SAXParserImpl$JAXPSAXParser&lt;br /&gt;Building tree for file:/Volumes/Macintosh%20HD2/Dropbox/programming/xml-visual-quickstart-guide/Chapter_02_examples/02-01.xml using class net.sf.saxon.tree.tiny.TinyBuilder&lt;br /&gt;Tree built in 1 milliseconds&lt;br /&gt;Tree size: 16 nodes, 32 characters, 1 attributes&lt;br /&gt;&amp;lt;html&amp;gt;&lt;br /&gt;   &amp;lt;head&amp;gt;&lt;br /&gt;      &amp;lt;meta http-equiv="Content-Type" content="text/html; charset=UTF-8"&amp;gt;&lt;br /&gt;      &amp;lt;title&amp;gt;Wonders of the World&amp;lt;/title&amp;gt;&lt;br /&gt;   &amp;lt;/head&amp;gt;&lt;br /&gt;   &amp;lt;body&amp;gt;&lt;br /&gt;      &amp;lt;h1&amp;gt;Wonders of the World&amp;lt;/h1&amp;gt;&lt;br /&gt;      &lt;br /&gt;      &lt;br /&gt;      &lt;br /&gt;      The Colossus of Rhodes&lt;br /&gt;      is located in Rhodes, Greece.&lt;br /&gt;      &lt;br /&gt;      &lt;br /&gt;   &amp;lt;/body&amp;gt;&lt;br /&gt;&amp;lt;/html&amp;gt;Execution time: 320ms&lt;br /&gt;Memory used: 21579320&lt;br /&gt;NamePool contents: 19 entries in 19 chains. 6 prefixes, 6 URIs&lt;br /&gt;bash-3.2$ &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Hum, XSLT files are in the end XML files, and it must be well-formed.  That kind of restriction must be not adequate as a template language.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;As the content of sample xml files, ancient wonders are boring.  So I'd better create my examples.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;I've thought about which kind of data I should deal with as my own examples, and I realized that the address data would be fine with me.  I'll adopt vCard objects in RDF as the xml vocabulary. [&lt;a href="http://www.w3.org/Submission/vcard-rdf/"&gt;Representing vCard Objects in RDF&lt;/a&gt;]&lt;br /&gt;And you can also check what the vCard data in the wild are in my wiki entry. [&lt;a href="http://practical-scheme.net/wiliki/wiliki.cgi?aka%3a%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E5%B8%B3"&gt;aka:アドレス帳&lt;/a&gt;] &lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-1643123999131857421?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/1643123999131857421/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=1643123999131857421' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/1643123999131857421'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/1643123999131857421'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2011/04/xml-vqg-2-xslt-2.html' title='[XML VQG] 2. XSLT (2)'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-5010246836125735835</id><published>2011-04-09T23:30:00.001+09:00</published><updated>2011-04-09T23:35:24.623+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='saxon'/><category scheme='http://www.blogger.com/atom/ns#' term='xml visual quickstart guide'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><category scheme='http://www.blogger.com/atom/ns#' term='xslt'/><title type='text'>[XML VQG] 2. XSLT (1)</title><content type='html'>In this chapter, I should build xslt processing environment on my computer.  I always prefer emacs as my kitchen sink, and found an minor-mode that interfaces with java xslt processors. [&lt;a href="http://xslt-process.sourceforge.net/"&gt;XSLT-process&lt;/a&gt;]&lt;br /&gt;&lt;br /&gt;XSLT-process seems a frontend and it needs at least an xslt processor as its backend.  I chose saxon as my xslt processor. [&lt;a href="http://practical-scheme.net/wiliki/wiliki.cgi?aka%3aXML"&gt;installation note&lt;/a&gt;]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-5010246836125735835?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/5010246836125735835/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=5010246836125735835' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/5010246836125735835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/5010246836125735835'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2011/04/xml-vqg-2-xslt-1.html' title='[XML VQG] 2. XSLT (1)'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-8776970686313039072</id><published>2011-04-06T10:31:00.001+09:00</published><updated>2011-04-06T10:37:16.389+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xml visual quickstart guide'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><title type='text'>[XML VQG] 1. Writing XML</title><content type='html'>On writing previous entry, I felt that taking-a-note style was not appropriate for this tiny but well-written book.  Because my entry looks containing too much original content and I can't help feeling sorry to the authors...  Well, I'd like to change the style of writing, so that my entries contain only what I myself felt or thought about the topics that comes from the book.&lt;br /&gt;&lt;br /&gt;BTW, Part 1 'XML' contains only one chapter 'Writing XML', and it's well written for real beginners.  Expressions, explanations and orders of material seems well considered.  But I've got no new knowledge from this part.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-8776970686313039072?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/8776970686313039072/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=8776970686313039072' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/8776970686313039072'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/8776970686313039072'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2011/04/xml-vqg-1-writing-xml.html' title='[XML VQG] 1. Writing XML'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-2592817706750993622</id><published>2011-04-05T08:27:00.002+09:00</published><updated>2011-04-05T08:31:12.582+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xml visual quickstart guide'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><title type='text'>[XML VQG] (Introductory sections)</title><content type='html'>&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Introduction&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;HTML is the first language of the web, and XML is the second language.&lt;br /&gt;&lt;li&gt;"HTML was designed to display information, XML was designed to manage it."&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt; What is XML?&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;XML is a specification for;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;i&gt;storing information&lt;/i&gt;,&lt;br /&gt;&lt;li&gt;&lt;i&gt;describing the structure of the information&lt;/i&gt;.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;Here, the author try to explain these two points with a tiny example of XML documents.  I felt something not so comfortable with the author's attitude, i.e. the author didn't mention explicitly the fact that the meaning of the tag or the information completely depends on the vocabulary of English (as a natural language).&lt;br /&gt;&lt;li&gt;In the end, XML is &lt;i&gt;a set of rules&lt;/i&gt; for defining new markup languages whatever you like.  This reminds me of FOL.&lt;/ul&gt;&lt;br /&gt;&lt;li&gt; The Power of XML&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;XML suits for storing and carrying information, more that HTML do.&lt;br /&gt;&lt;li&gt;XML is easily extended and adapted, as compared with HTML.&lt;br /&gt;&lt;li&gt;XML document is simply a text file.&lt;br /&gt;&lt;li&gt;XML is open standard.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;Extending XML&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt; XML tags have no inherent formatting.&lt;br /&gt;&lt;li&gt; We have to define how to display it using other facility like XML (eXtensible Stylesheet Language).&lt;br /&gt;&lt;li&gt; XSL is composed of three parts;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt; XSLT&lt;br /&gt;&lt;li&gt; XPath&lt;br /&gt;&lt;li&gt; XSL-FO&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt; There are also several ways to define the structures of XML document. DTD, XML Schema language and so on.  We can use XML Namespace to extend XML Schema.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;XML in Practice&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt; RSS and Ajax are the good examples on how to use XML in practice.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;About This Book&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;A Guided Tour&lt;br /&gt;&lt;li&gt; XML2e Companion Web Site (http://www.kehogo.com/xml2e)&lt;br /&gt;&lt;li&gt;From 2001 to 2008&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;What This Book is Not&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;This book is not exhaustive but introductory.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Oops.  Learning something related to programming made me happy.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-2592817706750993622?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/2592817706750993622/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=2592817706750993622' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/2592817706750993622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/2592817706750993622'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2011/04/xml-vqg-introductory-sections.html' title='[XML VQG] (Introductory sections)'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-4708088438378048109</id><published>2011-04-05T06:48:00.002+09:00</published><updated>2011-04-05T06:59:12.259+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xml visual quickstart guide'/><category scheme='http://www.blogger.com/atom/ns#' term='xml'/><title type='text'>[XML VQG] Learning again?</title><content type='html'>I've been quite busy to learn English and doing many activities in international businesses.&lt;br /&gt;In the mean time, I've always felt that I'd like to learn programming at the same time, but I couldn't.&lt;br /&gt;&lt;br /&gt;Now I want to try again to learn it.&lt;br /&gt;&lt;br /&gt;I selected XML as the subject for this trial.  I'm still not sure I could continue to learn something regarding programming in my current situation, because my skill of English is not yet sufficient and needs a lot of time to improve it.&lt;br /&gt;&lt;br /&gt;Any way, I'll try.&lt;br /&gt;&lt;br /&gt;This time, my text book is "XML VISUAL QUICKSTART GUIDE".  XML is a good old friend to me.  I already know much about it.  But I thought clarifying its basic notions would help me a lot at this timing.&lt;br /&gt;&lt;br /&gt;That's all for prologue.  Let's get started.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-4708088438378048109?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/4708088438378048109/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=4708088438378048109' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/4708088438378048109'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/4708088438378048109'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2011/04/xml-vqg-learning-again.html' title='[XML VQG] Learning again?'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-6403454769227660327</id><published>2010-08-28T00:22:00.002+09:00</published><updated>2010-08-28T00:25:32.365+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='雑'/><title type='text'>なかなか多忙</title><content type='html'>なんというか、なかなかに多忙。&lt;br /&gt;学習は継続しているが、プログラミングまで時間が回らない現状がある。&lt;br /&gt;もう一段、いろいろなことの効率化を考えないとこれは打破できない。&lt;br /&gt;&lt;br /&gt;一度、そこからやりなおそう。&lt;br /&gt;なんか自分、やり直してばっかり。。。&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-6403454769227660327?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/6403454769227660327/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=6403454769227660327' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/6403454769227660327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/6403454769227660327'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2010/08/blog-post.html' title='なかなか多忙'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-2687934757852300053</id><published>2010-07-31T19:21:00.000+09:00</published><updated>2010-07-31T19:21:47.463+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C言語'/><category scheme='http://www.blogger.com/atom/ns#' term='C PROGRAMMING: A Moder Approach'/><title type='text'>[CP:AMA] 7 Basic Types</title><content type='html'>&lt;ul&gt;&lt;br /&gt;&lt;li&gt;7.1 Integer Types&lt;br /&gt;I found no new knowledge.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;7.2 Floating Types&lt;br /&gt;In this book or by C's terminology,  the `literals' are called `constants'.   &lt;br /&gt;&lt;br /&gt;&lt;li&gt;7.3 Character Types&lt;br /&gt;This section contains nothing new to me.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;7.4 Type Conversion&lt;br /&gt;Just only scanned.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;7.5 Type Definitions&lt;br /&gt;No new knowledge found.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;7.6 The sizeof Operator&lt;br /&gt;No new knowledge found.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Q &amp; A&lt;br /&gt;Mmm, printf can't print the signed values when they are negative.&lt;br /&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;This chapter seems plane and gentle introduction to the C's type system.&lt;br /&gt;But somewhat boring...&lt;br /&gt;&lt;br /&gt;plodding away.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-2687934757852300053?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/2687934757852300053/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=2687934757852300053' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/2687934757852300053'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/2687934757852300053'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2010/07/cpama-7-basic-types.html' title='[CP:AMA] 7 Basic Types'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-3722105102904469465</id><published>2010-07-24T20:22:00.001+09:00</published><updated>2010-07-24T21:37:56.396+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C言語'/><category scheme='http://www.blogger.com/atom/ns#' term='C PROGRAMMING: A Moder Approach'/><title type='text'>[CP:AMA] 6 LOOPS</title><content type='html'>&lt;ul&gt;&lt;br /&gt;&lt;li&gt;6.1 The while Statement&lt;br /&gt;No new knowledge found.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;6.2 The do Statement&lt;br /&gt;No new knowledge found.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;6.3 The for Statement&lt;br /&gt;I've never used comma expressions...&lt;br /&gt;"C places no restrictions on the three expressions that control its behavior.  Although these expressions usually initialize, test, and update the same variable, there's no requirement that they be related in any way."  This is impressive.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;6.4 Exiting from a Loop&lt;br /&gt;No new knowledge found.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;6.5 Null Statement&lt;br /&gt;No new knowledge found.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Q &amp; A&lt;br /&gt;No new knowledge found.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;still plodding away...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-3722105102904469465?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/3722105102904469465/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=3722105102904469465' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/3722105102904469465'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/3722105102904469465'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2010/07/cpama-6-loops.html' title='[CP:AMA] 6 LOOPS'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-4008416228404057364</id><published>2010-07-19T15:11:00.000+09:00</published><updated>2010-07-19T15:11:30.245+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C言語'/><category scheme='http://www.blogger.com/atom/ns#' term='C PROGRAMMING: A Moder Approach'/><title type='text'>[CP:AMA] 5 Selection Statements</title><content type='html'>&lt;ul&gt;&lt;br /&gt;Most of C's statements fall into three categories.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Selection statements&lt;br /&gt;&lt;li&gt;Iteration statements&lt;br /&gt;&lt;li&gt;Jump statements&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;In another point of view, C's statements classified as below.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Single statement&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Expression statement&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;Compound statement&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;This chapter discusses the selection statements and the compound statement.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;5.1 Logical Expressions&lt;br /&gt;No new knowledge found.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;5.2 The if Statement&lt;br /&gt;`if' is a statement, and `? ... :' is an operator or a conditional expression.  I see.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;5.3 The switch Statement&lt;br /&gt;No new knowledge found.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Q &amp; A&lt;br /&gt;No new knowledge found.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;plodding away.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-4008416228404057364?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/4008416228404057364/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=4008416228404057364' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/4008416228404057364'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/4008416228404057364'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2010/07/cpama-5-selection-statements.html' title='[CP:AMA] 5 Selection Statements'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-9036607250945349861</id><published>2010-07-17T16:03:00.000+09:00</published><updated>2010-07-17T16:04:16.331+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C言語'/><category scheme='http://www.blogger.com/atom/ns#' term='C PROGRAMMING: A Moder Approach'/><title type='text'>[CP:AMA] 4 Expressions</title><content type='html'>&lt;ul&gt;&lt;br /&gt;"One of C's distinguishing characteristics is its emphasis on expressions-" Mmm... distinguishing from what?  Let's take a tiny survey.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Assembly Language: It doesn't seem to have expressions.&lt;br /&gt;&lt;li&gt;Fortran: sure. Fortran has expressions in its language specification, but its emphasis is on statements.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;So one can say `for those days that C had been developed C's emphasis on expressions, C's emphasis on expressions is its distinguishing characteristics, except for Lisp'.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;4.1 Arithmetic Operators&lt;br /&gt;No new knowledge found.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;4.2 Assignment Operators&lt;br /&gt;The explanation for side effects is great.  I finally understand why the assignment in C is thought to have side effects; because it is an operator or isn't an statement.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;4.3 Increment and Decrement Operators&lt;br /&gt;No new knowledge found.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;4.4 Expression Evaluation&lt;br /&gt;No new knowledge found.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;4.5 Expression Statements&lt;br /&gt; `Expression Statements' is somewhat weird term, but its meaning is clear.&lt;br /&gt;"C has the unusual rule that any expression can be used as a statement."&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Q &amp; A&lt;br /&gt;No new knowledge found.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;still plodding away.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-9036607250945349861?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/9036607250945349861/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=9036607250945349861' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/9036607250945349861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/9036607250945349861'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2010/07/cpama-4-expressions.html' title='[CP:AMA] 4 Expressions'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-2345064980281952528</id><published>2010-07-16T18:55:00.000+09:00</published><updated>2010-07-16T18:55:25.408+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C言語'/><category scheme='http://www.blogger.com/atom/ns#' term='C PROGRAMMING: A Moder Approach'/><title type='text'>[CP:AMA] 3 Formatted Input/Output</title><content type='html'>An ad hoc introduction to the I/O functions.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;3.1 The printf Function&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;"The information that follows the % character specifies how the value is converted from its internal form (binary) to printed form (characters)"; simple but impressive expression.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;3.2 The scanf Function&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;I see.  scanf is a pattern-matcher.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;Q &amp; A&lt;br /&gt;no new knowledge found.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;prodding away.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-2345064980281952528?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/2345064980281952528/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=2345064980281952528' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/2345064980281952528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/2345064980281952528'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2010/07/cpama-3-formatted-inputoutput.html' title='[CP:AMA] 3 Formatted Input/Output'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-6292029539242955895</id><published>2010-07-11T17:46:00.002+09:00</published><updated>2010-07-11T17:48:39.657+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C言語'/><category scheme='http://www.blogger.com/atom/ns#' term='C PROGRAMMING: A Moder Approach'/><title type='text'>[CP:AMA] 2 C Fundamentals</title><content type='html'>&lt;ul&gt;&lt;br /&gt;&lt;li&gt;2.1 Writing a Simple Program&lt;br /&gt;`cc' of gNewSense.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;sh-3.2$ sudo /usr/sbin/update-alternatives --config cc&lt;br /&gt;[sudo] password for aka:&lt;br /&gt;&lt;br /&gt;There is only 1 program which provides cc&lt;br /&gt;(/usr/bin/gcc). Nothing to configure.&lt;br /&gt;sh-3.2$ &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;li&gt;2.2 The General Form of a Simple Program&lt;br /&gt;&lt;br /&gt;Very plain and simple explanation about directives, functions and statements!  Great!&lt;br /&gt;&lt;br /&gt;&lt;li&gt;2.3 Comments&lt;br /&gt;&lt;li&gt;2.4 Variables and Assignment&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;`Variable' is fascinating but troublesome term for beginners.&lt;br /&gt;&lt;li&gt;In this book, `variables' is explained as "In C, as in most programming languages, these storage locations are called variables.".&lt;br /&gt;&lt;li&gt;This statement seems to correct one as for the C standards.  But the concept of variables in Common Lisp is more generalized one.  For the present, I don't know the relation of these two concepts.  Interesting topic for me.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;2.5 Reading Input&lt;br /&gt;&lt;br /&gt;No new knowledge for me found.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;2.6 Defining Names for Constants&lt;br /&gt;&lt;li&gt;2.7 Identifiers&lt;br /&gt;&lt;br /&gt;I can't yet believe that beginners are able to understand and distinguish the terms such as names, identifiers, keywords, tokens and symbols at the very beginning of their study of programming languages.  Especially the terminology of the C standards seems to have ambiguity in their ontology.  &lt;br /&gt;&lt;br /&gt;As for myself, I've already learned Common Lisp, and I've accustomed with relationship of the concept of symbols and the concept of the reader and the evaluator, so I've some feeling like "Though I couldn't tell I really understand what the author wrote, perhaps, these are in the scope of what I've learned in Common Lisp. So move on!", when I've read these sections.&lt;br /&gt;&lt;br /&gt;It doesn't seem hygienic, but anyway, move on.&lt;br /&gt;&lt;br /&gt;&lt;li&gt;2.8 Layout of a C Program&lt;br /&gt;&lt;li&gt;Q &amp; A&lt;br /&gt;fun to read!&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Still prodding away...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-6292029539242955895?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/6292029539242955895/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=6292029539242955895' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/6292029539242955895'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/6292029539242955895'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2010/07/cpama-2-c-fundamentals.html' title='[CP:AMA] 2 C Fundamentals'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-9042934571639022760</id><published>2010-07-06T21:07:00.002+09:00</published><updated>2010-07-06T21:08:39.314+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C言語'/><category scheme='http://www.blogger.com/atom/ns#' term='C PROGRAMMING: A Moder Approach'/><title type='text'>[CP:AMA] 1 Introducing C</title><content type='html'>Memos; write down interesting topics for myself.&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;1.1 History of C&lt;br /&gt;"C99 isn't yet universal" is still true ? According to &lt;a href="http://en.wikipedia.org/wiki/C99"&gt;C99 on Wikipedia&lt;/a&gt;, even GCC is still not a compliant implementation. mmm...&lt;br /&gt;&lt;li&gt;1.2 Strengths and Weaknesses of C&lt;br /&gt;For further reading, I've tried installing lint. But gNewSense seems not to contain it...&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;sh-3.2$ aptitude search lint&lt;br /&gt;p   dlint                           - Checks dns zone information using nameserv&lt;br /&gt;p   fslint                          - A utility to fix problems with filesystems&lt;br /&gt;p   jlint                           - A Java Program Checker&lt;br /&gt;p   jlint-doc                       - Manual for jlint - a Java Program Checker&lt;br /&gt;p   libflint-1.06                   - C library for number theory, shared librar&lt;br /&gt;p   libflint-dev                    - C library for number theory, development f&lt;br /&gt;p   libhtml-lint-perl               - Check for HTML errors in a string or file&lt;br /&gt;p   libmarc-lint-perl               - Perl extension for checking validity of MA&lt;br /&gt;p   linklint                        - A fast link checker and web site maintenan&lt;br /&gt;i A lintian                         - Debian package checker&lt;br /&gt;p   nslint                          - Lint for DNS files, checks integrity&lt;br /&gt;p   pylint                          - python code static checker&lt;br /&gt;p   splint                          - tool for statically checking C programs fo&lt;br /&gt;p   splint-data                     - tool for statically checking C programs fo&lt;br /&gt;p   splint-doc-html                 - tool for statically checking C programs fo&lt;br /&gt;v   weblint                         -&lt;br /&gt;p   weblint-perl                    - A syntax and minimal style checker for HTM&lt;br /&gt;i A xserver-xorg-video-glint        - X.Org X server -- Glint display driver&lt;br /&gt;sh-3.2$ &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;li&gt;Q&amp;A&lt;br /&gt;No new knowledge found.&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Still plodding away.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-9042934571639022760?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/9042934571639022760/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=9042934571639022760' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/9042934571639022760'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/9042934571639022760'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2010/07/cpama-1-introducing-c.html' title='[CP:AMA] 1 Introducing C'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-4986768713359360862</id><published>2010-07-05T03:41:00.000+09:00</published><updated>2010-07-05T03:41:54.576+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C言語'/><category scheme='http://www.blogger.com/atom/ns#' term='C PROGRAMMING: A Moder Approach'/><title type='text'>[CP:AMA] PREFACE</title><content type='html'>自分なりのポイントをメモ。&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;"Complete coverage of both the C89 standard and the C99 standard."&lt;br /&gt;&lt;li&gt;"I've included more information about GCC..."&lt;br /&gt;&lt;li&gt;"New coverage of abstract data types" in C.&lt;br /&gt;&lt;li&gt;498 Exercises!&lt;br /&gt;&lt;li&gt;"Avoid dependence on a particular machine, compiler, or operating system."&lt;br /&gt;&lt;li&gt;the undergraduate level.&lt;br /&gt;&lt;li&gt;"Be careful with a starred exercise: either pay close attention and think hard or skip it entirely."&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-4986768713359360862?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/4986768713359360862/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=4986768713359360862' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/4986768713359360862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/4986768713359360862'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2010/07/cpama-preface.html' title='[CP:AMA] PREFACE'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-1168409428425348347</id><published>2010-07-05T03:18:00.003+09:00</published><updated>2010-07-05T03:22:46.863+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='C言語'/><category scheme='http://www.blogger.com/atom/ns#' term='C PROGRAMMING: A Moder Approach'/><title type='text'>学習ブログ再開</title><content type='html'>Twitterを試してみたり、Wiki書いてみたり、業務繁忙だったりと、ずいぶん更新してなかった。&lt;br /&gt;&lt;br /&gt;まとめWiki+学習ブログという組み合わせが結構いいかも、と再開してみる。&lt;br /&gt;&lt;br /&gt;ただし、業務繁忙は相変わらずなので、超スロウペース。&lt;br /&gt;&lt;br /&gt;スロウスタディみたいなものになるのかなぁ。&lt;br /&gt;&lt;br /&gt;まずは、一度読んでみたかったK.N.KINGのC PROGRAMMING: A Modern Approachを勉強することにする。&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-1168409428425348347?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/1168409428425348347/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=1168409428425348347' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/1168409428425348347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/1168409428425348347'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2010/07/blog-post.html' title='学習ブログ再開'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-1017204255886170240</id><published>2010-02-03T23:57:00.004+09:00</published><updated>2010-02-04T14:33:35.898+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lisp Quote Backquote'/><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='On Lisp'/><title type='text'>Lisp Quote Backquote  (5)</title><content type='html'>「マクロ展開関数の中での関数呼出しにおいて、引数は評価されない」&lt;br /&gt;&lt;br /&gt;ということがちょっとひっかかっています。というのは、前回の記事を書くときに、ANSI Common Lisp 仕様のマクロ展開の部分はざっと確認したのですが、なんとなくそこの記述が曖昧な気がしたのですね。それを確認しようと思います。こういうのを重箱の隅をつつくような、というのかなぁ。まあ、仕事ではなく、好きでやっているので、やりたいようにやっちゃおう。&lt;br /&gt;&lt;br /&gt;さて、ANSI Common Lisp の該当部分、&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.franz.com/support/documentation/8.1/ansicl/subsubsu/macrofor.htm"&gt;3.1.2.1.2.2 Macro Forms&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;に書かれていることの骨子は次のとおりです。&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;a form の第一要素たるsymbolについて、macro-functionがtrueならば、そのformを a macro form とみなす。&lt;br /&gt;&lt;li&gt;macro-functionがtrueであるとき、macro-functionが返すのはa macro functionである。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;CL-USER&gt; (macro-function 'a-mac)&lt;br /&gt;#&amp;lt;Interpreted Function A-MAC @ #x1000c669d2&gt;&lt;br /&gt;CL-USER&gt; (macro-function 'a-fun)&lt;br /&gt;NIL&lt;br /&gt;CL-USER&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;li&gt;まず、the macroexpand hookを呼び出す。その引数は、次の3つ。&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;the macro function&lt;br /&gt;&lt;li&gt;the entire macro form&lt;br /&gt;&lt;li&gt;an environment object (lexical)&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;the macroexpand hook は、the macro functionを呼び出す。その引数は、次の2つ。&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;the entire macro form&lt;br /&gt;&lt;li&gt;an environment object (lexical)&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;the macro funcitionの値は、a formとして扱う。&lt;br /&gt;&lt;li&gt;the macroexpand hookは、the formをパススルーする。&lt;br /&gt;&lt;li&gt;the form が the original formの代わりに評価される。&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;ふむ。曖昧、というか、少くともここには、macro functionsの引数評価方法が通常の関数呼出しとは違うとは、&lt;b&gt;字句としては書かれていない&lt;/b&gt;。&lt;br /&gt;そこで、続いて、macroexpand hookを調べてみよう。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.franz.com/support/documentation/8.1/ansicl/dictentr/macroexp.htm"&gt;3.8.15 *macroexpand-hook*&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;ふむ。ここには、新しい情報は無いな。。。&lt;br /&gt;&lt;br /&gt;上で書いた骨子は、「評価モデル」の話です。評価モデルは、意味(意味論, semantics)の一部を説明するためのものであり、それがすべてではありません。そこで、Compilationでは何をどう述べているのか確認してみましょう。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.franz.com/support/documentation/8.1/ansicl/subsubse/minimalc.htm"&gt;3.2.2.2 Minimal Compilation&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;この2つめの項目で言及されているのは、compile time にマクロの展開は全部やっちゃいますよ、ということです。このことはよく知っているつもりでしたが、もしかして、このことに集約されてしまうのかな？&lt;br /&gt;&lt;br /&gt;コンパイルにおけるcompile timeの定義というか振舞いは次の部分に記述されています。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.franz.com/support/documentation/8.1/ansicl/subsecti/compiler.htm"&gt;3.2.1 Compiler Terminology&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;うーん。ここでは、各種環境の定義とその利用についてが書かれているだけですね。&lt;br /&gt;&lt;br /&gt;とすると、評価モデルの説明のところにて、字句としては書かれていませんが、何かimplicationがあるのでしょうか。。。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;あ゛、、、、&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;評価モデルのところ(&lt;a href="http://www.franz.com/support/documentation/8.1/ansicl/subsubsu/macrofor.htm"&gt;3.1.2.1.2.2 Macro Forms&lt;/a&gt;)のこの文、&lt;br /&gt;&lt;br /&gt;`The expansion function is invoked by calling the macroexpand hook with the expansion function as its first argument, the entire macro form as its second argument, and an environment object (corresponding to the current lexical environment) as its third argument.'&lt;br /&gt;&lt;br /&gt;で第二引数として`the entire macro form'を渡すと言っているところに含意があるんだ。だって、そこで評価しちゃったらマクロの展開は無限ループだ。。。だから、quoteして渡されるんですね。ここで勝負が着いているのだな。&lt;br /&gt;&lt;br /&gt;勝負が着いているというのは、前回の記事に書いた「関数呼出しを入れ子にしてもマクロ展開関数内では評価されない」というのは見た目としては通常の関数呼出しでも同じあり、しかも「評価されない」のではなく、「評価された結果としてそう振舞う」ということなんですね。この点も&lt;b&gt;前回の記事は間違っています&lt;/b&gt;。確認してみましょう。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;CL-USER&gt; (defun fun-1 (x)&lt;br /&gt;           (fun-2 x))&lt;br /&gt;FUN-1&lt;br /&gt;CL-USER&gt; (defun fun-2 (x)&lt;br /&gt;           (list x))&lt;br /&gt;FUN-2&lt;br /&gt;CL-USER&gt; (fun-1 'a)&lt;br /&gt;(A)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;これ、(fun-1 'a)をまず読み込みます。a cons form で operator が function なので、先に引数が評価されます。それは a symbol object を返します。その値にて関数本体を実行します。fun-1の関数本体は(fun-2 x)です。さて、ここで、(fun-2 &amp;lt;a symbol object&gt;)となると考えてしまうのが間違えなんですね。引数は束縛なので、xという名前がa symbol objectに束縛されているというレキシカル環境ができます。そこで、(fun-2 x)が評価されるので、eagerに評価された結果はその束縛によりa symbol objectなわけですね。これも基礎中の基礎、だな。。。&lt;br /&gt;&lt;br /&gt;まとめると、&lt;br /&gt;&lt;br /&gt;「関数の振舞いは、マクロ展開関数の中での呼出しも、通常の呼出しも、同じである。ただし、マクロ展開フックがマクロ展開関数を呼び出すときに、引数に置くフォームをquoteする(もしくはquote済みである)」&lt;br /&gt;&lt;br /&gt;ということですね。&lt;br /&gt;&lt;br /&gt;うむ。重ねて恥しい。しかし、すっきりした。&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-1017204255886170240?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/1017204255886170240/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=1017204255886170240' title='1 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/1017204255886170240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/1017204255886170240'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2010/02/lisp-quote-backquote-5.html' title='Lisp Quote Backquote  (5)'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-4454150076429828733</id><published>2010-02-02T02:12:00.002+09:00</published><updated>2010-02-02T02:25:25.205+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lisp Quote Backquote'/><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='On Lisp'/><title type='text'>Lisp Quote Backquote  (4)</title><content type='html'>日々ちょこちょこSteeleのbackquote impl.をながめているのですが、なんだかすっと頭に入ってこないのです。こういうときは、大抵何か根本的な理解が欠落しています。丁寧にコードを追ってみました。そしたら、マクロの基本的な振舞いの理解が曖昧だったことがわかりました。私的には大収穫なのですが、こんな基本的なことが曖昧というのはとても恥ずかしい。でも、誰かの何かに役立つかもしれないので書いちゃいます。&lt;br /&gt;&lt;br /&gt;わかっていなかったのは、マクロの中で呼ぶ関数の振舞いです。&lt;br /&gt;&lt;br /&gt;まず、諸処定義。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;CL-USER&gt; (setf a 1 b 2)&lt;br /&gt;2&lt;br /&gt;CL-USER&gt; a&lt;br /&gt;1&lt;br /&gt;CL-USER&gt; b&lt;br /&gt;2&lt;br /&gt;CL-USER&gt; (defmacro a-mac (x y)&lt;br /&gt;           (a-fun x y))&lt;br /&gt;A-MAC&lt;br /&gt;CL-USER&gt; (defun a-fun (x y)&lt;br /&gt;           (+ x y))&lt;br /&gt;A-FUN&lt;br /&gt;CL-USER&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;この関数を呼び出したとき、もちろん引数はeagerに評価されます。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;CL-USER&gt; (a-fun a b)&lt;br /&gt;3&lt;br /&gt;CL-USER&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;あ、この例では、eagerもlazyもへったくれもないですが、まぁCommon Lispの関数呼出しの評価モデルはeagerです。&lt;br /&gt;&lt;br /&gt;では、(a-mac a b) ではどうだろう、ということなんですね。a-mac自体はマクロなので、引数を評価しないので、それは(a-fun a b)になる。そしてこのように変換された後に評価されるから、(a-fun a b)は上の関数呼び出しと同じで3になるじゃん、と思ったんですね。これが間違い。エラーです。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;CL-USER&gt; (a-mac a b)&lt;br /&gt;; Evaluation aborted.&lt;br /&gt;CL-USER&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;エラーはこんな感じ。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;`A' is not of the expected type `NUMBER'&lt;br /&gt;   [Condition of type TYPE-ERROR]&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ちょっと考えてみればアタリマエなんですが、a-macの中のa-fun呼出しはマクロ展開関数の一部ですから、そのときの動作は、通常の関数呼出しの振舞いの定義に従うのではなく、あくまでマクロ展開関数の振舞いの定義に従うのですね。で、マクロ展開関数の中では、そもそもマクロの引数として渡された lisp form は評価されずにそのまま取り扱われるのです。関数がどんなに入れ子になっていてもマクロ展開関数の中ならば、ざっくり言うと、引数は評価されません。そのまま取り扱います。最終的にマクロ展開関数が返す lisp form が初めて評価されるのです(実行時環境に対して)。&lt;br /&gt;&lt;br /&gt;ちなみに、上で間違いといった解釈に多少合致したマクロは次のものです。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;CL-USER&gt; (defmacro b-mac (x y)&lt;br /&gt;           (list 'a-fun x y))&lt;br /&gt;B-MAC&lt;br /&gt;CL-USER&gt; (b-mac a b)&lt;br /&gt;3&lt;br /&gt;CL-USER&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;ここでは、マクロ展開関数が(a-fun a b)というlisp formを返します。そのlisp formを評価するときは通常の関数呼出しですから、eagerに(a-fun 1 2)となり、3となります。&lt;br /&gt;&lt;br /&gt;Common Lispの関数の引数は常にeagerに評価されると思っていたのが間違い。マクロ展開関数の中で呼出されるときは評価しないんですね！&lt;br /&gt;うひー、恥ずかしい。。。でもよかった。&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-4454150076429828733?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/4454150076429828733/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=4454150076429828733' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/4454150076429828733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/4454150076429828733'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2010/02/lisp-quote-backquote-4.html' title='Lisp Quote Backquote  (4)'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-356970431872112844</id><published>2010-01-25T03:12:00.002+09:00</published><updated>2010-01-25T14:59:28.313+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lisp Quote Backquote'/><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='On Lisp'/><title type='text'>Lisp Quote Backquote  (3)</title><content type='html'>Lispには入れたけど、まだ、仕様書を眺めるレベル。&lt;br /&gt;次回は、ソースに入れるかも。&lt;br /&gt;&lt;br /&gt;しかし、このブログは学習ブログなので「読者を念頭におかない！」ことが信条なのですが、だんだん、ゴミを撒き散らしているだけなのでは？という懸念が強くなってきました。WebのS/N比を低くしているだけだなぁ、と。まぁそんなこともぼちぼち考えながら、当面は続けていこうと思います。&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;;;;; CLtL2におけるbackquoteの定義&lt;br /&gt;&lt;br /&gt;;; Steeleの実装を読み解く前に、CLtL2のbackquoteの定&lt;br /&gt;;; 義をおさらいしておこう。まず、&lt;br /&gt;&lt;br /&gt;;; 「バッククォートは、テンプレートを用いることによっ&lt;br /&gt;;; て複雑なデータ構造を構築するプログラムを簡単に書&lt;br /&gt;;; けるようにする。」&lt;br /&gt;&lt;br /&gt;;; という言葉が、アタリマエなのだが新鮮。そうか、バッ&lt;br /&gt;;; ククォートはデータ構造のテンプレート記法なのだと。&lt;br /&gt;&lt;br /&gt;;; さて前回見たとおり、文字apostropheはマクロ文字としては、&lt;br /&gt;;; (quote foo)の略記にすぎない。'fooは、fooが何かに&lt;br /&gt;;; 関わらず、(quote foo)として読み込まれる。&lt;br /&gt;&lt;br /&gt;;; うむ。これはわかる。大丈夫。進もう。&lt;br /&gt;&lt;br /&gt;;; 次はバッククォート。まず、バッククォートという言&lt;br /&gt;;; 葉の使い方を確認しよう。通常の会話において、バッ&lt;br /&gt;;; ククォートと言うとき、それは単体のマクロ文字を指&lt;br /&gt;;; していることもあるし、バッククォート構文を指して&lt;br /&gt;;; いることもある。大抵の場合、どちらを指しているか&lt;br /&gt;;; は文脈によってあきらかである。なので、この文章で&lt;br /&gt;;; も文脈を利用して「バッククォート」という単語でこ&lt;br /&gt;;; の2つのものを指していくことも可能である。しかし、&lt;br /&gt;;; ちょっと考えてみると、ここではどちらであるか明示&lt;br /&gt;;; した方が書きやすいし、わかりやすそうだ。そこで、&lt;br /&gt;;; この文章では「バッククォート」というように独立し&lt;br /&gt;;; た単語としては使わずに、「マクロ文字バッククォー&lt;br /&gt;;; ト」か「バッククォート構文」のいずれかを使うこと&lt;br /&gt;;; にする。あとひとつ、先頭文字がバッククォートで始&lt;br /&gt;;; まるLispフォームのことを「バッククォートフォーム」&lt;br /&gt;;; と呼ぶことがある。これも必要に応じて利用する。&lt;br /&gt;&lt;br /&gt;;; バッククォート構文の説明に移ろう。&lt;br /&gt;&lt;br /&gt;;; バッククォート構文は、リーダマクロとして定義され&lt;br /&gt;;; ている。複雑なデータ構造を簡便に構築するためのテ&lt;br /&gt;;; ンプレート記法を目指したものである。&lt;br /&gt;&lt;br /&gt;;; バッククォート構文で使われるマクロ文字は次の通り&lt;br /&gt;;; である。&lt;br /&gt;&lt;br /&gt;;; ` , # @ .&lt;br /&gt;&lt;br /&gt;;; ここで、# は`の直後にあらわれたときのみバック&lt;br /&gt;;; クォート構文のマクロ文字として機能し、@ と .&lt;br /&gt;;; は、, の直後にあらわれたときのみそうである。&lt;br /&gt;&lt;br /&gt;;; さて、一般的に、リーダマクロの定義は、マクロ文字&lt;br /&gt;;; を含む印字表現をリーダが読んだときに、リーダの返&lt;br /&gt;;; り値として、どのようなLisp objectを返すのか、と&lt;br /&gt;;; いう変換として記述される。すなわち、定義がリーダ&lt;br /&gt;;; で閉じているのだ。図示すると次のとおり。&lt;br /&gt;&lt;br /&gt;;; &amp;lt;印字表現&gt; -(reader)-&gt; &amp;lt;Lispオブジェクト&gt;&lt;br /&gt;&lt;br /&gt;;; 例えば、&lt;br /&gt;&lt;br /&gt;;; 'foo -(reader)-&gt; (quote foo)を読み込んだときに返すLispオブジェクトとまったく同一。&lt;br /&gt;&lt;br /&gt;;; である。すなわち、'fooをreaderが(quote foo)と読&lt;br /&gt;;; み替えると考えてもまったく支障も懸念も無い。すな&lt;br /&gt;;; わち、readerが返すLispオブジェクトの印字表現は、&lt;br /&gt;;; (quote foo)であると言ってしまってよいのだ。&lt;br /&gt;&lt;br /&gt;;; しかしバッククォート構文のマクロ文字については、&lt;br /&gt;;; 少々事情が異なる。&lt;br /&gt;&lt;br /&gt;;; バッククォート構文では、readerが返却する&amp;lt;Lisp オ&lt;br /&gt;;; ブジェクト&gt;が何であるかは実装依存としてしまって&lt;br /&gt;;; いる。では、バッククォート構文の意味はどう定義す&lt;br /&gt;;; るかというと、その実装依存な&amp;lt;Lisp オブジェクト&gt;&lt;br /&gt;;; をevaluatorが評価した結果得られる&amp;lt;Lispオブジェク&lt;br /&gt;;; ト&gt;が何かという、もう一段先で記述しているのだ。&lt;br /&gt;&lt;br /&gt;;; &amp;lt;印字表現&gt; -(reader)-&gt; &amp;lt;実装依存&gt; -(evaluator)-&gt; &amp;lt;Lispオブジェクト&gt; &lt;br /&gt;&lt;br /&gt;;; これは後で再度説明する。&lt;br /&gt;&lt;br /&gt;;; 準備は整った。ここからは、バッククォート構文の意&lt;br /&gt;;; 味を形式的に定義しよう。&lt;br /&gt;&lt;br /&gt;;; 用語1. form は、断りがない限り、任意のLispフォー&lt;br /&gt;;; ムを表すものとする。&lt;br /&gt;&lt;br /&gt;;; 用語2. basic は、form からリストと一般のベクタを&lt;br /&gt;;; 除外したものである。&lt;br /&gt;&lt;br /&gt;;; 用語3. 2つのLispフォームがあり、それらを評価した&lt;br /&gt;;; 結果がequalにて等しいことを、評価等価と呼ぶ。こ&lt;br /&gt;;; のとき、評価する回数は複数回も考えられる。A と&lt;br /&gt;;; B が一回の評価において評価等価なとき、A = Bと書&lt;br /&gt;;; く。二回の評価において評価等価なときは、A == B&lt;br /&gt;;; と書く。&lt;br /&gt;&lt;br /&gt;;; 1. `basic = 'basic.&lt;br /&gt;&lt;br /&gt;;; 2. `,form = form. &lt;br /&gt;;; ただし、ここでの form は、@ または . で始まる&lt;br /&gt;;; Lispフォームを除外している。&lt;br /&gt;&lt;br /&gt;;; 3. `,@form は誤りである。&lt;br /&gt;&lt;br /&gt;;; 4. `(x1 x2 x3 ... xn . atom) = (append [x1] [x2] [x3] ... [xn] (quote atom))&lt;br /&gt;&lt;br /&gt;;;   ここで角括弧は次のようなものである。(上から順に判定)&lt;br /&gt;;;   - xjが,@で始まるとき、xjを,@formと書けば、[xj] = form。&lt;br /&gt;;;   - xjが,で始まるとき、xjを,formと書けば、  [xj] = (list form)。&lt;br /&gt;;;   - それ以外のとき、xjをformと書けば、      [xj] = (list `form)。&lt;br /&gt;;;     ここで、`formはバッククォートフォームである。&lt;br /&gt;;;     このフォームも再帰的に解釈をすすめる。&lt;br /&gt;&lt;br /&gt;;; 5. `(x1 x2 x3 ... xn) = `(x1 x2 x3 ... xn . nil)&lt;br /&gt;&lt;br /&gt;;; 6. `(x1 x2 x3 ... xn . ,form) = (append [x1] [x2] [x3] ... [xn] form)&lt;br /&gt;&lt;br /&gt;;; 7. `(x1 x2 x3 ... xn . ,@form) は誤りである。&lt;br /&gt;&lt;br /&gt;;; 8. `#(x1 x2 x3 ... xn) = (apply #'vector `(x1 x2 x3 ... xn))&lt;br /&gt;&lt;br /&gt;;; 9. ,@ が使われているところはどこでも、,@ の代わ&lt;br /&gt;;; りに ,. を使うことができる。この両者の違いは、,.&lt;br /&gt;;; の場合は、後続のformが生成するリストを破壊しても&lt;br /&gt;;; よいということである。&lt;br /&gt;&lt;br /&gt;;; 10. バッククォート構文が入れ子になっている場合、&lt;br /&gt;;; もっとも内側のマクロ文字バッククォートに属する&lt;br /&gt;;; フォームが最初に展開される。&lt;br /&gt;&lt;br /&gt;;; さて、先送りした話に戻ろう。&lt;br /&gt;&lt;br /&gt;;; `((,a b) ,c ,@d)&lt;br /&gt;&lt;br /&gt;;; を上記ルールに基づいて解釈(展開)すると、&lt;br /&gt;&lt;br /&gt;;; (append (list (append (list a) (list 'b) 'nil)) (list ) d 'nil)&lt;br /&gt;&lt;br /&gt;;; になる。しかし、バッククォート構文のルールが述べ&lt;br /&gt;;; ているのは、readerがまさにこのLispオブジェクトを&lt;br /&gt;;; 返さなければいけないということではなく、これと評&lt;br /&gt;;; 価等価なLispオブジェクトを返せばよいということだ。&lt;br /&gt;;; それは無数に存在する。例は次のとおり。&lt;br /&gt;&lt;br /&gt;;; (append (list (cons a '(b))) (list c d)&lt;br /&gt;;; (list* (cons a '(b)) c d)&lt;br /&gt;&lt;br /&gt;;; readerが返すものは、これらのうちどれでもよいのだ。&lt;br /&gt;&lt;br /&gt;;; さて、これでCLtL2のバッククォートの定義のおさら&lt;br /&gt;;; いができた。次回は、ついにSteeleの実装をみていこ&lt;br /&gt;;; う。&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-356970431872112844?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/356970431872112844/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=356970431872112844' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/356970431872112844'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/356970431872112844'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2010/01/lisp-quote-backquote-3.html' title='Lisp Quote Backquote  (3)'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-2076385080385708176</id><published>2010-01-24T02:56:00.009+09:00</published><updated>2010-01-24T15:25:52.782+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lisp Quote Backquote'/><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='On Lisp'/><title type='text'>Lisp Quote Backquote  (2)</title><content type='html'>体調が戻ってきたので、Lispいじりを再開。&lt;br /&gt;&lt;br /&gt;と思っていたのですが、Lispにたどりつく前の調べもので終わってしまった。&lt;br /&gt;&lt;br /&gt;でも、ずっと気になっていたところなので、スッキリ。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;;;;; Quote, Unquote and Back quote&lt;br /&gt;&lt;br /&gt;;; ところで、クォートとバッククォートって、印刷物で&lt;br /&gt;;; みると、いつもどっちがどっちだかわからなくなって&lt;br /&gt;;; しまう。Infoファイルとかだと、`hoge'のように、バッ&lt;br /&gt;;; ククォートの方が先にくるんですね。だから、前がバッ&lt;br /&gt;;; ククォートで、後がクォート。これ自体、なんかテレ&lt;br /&gt;;; コに命名した方が自然じゃない？という気がする。&lt;br /&gt;&lt;br /&gt;;; さらに、印刷のグリフだと後のグリフは、Writing&lt;br /&gt;;; Directionに対して「バック」しているように見える&lt;br /&gt;;; ので、それがバッククォートと思いたくなってしまう。&lt;br /&gt;;; だけど、実はクォートなんですね。少なくとも大抵の&lt;br /&gt;;; Lispの本ではそうです。&lt;br /&gt;&lt;br /&gt;;; この違和感がどこから来るのか調べてみよう。&lt;br /&gt;&lt;br /&gt;;; 英語の用法をしらべてみると、やっぱり普通は、引用&lt;br /&gt;;; をはじめるところをquoteと言うようだ。そして、引&lt;br /&gt;;; 用のおわりをunquoteと言う。unquoteは日本語の「括&lt;br /&gt;;; 弧閉じ」かな。&lt;br /&gt;&lt;br /&gt;;; 例：&lt;br /&gt;;; MacArthur said, quote, I shall return, unquote.&lt;br /&gt;&lt;br /&gt;;; quote unquote は日本語の「括弧」、「括弧閉じ」み&lt;br /&gt;;; たいな言葉であり、総称的でもあるので、quote、&lt;br /&gt;;; unquoteと言ったときの具体的な文字はいろいろあり&lt;br /&gt;;; うるわけです。''もあり、""もあり、()もあり、{}も&lt;br /&gt;;; あり、ですね。なので、"Lisp Quote Unquote"は、&lt;br /&gt;;; 「Lisp () 」というのがひとつの解釈ですね。なるほ&lt;br /&gt;;; ど。ついでなので、"Lisp Quote Unquote"の解釈につ&lt;br /&gt;;; いてもう少し探ってみよう。&lt;br /&gt;&lt;br /&gt;;; まず、そもそもquote-unquoteというのは、「いわゆ&lt;br /&gt;;; る」という用法があるので、「いわゆるLispについて」&lt;br /&gt;;; というものが別の解釈。&lt;br /&gt;&lt;br /&gt;;; もうひとつがBBC-Radioの長寿クイズ番組"Quote&lt;br /&gt;;; ... Unquote"。過去の名言や発言をパネラにお題とし&lt;br /&gt;;; て出して、それが誰が言ったものかを当てたりする番&lt;br /&gt;;; 組のようだ。この番組に因むのが3つ目の解釈。&lt;br /&gt;&lt;br /&gt;;; 閑話休題。&lt;br /&gt;&lt;br /&gt;;; では、バッククォートって何なのか、どこから来たの&lt;br /&gt;;; か。それはどうやらASCIIコードと印字アプリ(Tex等)&lt;br /&gt;;; がからんでいそうだ。これらを調べる準備として、&lt;br /&gt;;; Unicodeではどうなっているか、確認しておこう。&lt;br /&gt;&lt;br /&gt;;; まずUnicodeではQuotationは「同じグリフでも言語に&lt;br /&gt;;; よって用法が違うもの」としている。その結果、ひと&lt;br /&gt;;; つのグリフについて用法をオーバロードさせるという&lt;br /&gt;;; ルールにしている。&lt;br /&gt;&lt;br /&gt;;; それを前提として英語ではどうなっているか調べてみ&lt;br /&gt;;; る。ここでは、wide characterは取り扱わない、とい&lt;br /&gt;;; う制限をかけて進めよう。wide characterまで取り扱&lt;br /&gt;;; うと結構なボリュームになるが、こと英語に関して得&lt;br /&gt;;; られる知見は少ないと思うので。&lt;br /&gt;&lt;br /&gt;;; まず、英語において推奨、というか、好ましい引用文&lt;br /&gt;;; 字は、次の組み合わせだ。&lt;br /&gt;&lt;br /&gt;;; U+2018 引用対象 U+2019&lt;br /&gt;&lt;br /&gt;;; フォントがUnicodeに対応していれば、次の行でグリ&lt;br /&gt;;; フを確認できます。&lt;br /&gt;&lt;br /&gt;;; ‘ 引用対象 ’&lt;br /&gt;&lt;br /&gt;;; 名前はそれぞれ次のよう。&lt;br /&gt;&lt;br /&gt;;; ‘ : U+2018 : left single quotation mark&lt;br /&gt;;; ’ : U+2019 : right single quotation mark&lt;br /&gt;&lt;br /&gt;;; そうするとLispのquoteで使っているあの文字は何か&lt;br /&gt;;; というと、&lt;br /&gt;&lt;br /&gt;;; ' : U+0027 : apostrophe (= apostrophe-quote)&lt;br /&gt;&lt;br /&gt;;; なんですね。では、Lispのback quoteで使っているあ&lt;br /&gt;;; の文字は何かというと、&lt;br /&gt;&lt;br /&gt;;; ` : U+0060 : grave accent&lt;br /&gt;&lt;br /&gt;;; であり、quotation markではなくaccent markなんで&lt;br /&gt;;; すね。ちなみにgrave accentって何ですか、というと、&lt;br /&gt;;; 「抑音アクセント」のことのようです。&lt;br /&gt;&lt;br /&gt;;; Unicodeには、どうやらback quoteという概念は無い&lt;br /&gt;;; ようです。さて、ASCIIコードと印字アプリ(Tex等)に&lt;br /&gt;;; 進もう。&lt;br /&gt;&lt;br /&gt;;; まず、ASCIIコードにて、'と`は何なのか。&lt;br /&gt;&lt;br /&gt;;; まず初版たるASA standard X3.4-1963によると、基本&lt;br /&gt;;; 的には、printable charactersは、コードとグリフの&lt;br /&gt;;; 対応だけがあり、名前は付いていない。ただし、&lt;br /&gt;;; U+0027相当(0x27)については、(APOS)という注釈があ&lt;br /&gt;;; るので、これはapostropheを意図したものなのだろう。&lt;br /&gt;;; そしてなんと、U+0060相当はまだ未定義なんですね。&lt;br /&gt;;; アルファベット小文字も未定義。ASCIIコード自体何&lt;br /&gt;;; 度か改訂されて今のものになったようだ。そのあたり&lt;br /&gt;;; の経緯は、&lt;br /&gt;&lt;br /&gt;;; The Evolution of Character Codes, 1874-1968&lt;br /&gt;;; http://www.pobox.com/~enf/ascii/ascii.pdf&lt;br /&gt;&lt;br /&gt;;; に詳しい。この文書、とても面白い。一杯やりながら&lt;br /&gt;;; 読みたいたぐい。&lt;br /&gt;&lt;br /&gt;;; さて、ANS、ECMA、ISOでごちゃごちゃやって、1967年&lt;br /&gt;;; に今の形にかたまったようだ。それは正式には、ANS&lt;br /&gt;;; (Americal National Standard)ではなく、USAS (USA&lt;br /&gt;;; Standard) として規格化されたらしい。(X3.4-1967)&lt;br /&gt;&lt;br /&gt;;; X3.4-1967においては、Lispにおける&lt;br /&gt;;; quoteとbackquoteは、&lt;br /&gt;&lt;br /&gt;;; ' : 0x27 : apostrophe&lt;br /&gt;;; ` : 0x60 : (no legend)&lt;br /&gt;&lt;br /&gt;;; という状態です。&lt;br /&gt;&lt;br /&gt;;; さて、先の歴史文書ではどうだろう。そこでは、&lt;br /&gt;;; 0x27は、apostropheとacute accentがoverloadされて&lt;br /&gt;;; おり、`はgrave accentとのみある。&lt;br /&gt;&lt;br /&gt;;; ちなみに、acute accentは、「揚音アクセント」。本&lt;br /&gt;;; 来のグリフは、grave accentと左右対称なものです。&lt;br /&gt;&lt;br /&gt;;; これでASCIIコードを確認できた。&lt;br /&gt;&lt;br /&gt;;; 次は印字アプリとの関係です。これはWikipediaに詳&lt;br /&gt;;; しい。&lt;br /&gt;&lt;br /&gt;;; http://en.wikipedia.org/wiki/Quotation_mark_glyphs&lt;br /&gt;&lt;br /&gt;;; 要約すると次のとおり。&lt;br /&gt;&lt;br /&gt;;; 昔のPCのフォントは、スクリーン用も印字用も0x27の&lt;br /&gt;;; グリフは垂直ではなく、right single quote markの&lt;br /&gt;;; ように傾いていた。すると引用が、’hoge’ のように&lt;br /&gt;;; なり格好わるい。これをマシにするために、0x60が転&lt;br /&gt;;; 用されたのだ。`hoge’とすると多少見栄えが改善され&lt;br /&gt;;; たということ。&lt;br /&gt;&lt;br /&gt;;; これで経緯はわかった。そして、経緯の中では、&lt;br /&gt;;; 0x27をsingle quote markと呼ぶ例をみかけた。(あく&lt;br /&gt;;; までapostropheにoverloadされたものとしてです)&lt;br /&gt;;; 0x60を back quoteと呼ぶ例はみかけなかった。&lt;br /&gt;&lt;br /&gt;;; ここからは推測だが、次のような経緯ではないか？&lt;br /&gt;&lt;br /&gt;;; ASCIIコードの初版では、0x60 は未定義であり、&lt;br /&gt;;; single quote markとして使えるのは、0x27しかなかっ&lt;br /&gt;;; た。なのでこれを代用した。そしてこれを"Quote"と&lt;br /&gt;;; 呼ぶようになった。しかし、もともと0x27は&lt;br /&gt;;; apostropheなので、垂直ではなく’というように傾い&lt;br /&gt;;; ているフォントが多かった。そんな状況で、0x60が&lt;br /&gt;;; grave accentとして導入された。するとそれをleft&lt;br /&gt;;; single quotation markとして転用するというアイデ&lt;br /&gt;;; アがでた。傾きが逆なので具合がよい。さて、rightの&lt;br /&gt;;; 方を0x27をつかってすでに"Quote"と呼ぶ慣習になっ&lt;br /&gt;;; ていた。そのため新たに加えた0x60は、その逆傾斜である&lt;br /&gt;;; ということで"Back Quote"と呼ぶ慣習となった。&lt;br /&gt;&lt;br /&gt;;; ふう。writing directionがleft to rightなのに、な&lt;br /&gt;;; ぜ、leftをback quote、rightをquoteと呼ぶのか？と&lt;br /&gt;;; いうことについては、何となく合点がいった。&lt;br /&gt;&lt;br /&gt;;; 違う観点で、もう少しだけ調べよう。&lt;br /&gt;&lt;br /&gt;;; Common Lispでは、確か文字コードを指定していない&lt;br /&gt;;; はずだ。その観点で、この話題を調べてみよう。&lt;br /&gt;;; Common LispはCLtL2に限ることにする。&lt;br /&gt;&lt;br /&gt;;; まず、CLtL2はASCIIというかISO6937/2というかを意&lt;br /&gt;;; 識して、標準文字を定義している。これを文字レパー&lt;br /&gt;;; トリと言う。しかし文字コードは実装の自由度として&lt;br /&gt;;; おり、指定していない。&lt;br /&gt;&lt;br /&gt;;; ところで、ISO6937/2では、全ての文字に文字ラベル&lt;br /&gt;;; と記述(意味または備考と理解すればよさそう)が定義&lt;br /&gt;;; されており、CLtL2もそれに準拠している。前述のと&lt;br /&gt;;; おりCLtL2は文字コードは指定していないので、CLtL2&lt;br /&gt;;; における文字レパートリの定義はグリフ中心となる。&lt;br /&gt;;; ISO6937/2から文字コードを抜いたものと考えればよい。&lt;br /&gt;;; 具体的には次のとおり。&lt;br /&gt;&lt;br /&gt;;; SP05 ’ apostrophe&lt;br /&gt;;; SD13 ‘ grave accent&lt;br /&gt;&lt;br /&gt;;; せっかくなので、文字ラベルの読み方を確認しよう。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;;; S  P  0  5&lt;br /&gt;;; |  |  |  |&lt;br /&gt;;; |  |  |  |__ for alphabetic characters:&lt;br /&gt;;; |  |  |  |    odd digit = small letter;&lt;br /&gt;;; |  |  |  |    even digit = capital letter.&lt;br /&gt;;; |  |  |  |__ If N or S in first position:&lt;br /&gt;;; |  |  |       no special meaning.&lt;br /&gt;;; |  |  |&lt;br /&gt;;; |  |  |__ for alphabetic characters:&lt;br /&gt;;; |  |  |    0 = etter without diacritical mark;&lt;br /&gt;;; |  |  |    1 to 3 = letter with diacritical mark above it;&lt;br /&gt;;; |  |  |    4 = letter with diacritical mark below it;&lt;br /&gt;;; |  |  |    5 and 6 = special form.&lt;br /&gt;;; |  |  |__ If N or S in first position:&lt;br /&gt;;; |  |       no special meaning.&lt;br /&gt;;; |  |&lt;br /&gt;;; |  |__ For alphabetic characters:&lt;br /&gt;;; |  |    A to Z = the respective letter of the Latin alphabet.&lt;br /&gt;;; |  |__ If N in first position:&lt;br /&gt;;; |  |    D = digit;&lt;br /&gt;;; |  |    F = fraction;&lt;br /&gt;;; |  |    S = subscript or superscript.&lt;br /&gt;;; |  |__ If S in first position:&lt;br /&gt;;; |       A = arithmetic sign;&lt;br /&gt;;; |       C = currency sign;&lt;br /&gt;;; |       D = diacritical mark;&lt;br /&gt;;; |       P = punctuation mark;&lt;br /&gt;;; |       M = other symbol (miscellaneous)&lt;br /&gt;;; |&lt;br /&gt;;; |__ For all graphic characters:       &lt;br /&gt;;;      L = Latin alphabetic character;&lt;br /&gt;;;      N = numeric graphic character;&lt;br /&gt;;;      S = special graphic character.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;;; ちなみに、ISO6937/2では文字コードも定義されてい&lt;br /&gt;;; るので、そのとおりに処理系を実装すれば、&lt;br /&gt;&lt;br /&gt;;; SP05 ’ apostrophe   =&gt; 0x27 '&lt;br /&gt;;; SD13 ‘ grave accent =&gt; 0x60 `&lt;br /&gt;&lt;br /&gt;;; となる。&lt;br /&gt;&lt;br /&gt;;; さて、CLtL2の文字の定義においては、SP05がquoteで&lt;br /&gt;;; あるとか、SD13がback quoteであるという話題はない。&lt;br /&gt;&lt;br /&gt;;; それらがquoteであるとかback quoteであると成るの&lt;br /&gt;;; は、「マクロ文字」の定義においてである。&lt;br /&gt;&lt;br /&gt;;; ああ、そうなのだ。これは「文字」の定義の話ではなく&lt;br /&gt;;; 「マクロ文字」の定義の話なのだ。&lt;br /&gt;;;「#」を「シャープ」(文字定義)ではなく、「ディスパッチ」&lt;br /&gt;;; と考えて(マクロ文字定義されて)、時にはその&lt;br /&gt;;; ように呼ぶように、「’」を「アポストロフィ」ではなく&lt;br /&gt;;; 「クォート」と考えて(定義されて)、時にはそのよう&lt;br /&gt;;; に呼んだり、「‘」を「グレイブ アクセント」ではなく&lt;br /&gt;;; 「バッククォート」と考えて(定義されて)、時にはそのよう&lt;br /&gt;;; に呼んだりすると理解しておけばよいのだ。&lt;br /&gt;&lt;br /&gt;こつこつ、再開。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-2076385080385708176?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/2076385080385708176/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=2076385080385708176' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/2076385080385708176'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/2076385080385708176'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2010/01/lisp-quote-backquote-2.html' title='Lisp Quote Backquote  (2)'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-924326053390442743</id><published>2010-01-11T21:44:00.009+09:00</published><updated>2010-01-12T16:02:42.948+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='Scheme Code button'/><title type='text'>Schemeコードバトンに参加しました</title><content type='html'>Schemeコードバトンに参加しました。g000001さんのをテンプレに、そのリポートを。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://d.hatena.ne.jp/higepon/20100110/1263121990"&gt;第1回 Scheme コードバトンのお知らせ - ひげぽん OSとか作っちゃうかMona-&lt;/a&gt;&lt;br /&gt;&lt;a href="http://cadr.g.hatena.ne.jp/g000001/20100111/1263204766"&gt;Schemeコードバトンに参加しました - わだばLiperになる -&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;g000001さんからバトンを渡されました。&lt;br /&gt;&lt;li&gt;渡されたバトン &lt;a href="http://gist.github.com/273441"&gt;http://gist.github.com/273441&lt;/a&gt;&lt;br /&gt;&lt;li&gt;次はquek(&lt;a href="http://read-eval-print.blogspot.com/"&gt;LETTER&lt;/a&gt;)さんへ&lt;br /&gt;&lt;li&gt;渡したバトン &lt;a href="http://gist.github.com/273567"&gt;http://gist.github.com/273567&lt;/a&gt;&lt;br /&gt;&lt;li&gt;やったことは、g000001さんがCL化したことを受けて、「とにかくCLらしく！」です。CL臭が結構出せたとしたら嬉しいです。&lt;br /&gt;&lt;li&gt;変更点&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;シェルアプリではなくREPLアプリという流れを助長しました。エントリポイントは、mainではなく、(hige:pon)に変更。&lt;br /&gt;&lt;li&gt;英単語を登録できるTop-level関数をつくりました。(hige:pin)&lt;br /&gt;&lt;li&gt;辞書のCSV一覧表示のTop-level関数をつくりました。(hige:pun)&lt;br /&gt;&lt;li&gt;pinとpunは、実践Common Lisp の第三章の技法をそのまま使いました。CL入門者の方が担当されたときにいじりやすいかな、という狙いです。&lt;br /&gt;&lt;li&gt;このツールを使う名前空間(主にcl-userかな)と、このツールの名前空間の整理をきっちりしました。英単語はSymbolで表現し、case-sensitive かつ package-awareでread/writeするようにしました。(cl-userが英単語で汚れていかないように、ということ)&lt;br /&gt;&lt;li&gt;read-char,clear-inputのシーケンスが、私のTop-levelでは挙動があやしかったので、read-lineに変更しました。&lt;br /&gt;&lt;li&gt;ダイナミック変数を導入しました。ツールの利用のライフサイクルを通して固定されている束縛については、引数で渡していかなくてもよいだろうと。先々テストもしやすいかもしれません。&lt;br /&gt;&lt;li&gt;CLのイメージ指向を際立たせるためdocumentationストリングをまめに書きました。英語はいいかげんです。。。&lt;br /&gt;&lt;li&gt;処理に無駄がないように、read time evaluationを必要なところで使いました。&lt;br /&gt;&lt;li&gt;制御に関わる部分は命令的に書き、関数の性質がある部分は関数的に書きました。&lt;br /&gt;&lt;li&gt;正答率でソートする部分は、学習効率を高めるためのストラテジの部分なので、関数として外に出して交換しやすくしました。現状は#'sort-dict-standardのみ提供。&lt;br /&gt;&lt;li&gt;とにかくCLらしく、ということで、(lambda もいちいち#'(lambdaにかえたり。&lt;br /&gt;&lt;br /&gt;&lt;li&gt;&lt;b&gt;なんとも気持がいいので、goto、残しました。&lt;/b&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;やってみて気づいたのは、&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Scheme と CL は思ってた以上に別物だ&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;ということです。自分一人で両方やっているときは、そういう風には思わなかったんです。距離感としては、C言語とJavaぐらいはあるように思います。優劣ではなく距離感として。&lt;br /&gt;&lt;br /&gt;あ、もしかしたら今回のものがピュアR6RSだから？かもしれません。&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-924326053390442743?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/924326053390442743/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=924326053390442743' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/924326053390442743'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/924326053390442743'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2010/01/scheme.html' title='Schemeコードバトンに参加しました'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-5524525393502708289</id><published>2010-01-10T20:55:00.008+09:00</published><updated>2010-01-24T02:58:05.902+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Lisp Quote Backquote'/><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='On Lisp'/><title type='text'>Lisp Quote Backquote  (1)</title><content type='html'>On Lispの7 Macrosに入ったところで、quote backquoteが出てきました。簡単な説明はあるのですが、そういえば、backquoteについてちゃんと調べたことなかったなぁと思って調べはじました。これはそのメモです。&lt;br /&gt;&lt;br /&gt;backquoteは結構難しいみたいなので、その3までいくかもしれません。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;;;;; &lt;br /&gt;;;;; Lisp Quote Backquote&lt;br /&gt;;;;; &lt;br /&gt;&lt;br /&gt;;; Common Lispのquoteとbackquoteを理解しようという&lt;br /&gt;;; 試みです。&lt;br /&gt;&lt;br /&gt;;; 前半は、基本的な動作を確認しています。振舞の確認&lt;br /&gt;;; は、stefilによるテストとして記述しています。ただ&lt;br /&gt;;; し、the reader の内部動作についてはテストとして&lt;br /&gt;;; 書けないものもありました。それらはコメントに振舞&lt;br /&gt;;; を記述しています。&lt;br /&gt;&lt;br /&gt;;; 後半はbackquoteをちゃんと理解するために、CLtL2の&lt;br /&gt;;; 付録Cをやっています。ちなみに付録Cにはバグという&lt;br /&gt;;; かタイポがあります。ここに掲載しているのは修正版&lt;br /&gt;;; です。&lt;br /&gt;&lt;br /&gt;;; Steeleも書いているとおり、backquoteの理解は簡単&lt;br /&gt;;; ではありません。&lt;br /&gt;&lt;br /&gt;;; 特にbackquoteのsemanticsが、本質的には、readerと&lt;br /&gt;;; evaluatorに跨っているところだと思います。すなわ&lt;br /&gt;;; ち、backquoteが無くなるまで評価しきったところで、&lt;br /&gt;;; 意味が定義されているのですが、マクロなどで&lt;br /&gt;;; backquoteが残った状態で使われたりするのですね。&lt;br /&gt;&lt;br /&gt;;; より根源的に言うと、入れ子になったbackquoteの仕&lt;br /&gt;;; 様について、ANSI CLはほとんど定義していません。&lt;br /&gt;;; これは大変残念なことです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;;;;; test facility&lt;br /&gt;(asdf:operate 'asdf:load-op :stefil)&lt;br /&gt;(use-package :stefil)&lt;br /&gt;;;(in-root-suite)&lt;br /&gt;;;(defsuite* test-for-understanding)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;;;;; quote basics&lt;br /&gt;(is (eq (quote 1)&lt;br /&gt;        1))&lt;br /&gt;(is (eq (quote nil)&lt;br /&gt;        nil))&lt;br /&gt;(is (eq (quote t)&lt;br /&gt;        t))&lt;br /&gt;(is (not (eq (quote #\A)&lt;br /&gt;             (quote a))))&lt;br /&gt;(is (not (eq (quote #\A)&lt;br /&gt;             (intern "#\A"))))&lt;br /&gt;(is (eql (quote #\A)&lt;br /&gt;         #\A))&lt;br /&gt;(is (equal (quote "ab")&lt;br /&gt;           "ab"))&lt;br /&gt;(is (eq (quote a)&lt;br /&gt;        (intern "A")))&lt;br /&gt;(is (not (eq (quote (quote a))&lt;br /&gt;             (quote a))))&lt;br /&gt;(is (equal (quote (quote a))&lt;br /&gt;           (list (quote quote) (quote a))))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;;;;; quote (standard macro character)&lt;br /&gt;(is (eq 'a&lt;br /&gt;        (quote a)))&lt;br /&gt;(is (equal '(a)&lt;br /&gt;           (quote (a))))&lt;br /&gt;(is (equal (read-from-string "'a")&lt;br /&gt;           ''a ))&lt;br /&gt;(is (eq (read-from-string "a")&lt;br /&gt;        'a ))&lt;br /&gt;(signals end-of-file (read-from-string "'"))&lt;br /&gt;(signals end-of-file (read-from-string "' "))&lt;br /&gt;(is (equal (read-from-string "' a")&lt;br /&gt;           ''a))&lt;br /&gt;(is (equal (list ' a 'b)&lt;br /&gt;           '(a b)))&lt;br /&gt;(is (eq (car (read-from-string "'a"))&lt;br /&gt;        'quote))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;;;;; quote and conses&lt;br /&gt;(is (eq 'nil&lt;br /&gt;        nil))&lt;br /&gt;(is (eq '()&lt;br /&gt;        nil))&lt;br /&gt;(is (equal '(a . b)&lt;br /&gt;           (cons 'a 'b)))&lt;br /&gt;(is (equal '(a b . c)&lt;br /&gt;           (cons 'a (cons 'b 'c))))&lt;br /&gt;&lt;br /&gt;(is (equal '(a)&lt;br /&gt;           (cons 'a 'nil)))&lt;br /&gt;(is (equal '(a)&lt;br /&gt;           (list 'a)))&lt;br /&gt;(is (equal ''(a)&lt;br /&gt;           (cons 'quote&lt;br /&gt;                 (cons&lt;br /&gt;                  (cons 'a 'nil)&lt;br /&gt;                  nil))))&lt;br /&gt;(is (equal ''(a)&lt;br /&gt;           (quote (quote (a)))))&lt;br /&gt;(is (equal ''(a)&lt;br /&gt;           (list 'quote '(a))))&lt;br /&gt;(is (equal ''(a)&lt;br /&gt;           (list 'quote (list 'a))))&lt;br /&gt;(is (equal '('a)&lt;br /&gt;           (quote ((quote a)))))&lt;br /&gt;(is (equal '('a)&lt;br /&gt;           (list ''a)))&lt;br /&gt;(is (equal '('a)&lt;br /&gt;           (list (list 'quote 'a))))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;;;;; backquote and quote&lt;br /&gt;(is (eq `nil&lt;br /&gt;        'nil))&lt;br /&gt;(is (eq `a&lt;br /&gt;        'a))&lt;br /&gt;(is (equal `(a . b)&lt;br /&gt;           '(a . b)))&lt;br /&gt;(is (equal `(a)&lt;br /&gt;           '(a)))&lt;br /&gt;&lt;br /&gt;(signals end-of-file (read-from-string "`"))&lt;br /&gt;(signals end-of-file (read-from-string "` "))&lt;br /&gt;(is (equal (read-from-string "` a")&lt;br /&gt;           '`a))&lt;br /&gt;(is (equal (list ` a ' b)&lt;br /&gt;           '(a b)))&lt;br /&gt;(is (not (equal ``a&lt;br /&gt;                ''a)))&lt;br /&gt;(is (not (equal '`a&lt;br /&gt;                `'a)))&lt;br /&gt;(is (equal `'a&lt;br /&gt;           ''a))&lt;br /&gt;(is (eq (eval ``a)&lt;br /&gt;        (eval ''a)))&lt;br /&gt;(is (eq (eval '`a)&lt;br /&gt;        (eval ''a)))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;;;;; backquote and comma&lt;br /&gt;(setf a 1&lt;br /&gt;      b 2&lt;br /&gt;      c 3&lt;br /&gt;      x 'y&lt;br /&gt;      (symbol-function 'x) #'identity&lt;br /&gt;      y 'z&lt;br /&gt;      (symbol-function 'y) #'identity&lt;br /&gt;      z 9&lt;br /&gt;      (symbol-function 'z) #'identity&lt;br /&gt;      m '(p q r)&lt;br /&gt;      n '(10 20 30))&lt;br /&gt;&lt;br /&gt;(is (eq `,a&lt;br /&gt;        a))&lt;br /&gt;(is (eq `,x&lt;br /&gt;        x))&lt;br /&gt;(is (eq `,m&lt;br /&gt;        m))&lt;br /&gt;(is (equal `,m&lt;br /&gt;           '(p q r)))&lt;br /&gt;&lt;br /&gt;(is (equal `(a . b)&lt;br /&gt;           (append (list `a) 'b)))&lt;br /&gt;(is (equal `(a b . c)&lt;br /&gt;           (append (list `a) (list `b) 'c)))&lt;br /&gt;(is (equal `(,a . b)&lt;br /&gt;           (append (list `,a) 'b)))&lt;br /&gt;(is (equal `(,a . b)&lt;br /&gt;           (append (list a) 'b)))&lt;br /&gt;(is (equal `(,a . ,b)&lt;br /&gt;           (append (list a) b)))&lt;br /&gt;(is (equal `(,a ,b)&lt;br /&gt;           (append (list a) (list b) 'nil)))&lt;br /&gt;(is (equal `(,@m)&lt;br /&gt;           (append m 'nil)))&lt;br /&gt;(is (equal `(,@m ,@n)&lt;br /&gt;           (append m n 'nil)))&lt;br /&gt;(is (equal `(a ,b ,m ,@n)&lt;br /&gt;           (append (list `a) (list b) (list m) n 'nil)))&lt;br /&gt;(is (equal `((,a b) ,c ,@m)&lt;br /&gt;           ;; (append (list `(,a b)) (list c) m)&lt;br /&gt;           ;; (append (list (append (list a) (list `b))) (list c) m)&lt;br /&gt;           (list (list a 'b) c 'p 'q 'r)&lt;br /&gt;           ))&lt;br /&gt;&lt;br /&gt;(signals reader-error (read-from-string ","))&lt;br /&gt;(signals end-of-file (read-from-string "`,"))&lt;br /&gt;(signals end-of-file (read-from-string "`, "))&lt;br /&gt;(is (equal (read-from-string "`, a")&lt;br /&gt;           '`,a))&lt;br /&gt;(is (eq (eval '`,a)&lt;br /&gt;        a))&lt;br /&gt;(is (equal (read-from-string "``,a")&lt;br /&gt;           '``,a))&lt;br /&gt;(is (eq (eval '``,a)&lt;br /&gt;        'a))&lt;br /&gt;(is (eq (eval (eval '``,a))&lt;br /&gt;        a))&lt;br /&gt;(signals reader-error (read-from-string "`,,a"))&lt;br /&gt;(is (equal (read-from-string "``,,a")&lt;br /&gt;           '``,,a))&lt;br /&gt;(is (eq (eval '``,,a)&lt;br /&gt;        a))&lt;br /&gt;(is (equal (read-from-string "`,`,a")&lt;br /&gt;           '`,`,a))&lt;br /&gt;(is (eq (eval '`,`,a)&lt;br /&gt;        a))&lt;br /&gt;&lt;br /&gt;(is (equal `````,,,,,a&lt;br /&gt;           a))&lt;br /&gt;(is (eq ``````,,,,,a&lt;br /&gt;        'a))&lt;br /&gt;&lt;br /&gt;(is (equal `,`,`,`,`,a&lt;br /&gt;           a))&lt;br /&gt;(is (eq `,`,`,`,`,`a&lt;br /&gt;        'a))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;;; nested backquotes and commas [the reader internal]&lt;br /&gt;;; (The reader's behavior is implementation dependent.&lt;br /&gt;;;  Here we use the allegro.)&lt;br /&gt;&lt;br /&gt;(is (equal (read-from-string "`a")&lt;br /&gt;           '(excl::backquote a)))&lt;br /&gt;&lt;br /&gt;(is (equal (read-from-string "``a")&lt;br /&gt;           '(excl::backquote (excl::backquote a))))&lt;br /&gt;&lt;br /&gt;(is (equal (read-from-string "`,a")&lt;br /&gt;           '(excl::backquote (excl::bq-comma a))))&lt;br /&gt;&lt;br /&gt;(is (equal (read-from-string "``,,a")&lt;br /&gt;           '(excl::backquote&lt;br /&gt;             (excl::backquote&lt;br /&gt;              (excl::bq-comma&lt;br /&gt;               (excl::bq-comma a))))))&lt;br /&gt;&lt;br /&gt;(is (equal (read-from-string "`,(+ 1 2)")&lt;br /&gt;           '(excl::backquote&lt;br /&gt;             (excl::bq-comma&lt;br /&gt;              (+ 1 2)))))&lt;br /&gt;&lt;br /&gt;(is (equal (eval&lt;br /&gt;            (read-from-string "`,(+ 1 2)"))&lt;br /&gt;           3))&lt;br /&gt;&lt;br /&gt;(is (equal (read-from-string "``,(+ 1 2)")&lt;br /&gt;           '(excl::backquote&lt;br /&gt;             (excl::backquote&lt;br /&gt;              (excl::bq-comma&lt;br /&gt;               (+ 1 2))))))&lt;br /&gt;&lt;br /&gt;(is (equal (eval&lt;br /&gt;            (read-from-string "``,(+ 1 2)"))&lt;br /&gt;           (excl::backquote (+ 1 2))))&lt;br /&gt;&lt;br /&gt;(is (equal (eval&lt;br /&gt;            (eval&lt;br /&gt;             (read-from-string "``,(+ 1 2)")))&lt;br /&gt;           (+ 1 2)))&lt;br /&gt;&lt;br /&gt;(is (equal (read-from-string "``,,(list '+ 1 2)")&lt;br /&gt;           '(excl::backquote&lt;br /&gt;             (excl::backquote&lt;br /&gt;              (excl::bq-comma&lt;br /&gt;               (excl::bq-comma&lt;br /&gt;                (list (quote +) 1 2)))))))&lt;br /&gt;&lt;br /&gt;(is (equal (eval&lt;br /&gt;            (read-from-string "``,,(list '+ 1 2)"))&lt;br /&gt;           (list (quote +) 1 2)))&lt;br /&gt;(is (equal (eval&lt;br /&gt;            (eval&lt;br /&gt;             (read-from-string "``,,(list '+ 1 2)")))&lt;br /&gt;           (+ 1 2)))&lt;br /&gt;&lt;br /&gt;(is (equal (read-from-string "`(,x `(,x `(,x)))")&lt;br /&gt;           '(excl::backquote&lt;br /&gt;             ((excl::bq-comma x)&lt;br /&gt;              (excl::backquote&lt;br /&gt;               ((excl::bq-comma x)&lt;br /&gt;                (excl::backquote&lt;br /&gt;                 ((excl::bq-comma x)))))))))&lt;br /&gt;(eval&lt;br /&gt; (read-from-string "`(,x `(,x `(,x)))"))&lt;br /&gt;;; =&gt; (Y (EXCL::BQ-CONS X `((EXCL::BQ-LIST X))))&lt;br /&gt;&lt;br /&gt;(eval&lt;br /&gt; (eval&lt;br /&gt;  (read-from-string "`(,x `(,x `(,x)))")))&lt;br /&gt;;; =&gt; (Y (EXCL::BQ-LIST X))&lt;br /&gt;&lt;br /&gt;(eval&lt;br /&gt; (eval&lt;br /&gt;  (eval&lt;br /&gt;   (read-from-string "`(,x `(,x `(,x)))"))))&lt;br /&gt;;; =&gt; (Y) ; fully evaluated.  implementation independent.&lt;br /&gt;&lt;br /&gt;(is (equal &lt;br /&gt;     (read-from-string "`(1 `( 2 `( 3,,,x)))")&lt;br /&gt;     '(EXCL::BACKQUOTE&lt;br /&gt;       (1 (EXCL::BACKQUOTE&lt;br /&gt;           (2 (EXCL::BACKQUOTE&lt;br /&gt;               (3 (EXCL::BQ-COMMA&lt;br /&gt;                   (EXCL::BQ-COMMA&lt;br /&gt;                    (EXCL::BQ-COMMA X)))))))))))&lt;br /&gt;&lt;br /&gt;(is (equal &lt;br /&gt;     (read-from-string "`(x `(y `(z,,,x)))")&lt;br /&gt;     '(EXCL::BACKQUOTE&lt;br /&gt;       (x (EXCL::BACKQUOTE&lt;br /&gt;           (y (EXCL::BACKQUOTE&lt;br /&gt;               (z (EXCL::BQ-COMMA&lt;br /&gt;                   (EXCL::BQ-COMMA&lt;br /&gt;                    (EXCL::BQ-COMMA X)))))))))))&lt;br /&gt;&lt;br /&gt;(eval&lt;br /&gt; (read-from-string "`(x `(y `(z,,,x)))"))&lt;br /&gt;;; =&gt; &lt;br /&gt;;; (X (EXCL::BQ-LIST&lt;br /&gt;;;     (EXCL::BQ-QUOTE Y)&lt;br /&gt;;;     (EXCL::BQ-LIST (EXCL::BQ-QUOTE EXCL::BQ-LIST)&lt;br /&gt;;;                    (EXCL::BQ-QUOTE&lt;br /&gt;;;                     (EXCL::BQ-QUOTE Z))&lt;br /&gt;;;                    Y)))&lt;br /&gt;&lt;br /&gt;(eval&lt;br /&gt; (eval&lt;br /&gt;  (read-from-string "`(x `(y `(z,,,x)))")))&lt;br /&gt;;; =&gt; (Y (EXCL::BQ-LIST (EXCL::BQ-QUOTE Z) Z))&lt;br /&gt;(eval&lt;br /&gt; (eval&lt;br /&gt;  (eval&lt;br /&gt;   (read-from-string "`(x `(y `(z,,,x)))"))))&lt;br /&gt;;; =&gt; (Z 9)&lt;br /&gt;(eval&lt;br /&gt; (eval&lt;br /&gt;  (eval&lt;br /&gt;   (eval&lt;br /&gt;    (read-from-string "`(x `(y `(z,,,x)))")))))&lt;br /&gt;;; =&gt; 9 ; fully evaluated.  implementation independent.&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;次回は、Steeleの、&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;;;; Common Lisp backquote implementation, written in Common Lisp. &lt;br /&gt;;;; Author: Guy L. Steele Jr.     Date: 27 December 1985 &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;です。まだまだ精査中。。。これは楽しめる！！&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-5524525393502708289?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/5524525393502708289/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=5524525393502708289' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/5524525393502708289'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/5524525393502708289'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2010/01/lisp-quote-backquote-1.html' title='Lisp Quote Backquote  (1)'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-4833143283958003441</id><published>2010-01-10T01:06:00.003+09:00</published><updated>2010-01-10T01:17:02.667+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='On Lisp'/><title type='text'>【On Lisp】6 Functions as Representation</title><content type='html'>なるほど。ネットワークというお題にて、コンパイルを、&lt;br /&gt;&lt;ol&gt;&lt;br /&gt;&lt;li&gt;(ルール -&gt; データ構造 ) + 辞書 + プログラム&lt;br /&gt;&lt;li&gt;ルール -&gt; 辞書 + ((データ構造 &amp; プログラム) = クロージャ) [インタプリタ]&lt;br /&gt;&lt;li&gt;(ルール -&gt; ((データ構造 &amp; プログラム) = リンクされたクロージャ)) -[コンパイル]-&gt; コンパイル済みプログラム&lt;br /&gt;&lt;/ol&gt;&lt;br /&gt;という文脈で説明するのか。うまい。&lt;br /&gt;&lt;br /&gt;お、Lisp復習パートが終わった。ついにマクロだ！&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-4833143283958003441?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/4833143283958003441/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=4833143283958003441' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/4833143283958003441'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/4833143283958003441'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2010/01/on-lisp6-functions-as-representation.html' title='【On Lisp】6 Functions as Representation'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-8139051974327245312</id><published>2010-01-09T23:36:00.003+09:00</published><updated>2010-01-10T01:12:51.745+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='On Lisp'/><title type='text'>【On Lisp】5 Returning Functions</title><content type='html'>ひさしぶりに、のんびりLisp。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;** 5 Returning Functions&lt;br /&gt;&lt;br /&gt;*** 5.1&lt;br /&gt; - そうか、レキシカルスコープでは関数の呼出し時に新&lt;br /&gt;   しいクロージャをつくることができるということは、&lt;br /&gt;   ダイナミック変数とは違う意味で動的であるといえ&lt;br /&gt;   るな。&lt;br /&gt; - ダイナミック変数でも関数呼出し時に関数を作ること&lt;br /&gt;   はできるが、それはどこまでいっても単なるダイナミッ&lt;br /&gt;   クバインディングなだけではある。&lt;br /&gt;&lt;br /&gt; - 例&lt;br /&gt;&lt;br /&gt;CL-USER&gt; (defun make-adder (n)&lt;br /&gt;           #'(lambda (x)&lt;br /&gt;               (+ x n)))&lt;br /&gt;MAKE-ADDER&lt;br /&gt;CL-USER&gt; (setq add3 (make-adder 3))&lt;br /&gt;#&amp;lt;Interpreted Closure (:INTERNAL MAKE-ADDER) @ #x1000ee3a82&gt;&lt;br /&gt;CL-USER&gt; (funcall add3 2)&lt;br /&gt;5&lt;br /&gt;CL-USER&gt; (proclaim '(special m))&lt;br /&gt;T&lt;br /&gt;CL-USER&gt; (setq m 1)&lt;br /&gt;1&lt;br /&gt;CL-USER&gt; (defun make-adder-dyn (m)&lt;br /&gt;           #'(lambda (x)&lt;br /&gt;               (+ x m)))&lt;br /&gt;MAKE-ADDER-DYN&lt;br /&gt;CL-USER&gt; (setq add3-dyn (make-adder-dyn 3))&lt;br /&gt;#&amp;lt;Interpreted Closure (:INTERNAL MAKE-ADDER-DYN) @ #x100112ead2&gt;&lt;br /&gt;CL-USER&gt; (funcall add3-dyn 2)&lt;br /&gt;3&lt;br /&gt;CL-USER&gt; (setq m 2)&lt;br /&gt;2&lt;br /&gt;CL-USER&gt; (funcall add3-dyn 2)&lt;br /&gt;4&lt;br /&gt;CL-USER&gt; (setq n 2)&lt;br /&gt;2&lt;br /&gt;CL-USER&gt; (funcall add3 2)&lt;br /&gt;5&lt;br /&gt;CL-USER&gt;&lt;br /&gt;&lt;br /&gt; - そうか。関数を引数にとり関数を返す関数が意味をも&lt;br /&gt;   つのは、返している関数が単なる関数ではなく、レキ&lt;br /&gt;   シカルクロージャであり、引数である関数をクローズ&lt;br /&gt;   しているからなんだな。&lt;br /&gt; - クロージャの威力の紹介として、オブジェクトシステ&lt;br /&gt;   ムなど、値の保持方法として紹介されることが多い。&lt;br /&gt;   それはそれで役に立つけれども、そもそもOOをあまり&lt;br /&gt;   やらないという人にはいまいち説得力がないように思&lt;br /&gt;   う。でも、汎関数プログラミングのインフラだよ、と&lt;br /&gt;   言われれば誰にとっても説得力があるように思う。&lt;br /&gt;&lt;br /&gt;*** 5.2&lt;br /&gt; - 直交性という観点にいくなら、それはもうSchemeの&lt;br /&gt;   独壇場のような。。。&lt;br /&gt; - おお、Common LispのScheme化的な動きが、、、&lt;br /&gt;&lt;br /&gt;*** 5.4&lt;br /&gt; - PGのcomposeはPAIPのものよりもいい。&lt;br /&gt;&lt;br /&gt; - PAIPのは、1引数関数しか合成できない。&lt;br /&gt;&lt;br /&gt;(defun compose (&amp;rest functions)&lt;br /&gt;  #'(lambda (x)&lt;br /&gt;      (reduce #'funcall functions :from-end t :initial-value x)))&lt;br /&gt;&lt;br /&gt;*** 5.5&lt;br /&gt; - なるほど。再帰のパターン化というのはこんな感じな&lt;br /&gt;   んだな。&lt;br /&gt; - やはりlambdaというのは、実行遅延なんだよなぁ。&lt;br /&gt;&lt;br /&gt;CL-USER&gt; (setq x 3)&lt;br /&gt;3&lt;br /&gt;CL-USER&gt; x&lt;br /&gt;3&lt;br /&gt;CL-USER&gt; (setq hoge #'(lambda () (setq x 5)))&lt;br /&gt;#&amp;lt;Interpreted Function (unnamed) @ #x1000ff6d62&gt;&lt;br /&gt;CL-USER&gt; x&lt;br /&gt;3&lt;br /&gt;CL-USER&gt; (funcall hoge)&lt;br /&gt;5&lt;br /&gt;CL-USER&gt; x&lt;br /&gt;5&lt;br /&gt;CL-USER&gt;&lt;br /&gt;&lt;br /&gt; - thunkも実行遅延なんだけど、より原始的な意味でい&lt;br /&gt;   うと、サブルーチンというか手続きというかもそれ自体&lt;br /&gt;   実行遅延だよね。&lt;br /&gt; - 関数もそれらの一種とするなら、関数と関数呼出しと&lt;br /&gt;   は制御構造の親玉だよね。コードを切り貼りして実行&lt;br /&gt;   タイミングを調整する機構。本質的にはgotoやjump&lt;br /&gt;   だし。すると、構造化プログラミングとの折り合いは&lt;br /&gt;   どうなっているのだろう？&lt;br /&gt; - このあたりについて、プログラミング言語階層での説&lt;br /&gt;   明語彙として「継続」を位置づけるのはどうだろう？&lt;br /&gt;   継続という用語の導入として、継続を取り出してファー&lt;br /&gt;   ストクラスで扱うときが始めてということが多いけど、&lt;br /&gt;   それだと逆にわかりにくいのではないか？&lt;br /&gt; - 例えば末尾再帰もある意味継続の構造の問題ですよね。&lt;br /&gt;   継続にノイズが入らないのが末尾再帰というか。&lt;br /&gt; - 関数が数学的な意味での関数であるとすると、話はまっ&lt;br /&gt;   たく別になるな。そもそも実行順とか制御の考えが入っ&lt;br /&gt;   て無いから。&lt;br /&gt; - なんかつれづれなるままに、だな。。。&lt;br /&gt;&lt;br /&gt; - さて、遅延させて渡すときはthunkを作る(使う)など&lt;br /&gt;   して、 関数でもコードの抽象化(パターン抽出)ができ&lt;br /&gt;   るよ、というのがこの章のテーマのようだ。&lt;br /&gt; - ただし、やってみるとわかるが、関数だけで抽象化&lt;br /&gt;   させようとすると、関数的抽象化がどうできるのか&lt;br /&gt;   にいろいろ腐心することになる。&lt;br /&gt; - もっと手軽に抽象化するなら、関数的抽象化ではな&lt;br /&gt;   く表現的抽象化であり、それがこの本の主題たるマ&lt;br /&gt;   クロなんですよ〜、ということかなぁ。&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-8139051974327245312?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/8139051974327245312/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=8139051974327245312' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/8139051974327245312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/8139051974327245312'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2010/01/onlisp5-returning-functions.html' title='【On Lisp】5 Returning Functions'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-8959429970913289165</id><published>2010-01-07T20:54:00.003+09:00</published><updated>2010-01-10T01:13:06.494+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='On Lisp'/><title type='text'>【On Lisp】4 ユーティリティ関数</title><content type='html'>年始にもかかわらず、業務繁忙。&lt;br /&gt;ちょっとずつ進めて、やっと4章完了。&lt;br /&gt;&lt;br /&gt;ユニットテストをたくさん書きながら、理解を深めた。&lt;br /&gt;&lt;br /&gt;特にあたらしい知見はない。&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-8959429970913289165?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/8959429970913289165/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=8959429970913289165' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/8959429970913289165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/8959429970913289165'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2010/01/onlisp4.html' title='【On Lisp】4 ユーティリティ関数'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-1038404444467042606</id><published>2010-01-02T22:39:00.002+09:00</published><updated>2010-01-10T01:13:21.731+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='On Lisp'/><title type='text'>【On Lisp】3 関数プログラミング</title><content type='html'>&lt;pre&gt;&lt;br /&gt;** 3 関数プログラミング&lt;br /&gt;*** 3.1&lt;br /&gt; - 副作用について読むとき、いつも違和感がある。&lt;br /&gt;   - プログラマまたはユーザから見れば、何が副作用で&lt;br /&gt;     何が本作用かは、実現したい課題によるのではない&lt;br /&gt;     か。&lt;br /&gt;   - それを(関数型)言語の視点から一方的に、値を返却&lt;br /&gt;     すること以外の作用を全て副作用と呼んでしまう。&lt;br /&gt;     これは乱暴ではないか？&lt;br /&gt;*** 3.3&lt;br /&gt; - なるほど。純粋に関数型であるかどうかよりも、関数&lt;br /&gt;   型インターフェイスを提供するかどうかを重要視する&lt;br /&gt;   のか。&lt;br /&gt; - 「関数が返すquoteに注意」は知らなかった。&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-1038404444467042606?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/1038404444467042606/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=1038404444467042606' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/1038404444467042606'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/1038404444467042606'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2010/01/onlisp3.html' title='【On Lisp】3 関数プログラミング'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-444285301446746368</id><published>2010-01-02T21:14:00.004+09:00</published><updated>2010-01-10T01:13:36.143+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='On Lisp'/><title type='text'>【On Lisp】2 関数</title><content type='html'>&lt;pre&gt;&lt;br /&gt;** 2 関数&lt;br /&gt;*** 前説&lt;br /&gt; - イメージ指向の簡潔な解説あり。&lt;br /&gt;*** 2.2&lt;br /&gt; - PGは、Lisp2だとコードがかっこ悪くなることがある、&lt;br /&gt;   という。正気か？&lt;br /&gt; - 'list'を'lst'と書くのはかっこ悪くないか？&lt;br /&gt;*** 2.4&lt;br /&gt; - お、このタイミングでplistと関数の組み合わせを扱&lt;br /&gt;   うのか。展開が早くてよろし。&lt;br /&gt;*** 2.7&lt;br /&gt; - count-instancesでlabelsの必然性の導入というのは&lt;br /&gt;   違和感ある。そもそもcount-instancesくらいなら、&lt;br /&gt;   labelsというか再帰すら使わないんじゃないかなぁ。&lt;br /&gt;&lt;br /&gt;CL-USER&gt; (defun count-instances-1 (obj list-of-lists)&lt;br /&gt;           (mapcar #'(lambda (list)&lt;br /&gt;                       (count-if #'(lambda (x) (eq obj x))&lt;br /&gt;                                 list))&lt;br /&gt;                   list-of-lists))&lt;br /&gt;COUNT-INSTANCES-1&lt;br /&gt;CL-USER&gt; (count-instances-1 'a '((a b c) (d a r p a) (d a r) (a a)))&lt;br /&gt;(1 2 1 2)&lt;br /&gt;CL-USER&gt; &lt;br /&gt;*** 2.9&lt;br /&gt; - On LispはCLtL2なんだな。&lt;br /&gt; - Allegroは「空でないレキシカル環境においてインタ&lt;br /&gt;   プリタ的に定義された関数」をコンパイルできる。&lt;br /&gt;&lt;br /&gt;CL-USER&gt; (let ((y 2))&lt;br /&gt;           (defun foo (x) (+ x y)))&lt;br /&gt;FOO&lt;br /&gt;CL-USER&gt; (compile 'foo)&lt;br /&gt;FOO&lt;br /&gt;NIL&lt;br /&gt;NIL&lt;br /&gt;CL-USER&gt; (compiled-function-p #'foo)&lt;br /&gt;T&lt;br /&gt;CL-USER&gt; &lt;br /&gt;&lt;br /&gt; - そうか。コンパイルされた関数が返す関数はコンパ&lt;br /&gt;   イル済みなんだな。&lt;br /&gt;&lt;br /&gt;CL-USER&gt; (defun make-adder (n)&lt;br /&gt;           #'(lambda (x) (+ x n)))&lt;br /&gt;MAKE-ADDER&lt;br /&gt;CL-USER&gt; (interpreted-function-p #'make-adder)&lt;br /&gt;T&lt;br /&gt;CL-USER&gt; (compiled-function-p #'make-adder)&lt;br /&gt;NIL&lt;br /&gt;CL-USER&gt; (setq add2 (make-adder 2))&lt;br /&gt;#&amp;lt;Interpreted Closure (:INTERNAL MAKE-ADDER) @ #x1000d01fb2&gt;&lt;br /&gt;CL-USER&gt; (interpreted-function-p add2)&lt;br /&gt;T&lt;br /&gt;CL-USER&gt; (compiled-function-p add2)&lt;br /&gt;NIL&lt;br /&gt;CL-USER&gt; (compile 'make-adder)&lt;br /&gt;MAKE-ADDER&lt;br /&gt;NIL&lt;br /&gt;NIL&lt;br /&gt;CL-USER&gt; (interpreted-function-p #'make-adder)&lt;br /&gt;NIL&lt;br /&gt;CL-USER&gt; (compiled-function-p #'make-adder)&lt;br /&gt;T&lt;br /&gt;CL-USER&gt; (setq add2 (make-adder 2))&lt;br /&gt;#&amp;lt;Closure (:INTERNAL MAKE-ADDER 0) @ #x1000e55e52&gt;&lt;br /&gt;CL-USER&gt; (compiled-function-p add2)&lt;br /&gt;T&lt;br /&gt;CL-USER&gt; (interpreted-function-p add2)&lt;br /&gt;NIL&lt;br /&gt;CL-USER&gt; &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-444285301446746368?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/444285301446746368/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=444285301446746368' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/444285301446746368'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/444285301446746368'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2010/01/onlisp2.html' title='【On Lisp】2 関数'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-1793144153308078824</id><published>2010-01-02T21:12:00.002+09:00</published><updated>2010-01-10T01:13:52.523+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='On Lisp'/><title type='text'>【On Lisp】1 拡張可能なプログラミング言語</title><content type='html'>&lt;pre&gt;&lt;br /&gt;* On Lisp&lt;br /&gt; - 新しい知見や疑問点などをメモする。&lt;br /&gt;** 1 拡張可能なプログラミング言語&lt;br /&gt; - 新しい知見はない。&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-1793144153308078824?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/1793144153308078824/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=1793144153308078824' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/1793144153308078824'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/1793144153308078824'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2010/01/onlisp1.html' title='【On Lisp】1 拡張可能なプログラミング言語'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-2733144501813846943</id><published>2010-01-02T18:38:00.003+09:00</published><updated>2010-01-02T18:46:26.776+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='On Lisp'/><title type='text'>On Lisp を読む</title><content type='html'>なんとなく、気分として、必読図書で読んでいないものを読みたくなりました。というと必読図書をかなりこなしていそうですが、ほとんと読んでいないというのが実情です。まずはLisp系からいこうと思います。&lt;br /&gt;&lt;br /&gt;トップバッターとして、今まで手を出さなかったOn Lisp を読んでみます。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.co.jp/dp/4274066371/"&gt;On Lisp&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;On Lispに手を出さなかったのには理由があるのですが、読んでもいいかなぁと思える状態にはなったようです。&lt;br /&gt;&lt;br /&gt;さて、On Lispを読み終えることができたら、Let Over Lambdaもいけるかもしれません。お風呂用まで買ったのですが、読書条件がOn Lispにdepends-onしているために読めないでおります。&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-2733144501813846943?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/2733144501813846943/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=2733144501813846943' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/2733144501813846943'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/2733144501813846943'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2010/01/on-lisp.html' title='On Lisp を読む'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-8996879857618093671</id><published>2009-12-30T21:40:00.000+09:00</published><updated>2009-12-30T21:41:29.762+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='うんにゃら'/><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><title type='text'>うんにゃらマクロ</title><content type='html'>「うんにゃら」をマクロにしてみました。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;CL-USER&gt; (defmacro unnyara (name-string)&lt;br /&gt;           (let ((name-value (gensym))&lt;br /&gt;                 (not-used (gensym)))&lt;br /&gt;             `(macrolet ((,name-value (,not-used)&lt;br /&gt;                           (find-symbol (string-upcase ,name-string))))&lt;br /&gt;                (,name-value t))))&lt;br /&gt;UNNYARA&lt;br /&gt;CL-USER&gt; (setq x 0)&lt;br /&gt;0&lt;br /&gt;CL-USER&gt; (setq y 'a)&lt;br /&gt;A&lt;br /&gt;CL-USER&gt; (proclaim '(special y))&lt;br /&gt;T&lt;br /&gt;CL-USER&gt; (let ((x 1)&lt;br /&gt;               (y 'b))&lt;br /&gt;           (print (unnyara "x"))&lt;br /&gt;           (print (unnyara "y"))&lt;br /&gt;           (locally (declare (special x))&lt;br /&gt;             (print (unnyara "x")))&lt;br /&gt;           (progv '(x y) '(2 c)&lt;br /&gt;             (print (unnyara "x"))&lt;br /&gt;             (print (unnyara "y"))&lt;br /&gt;             (locally (declare (special x))&lt;br /&gt;               (print (unnyara "x"))&lt;br /&gt;               (values))))&lt;br /&gt;&lt;br /&gt;1&lt;br /&gt;B&lt;br /&gt;0&lt;br /&gt;1&lt;br /&gt;C&lt;br /&gt;2 ; No value&lt;br /&gt;CL-USER&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;レキシカルにしてもダイナミックにしても、適切な束縛の値を返してくれているようです。&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-8996879857618093671?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/8996879857618093671/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=8996879857618093671' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/8996879857618093671'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/8996879857618093671'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2009/12/blog-post.html' title='うんにゃらマクロ'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-2833199728576635706</id><published>2009-12-30T07:51:00.006+09:00</published><updated>2009-12-30T21:42:24.161+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='うんにゃら'/><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='かんにゃら'/><title type='text'>Common Lispのレキシカルスコープを調べる</title><content type='html'>2chのLisp系のスレで変数参照の議論があることをg000001さんから教えていただきました。要約するとこんな感じです。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(setq x 1)&lt;br /&gt;(うんにゃら "x")&lt;br /&gt;&lt;br /&gt;というシーケンスがあり、2つ目の式の値を変数xの値(すなわち1)とするには、&lt;br /&gt;'うんにゃら'はどう書けばいいの?&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;回答案として、&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(symbol-value (find-symbol (string-upcase "x")))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;という類のものがありました。私なりに書き直していますが趣旨は同じものです。&lt;br /&gt;&lt;br /&gt;しかしこのやり方だと、変数xについてレキシカルな束縛が存在するところにシーケンスがある場合にダイナミック変数の方の値が取れちゃうのですね。なので私はこの'うんにゃら'が文脈によらず機能するように書くのは、「ANSI CLの範囲では無理」とg000001さんに話していました。&lt;br /&gt;&lt;br /&gt;そこでふと疑問がわきました。いや、これ「ANSI CLの範囲」では無理、という一言で済む類のことではないのではないか、と。&lt;br /&gt;&lt;br /&gt;問題は二段階に整理できます。&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;STEP 1: レキシカルスコープの中で、シンボルxではなく文字列"x"から変数xの束縛の値を取得できるか? ということ。例は次のとおりです。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(setq x 0)&lt;br /&gt;(let ((x 0))&lt;br /&gt;  (seq x 1)&lt;br /&gt;  (うんにゃら "x")) → 1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;li&gt;STEP 2: レキシカルスコープの外で、名前で変数xの束縛の値を取得できるか?ということ。例は次のとおりです。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;(setq x 0)&lt;br /&gt;(let ((x 1))&lt;br /&gt;  (かんにゃら))&lt;br /&gt;(うんにゃら "x") → 1&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;前者は不可能なのかどうか。そして、それ以上に、後者ができてしまったら、それはもうレキシカルスコープのレキシカルスコープたる本分を破戒していることになるのではないか。&lt;br /&gt;&lt;br /&gt;ああ、、、これがレキシカルスコープという概念を破戒しているかどうかを判断できる程、私はCommon Lispを理解していない。。。&lt;br /&gt;&lt;br /&gt;というのが事のはじまりです。久しぶりにCommon Lispの基礎を復習してみよう、と思い立ちました。&lt;br /&gt;&lt;br /&gt;結論を先に言ってしまうと、&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;STEP 1: ANSI CLの範囲でもマクロを使えば可能。&lt;br /&gt;&lt;li&gt;STEP 2: ANSI CLの範囲ではやはり無理であり、参照できたとしたらレキシカルスコープの本分を破戒していると言ってよさそうだ。&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;ということがわかりました。この長文エントリは、その検討の際のメモをそのまま掲載するものです。結構長いので、投稿するかどうか悩みました。しかし、もしかしたら、Common Lisp初心者の方がスコープ関係や環境関係を復習するに参考になるかもしれないと考えて、今この前置きを書いている次第です。すでにLisperの方にとっては、アタリマエのことを何くどくどと書いてるんだ? という内容だと思いますので、その筋の方は読まないことをおすすめします。&lt;br /&gt;&lt;br /&gt;なお、Emacsのorg-modeなどで読むと、色付けや階層化されて読みやすいです。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;　　　　　　*** 以下、検討メモ ***&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;* レキシカルスコープの理解を深める&lt;br /&gt;&lt;br /&gt; - ふと、レキシカルスコープについて理解が甘いこと&lt;br /&gt;   に気付いた。&lt;br /&gt; - 気付いたことを仮説として検証してみることにした。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;** レキシカルスコープに関する仮説&lt;br /&gt;&lt;br /&gt; - 関数呼出しの文脈にて変数を名前で参照するというこ&lt;br /&gt;   とがレキシカルスコープではできないということが、&lt;br /&gt;   「CLの仕様が限定的である」ことによるものだと思っ&lt;br /&gt;   ていたが、それは誤解である。(名前を使うかにかか&lt;br /&gt;   わらず)その文脈で「直接参照できたら」、それはも&lt;br /&gt;   うレキシカルスコープ「ではない」のだ。すなわち、&lt;br /&gt;   CLの仕様はレキシカルスコープがレキシカルスコープ&lt;br /&gt;   であることを維持するために、そのような機構をわざ&lt;br /&gt;   と持たないのだ。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;** 現象論とその意味からの確認&lt;br /&gt;&lt;br /&gt;*** レキシカルスコープの振る舞い&lt;br /&gt;&lt;br /&gt;CL-USER&gt; (setq x 10)&lt;br /&gt;10&lt;br /&gt;CL-USER&gt; (defun hoge ()&lt;br /&gt;           (let ((x 0))&lt;br /&gt;             (piyo)))&lt;br /&gt;HOGE&lt;br /&gt;CL-USER&gt; (defun piyo ()&lt;br /&gt;           (+ 1 x))&lt;br /&gt;PIYO&lt;br /&gt;CL-USER&gt; (hoge)&lt;br /&gt;11&lt;br /&gt;CL-USER&gt; &lt;br /&gt;&lt;br /&gt; - piyoの中の'x'にて、hogeの中の'x'は参照されていな&lt;br /&gt;   い(できない)。&lt;br /&gt; - 'x'という名前によって参照できるということが、&lt;br /&gt;   defunの評価時に、すなわち関数の生成時には可能だ&lt;br /&gt;   が、そのコードブロックを抜けると消失してしまう。&lt;br /&gt;   ただし、その束縛自体は、hogeが参照する関数オブジェ&lt;br /&gt;   クトについての全ての参照が無くなって、その関数オ&lt;br /&gt;   ブジェクトGCされるまでは残り続ける。これがレキシ&lt;br /&gt;   カルスコープの意味または定義。&lt;br /&gt; - 簡潔に言えば、「有限スコープ」かつ「無限エクス&lt;br /&gt;   テント」。&lt;br /&gt; - ちなみに一般的には、有限ではなく静的と言う。&lt;br /&gt;&lt;br /&gt;*** ダイナミックスコープの振る舞い&lt;br /&gt; - レキシカルスコープを確認した後で、proclaimでダイ&lt;br /&gt;   ナミックに切り換える。&lt;br /&gt;&lt;br /&gt;CL-USER&gt; (setq x 10)&lt;br /&gt;10&lt;br /&gt;CL-USER&gt; (defun hoge ()&lt;br /&gt;           (let ((x 0))&lt;br /&gt;             (piyo)))&lt;br /&gt;HOGE&lt;br /&gt;CL-USER&gt; (defun piyo ()&lt;br /&gt;           (+ 1 x))&lt;br /&gt;PIYO&lt;br /&gt;CL-USER&gt; (hoge)&lt;br /&gt;11&lt;br /&gt;CL-USER&gt; (symbol-function 'hoge)&lt;br /&gt;#&amp;lt;Interpreted Closure HOGE&gt;&lt;br /&gt;CL-USER&gt; (proclaim '(special x))&lt;br /&gt;T&lt;br /&gt;CL-USER&gt; (hoge)&lt;br /&gt;1&lt;br /&gt;CL-USER&gt; (symbol-function 'hoge)&lt;br /&gt;#&amp;lt;Interpreted Function HOGE&gt;&lt;br /&gt;CL-USER&gt;&lt;br /&gt;&lt;br /&gt; - piyoの中の'x'にて、hogeの中の'x'を参照している&lt;br /&gt;   (できる)。&lt;br /&gt; - 'x'という名前によって参照できるということが、&lt;br /&gt;   defunの評価時のみならず、piyoの呼出し時にも可能&lt;br /&gt;   であり、その参照可能状態は、hogeが参照する関数オ&lt;br /&gt;   ブジェクトについての全ての参照が無くなって、その&lt;br /&gt;   関数オブジェクトGCされるまでは残り続ける。逆に、&lt;br /&gt;   hogeの中で'x'と0の束縛は、そのコードブロックを&lt;br /&gt;   抜けると消失する。これがダイナミックスコープの&lt;br /&gt;   意味または定義。&lt;br /&gt; - 簡潔に言えば、「無限スコープ」かつ「有限エクス&lt;br /&gt;   テント」。&lt;br /&gt; - ちなみに一般的には、有限ではなく静的と言う。&lt;br /&gt;&lt;br /&gt;*** 仮説の検証&lt;br /&gt;&lt;br /&gt; - この現象論レベルの意味で言えば、コードブロックを&lt;br /&gt;   抜けたら名前で参照できなくなるのがレキシカルスコー&lt;br /&gt;   プなのだから仮説は正しい。&lt;br /&gt;&lt;br /&gt; - ちなみに、dynamic scopeという用語はANSI CLでは定&lt;br /&gt;   義されていないようだ(用語集にはあるけど、本文に出て&lt;br /&gt;   こない)。レキシカルやダイナミックで言うと、本文で定&lt;br /&gt;   義されているのは次のもののようだ。&lt;br /&gt;&lt;br /&gt;   - Lexical Variables&lt;br /&gt;   - Dynamic Variables&lt;br /&gt;   - Lexical Scope&lt;br /&gt;   - Lexical Environment&lt;br /&gt;   - Dynamic Environment&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;** 環境(Environment)の観点で考える&lt;br /&gt;&lt;br /&gt; - ANSI CLの意味論は、環境モデルを中心に構成されて&lt;br /&gt;   いる。例えばスコープという言葉もあまり出てこな&lt;br /&gt;   い。環境の振舞の結果としてスコープが実現される&lt;br /&gt;   からだろう。&lt;br /&gt; - そこで、環境の観点にて仮説はどうなのか、考えてみ&lt;br /&gt;   る。&lt;br /&gt; - このあたり、ANSI CLとCLtL2で差異がありそうなので、&lt;br /&gt;   ANSI CLであるかCLtL2であるかを常に明記することに&lt;br /&gt;   する。まず、ANSI CLをやる。余力があれば、CLtL2も&lt;br /&gt;   やる。&lt;br /&gt;&lt;br /&gt;*** ANSI CL&lt;br /&gt;&lt;br /&gt; - ANSI CLは、readerとevaluatorとcompilerとが概念分&lt;br /&gt;   離されている。&lt;br /&gt; - それぞれで環境が使われている。&lt;br /&gt; - レキスカルスコープ/ダイナミックスコープを定義し&lt;br /&gt;   ているのは、evaluatorの章である。&lt;br /&gt; - 仮説の検証においては、evaluatorだけでも話は済む&lt;br /&gt;   かもしれないが、ここではせっかくなので、readerと&lt;br /&gt;   compilerでの環境も確認する。&lt;br /&gt;&lt;br /&gt;**** reader&lt;br /&gt;&lt;br /&gt;***** readerにおける環境とは？&lt;br /&gt; - readerは、streamを入力として、そのstreamから得ら&lt;br /&gt;   れる文字の並びをパースし、lisp objects を返すも&lt;br /&gt;   のである。&lt;br /&gt; - readerの動作は、次のものを骨格として定義されて&lt;br /&gt;   いる。&lt;br /&gt;   - the reader algorithm&lt;br /&gt;&lt;br /&gt;     これはプログラマが変更することはできないもの。&lt;br /&gt;     処理系実装者の世界。というかANSI CLの仕様で確&lt;br /&gt;     定されているもの。&lt;br /&gt;&lt;br /&gt;     ANSI CLの構文のほとんどは、このアルゴリズム&lt;br /&gt;     「以外」の構成物で定義されている。そしてそれら&lt;br /&gt;     はプログラマが変更可能である。よって、CLは構文&lt;br /&gt;     を変更可能というよりも「構文を持たない」という&lt;br /&gt;     方が実態をよく表していると思う。ANSI CLは「構&lt;br /&gt;     文が不確定、意味論が確定」している言語と言える。&lt;br /&gt;     (意味論が確定、といってもあくまでメタな確定で&lt;br /&gt;     あり、プログラマが変更可能である)&lt;br /&gt;&lt;br /&gt;     ただし、意味論を説明するには、何がしか構文が必&lt;br /&gt;     要なので、仕様化には、意味論の説明用のとりあえ&lt;br /&gt;     ずの構文が必要。それが日頃使われているあの構&lt;br /&gt;     文であり、標準構文(the standard syntax)という&lt;br /&gt;     名前を持つ。&lt;br /&gt;&lt;br /&gt;   - readtable&lt;br /&gt;&lt;br /&gt;     文字と構文タイプとを紐付けるテーブル。これはプ&lt;br /&gt;     ログラマが変更することができる。構文タイプには&lt;br /&gt;     次のものがある。&lt;br /&gt;&lt;br /&gt;     - constituent&lt;br /&gt;     - whitespace&lt;br /&gt;     - terminating macro char&lt;br /&gt;     - no-terminating macro char&lt;br /&gt;     - single escape&lt;br /&gt;     - multiple excape&lt;br /&gt;&lt;br /&gt;     精確には、constituent traits の定義も&lt;br /&gt;     readtableにあるがここでは割愛。また、&lt;br /&gt;     dispatching macro characterの表の定義も&lt;br /&gt;     readtableにあるがここでは割愛。&lt;br /&gt;&lt;br /&gt;   - tokens 解釈仕様&lt;br /&gt;&lt;br /&gt;     構文の基礎となるものについては、tokensの解釈&lt;br /&gt;     が仕様で決まっている。よって、readtableでなん&lt;br /&gt;     でもかんでも自由自在に定義できるわけではない&lt;br /&gt;     ということ。決まっているものは次のとおり。&lt;br /&gt;&lt;br /&gt;     - numbers&lt;br /&gt;     - the consing dot&lt;br /&gt;     - symbols&lt;br /&gt;&lt;br /&gt;   - reader macro function&lt;br /&gt;&lt;br /&gt;     readerがthe reader algorithmにしたがって、a&lt;br /&gt;     readtableを使いながら処理していくときに、&lt;br /&gt;     readtableにてmacro charとなっている文字を読み&lt;br /&gt;     込んだときに呼ばれる関数のこと。&lt;br /&gt;&lt;br /&gt;     - standard macro characters&lt;br /&gt;&lt;br /&gt;       説明のための構文のために定義されたreader&lt;br /&gt;       macro functionが割り当てられた文字達。&lt;br /&gt;&lt;br /&gt;       - left parenthesis&lt;br /&gt;       - right parenthesis&lt;br /&gt;       - single quote&lt;br /&gt;       - semicolon&lt;br /&gt;       - double quote&lt;br /&gt;       - backquote&lt;br /&gt;       - comma&lt;br /&gt;       - sharpsign&lt;br /&gt;&lt;br /&gt; - さて、これらが骨格であるとして、その中には、プロ&lt;br /&gt;   グラマが変更可能というものもあった。すると「プロ&lt;br /&gt;   グラマが変更」とは具体的にどのようにやるのだろう&lt;br /&gt;   か、変更するということはどこかに格納されているは&lt;br /&gt;   ずではないか、ということになる。この格納先が、環&lt;br /&gt;   境だ。&lt;br /&gt;&lt;br /&gt; - 違う観点でみてみよう。プログラマが変更可能なのは、&lt;br /&gt;   readerが使うもの達だ。なぜならreaderの挙動を変更&lt;br /&gt;   可能であるというとき、reader自体のソースコードを&lt;br /&gt;   いじるわけではないからだ。するとreaderは使うもの&lt;br /&gt;   達の名前を知っている、もしくはreaderは使うもの達&lt;br /&gt;   を「名前で」参照する、ことになる。よって、&lt;br /&gt;   readerが使う変数はdynamic variablesでなければな&lt;br /&gt;   らないし、その束縛を保持する環境はdynamic&lt;br /&gt;   environmentsだ(environmentsの導入はevaluator の&lt;br /&gt;   ところで)。実際、ANSI CLの仕様ではreaderが名前で&lt;br /&gt;   参照する変数の一覧が定義されており、それらは&lt;br /&gt;   dynamic variablesであると決められている。一覧は&lt;br /&gt;   次のとおり。&lt;br /&gt;&lt;br /&gt;   - *package*&lt;br /&gt;   - *read-default-float-format*&lt;br /&gt;   - *readtable*&lt;br /&gt;   - *readbase*&lt;br /&gt;   - *read-suppress*&lt;br /&gt;&lt;br /&gt;   この文書の話題で重要なのは*package*と&lt;br /&gt;   *readtable*である。それらについて説明する。&lt;br /&gt;&lt;br /&gt;   - *readtable*&lt;br /&gt;&lt;br /&gt;     - これにはa readtable objectが束縛される。&lt;br /&gt;       *readtable*に束縛されているa readtable&lt;br /&gt;       objectをthe current readtableと呼ぶ。&lt;br /&gt;&lt;br /&gt;     - Lisp imageが起動したときにthe current&lt;br /&gt;       readtable となるreadtableのことを、the&lt;br /&gt;       initial readtable と呼ぶ。the initial&lt;br /&gt;       readtableはプログラマが変更可能である。&lt;br /&gt;&lt;br /&gt;     - 処理系には、the standard readtableが埋め込ま&lt;br /&gt;       れており、処理系出荷時はthe standard&lt;br /&gt;       readtableがthe initial readtableになっている&lt;br /&gt;       ことが多い。しかし、(仕様的には)そうでなけれ&lt;br /&gt;       ばいけないわけではない。&lt;br /&gt;&lt;br /&gt;   - *package*&lt;br /&gt;&lt;br /&gt;     - a packageは名前(names)とシンボル(symbols)の&lt;br /&gt;       紐付けを保持するものである。ただし、印字名&lt;br /&gt;       (a print name)自体は、a symbol objectの中に&lt;br /&gt;       も保持されている。よって名前とシンボルの対応&lt;br /&gt;       は、packagesとsymbolsの双方に存在しているこ&lt;br /&gt;       とになる。この両者は役割が異なるのだ。&lt;br /&gt;       packagesが提供しているのは、名前空間の分離で&lt;br /&gt;       ある。すなわち、readerがtokens からsymbolsを&lt;br /&gt;       引き当てるときに、(package)修飾子なし名前に&lt;br /&gt;       ついてどのsymbolを選ぶかを決めているのが&lt;br /&gt;       package 機構である。引き当てだけでなく、新し&lt;br /&gt;       いsymbolの登録先の選定にも使われている。&lt;br /&gt;       package の基本について、これ以上の説明は割愛&lt;br /&gt;       して先に進む。&lt;br /&gt;&lt;br /&gt;     - *package*に束縛されたa package objectのことを、&lt;br /&gt;       the current packageと呼ぶ。&lt;br /&gt;&lt;br /&gt;     - readerがthe current pakcageをどのように使う&lt;br /&gt;       かというと、やはり次のものにすぎない。&lt;br /&gt;&lt;br /&gt;       - symbolsを表わすtokensについて、それが&lt;br /&gt;         package修飾子を持たない場合に、the&lt;br /&gt;         symbolsのintern先となる。(ちなみにreaderは&lt;br /&gt;         uninternはしない)&lt;br /&gt;&lt;br /&gt;     - 標準構文のためのpackagesが定義されている。そ&lt;br /&gt;       れを standarized packagesと言う。それは次の&lt;br /&gt;       3つである。&lt;br /&gt;       - common-lisp&lt;br /&gt;       - keyword&lt;br /&gt;       - common-lisp-user&lt;br /&gt;&lt;br /&gt;       common-lisp-userは、標準構文に関する要素は&lt;br /&gt;       含んでいないが、standarized packagesである&lt;br /&gt;       として定義されている。&lt;br /&gt;&lt;br /&gt;     - 'common-lisp' packageと'keyword' packageを&lt;br /&gt;       use-packageすることによって、標準構文で定義&lt;br /&gt;       済みの名前(defined names)を、仕様書に記載さ&lt;br /&gt;       れているそのままで使うことができるようになる。&lt;br /&gt;&lt;br /&gt;***** 初めにthe global environmentありき&lt;br /&gt;&lt;br /&gt; - さて、ではLisp imageが起動したときにどのようなa&lt;br /&gt;   dynamic environmentが存在するのだろうか。残念な&lt;br /&gt;   がらこれはANSI CL には明示的には書かれていないよ&lt;br /&gt;   うだ。しかし暗示的には書かれている。&lt;br /&gt;&lt;br /&gt; - それが、the global environemt。the global&lt;br /&gt;   environmentが保持する束縛は、'indefinite scope'&lt;br /&gt;   かつ'indefinite extent'であるという。であるなら、&lt;br /&gt;   起動直後から存在していなければならない。そして、&lt;br /&gt;   この両方の特性をもっているのは、the global&lt;br /&gt;   environmentだけなので、起動時に存在しているもの&lt;br /&gt;   はこれだ(け)といってよいだろう。&lt;br /&gt;&lt;br /&gt; - ちなみに、the global environmentは'indefinite&lt;br /&gt;   scope'かつ'indefinite extent'なので、レキシカル&lt;br /&gt;   スコープでもダイナミックスコープでもない。あく&lt;br /&gt;   までthe global scope。ただし、どちらかと言えば、&lt;br /&gt;   ダイナミックスコープよりではある。&lt;br /&gt;&lt;br /&gt; - このthe global environmentが、いろいろなものの&lt;br /&gt;   束縛を保持している。&lt;br /&gt;   - reader macro functionsについて、名前と関数&lt;br /&gt;     objectsの束縛。&lt;br /&gt;   - *readtable*や*package*に関する束縛。&lt;br /&gt;   - 標準構文のための関数やマクロやコンパイラーマク&lt;br /&gt;     ロやタイプやクラスなどに関する束縛。&lt;br /&gt;  &lt;br /&gt;   束縛だけでなく次の情報も保持している。&lt;br /&gt;&lt;br /&gt;   - proclamations(global environmentにおける宣言&lt;br /&gt;     情報)&lt;br /&gt;&lt;br /&gt;***** readerは処理途中に環境を変えられるのか？&lt;br /&gt;&lt;br /&gt; - さて、疑問がひとつでてきた。readしている段階で、&lt;br /&gt;   環境を変えることができるのだろうか？&lt;br /&gt;&lt;br /&gt; - 答えは、「できる」だ。「できる」方法が2つ、いっ&lt;br /&gt;   けんできそうだが、実際は「できない」方法が1つあ&lt;br /&gt;   る。&lt;br /&gt;&lt;br /&gt;   - 「できる」方法、その1。ANSI CLではファイルに&lt;br /&gt;     programを格納しておき、これを読み込むことがで&lt;br /&gt;     きる。このとき、ファイルのtop-levelのformsは、&lt;br /&gt;     順次評価される。すると、先行して評価される&lt;br /&gt;     formsにてthe global environmentの束縛を代入に&lt;br /&gt;     て変更した場合、the global environment自体、&lt;br /&gt;     indefinite scope, indefinite extentなので、そ&lt;br /&gt;     れ以降のformsのread には束縛の新しい値が使われ&lt;br /&gt;     る。例は次のとおり。&lt;br /&gt;&lt;br /&gt;CL-USER&gt; (setq zvar 123)&lt;br /&gt;123&lt;br /&gt;CL-USER&gt; (defparameter *my-rt* (copy-readtable))&lt;br /&gt;*MY-RT*&lt;br /&gt;CL-USER&gt; (set-syntax-from-char #\z #\' *my-rt* *readtable*)&lt;br /&gt;T&lt;br /&gt;CL-USER&gt; zvar&lt;br /&gt;123&lt;br /&gt;CL-USER&gt; (setf *readtable* *my-rt*)&lt;br /&gt;#&amp;lt;readtable @ #x1000e200e2&gt;&lt;br /&gt;CL-USER&gt; zvar&lt;br /&gt;VAR&lt;br /&gt;CL-USER&gt; (setf *readtable* (copy-readtable nil))&lt;br /&gt;#&amp;lt;readtable @ #x1000d041a2&gt;&lt;br /&gt;CL-USER&gt; zvar&lt;br /&gt;123&lt;br /&gt;CL-USER&gt; &lt;br /&gt;&lt;br /&gt;   - 「できない」方法。ANSI CLの実行モデルでは、&lt;br /&gt;     top-levelにあるa lisp objectの評価方法は、その&lt;br /&gt;     lisp objectに含まれる内部構造(lisp objects)を&lt;br /&gt;     順番に評価していくというものだ。この評価順で先&lt;br /&gt;     行しているもの評価結果(または行為)は後続のもの&lt;br /&gt;     の評価に影響を与えうる。よって先行している部分&lt;br /&gt;     でreader にかかわる。dynamic variablesの束縛を&lt;br /&gt;     変更すれば、後続の部分はその新しい束縛をもとに&lt;br /&gt;     動作する。という形で変更可能におもえるが、それ&lt;br /&gt;     は間違い。というのはtop-levelにあるS式は、まる&lt;br /&gt;     ごとreadされてa lisp ojectにした上で、evalに渡&lt;br /&gt;     されるから。なので後続のevalの動作には影響を及&lt;br /&gt;     ぼしうるが、readはもう終わっているので影響しよ&lt;br /&gt;     うがない。例は続き。&lt;br /&gt;&lt;br /&gt;CL-USER&gt; zvar&lt;br /&gt;123&lt;br /&gt;CL-USER&gt; (let* ((*readtable* *my-rt*))&lt;br /&gt;           zvar)&lt;br /&gt;123&lt;br /&gt;CL-USER&gt; &lt;br /&gt;&lt;br /&gt;   - 「できる」方法、その2。できない方法の内部構造&lt;br /&gt;     にて'read'が存在していれば、その'read'の動作は、&lt;br /&gt;     内部構造で先行しているものから影響を受けること&lt;br /&gt;     ができる。例はつづき。&lt;br /&gt;&lt;br /&gt;CL-USER&gt; (let* ((*readtable* *my-rt*))&lt;br /&gt;           (read-from-string "zvar"))&lt;br /&gt;'VAR&lt;br /&gt;4&lt;br /&gt;CL-USER&gt; zvar&lt;br /&gt;123&lt;br /&gt;CL-USER&gt; &lt;br /&gt;&lt;br /&gt;**** evaluator&lt;br /&gt; - ANSI CLにおいて、Evaluationとは、programの実行手&lt;br /&gt;   順というか実行のあり様を指す言葉である。ここでい&lt;br /&gt;   う'program'の形態は主に2種類あり、ひとつは&lt;br /&gt;   readerが返すlisp objects(これをevaluationの観点&lt;br /&gt;   ではformsと呼ぶ)、もうひとつは、compilerにて処理&lt;br /&gt;   済みのcompiled codeである。&lt;br /&gt; - Common Lispの意味論は、lisp objects(forms) に対&lt;br /&gt;   して定義されている。それをベースにて、compiler&lt;br /&gt;   やcompiled codeの意味論が記述されている。&lt;br /&gt; - なお、ANSI CLにはevaluatorという用語はめったに出&lt;br /&gt;   てこない(稀に本文内に出現する)。もっぱら&lt;br /&gt;   evaluationが使われている。しかし、個人的には、&lt;br /&gt;   reader、compiler、というように並べると、&lt;br /&gt;   evaluatorが自然に思える。もしかしたら、&lt;br /&gt;   evaluatorと言わずにevaluationと言うところに機微&lt;br /&gt;   があるのかもしれない。いやあるのだろう。そのこと&lt;br /&gt;   も今回探ってみたい。&lt;br /&gt;&lt;br /&gt;***** そもそも環境ってどんなもの？&lt;br /&gt;****** 環境と環境オブジェクト&lt;br /&gt; - ANSI CLには、環境(environments)と環境オブジェク&lt;br /&gt;   ト(environment objects)が登場する。&lt;br /&gt; - 処理系の内部では、環境は環境オブジェクトによっ&lt;br /&gt;   て実現されていると思うかもしれない。しかし仕様&lt;br /&gt;   はそこまでは求めていない。もちろん、そうしても&lt;br /&gt;   よいのだが。&lt;br /&gt; - 環境オブジェクトはマクロ関連の関数で引数として&lt;br /&gt;   関数を渡す際の形態として使われるだけである。&lt;br /&gt; - よって、環境という概念は「ANSI CL programの意味&lt;br /&gt;   を説明するための概念」にすぎない。違う言い方をす&lt;br /&gt;   ると、意味論の用語、である。&lt;br /&gt; - なお、ANSI CLにおいて、環境オブジェクト&lt;br /&gt;   は、'lexical environments'を表現するものとして&lt;br /&gt;   定義されている。dynamic environmentsを表現でき&lt;br /&gt;   るかどうかについては記述はない。&lt;br /&gt;****** 束縛って？&lt;br /&gt; - 束縛(a binding)とは、名前(a name)と、その名前が&lt;br /&gt;   指すもの(that which the name denotes)とのつなが&lt;br /&gt;   り(an association)のこと。&lt;br /&gt; - 束縛(bindings)がどこに存在するかというと、それは&lt;br /&gt;   a lexical environmentまたはa dynamic&lt;br /&gt;   environmentの中に、である。&lt;br /&gt;   それらenvironmentsにおいて、束縛は「確立される」&lt;br /&gt;   (are estabilished)と言う。&lt;br /&gt; - special operators(の一部)のみが、束縛の確立を実&lt;br /&gt;   行できる。&lt;br /&gt;****** 環境、束縛と名前空間&lt;br /&gt; - 環境は、まず名前空間で区分けされる。名前空間が異&lt;br /&gt;   なるなら、ひとつの環境の中に同じ名前に関する束縛&lt;br /&gt;   が複数存在してもよい。ただし、ひとつの名前空間&lt;br /&gt;   でとある名前に関する束縛は単一でなければならな&lt;br /&gt;   い。&lt;br /&gt; - 名前空間はパッケージで定義する。&lt;br /&gt;&lt;br /&gt;***** evaluatorにおける環境の分類&lt;br /&gt;****** the global environment&lt;br /&gt; - "the global environment for evaluation is that&lt;br /&gt;   part of an environment that contains ..." すなわ&lt;br /&gt;   ち、環境の一部として存在するのだな。&lt;br /&gt; - the global environmentにおける束縛は、'indefinite&lt;br /&gt;   scope'かつ'indefinite extent'。&lt;br /&gt; - 主に次のものを含む。&lt;br /&gt;   - bindings&lt;br /&gt;     - dynamic variables&lt;br /&gt;     - constant variables&lt;br /&gt;     - functions&lt;br /&gt;     - macros&lt;br /&gt;     - special operators&lt;br /&gt;     - compiler macros&lt;br /&gt;     - type names&lt;br /&gt;     - class names&lt;br /&gt;   - proclamations&lt;br /&gt;****** dynamic environments for evaluation&lt;br /&gt; - "A dynamic environment for evaluation is that&lt;br /&gt;   part of an environment that contains ..." すなわ&lt;br /&gt;   ち、これまた環境の一部として存在するのだな。&lt;br /&gt; - (ここ重要) dynamic environmentsにおける束縛の特&lt;br /&gt;   徴。&lt;br /&gt;   - 束縛を確立するlisp formを実行(execute)すると&lt;br /&gt;     きに、&lt;br /&gt;   - 束縛の開始点と終了点の間だけその束縛は存在す&lt;br /&gt;     る。&lt;br /&gt;   - 原文: "A dynamic environment for evaluation&lt;br /&gt;     is that part of an environment that contains&lt;br /&gt;     bindings whose duration is bounded by points&lt;br /&gt;     of establishment and desestablishment within&lt;br /&gt;     the execution of the form that established&lt;br /&gt;     the binding."&lt;br /&gt; - 主に次のものを含む。&lt;br /&gt;   - bindings&lt;br /&gt;     - dynamic variables&lt;br /&gt;   - active catch tags&lt;br /&gt;   - exit points (established by unwind-protect)&lt;br /&gt;   - active handlers and restarts&lt;br /&gt;****** lexical environments for evaluation&lt;br /&gt; - "A lexical environment for evaluation at some&lt;br /&gt;   position in a program is that part of the&lt;br /&gt;   environment that contains information having&lt;br /&gt;   lexical scope within the forms containing that&lt;br /&gt;   position." レキシカルもこれまた環境の一部なのだ&lt;br /&gt;   が、the globalやdynamicsとはちょっと趣が違う。&lt;br /&gt; - the globalやdynamicsと趣が違うのは、このレキシカ&lt;br /&gt;   ルの定義が束縛(bindings)という言葉を含んでいない&lt;br /&gt;   からだ。そしてスコープという、the globalや&lt;br /&gt;   dynamicsの定義に含まれていない用語を使っている。&lt;br /&gt; - (ここ重要) lexical environmentsにおける束縛の特&lt;br /&gt;   徴。&lt;br /&gt;   - まず、lexical scopeの定義。&lt;br /&gt;     - その前にscopeの定義。a scopeとは、&lt;br /&gt;       - コードの文字面の領域である。&lt;br /&gt;       - ただし、すべての文字面の領域をa scopeと呼&lt;br /&gt;         ぶのではなく、&lt;br /&gt;         - その中で、lisp objects、bindings、exit&lt;br /&gt;           points、tagsへの参照が発生するようなもの&lt;br /&gt;           ことを呼ぶ。(参照は、通常、名前を使って&lt;br /&gt;           実施される)&lt;br /&gt;         - 前項を別の言葉で言うと、「環境が発生す&lt;br /&gt;           るようなもの」である。&lt;br /&gt;     - では、lexical scopeは？&lt;br /&gt;       - scopeの一種である。&lt;br /&gt;       - ただしその範囲は、束縛を確立するformの文&lt;br /&gt;         字面の範囲に限られる。&lt;br /&gt;  - では、lexical environmentsにおける束縛の特徴は？&lt;br /&gt;    と言うと、このlexical spcopeの定義がそのままあ&lt;br /&gt;    てはまる。&lt;br /&gt;  - ちょっと疑問。これはstatic scopeということは言っ&lt;br /&gt;    ているが、indefinite extentということは言って&lt;br /&gt;    いないような。それともこれだけでそれがimplyさ&lt;br /&gt;    れるのかなぁ。&lt;br /&gt; - 主に次のものを含む。&lt;br /&gt;   - bindings&lt;br /&gt;     - lexical variables&lt;br /&gt;     - symbol macros&lt;br /&gt;     - functions&lt;br /&gt;     - macros&lt;br /&gt;     - block tags&lt;br /&gt;     - go tags&lt;br /&gt;   - declarations&lt;br /&gt;&lt;br /&gt;******** the null lexical environment&lt;br /&gt; - 'the null lexical environment'は、'the global&lt;br /&gt;   environment'と同義である。&lt;br /&gt; - 環境を求める文脈では、'nil'はthe null lexical&lt;br /&gt;   environmentを指す。&lt;br /&gt;&lt;br /&gt;***** evaluatorにおける環境の利用&lt;br /&gt; - では、evaluatorによって環境はどのように利用され&lt;br /&gt;   ているのだろうか。それをThe Evaluation Modelに&lt;br /&gt;   したがって確認していこう。&lt;br /&gt;&lt;br /&gt;***** The Evaluation Modelに沿って&lt;br /&gt; - ANSI CLにて「programを実行する」とは、lisp&lt;br /&gt;   formsを評価することである。評価にあたっては、レ&lt;br /&gt;   キシカル、ダイナミックまたはグローバル環境を考&lt;br /&gt;   慮する(with respect to)。&lt;br /&gt; - lisp formsは3つに分類できる。symbols、consesと&lt;br /&gt;   self-evaluating objectsである。これら毎に評価手&lt;br /&gt;   順が定義されている。&lt;br /&gt;&lt;br /&gt;****** Symbols&lt;br /&gt; - a symbolは、a symbol macroかa variableであると解&lt;br /&gt;   釈され、評価結果を返す。&lt;br /&gt; - a symbol macroであるかどうかは、the current&lt;br /&gt;   lexical environmentにて、そのsymbolがa symbol&lt;br /&gt;   macroとしての束縛を持つ場合である。&lt;br /&gt; - a symbol macroではない場合は、the name of a&lt;br /&gt;   variableと解釈されて、the value of a variableを&lt;br /&gt;   返す。&lt;br /&gt; - ところで、variableって何だ、というと、それは束縛&lt;br /&gt;   のうちで"variable"名前空間に属するもののことだ。&lt;br /&gt;   なので、束縛の一部と考えてもよい。ただし、&lt;br /&gt;   "bindings of lexical variables"という表現もある&lt;br /&gt;   ことに注意。&lt;br /&gt; - symbolsの評価の観点では、variablesは3つに分類で&lt;br /&gt;   きる。lexical variables 、dynamic variablesと&lt;br /&gt;   constant variablesだ。&lt;br /&gt;******** symbol macrosの例&lt;br /&gt;CL-USER&gt; (let ((a '(1 2 3))&lt;br /&gt;               (sec 'hoge))&lt;br /&gt;           (print sec)&lt;br /&gt;           (symbol-macrolet ((sec (second a)))&lt;br /&gt;             (print sec)&lt;br /&gt;             (let ((x 1))&lt;br /&gt;               (print sec)&lt;br /&gt;               (values))))&lt;br /&gt;&lt;br /&gt;HOGE &lt;br /&gt;2 &lt;br /&gt;2 ; No value&lt;br /&gt;CL-USER&gt; &lt;br /&gt;&lt;br /&gt;******* Lexical Variables&lt;br /&gt; - 特徴を列挙する。&lt;br /&gt;   - 確立&lt;br /&gt;     - 方法は一種類。&lt;br /&gt;       - なんらかのspecial formによって、lexical&lt;br /&gt;         variablesは確立される。(ここでは、確立の役&lt;br /&gt;         割を担うspecial formをthe formと呼ぶ)。&lt;br /&gt;   - 束縛の生成&lt;br /&gt;     - the formは、評価されるたびに、freshな束縛&lt;br /&gt;       (lexical variables)を生成する。確立と併わせ&lt;br /&gt;       て別の言い方をすると、lexical variablesは確&lt;br /&gt;       立と束縛が同時に実行され、束縛は確立毎にユ&lt;br /&gt;       ニークである。&lt;br /&gt;     - a lexical variableは常に値を持つ。'unbound'&lt;br /&gt;       という状態は存在しない。別の言い方をすると、&lt;br /&gt;       束縛を生成しない限りlexical variablesは存在&lt;br /&gt;       しない。&lt;br /&gt;   - extent&lt;br /&gt;     - lexical variablesの定義には「lexical&lt;br /&gt;       bindings は indefinite extentである」ことの&lt;br /&gt;       記述は存在しない。それ以前に、extentに関す&lt;br /&gt;       る記述が存在しない。それは'Closures and&lt;br /&gt;       Lexical Binding'の節で説明されている。&lt;br /&gt;   - 参照認定&lt;br /&gt;     - a variableがa lexical variableであると認定&lt;br /&gt;       されるのは次の条件を満すときである。&lt;br /&gt;       - the formのlexical scopeの内側にて、a&lt;br /&gt;         symbol がa variableであると解釈されるとき、&lt;br /&gt;         the symbol のnameがthe lexical variable&lt;br /&gt;         nameと同じならば、the lexical variableへの&lt;br /&gt;         参照とみなされる。これが基本。&lt;br /&gt;     - shadowing&lt;br /&gt;       - the formのlexical scopeの内部にて、他の&lt;br /&gt;         form(another formと呼ぶ)によって同じnameに&lt;br /&gt;         ついてshadowされているということがある。こ&lt;br /&gt;         のときそのnameはthe formのbindingではなく、&lt;br /&gt;         another formのbindingを参照していると認定&lt;br /&gt;         される。shadowを実現するformは二種類存在&lt;br /&gt;         する。&lt;br /&gt;         - lexical variablesを確立するforms。&lt;br /&gt;         - locally declares the name specialする&lt;br /&gt;           forms。&lt;br /&gt;   - 環境&lt;br /&gt;     - lexical variablesの束縛はlexical&lt;br /&gt;       environments に格納される。&lt;br /&gt;&lt;br /&gt;******** 例&lt;br /&gt;&lt;br /&gt;CL-USER&gt; ; lexical variablesを確立するspecial&lt;br /&gt;         ; operatorsの例。&lt;br /&gt;; No value&lt;br /&gt;CL-USER&gt; (let ((x 0))&lt;br /&gt;           x)&lt;br /&gt;0&lt;br /&gt;CL-USER&gt; ; lexical variablesでは、毎回 freshな束縛&lt;br /&gt;         ; が生成される例。&lt;br /&gt;; No value&lt;br /&gt;CL-USER&gt; (defun hoge ()&lt;br /&gt;           (let ((x 0))&lt;br /&gt;             (values #'(lambda () x)&lt;br /&gt;                     #'(lambda (y) (incf x y)))))&lt;br /&gt;HOGE&lt;br /&gt;CL-USER&gt; (multiple-value-bind (g s)&lt;br /&gt;             (hoge)&lt;br /&gt;           (setf (symbol-function 'g1) g)&lt;br /&gt;           (setf (symbol-function 's1) s))&lt;br /&gt;#&amp;lt;Interpreted Closure (:INTERNAL HOGE) @ #x1000e4fc62&gt;&lt;br /&gt;CL-USER&gt; (multiple-value-bind (g s)&lt;br /&gt;             (hoge)&lt;br /&gt;           (setf (symbol-function 'g2) g)&lt;br /&gt;           (setf (symbol-function 's2) s))&lt;br /&gt;#&amp;lt;Interpreted Closure (:INTERNAL HOGE) @ #x1000e6c1f2&gt;&lt;br /&gt;CL-USER&gt; (g1)&lt;br /&gt;0&lt;br /&gt;CL-USER&gt; (s1 3)&lt;br /&gt;3&lt;br /&gt;CL-USER&gt; (g1)&lt;br /&gt;3&lt;br /&gt;CL-USER&gt; (g2)&lt;br /&gt;0&lt;br /&gt;CL-USER&gt; (s2 100)&lt;br /&gt;100&lt;br /&gt;CL-USER&gt; (g2)&lt;br /&gt;100&lt;br /&gt;CL-USER&gt; (g1)&lt;br /&gt;3&lt;br /&gt;CL-USER&gt; ; dynamic variablesでは、毎回 freshな束縛&lt;br /&gt;         ;  は生成されない例。&lt;br /&gt;; No value&lt;br /&gt;CL-USER&gt; (setq x 0)&lt;br /&gt;0&lt;br /&gt;CL-USER&gt; (defun hoge ()&lt;br /&gt;           (progv '(x) '(0)&lt;br /&gt;             (values #'(lambda () x)&lt;br /&gt;                     #'(lambda (y) (incf x)))))&lt;br /&gt;HOGE&lt;br /&gt;CL-USER&gt; (multiple-value-bind (g s)&lt;br /&gt;             (hoge)&lt;br /&gt;           (setf (symbol-function 'g1) g)&lt;br /&gt;           (setf (symbol-function 's1) s))&lt;br /&gt;#&amp;lt;Interpreted Closure (:INTERNAL HOGE) @ #x1000ea7cc2&gt;&lt;br /&gt;CL-USER&gt; (multiple-value-bind (g s)&lt;br /&gt;             (hoge)&lt;br /&gt;           (setf (symbol-function 'g2) g)&lt;br /&gt;           (setf (symbol-function 's2) s))&lt;br /&gt;#&amp;lt;Interpreted Closure (:INTERNAL HOGE) @ #x1000ec4192&gt;&lt;br /&gt;CL-USER&gt; (g1)&lt;br /&gt;0&lt;br /&gt;CL-USER&gt; (s1 1)&lt;br /&gt;1&lt;br /&gt;CL-USER&gt; (g1)&lt;br /&gt;1&lt;br /&gt;CL-USER&gt; (g2)&lt;br /&gt;1&lt;br /&gt;CL-USER&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;******* Dynamic Variables&lt;br /&gt; - 特徴を列挙する。&lt;br /&gt;   - 確立&lt;br /&gt;     - dynamic variablesに確立の概念は無い。&lt;br /&gt;     - a dynamic variableは、どのprogramからでも何&lt;br /&gt;       時でも参照できる。textualな限定は無いのだ。&lt;br /&gt;   - 束縛の生成&lt;br /&gt;     - なんらかのspecial formによって、dynamic&lt;br /&gt;       variablesの束縛は生成される。そのspecial&lt;br /&gt;       formをthe formと呼ぶ。&lt;br /&gt;     - 束縛が存在するのは、the formを評価している期&lt;br /&gt;       間(区間)だけである。これをdynamic extent と&lt;br /&gt;       呼ぶ。別の言い方をすると、あるnameに関する&lt;br /&gt;       dynamic bindingは、program 実行のどの時点に&lt;br /&gt;       おいても常にせいぜいひとつだけ存在する。&lt;br /&gt;     - 前項の確立と併せて別の言い方をすると、&lt;br /&gt;       dynamic variablesはどのprogramからでも何時で&lt;br /&gt;       も参照可能であるが、参照したときに束縛が存&lt;br /&gt;       在するとは限らない。束縛が存在しないこと&lt;br /&gt;       を'has no value'とか'unbound'などと言う。&lt;br /&gt;   - extent&lt;br /&gt;     - dynamic bindings は dynamic extent であるこ&lt;br /&gt;       とが、dynamic variablesの定義にて明示されて&lt;br /&gt;       いる。&lt;br /&gt;   - 参照認定&lt;br /&gt;     - a variable が a dynamic variableであると認&lt;br /&gt;       定されるのは次の2つの条件のいずれかが成立す&lt;br /&gt;       る場合である。(ここではa variableが持つ名前&lt;br /&gt;       をthe nameと呼ぶ)&lt;br /&gt;       - the nameについてa dynamic bindingを生成す&lt;br /&gt;         るformの内側にいる(textually within)とき。&lt;br /&gt;         (このformをthe formと呼ぶ)&lt;br /&gt;       - the nameがspecial宣言されている&lt;br /&gt;         - locally declare&lt;br /&gt;         - globally proclaim&lt;br /&gt;     - shadowing&lt;br /&gt;       - the form の内側にて、the nameについてa&lt;br /&gt;         lexical bindigを生成するformが存在する場合&lt;br /&gt;         (これをanother formと呼ぶ)、another formの&lt;br /&gt;         内側(textually within)においては、the&lt;br /&gt;         formのa dynamic bindingではなく、another&lt;br /&gt;         formのa lexical bindigを参照していると認&lt;br /&gt;         定される。&lt;br /&gt;&lt;br /&gt;   - 環境&lt;br /&gt;     - dynamic bindingsが発生するのは、dynamic&lt;br /&gt;       envrionmentsやthe global environmentである。&lt;br /&gt;     - the global envionmentにて束縛が発生している&lt;br /&gt;       とき、それを'global variables'と呼ぶことがあ&lt;br /&gt;       るが、それはdynamic variablesと何ら変わりな&lt;br /&gt;       いものである。(違う呼び方をすることがあるだ&lt;br /&gt;       けだよ、という意味だろう)&lt;br /&gt;&lt;br /&gt;******** 例&lt;br /&gt;&lt;br /&gt;CL-USER&gt; ; locally declaredの例&lt;br /&gt;; No value&lt;br /&gt;CL-USER&gt; (setq x 0)&lt;br /&gt;0&lt;br /&gt;CL-USER&gt; (let ((x 1))&lt;br /&gt;           (print x)&lt;br /&gt;           (locally (declare (special x))&lt;br /&gt;             (print x)))&lt;br /&gt;&lt;br /&gt;1 &lt;br /&gt;0 0&lt;br /&gt;CL-USER&gt; ; globally proclaimedの例&lt;br /&gt;; No value&lt;br /&gt;CL-USER&gt; (setq *x* 10&lt;br /&gt;               x 10)&lt;br /&gt;10&lt;br /&gt;CL-USER&gt; (let ((*x* 100)&lt;br /&gt;               (x 100))&lt;br /&gt;           (print (symbol-value '*x*))&lt;br /&gt;           (print (symbol-value 'x)))&lt;br /&gt;&lt;br /&gt;100 &lt;br /&gt;10 10&lt;br /&gt;CL-USER&gt; ; special formsによって確立する例。&lt;br /&gt;; No value&lt;br /&gt;CL-USER&gt; (boundp 'z)&lt;br /&gt;NIL&lt;br /&gt;CL-USER&gt; (progv '(z) '(0)&lt;br /&gt;           (boundp 'z))&lt;br /&gt;T&lt;br /&gt;CL-USER&gt; (boundp 'z)&lt;br /&gt;NIL&lt;br /&gt;CL-USER&gt; &lt;br /&gt;&lt;br /&gt;******** 疑問&lt;br /&gt;   - 疑問&lt;br /&gt;     - 'progv'はネストできる。そのときも、dynamic&lt;br /&gt;       bindingはひとつだけ存在すると言えるのだろう&lt;br /&gt;       か。&lt;br /&gt;&lt;br /&gt;CL-USER&gt; (progv '(z) '(1)&lt;br /&gt;           (print z)&lt;br /&gt;           (progv '(z) '(2)&lt;br /&gt;             (print z))&lt;br /&gt;           (print z))&lt;br /&gt;&lt;br /&gt;1 &lt;br /&gt;2 &lt;br /&gt;1 1&lt;br /&gt;CL-USER&gt; &lt;br /&gt;&lt;br /&gt;     - そうか、言えるのだ。内側の'progv'の中で、外&lt;br /&gt;       側の'progv'の束縛を参照する方法は存在しない。&lt;br /&gt;       そのことと束縛はひとつしか存在しないという&lt;br /&gt;       ことは等価である。それがわかりやすい例。&lt;br /&gt;&lt;br /&gt;CL-USER&gt; (progv '(z) '(1)&lt;br /&gt;           (progv '(fn) (list #'(lambda () z))&lt;br /&gt;             (funcall fn)))&lt;br /&gt;1&lt;br /&gt;CL-USER&gt; (progv '(z) '(1)&lt;br /&gt;           (progv '(fn) (list #'(lambda () z))&lt;br /&gt;             (progv '(z) '(2)&lt;br /&gt;               (funcall fn))))&lt;br /&gt;2&lt;br /&gt;CL-USER&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;******* Constant Variables&lt;br /&gt; - 'constant variables'と言うと、矛盾した名称と思&lt;br /&gt;   えるが、別の言い方をすると'named constant'のこ&lt;br /&gt;   とである。&lt;br /&gt; - constant variablesはthe global environmentに格&lt;br /&gt;   納される。&lt;br /&gt;&lt;br /&gt;******* 仮説の検証 その2&lt;br /&gt; - lexical variablesの定義にて、lexical variables&lt;br /&gt;   はその束縛を確立したformのlexical scopeの内側で&lt;br /&gt;   のみ参照可能とあるので、仮説は正しい。&lt;br /&gt; - これでANSI CL的には「the evaluation modelとして&lt;br /&gt;   も、仮説は正しい」と言ってもよいだろう。なので、&lt;br /&gt;   ここでやめるという手もある。しかし、まだthe&lt;br /&gt;   evaluation modelの理解の途中である。一通り理解&lt;br /&gt;   した上で判断しよう。&lt;br /&gt;&lt;br /&gt;****** Conses&lt;br /&gt; - consesは、4つに分類できる。special forms、macro&lt;br /&gt;   forms、function forms、そしてlambda formsだ。&lt;br /&gt; - consesのcarによって、種類を判定する。判定ルール&lt;br /&gt;   は次のとおり(疑似コードにて表記)。&lt;br /&gt;&lt;br /&gt;(cond ((carがsymbol)&lt;br /&gt;       (cond ((carがspecial operator)&lt;br /&gt;              (special formと認定))&lt;br /&gt;             ((carがmacro function)&lt;br /&gt;              (macro formと認定))&lt;br /&gt;             ((carがfunction)&lt;br /&gt;              (function formと認定))))&lt;br /&gt;      ((carが複合form)&lt;br /&gt;       (cond ((carがlambda式)&lt;br /&gt;              (lambda formと認定))&lt;br /&gt;             (t エラー)))&lt;br /&gt;      (t エラー))&lt;br /&gt;&lt;br /&gt; - ここで、carがa symbolのときに'carがほにゃらら'と&lt;br /&gt;   言う部分がどの環境のどこを見ているかという&lt;br /&gt;   と、'the current lexical environment' の&lt;br /&gt;   'Function'名前空間である。&lt;br /&gt; - 4種類ひとつずつ確認していく。&lt;br /&gt;&lt;br /&gt;******* Special Forms&lt;br /&gt; - special formsはまさに環境を操作するための道具で&lt;br /&gt;   である。次のものがspecialformsをつくるspecial&lt;br /&gt;   operatorsの一覧である。環境に対する操作(参照や変&lt;br /&gt;   更)を明示的に含むものにチェックを入れた。&lt;br /&gt;   - [X] block&lt;br /&gt;     - [X] lexical&lt;br /&gt;     - [X] dynamic&lt;br /&gt;   - [-] catch&lt;br /&gt;     - [ ] lexical&lt;br /&gt;     - [X] dynamic&lt;br /&gt;   - [ ] eval-when&lt;br /&gt;     - [ ] lexical&lt;br /&gt;     - [ ] dynamic&lt;br /&gt;   - [-] flet&lt;br /&gt;     - [X] lexical&lt;br /&gt;     - [ ] dynamic&lt;br /&gt;   - [-] go&lt;br /&gt;     - [X] lexical&lt;br /&gt;     - [ ] dynamic&lt;br /&gt;   - [ ] if&lt;br /&gt;     - [ ] lexical&lt;br /&gt;     - [ ] dynamic&lt;br /&gt;   - [-] labels&lt;br /&gt;     - [X] lexical&lt;br /&gt;     - [ ] dynamic&lt;br /&gt;   - [X] let&lt;br /&gt;     - [X] lexical&lt;br /&gt;     - [X] dynamic&lt;br /&gt;   - [X] let*&lt;br /&gt;     - [X] lexical&lt;br /&gt;     - [X] dynamic&lt;br /&gt;   - [ ] load-time-value&lt;br /&gt;     - [ ] lexical&lt;br /&gt;     - [ ] dynamic&lt;br /&gt;   - [X] locally&lt;br /&gt;     - [X] lexical&lt;br /&gt;     - [X] dynamic&lt;br /&gt;   - [-] macrolet&lt;br /&gt;     - [X] lexical&lt;br /&gt;     - [ ] dynamic&lt;br /&gt;   - [ ] mutiple-value-call&lt;br /&gt;     - [ ] lexical&lt;br /&gt;     - [ ] dynamic&lt;br /&gt;   - [ ] multiple-value-prog1&lt;br /&gt;     - [ ] lexical&lt;br /&gt;     - [ ] dynamic&lt;br /&gt;   - [ ] progn&lt;br /&gt;     - [ ] lexical&lt;br /&gt;     - [ ] dynamic&lt;br /&gt;   - [-] progv&lt;br /&gt;     - [ ] lexical&lt;br /&gt;     - [X] dynamic&lt;br /&gt;   - [ ] quote&lt;br /&gt;     - [ ] lexical&lt;br /&gt;     - [ ] dynamic&lt;br /&gt;   - [X] return-from&lt;br /&gt;     - [X] lexical&lt;br /&gt;     - [X] dynamic&lt;br /&gt;   - [X] setq&lt;br /&gt;     - [X] lexical&lt;br /&gt;     - [X] dynamic&lt;br /&gt;   - [-] symbol-macrolet&lt;br /&gt;     - [X] lexical&lt;br /&gt;     - [ ] dynamic&lt;br /&gt;   - [-] tagbody&lt;br /&gt;     - 基本lexicalだが、特殊。'lexical scope'だ&lt;br /&gt;       が'dynamic extent'な振る舞いが定義されてい&lt;br /&gt;       るため。&lt;br /&gt;     - [X] lexical&lt;br /&gt;     - [ ] dynamic&lt;br /&gt;   - [ ] the&lt;br /&gt;     - [ ] lexical&lt;br /&gt;     - [ ] dynamic&lt;br /&gt;   - [-] unwind-protect&lt;br /&gt;     - [ ] lexical&lt;br /&gt;     - [X] dynamic&lt;br /&gt; - 集計&lt;br /&gt;   - 環境に明示的に関連している。[18/23]&lt;br /&gt;     - レキシカル [11/23]&lt;br /&gt;     - ダイナミック [9/23]&lt;br /&gt; - special operatorsの仕様はANSIで固定されている。&lt;br /&gt;   special operatorsをグローバル環境で変更すること&lt;br /&gt;   は、ANSI CLでは禁止されている。&lt;br /&gt; - special operatorsは、処理系組込みで実装してもよ&lt;br /&gt;   いし、マクロで実装してもよい。マクロで実装する&lt;br /&gt;   場合は、同種の機能について別の組込み機能を実装&lt;br /&gt;   している場合などだろう。&lt;br /&gt; - いずれにしても、special operatorsがspecial&lt;br /&gt;   operatorsたる所以は、その動作が関数やマクロでは&lt;br /&gt;   実現できないような特殊な振舞をそれぞれ固有に含&lt;br /&gt;   んでいることだろう。&lt;br /&gt; - なので、環境との兼ね合いがどうなのかは、special&lt;br /&gt;   operatorsを個別に調べるしかない。&lt;br /&gt; - special operatorsの振舞自体は、日頃のプログラミ&lt;br /&gt;   ングにて周知のことと思うのでここでは割愛。&lt;br /&gt;&lt;br /&gt;******* Macro Forms&lt;br /&gt; - macro formsについての評価手順。&lt;br /&gt;   - the current lexical environmentからcarの&lt;br /&gt;     symbolのnameに束縛されている関数を取得する。&lt;br /&gt;     これには'macro-function'を使う。&lt;br /&gt;   - そこで得られた関数は2引数であり、最初の引数は、&lt;br /&gt;     macro form全体を受け取り、2つめの引数は、the&lt;br /&gt;     current lexical environmentに対応したan&lt;br /&gt;     environment objectを受け取る。&lt;br /&gt;   - この関数のことを展開関数(the expansion&lt;br /&gt;     function)と言う。&lt;br /&gt;   - 展開関数は直接呼出されるのではなく、マクロ展&lt;br /&gt;     開フックという関数を経由して呼出される。&lt;br /&gt;   - マクロ展開フックの関数オブジェクトは、&lt;br /&gt;     *macroexpand-hook*に束縛されている(ゆえにプロ&lt;br /&gt;     グラマが変更可能)。&lt;br /&gt;   - マクロ展開フック(の関数オブジェクト)の引数は、&lt;br /&gt;     展開関数の引数に、展開関数の名前を加えたもの&lt;br /&gt;     であり、3つである。&lt;br /&gt;   - マクロ展開フックが返すのは、マクロ展開関数が&lt;br /&gt;     macro form全体をthe current lexical&lt;br /&gt;     environmentを考慮しながら変換したformである。&lt;br /&gt;   - そのformを再度(というか、再帰的というか再入的&lt;br /&gt;     というか)に評価する。&lt;br /&gt; - 余談&lt;br /&gt;   - このMacroを'evaluator macro'と呼ぶことにする&lt;br /&gt;     と、'reader macro'、'evaluator macro' 、&lt;br /&gt;     'compiler macro'と3つ揃い踏みとなり、分かりや&lt;br /&gt;     すい。&lt;br /&gt;******** 疑問 その１&lt;br /&gt; - さて、ここで疑問がひとつ。何故、マクロの場合は、&lt;br /&gt;   環境オブジェクトを渡してあげるのか？ 'eval'は渡&lt;br /&gt;   さないじゃん、という比較にて疑問がある。特&lt;br /&gt;   に'eval'はformをthe current dynamic environment&lt;br /&gt;   とthe null lexical environmentにて評価する。こ&lt;br /&gt;   の違いは何だろう。&lt;br /&gt;   - まず、'eval'がthe current lexical environment&lt;br /&gt;     にてformを評価するということは、そのeval form&lt;br /&gt;     の中ではthe current lexical environmentを名前&lt;br /&gt;     でいじれるということになのだが、この言明自体、&lt;br /&gt;     冒頭のlexicalとdynamicの例のような局面では意味&lt;br /&gt;     がないということだろう。例を考えてみよう。&lt;br /&gt;&lt;br /&gt;CL-USER&gt; (setq y 10)&lt;br /&gt;10&lt;br /&gt;CL-USER&gt; (defun hoge ()&lt;br /&gt;           (let ((y 0))&lt;br /&gt;             (piyo)))&lt;br /&gt;HOGE&lt;br /&gt;CL-USER&gt; (defun piyo ()&lt;br /&gt;           (eval '(+ 1 y)))&lt;br /&gt;PIYO&lt;br /&gt;CL-USER&gt; (piyo)&lt;br /&gt;11&lt;br /&gt;CL-USER&gt; (hoge)&lt;br /&gt;11&lt;br /&gt;CL-USER&gt; &lt;br /&gt;&lt;br /&gt;   -  詳細は、次の項目であるfunction formsに譲るが、&lt;br /&gt;      (hoge)を評価するとhogeに束縛されている関数オ&lt;br /&gt;      ブジェクト(クロージャ)が実行されるが、そのク&lt;br /&gt;      ロージャが包んでいる環境のスコープは、defun&lt;br /&gt;      formの評価時であり、(hoge)の実行時には束縛に&lt;br /&gt;      対する名前での参照は消失している。よっ&lt;br /&gt;      て、'eval'に渡せるthe current lexical&lt;br /&gt;      environmentは、ここではthe null lexical&lt;br /&gt;      environmentただひとつに過ぎない。&lt;br /&gt;&lt;br /&gt;    - では、the current lexical environmentが存在&lt;br /&gt;      するコード領域にて'eval'を呼んでみよう。&lt;br /&gt;&lt;br /&gt;CL-USER&gt; (setq y 10)&lt;br /&gt;10&lt;br /&gt;CL-USER&gt; (let ((y 0))&lt;br /&gt;           (eval '(+ 1 y)))&lt;br /&gt;11&lt;br /&gt;CL-USER&gt; &lt;br /&gt;&lt;br /&gt;    - やはりこれもthe null lexical environmentを見&lt;br /&gt;      ている。これまでthe nullにするのはなぜか？&lt;br /&gt;      それはFunction formsをやった後に確認する。&lt;br /&gt;   &lt;br /&gt;    - さて、マクロ展開関数の第二引数はどのように指&lt;br /&gt;      定するのだろう。というのは、ANSI CLの範囲では、&lt;br /&gt;      環境を返す仕組みが、special operators、&lt;br /&gt;      macros,functions,のいずれにしても存在しない&lt;br /&gt;      からだ。ANSI CLの例の抜粋は次のとおり。&lt;br /&gt;&lt;br /&gt;CL-USER&gt; (defmacro alpha (x y) `(beta ,x ,y))&lt;br /&gt;ALPHA&lt;br /&gt;CL-USER&gt; (defmacro beta (x y) `(gamma ,x ,y))&lt;br /&gt;BETA&lt;br /&gt;CL-USER&gt; (defmacro expand-1 (form &amp;environment env)&lt;br /&gt;           (multiple-value-bind (expansion expanded-p)&lt;br /&gt;               (macroexpand-1 form env)&lt;br /&gt;             `(values ',expansion ',expanded-p)))&lt;br /&gt;EXPAND-1&lt;br /&gt;CL-USER&gt; (macroexpand-1 '(alpha a b))&lt;br /&gt;(BETA A B)&lt;br /&gt;T&lt;br /&gt;CL-USER&gt; (expand-1 (alpha a b))&lt;br /&gt;(BETA A B)&lt;br /&gt;T&lt;br /&gt;CL-USER&gt; (macrolet ((alpha (x y) `(delta ,x ,y)))&lt;br /&gt;           (macroexpand-1 '(alpha a b)))&lt;br /&gt;(BETA A B)&lt;br /&gt;T&lt;br /&gt;CL-USER&gt; (macrolet ((alpha (x y) `(delta ,x ,y)))&lt;br /&gt;           (expand-1 (alpha a b)))&lt;br /&gt;(DELTA A B)&lt;br /&gt;T&lt;br /&gt;CL-USER&gt;&lt;br /&gt;&lt;br /&gt;     - これ、macroexpand-1もenvironmentを&amp;optional&lt;br /&gt;       で引数にとるのに、何でマクロでくるんであげ&lt;br /&gt;       る必要があるのだろう？&lt;br /&gt;     - そうか、次の演繹が成り立つのだろう。&lt;br /&gt;       - environment objectsを取り出す方法は存在し&lt;br /&gt;         ない。&lt;br /&gt;       - それが引数として渡されるのは、マクロ展開関&lt;br /&gt;         数を呼出すとき(に勝手に処理系内部で行われ&lt;br /&gt;         る)だけである。&lt;br /&gt;       - macroexpand-1は関数である。ゆえに&lt;br /&gt;         macroexpand-1の呼出しにはマクロ展開関数呼&lt;br /&gt;         出し機構は関与しない。&lt;br /&gt;       - 関与させるには、マクロとしてラップしてあ&lt;br /&gt;         げればよい。&lt;br /&gt;     - 付随的な知見として、開発時にREPL上で&lt;br /&gt;       macroexpand-1でマクロを展開させているのは、&lt;br /&gt;       ソースの中で実際に行われる展開とは異なる文脈&lt;br /&gt;       (lexical scope)なので、展開結果は必ずしも一&lt;br /&gt;       致しないということを理解した。アタリマエ、な&lt;br /&gt;       んだけど、明確には捉えていなかった。&lt;br /&gt;&lt;br /&gt;******** 疑問 その２&lt;br /&gt; - この評価手順ならば、macro formsの展開は、評価時&lt;br /&gt;   に順次行われるということであり、macroexpand&lt;br /&gt;   hook がマクロ展開関数に渡す環境も評価時の&lt;br /&gt;   lexical environmentである。すると、いわゆる「マ&lt;br /&gt;   クロ展開時(macroexpansion-time)は実行時&lt;br /&gt;   (run-time)とは使える情報(環境)が異なるので注意が&lt;br /&gt;   必要」というのはThe Evaluation Modelには存在しな&lt;br /&gt;   いのだろうか。&lt;br /&gt; - おそらく、異なるというのはcompilerにおいてなの&lt;br /&gt;   だろうとは思う。しかし、ANSI CLの意味論の基礎が&lt;br /&gt;   The Evaluation Modelにあるとしたら、それと&lt;br /&gt;   compiled codeに差異があっては意味が二重になって&lt;br /&gt;   しまうのでは？という不安がある。&lt;br /&gt; - これはcompilerのところで確認しよう。&lt;br /&gt;&lt;br /&gt;******* Function Forms&lt;br /&gt; - function formsのルールは単純。&lt;br /&gt; - functionの束縛はthe current lexical environment&lt;br /&gt;   のものを使うこと。&lt;br /&gt; - 引数を先に評価すること。&lt;br /&gt; - 引数は左から右に評価すること。&lt;br /&gt;&lt;br /&gt; - 一点、処理系依存となっている曖昧さがある。それは、&lt;br /&gt;   functionの束縛を参照するのが、引数を評価する前&lt;br /&gt;   なのか後なのか、ということだ。例は次のとおり。&lt;br /&gt;&lt;br /&gt;CL-USER&gt; (defun foo (x) (+ x 3))&lt;br /&gt;FOO&lt;br /&gt;CL-USER&gt; (defun bar () (setf (symbol-function 'foo) #'(lambda (x (+ x 4)))))&lt;br /&gt;BAR&lt;br /&gt;CL-USER&gt; (foo (progn (bar) 20))&lt;br /&gt;23&lt;br /&gt;CL-USER&gt; &lt;br /&gt;&lt;br /&gt; - これは23になる処理系と24になる処理系がある(あっ&lt;br /&gt;   てよい)。ここではAllegro CLを使用している。&lt;br /&gt;&lt;br /&gt;******* Lambda Forms&lt;br /&gt; - lambda formのルールも単純。&lt;br /&gt; - 基本的には、lambda式をa lexical closureにした後&lt;br /&gt;   で、funcallしていると考えればよい。その後は&lt;br /&gt;   function formsと同じ。(lexical closuresについて&lt;br /&gt;   は、'Closures and Lexical Binding'にて導入。&lt;br /&gt; - lambda式をa lexical closureにするところで、&lt;br /&gt;   lambda-listに従って束縛が生成され、それはlambda&lt;br /&gt;   式の本体を評価する際のthe current lexical&lt;br /&gt;   environmentとなる。&lt;br /&gt;&lt;br /&gt;****** Self-evaluating Objects&lt;br /&gt; - symbolsでもconsesでも無いformはself-evaluation&lt;br /&gt;   objectsである。別の言い方をすると、評価対象が、&lt;br /&gt;   symbolsでもconsesでもself-evaluation objectsで&lt;br /&gt;   も無ければエラーとなる。&lt;br /&gt; - まあ、これは環境とは関係ないですね。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;****** Closures and Lexical Binding&lt;br /&gt; - まず、a lexical closure と a closure は同義であ&lt;br /&gt;   る。&lt;br /&gt; - では、a lexical closure とは何か。&lt;br /&gt; - a lexical closure の定義&lt;br /&gt;   - 関数の一種である。&lt;br /&gt;   - 関数定義(bodyのこと)を文面上内包する&lt;br /&gt;     (textually include) lexical bindingsが存在する。&lt;br /&gt;     ここでは、そのlexical bindingsをthe bindingsと&lt;br /&gt;     呼ぶことにする。&lt;br /&gt;   - closureはthe bindingsの値を参照したり変更した&lt;br /&gt;     りすることができる。ここ重要。「the bindingsの&lt;br /&gt;     名前については言及していない」&lt;br /&gt; - ANSI CLのかきぶりは、「lexical environments&lt;br /&gt;   が'indefinite extent'である」というものではなく、&lt;br /&gt;   「Closures が lexical bindings を参照/変更でき&lt;br /&gt;   る」というものである。&lt;br /&gt; - まあ、lexical scopeの外側でlexical bindingsを参&lt;br /&gt;   照/変更する方法がclosuresしかないならば、意味す&lt;br /&gt;   るところは同じなのですが。&lt;br /&gt;&lt;br /&gt;***** 仮説の検証 その3&lt;br /&gt;&lt;br /&gt; - Macro formsの機構によれば、macroexpansion hookを&lt;br /&gt;   つかって環境をlexical scope外にひきずりだすこと&lt;br /&gt;   ができる。&lt;br /&gt;&lt;br /&gt;CL-USER&gt; (defmacro extract (form &amp;environment env)&lt;br /&gt;           (setf *env* env))&lt;br /&gt;EXTRACT&lt;br /&gt;CL-USER&gt; (let ((x 1))&lt;br /&gt;           (extract 'a))&lt;br /&gt;#&amp;lt:Augmentable INTERPRETER environment 1&gt;&lt;br /&gt;CL-USER&gt; &lt;br /&gt;&lt;br /&gt; - また、macro expanderが環境を捕捉するなら、&lt;br /&gt;   lexical scopeの中で'symbol-value'のかわりにマク&lt;br /&gt;   ロをつかって名前で値を取得でき&lt;br /&gt;   るのではないか。&lt;br /&gt;&lt;br /&gt;CL-USER&gt; (setq x 0)&lt;br /&gt;0&lt;br /&gt;CL-USER&gt; (let ((x 1))&lt;br /&gt;           (symbol-value (find-symbol (string-upcase "x"))))&lt;br /&gt;0&lt;br /&gt;CL-USER&gt; (let ((x 1))&lt;br /&gt;           (macrolet ((lex-var-value (not-used)&lt;br /&gt;                        (find-symbol (string-upcase "x"))))&lt;br /&gt;             (lex-var-value t)))&lt;br /&gt;1&lt;br /&gt;CL-USER&gt; &lt;br /&gt;&lt;br /&gt; - お、できる。&lt;br /&gt; - これはきっかけのお題の解の一部ではある。しかし、&lt;br /&gt;   仮説の反例にはなっていない。&lt;br /&gt; - この2つを組みあわせて、lexical scopeを越えて、名&lt;br /&gt;   前でアクセスできるか？&lt;br /&gt;&lt;br /&gt;CL-USER&gt; (let ((*macroexpand-hook*&lt;br /&gt;                #'(lambda (expander form env)&lt;br /&gt;                    (funcall expander form *env*))))&lt;br /&gt;           (macrolet ((lex-var-value (not-used)&lt;br /&gt;                        (find-symbol (string-upcase "x"))))&lt;br /&gt;             (lex-var-value t)))&lt;br /&gt;0&lt;br /&gt;CL-USER&gt; &lt;br /&gt;&lt;br /&gt; - できない。。。*env*がうまくわたせているのかどう&lt;br /&gt;   かをAllegroの環境IF(処理系機能)で確認すると。&lt;br /&gt;&lt;br /&gt;CL-USER&gt; (let ((*macroexpand-hook*&lt;br /&gt;                #'(lambda (expander form env)&lt;br /&gt;                    (funcall expander form *env*))))&lt;br /&gt;           (macrolet ((lex-var-value (not-used &amp;environment env)&lt;br /&gt;                        (multiple-value-bind (scope locative-cons)&lt;br /&gt;                            (sys:variable-information 'x env)&lt;br /&gt;                          (car locative-cons))))&lt;br /&gt;             (lex-var-value t)))&lt;br /&gt;1&lt;br /&gt;CL-USER&gt; &lt;br /&gt;&lt;br /&gt; - *env*に変更はできているようだ。しかしマクロ展開&lt;br /&gt;   関数に使われないという不思議な状況。&lt;br /&gt; - ANSI CLを確認すると、'3.8.15&lt;br /&gt;   *macroexpansion-hook*'に次のような記述があった。&lt;br /&gt;&lt;br /&gt;   'The environment object has dynamic extent; the&lt;br /&gt;   consequences are undefined if the environment&lt;br /&gt;   object is referred to outside the dynamic&lt;br /&gt;   extent of the macro expansion function.'&lt;br /&gt;&lt;br /&gt;   ということは、Allegroでは、macro expansion&lt;br /&gt;   functionの呼出しを使って、specialたる*env*に&lt;br /&gt;   Environment Objectを束縛してひきづり出せたが、こ&lt;br /&gt;   のこと自体、ANSI CLでは保証されていないということ&lt;br /&gt;   だし、それをextent外で使用した場合の動作は不定&lt;br /&gt;   ということだろう。&lt;br /&gt;&lt;br /&gt; - というわけで、引き続き仮説は正しい。&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;さて、この後、compiler、CLtL2、処理系独自対応などを調べているところで力尽きました。。。&lt;br /&gt;いや、正確には、飽きました。。。&lt;br /&gt;&lt;br /&gt;それらの話題は、またモチベーションが上がったときに書いてみたいと思います。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-2833199728576635706?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/2833199728576635706/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=2833199728576635706' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/2833199728576635706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/2833199728576635706'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2009/12/common-lisp.html' title='Common Lispのレキシカルスコープを調べる'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-6945649034489838312</id><published>2009-12-21T06:13:00.005+09:00</published><updated>2009-12-22T03:35:50.956+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><category scheme='http://www.blogger.com/atom/ns#' term='Elisp'/><title type='text'>Common LispとEmacs Lispの違い [関数のあたり]</title><content type='html'>というわけで、Prolog on Emacsの完成を目指して、Common LispとEmacs Lispのスコープ関係の違いを確認してみようと思う。&lt;br /&gt;スコープ自体は、Common Lispがレキシカルとダイナミックの両用で、Emacs Lispはダイナミックのみというだけでさして難しくはないのだが、では、言語の中のいろいろな機構の振舞いはそれによってどういう違いがあるかというと、また別の話である。&lt;br /&gt;&lt;br /&gt;まず、関数のあたりから調べてみよう。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;* 関数のあたり&lt;br /&gt;** symbolへの格納&lt;br /&gt; - まず、symbolまわりがどうなっているかをなんとな&lt;br /&gt;   く。&lt;br /&gt; - Emacs LispはLisp2であり、インターフェイスも&lt;br /&gt;   Common Lisp風。&lt;br /&gt;&lt;br /&gt;*** Common Lisp の場合&lt;br /&gt;CL-USER&gt; (setq hoge 1)&lt;br /&gt;1&lt;br /&gt;CL-USER&gt; (defun hoge (x) (+ 2 x))&lt;br /&gt;HOGE&lt;br /&gt;CL-USER&gt; hoge&lt;br /&gt;1&lt;br /&gt;CL-USER&gt; (hoge 3)&lt;br /&gt;5&lt;br /&gt;CL-USER&gt; (symbol-value 'hoge)&lt;br /&gt;1&lt;br /&gt;CL-USER&gt; (symbol-function 'hoge)&lt;br /&gt;#&amp;lt;Interpreted Function HOGE&gt;&lt;br /&gt;CL-USER&gt; (compile 'hoge)&lt;br /&gt;HOGE&lt;br /&gt;NIL&lt;br /&gt;NIL&lt;br /&gt;CL-USER&gt; (symbol-function 'hoge)&lt;br /&gt;#&amp;lt;Function HOGE&gt;&lt;br /&gt;CL-USER&gt; &lt;br /&gt;&lt;br /&gt;*** Emacs Lisp の場合&lt;br /&gt;(setq hoge 1)&lt;br /&gt;(defun hoge (x)&lt;br /&gt;  (+ 2 x))&lt;br /&gt;hoge ; =&gt; 1&lt;br /&gt;(hoge 3) ; =&gt; 5&lt;br /&gt;&lt;br /&gt;(symbol-value 'hoge) ; =&gt; 1&lt;br /&gt;(symbol-function 'hoge) ; =&gt; (lambda (x) (+ 2 x))&lt;br /&gt;(byte-compile 'hoge)&lt;br /&gt;(symbol-function 'hoge) ; =&gt; #[(x) T\207" [x] 1]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;** 関数定義&lt;br /&gt;&lt;br /&gt;*** 'defun'&lt;br /&gt; - 名前をもつ関数を作成する。&lt;br /&gt; - 名前はグローバルになる。&lt;br /&gt;&lt;br /&gt;**** Common Lisp の場合&lt;br /&gt; - マクロ。&lt;br /&gt;&lt;br /&gt;CL-USER&gt; (defun defun-at-global () 'global)&lt;br /&gt;DEFUN-AT-GLOBAL&lt;br /&gt;CL-USER&gt; (defun-at-global)&lt;br /&gt;GLOBAL&lt;br /&gt;CL-USER&gt; (let ((hoge))&lt;br /&gt;           (defun defun-in-let ()&lt;br /&gt;             'let))&lt;br /&gt;DEFUN-IN-LET&lt;br /&gt;CL-USER&gt; (defun-in-let)&lt;br /&gt;LET&lt;br /&gt;CL-USER&gt; &lt;br /&gt;&lt;br /&gt;**** Emacs Lisp の場合&lt;br /&gt; - special form。&lt;br /&gt;&lt;br /&gt;(defun defun-at-global ()&lt;br /&gt;  'global)&lt;br /&gt;(defun-at-global) ; =&gt; global&lt;br /&gt;(let ((hoge))&lt;br /&gt;  (defun defun-in-let ()&lt;br /&gt;    'let))&lt;br /&gt;(defun-in-let) ; =&gt; let&lt;br /&gt;&lt;br /&gt;*** 'lambda'&lt;br /&gt;**** Common Lisp の場合&lt;br /&gt; - lambda formは、リストである。ただし、'lambda'を&lt;br /&gt;   第一要素とするなど、lambda expressionたるリスト&lt;br /&gt;   の構造の規約がある。この意味での'lambda'は単なる&lt;br /&gt;   シンボルである。&lt;br /&gt; - a function name を求める場所に、lambda formを使&lt;br /&gt;   うことができる。(ただし、常に可能というわけでは&lt;br /&gt;   ない) このとき、そのlambda formをlambda&lt;br /&gt;   expressionと言う。lambda expressionは、関数の振&lt;br /&gt;   る舞いを直接表現していると言える。&lt;br /&gt; - lambda formsがよく使われる場所は2つある。ひとつ&lt;br /&gt;   目は、通常の関数呼出し、すなわちリストの第一要&lt;br /&gt;   素として。例えば次のとおり。&lt;br /&gt;&lt;br /&gt;CL-USER&gt; ((lambda (x y) (+ x y)) 1 2)&lt;br /&gt;3&lt;br /&gt;CL-USER&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; - ふたつ目は、'function' special operator の引数と&lt;br /&gt;   して。例えば次のとおり。&lt;br /&gt;&lt;br /&gt;CL-USER&gt; (function (lambda (x) (+ 1 x)))&lt;br /&gt;#&amp;lt;Interpreted Function (unnamed) @ #x1000eec532&gt;&lt;br /&gt;CL-USER&gt; &lt;br /&gt;&lt;br /&gt; - このイディオムのためのリーダーマクロが存在する。&lt;br /&gt;   それが"#'"であり、後続のS式を(function )でくる&lt;br /&gt;   む。&lt;br /&gt;&lt;br /&gt;CL-USER&gt; #'(lambda (x) (+ 1 x))&lt;br /&gt;#&amp;lt;Interpreted Function (unnamed) @ #x1000d2bb22&gt;&lt;br /&gt;CL-USER&gt; &lt;br /&gt;&lt;br /&gt; - また、略記のためのマクロ'lambda'がある。&lt;br /&gt;&lt;br /&gt;CL-USER&gt; (lambda (x) (+ 1 x))&lt;br /&gt;#&amp;lt;Interpreted Function (unnamed) @ #x1000d5a402&gt;&lt;br /&gt;CL-USER&gt; (macroexpand-1 '(lambda (x) (+ 1 x)))&lt;br /&gt;#'(LAMBDA (X) (+ 1 X))&lt;br /&gt;T&lt;br /&gt;CL-USER&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;**** Emacs Lisp の場合&lt;br /&gt; - Emacs Lispでは、lambda expressionsは普通の&lt;br /&gt;   expression (式)であり、評価すると自分自身になる。&lt;br /&gt;   例は次のとおり。&lt;br /&gt;&lt;br /&gt;(lambda (x y) (+ x y)) ; = &gt; (lambda (x y) (+ x y))&lt;br /&gt;&lt;br /&gt; - Emacs Lispでは、関数は、Cで書かれたものと、Lisp&lt;br /&gt;   で書かれたものがある。Lispで書かれたものは、バ&lt;br /&gt;   イトコンパイルされていないものと、バイトコンパ&lt;br /&gt;   イルされているものがある。バイトコンパイルされ&lt;br /&gt;   ていないLisp関数は、全てlambda expressionsで記&lt;br /&gt;   述されている。よって、言語仕様としては、Common&lt;br /&gt;   Lispと比べて、Emacs Lispの方がlambda&lt;br /&gt;   expressionsを関数概念の中心に置いている。多少&lt;br /&gt;   Schemeに近い部分がある(ただしクロージャが無い点&lt;br /&gt;   がずいぶん違う)。&lt;br /&gt;&lt;br /&gt; - lambda expressions はそのままで関数定義なので、&lt;br /&gt;   関数が使えるところならどこでも使え&lt;br /&gt;   る。&lt;br /&gt;&lt;br /&gt;((lambda (x y) (+ x y)) 1 2) ; =&gt; 3&lt;br /&gt;&lt;br /&gt; - 'function'は、基本的には'quote'にすぎない。&lt;br /&gt;&lt;br /&gt;(function (lambda (x y) (+ x y))) ; =&gt; (lambda (x y) (+ x y))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;*** Closures&lt;br /&gt; - Common Lispではクロージャを使える。Emacs Lisp で&lt;br /&gt;   はクロージャは使えない。&lt;br /&gt; - Common Lispでクロージャを生成するには、レキシカ&lt;br /&gt;   ル環境を参照しつつ関数を定義する。Common Lispで&lt;br /&gt;   は、クロージャをレキシカルクロージャやクロージャ&lt;br /&gt;   オブジェクトとも呼ぶ。&lt;br /&gt; - Common Lispでは、クロージャは関数の一種と位置づ&lt;br /&gt;   けられている。&lt;br /&gt;&lt;br /&gt;*** fletとlablels&lt;br /&gt; - Common Lispでは、fletやlabelsを用いて、局所的な&lt;br /&gt;   関数をつくることができる。別の言い方をすると、&lt;br /&gt;   関数の名前をスコーピングできる。&lt;br /&gt; - Emacs Lisp自体では、このような機構は提供されて&lt;br /&gt;   いない。clパッケージにてマクロで提供されている。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;** 'function' special operator/form&lt;br /&gt; - 'function'の振る舞いは'flet'との兼ね合いが重要&lt;br /&gt;   である。&lt;br /&gt;&lt;br /&gt;*** fletとの兼ね合い&lt;br /&gt;**** Common Lisp の場合&lt;br /&gt; - functionは、レキシカル環境で、名前に紐付けられた&lt;br /&gt;   関数オブジェクト(関数定義とも言う)を返すspecial&lt;br /&gt;   operator。文脈によって、symbol-functionとは返す&lt;br /&gt;   ものが異なる。&lt;br /&gt;&lt;br /&gt;CL-USER&gt; (defun hoge (x) (+ 2 x))&lt;br /&gt;HOGE&lt;br /&gt;CL-USER&gt; (flet ((hoge (x) (+ 3 x)))&lt;br /&gt;           (funcall (function hoge) 1))&lt;br /&gt;4&lt;br /&gt;CL-USER&gt; (flet ((hoge (x) (+ 3 x)))&lt;br /&gt;           (funcall (symbol-function 'hoge) 1))&lt;br /&gt;3&lt;br /&gt;CL-USER&gt; &lt;br /&gt;&lt;br /&gt; - 名前に紐付けられた関数定義が存在しない場合、&lt;br /&gt;   functionはエラーをあげる。&lt;br /&gt;&lt;br /&gt;CL-USER&gt; (function hoge)&lt;br /&gt;#&amp;lt;Interpreted Function HOGE&gt;&lt;br /&gt;CL-USER&gt; (function piyo)&lt;br /&gt;; Evaluation aborted.&lt;br /&gt;CL-USER&gt; &lt;br /&gt;&lt;br /&gt;**** Emacs Lisp の場合&lt;br /&gt; - 一方、Emacs Lispでは、fletはマクロである。マクロ&lt;br /&gt;   でシミュレートするにあたって、symbolのfunctionセ&lt;br /&gt;   ルをつかっている。よって、functionと&lt;br /&gt;   symbol-functionの挙動は文脈によらず同じ。&lt;br /&gt;&lt;br /&gt;(defun hoge (x) (+ 2 x))&lt;br /&gt;(flet ((hoge (x) (+ 3 x)))&lt;br /&gt;  (funcall (function hoge) 1)) ; =&gt; 4&lt;br /&gt;(flet ((hoge (x) (+ 3 x)))&lt;br /&gt;  (funcall (symbol-function 'hoge) 1)) ; =&gt; 4&lt;br /&gt;&lt;br /&gt; - functionはspecial form。'function'は、プログラ&lt;br /&gt;   マにとっては'quote'と同じ。コンパイラ&lt;br /&gt;   は、'function'が使われているときはそれは&lt;br /&gt;   Function cellしか使われないことがわかるので、最&lt;br /&gt;   適化ができる。&lt;br /&gt;&lt;br /&gt; - 'quote'と変わらないだけあって、関数定義が存在し&lt;br /&gt;   なくてもエラーにならない。&lt;br /&gt;&lt;br /&gt;(defun hoge () nil)&lt;br /&gt;(setq piyo nil)&lt;br /&gt;(functionp hoge) ; =&gt; t&lt;br /&gt;(functionp piyo) ; =&gt; nil&lt;br /&gt;(function hoge) ; =&gt; hoge&lt;br /&gt;(function piyo) ; =&gt; piyo&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;** funcall&lt;br /&gt;*** Common Lisp の場合&lt;br /&gt; - funcallは関数。引数は、'a function&lt;br /&gt;   designator'。'function designators'は関数を指し&lt;br /&gt;   示すなんらかのLisp Objectsのこと。関数なので、引&lt;br /&gt;   数は eager に評価される。アタリマエだが、評価さ&lt;br /&gt;   れた結果、function designatorsになるものならなん&lt;br /&gt;   でも引数にしてよい。&lt;br /&gt; - function designators&lt;br /&gt;   - 関数オブジェクト&lt;br /&gt;     - この場合、'funcall'は、関数オブジェクトをそ&lt;br /&gt;       のまま使う。&lt;br /&gt;   - シンボル&lt;br /&gt;     - この場合、'funcall'は、global environmentを&lt;br /&gt;       参照して、symbolのfunction cellに格納されて&lt;br /&gt;       いる関数定義を利用する。&lt;br /&gt;&lt;br /&gt; - 関数オブジェクトの例&lt;br /&gt;&lt;br /&gt;CL-USER&gt; (funcall #'car '(1 2 3))&lt;br /&gt;1&lt;br /&gt;CL-USER&gt; (funcall #'(lambda (x y) (+ x y)) 1 2)&lt;br /&gt;3&lt;br /&gt;CL-USER&gt; (funcall (lambda (x y) (+ x y)) 1 2)&lt;br /&gt;3&lt;br /&gt;CL-USER&gt; (setq hoge #'(lambda (x y) (+ x y)))&lt;br /&gt;#&lt;Interpreted Function (unnamed) @ #x1000d4f982&gt;&lt;br /&gt;CL-USER&gt; (funcall hoge 1 2)&lt;br /&gt;3&lt;br /&gt;CL-USER&gt; &lt;br /&gt;&lt;br /&gt; - シンボルの例&lt;br /&gt;&lt;br /&gt;CL-USER&gt; (funcall 'car '(1 2 3))&lt;br /&gt;1&lt;br /&gt;CL-USER&gt; &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;*** Emacs Lisp の場合&lt;br /&gt; - funcallは関数。引数を eager に評価して、評価結&lt;br /&gt;   果によって振舞が違う。&lt;br /&gt;   - 評価結果がシンボルの場合。&lt;br /&gt;     - そのシンボルのfunction cellにある関数定義を&lt;br /&gt;       採用。&lt;br /&gt;   - 評価結果が関数の場合&lt;br /&gt;     - それを採用。関数がLisp系でもC系でも。&lt;br /&gt;   - 例&lt;br /&gt;&lt;br /&gt;(setq hoge (lambda () 'fn-for-value-cell))&lt;br /&gt;(defun hoge ()&lt;br /&gt;  'fn-for-function-cell)&lt;br /&gt;(symbol-value 'hoge) ; =&gt; (lambda () 'fn-for-value-cell)&lt;br /&gt;(symbol-function 'hoge) ; =&gt; (lambda () 'fn-for-function-cell)&lt;br /&gt;(funcall hoge) ; =&gt; fn-for-value-cell&lt;br /&gt;(funcall 'hoge) ; =&gt; fn-for-function-cell&lt;br /&gt;&lt;br /&gt;(symbol-function 'list) ; =&gt; #&amp;lt;subr list&gt;&lt;br /&gt;(funcall (symbol-function 'list) 1 2) ; =&gt; (1 2)&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-6945649034489838312?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/6945649034489838312/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=6945649034489838312' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/6945649034489838312'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/6945649034489838312'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2009/12/common-lispemacs-lisp.html' title='Common LispとEmacs Lispの違い [関数のあたり]'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-7555832659840030719</id><published>2009-12-20T21:41:00.001+09:00</published><updated>2009-12-20T21:48:41.583+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Smiley Hackathon'/><title type='text'>Smiley Hackathon #7 に参加</title><content type='html'>昨日Smiley Hackathon #7に参加しました。Hackathonは初めてだったので、いろいろ粗相をしてしまったような気がするのですが、暖かく接してくださった参加者のみなさんに感謝です。素敵な会場を提供してくださったgaiaxさんに感謝。そして、acotieさんを中心に運営されている方々に感謝です。&lt;br /&gt;&lt;br /&gt;備忘録として、自分なりのトピックを。&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;高校生にHaskellを教わる、という体験はなかなかできないので、新鮮だった。&lt;br /&gt;&lt;li&gt;囲碁関係のお話もとてもおもしろかった。&lt;br /&gt;&lt;li&gt;いろいろな言語の人が参加していたが、やはりPerlの人が多かった。Perlの重鎮の方もゲストで参加されていた。&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Hackathonに慣れていなかったので、いつもと違う環境で集中するのにちょっと時間がかかった。でも3時間くらいで慣れた。&lt;br /&gt;&lt;li&gt;せっかく集っているのでいろいろお喋りしたいということと、Hackathonなので何か作りあげたいということが交錯した。どっちに軸足を置くか、あらかじめ決めておくとよいかも。初回は、せっかくなのでいろいろお喋りするのが楽しいと思います。&lt;br /&gt;&lt;br /&gt;&lt;li&gt;自分としては、elisp library introspectionのmajor-modeをそこそこ書くことができた。&lt;br /&gt;&lt;li&gt;途中で、データ構造について設計遅延させたくて、elispのprologインタプリタが欲しくなり、PAIPのCommon Lispのものを移植した。ただし、とりあえず動いているだけで、スコープ関係があやしい。それは残課題。&lt;br /&gt;&lt;br /&gt;&lt;li&gt;懇親会に参加して、LispやHaskellの興味深いお話が聞けた。&lt;br /&gt;&lt;br /&gt;&lt;li&gt;やはりいろいろな人に出会いお話を聞くことは、刺激になった。&lt;br /&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-7555832659840030719?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/7555832659840030719/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=7555832659840030719' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/7555832659840030719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/7555832659840030719'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2009/12/smiley-hackathon-7.html' title='Smiley Hackathon #7 に参加'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-234085810218158645</id><published>2009-12-08T19:54:00.003+09:00</published><updated>2009-12-08T20:08:55.287+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs packaging'/><title type='text'>emacsのライブラリパッケージ取扱方針</title><content type='html'>多少調査したので、見えてきた。次の方針がよいように思う。&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Ubuntu(Debian)のElispパッケージを採用する。(debian-emacs-policy)&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;依存関係も管理しているので安心。&lt;br /&gt;&lt;li&gt;インストール/アンインストールも統一的。&lt;br /&gt;&lt;li&gt;ただし、パッケージをつくる手間は結構ある。&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;補完的に、Auto Installを採用する。&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Ubuntu(Debian)のElispで提供されていないものは、Auto InstallにてElispAreaなどから採用する。&lt;br /&gt;&lt;li&gt;パッケージ化の手間がないので、アジャイルにライブラリの導入ができる。&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;li&gt;Auto Install -&gt; Ubuntu(Debian)&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Auto Installにて導入したライブラリが、有用であり安定しているならば、パッケージ化のプロセスに入る。&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;まず、Auto Install上での安定。依存関係があるなら、Auto Install上でbatch定義する。また、ライブラリのリビジョンを止めるために、ElispAreaではなく、ローカルに落として止めたリビジョンのみを見るなど。&lt;br /&gt;&lt;li&gt;次に、debian-emacs-policyに準拠したdebian packageを作成する。これをプライベートリポジトリに置き運用する。&lt;br /&gt;&lt;li&gt;最後に、debianパッケージメンテナ等に依頼して、公式リポジトリにアップロードしてもらう。&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-234085810218158645?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/234085810218158645/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=234085810218158645' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/234085810218158645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/234085810218158645'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2009/12/emacs_08.html' title='emacsのライブラリパッケージ取扱方針'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-2897394628599489566</id><published>2009-12-08T19:45:00.001+09:00</published><updated>2009-12-08T19:50:01.992+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xemacs'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs packaging'/><title type='text'>debian-emacs-policyとXEmacs package systemの関係</title><content type='html'>&lt;pre&gt;&lt;br /&gt;* debian-emacs-policyとXEmacs package systemの関係&lt;br /&gt; - debianのパッケージにXEmacs package systemのパッケージあり&lt;br /&gt;   - xemacs21-basesupport&lt;br /&gt;     - xemacs binary packages&lt;br /&gt;   - xemacs21-basesupport-el&lt;br /&gt;     - xemacs source packages&lt;br /&gt;&lt;br /&gt; - ここにXEmacs package system公式提供のものはすべ&lt;br /&gt;   て入っているようだ。&lt;br /&gt; - debian-emacs-policyに従ったpackagesと、XEmacs&lt;br /&gt;   package systemのpackageの両方に含まれているpackage&lt;br /&gt;   がけっこうある。&lt;br /&gt; - どうやら、御互い無関係にやっているようだ。&lt;br /&gt; - ユーザ自身が、どちらのパッケージシステムでいく&lt;br /&gt;   かの判断をしなければならない。&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-2897394628599489566?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/2897394628599489566/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=2897394628599489566' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/2897394628599489566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/2897394628599489566'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2009/12/debian-emacs-packagesxemacs-package.html' title='debian-emacs-policyとXEmacs package systemの関係'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-2021931246044641509</id><published>2009-12-08T00:28:00.002+09:00</published><updated>2009-12-08T00:34:45.015+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='xemacs'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs packaging'/><title type='text'>XEmacs package system</title><content type='html'>XEmacs、ほぼ初めていじったといってよいのですが、このpackage systemは結構ちゃんとしていてびっくりです。依存関係管理を装備すれば、完備かと。&lt;br /&gt;&lt;br /&gt;うーん。GNU Emacsにもこういうものが欲しい。。。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;* XEmacs package system&lt;br /&gt; - パッケージの置き場所&lt;br /&gt;   - パッケージの置き場所は、file system上のpathで&lt;br /&gt;     系統づけている。その系統を'パッケージ階層'と呼&lt;br /&gt;     ぶ。デフォルトでは3つの系統がある。&lt;br /&gt;   - startupの際に、パッケージ階層をXEmacsは見るこ&lt;br /&gt;     とができる。load-pathにする、ということではな&lt;br /&gt;     いようだ。M-x describe-installationでpackage&lt;br /&gt;     pathの値をみることができる。&lt;br /&gt;   - パッケージ階層 (package hierarchies)&lt;br /&gt;     - Local and 3rd party packages go here:&lt;br /&gt;       - $prefix/lib/xemacs/site-packages&lt;br /&gt;     - Only searched by MULE-enabled XEmacsen:&lt;br /&gt;       - $prefix/lib/xemacs/mule-packages&lt;br /&gt;     - Normal packages go here:&lt;br /&gt;       - $prefix/lib/xemacs/xemacs-packages&lt;br /&gt;     - Infodock development environments&lt;br /&gt;       - $prefix/lib/xemacs/infodock-packages&lt;br /&gt;&lt;br /&gt;     - $prefixはconfigure scriptに渡したパラメータ。&lt;br /&gt;       - 典型的には'/usr/local/'。&lt;br /&gt;   - ユーザのパッケージ階層&lt;br /&gt;     - '.xemacs/'配下&lt;br /&gt;       に、'site-packages'、'xemacs-packages'、&lt;br /&gt;       'mule-packages'ディレクトリをつくると、認識&lt;br /&gt;       される。&lt;br /&gt;   - パッケージ階層とload-path&lt;br /&gt;     - パッケージ階層達の優先度はXEmacsのコンパイ&lt;br /&gt;       ル時に指定する。&lt;br /&gt;     - 前項の指定順にしたがって、パッケージ階層を&lt;br /&gt;       調べて、load-pathを構成する。&lt;br /&gt;&lt;br /&gt; - パッケージ&lt;br /&gt;   - バイナリパッケージとソースパッケージがある。&lt;br /&gt;   - ソースパッケージからバイナリパッケージを生成&lt;br /&gt;     する。'バイナリ'と言うが、実際はバイトコード&lt;br /&gt;     (コンパイルされたelispファイル)。&lt;br /&gt;&lt;br /&gt; - バイナリパッケージアーカイブ&lt;br /&gt;   - XEmacs公式&lt;br /&gt;     - Official XEmacs Packages:&lt;br /&gt;       - XEmacs開発者によってテスト済み。&lt;br /&gt;        These packages have received testing from XEmacs developers and bleeding-edge users   &lt;br /&gt;        and are available as documented in our Release Notice Archive.                        &lt;br /&gt;     - Pre-Release XEmacs Packages:&lt;br /&gt;       - テスト中またはテスト待ちのパッケージ。&lt;br /&gt;   - アーカイブではなく、パケージ個別に独立管理し&lt;br /&gt;     ているもの&lt;br /&gt;     - http://www.xemacs.org/Download/elispPackages.html&lt;br /&gt;     - ただし、このリストにあるもので、XEmacs&lt;br /&gt;       packagesに含まれることもあるとのこと。なん&lt;br /&gt;       のこっちゃ。&lt;br /&gt;   - http://ftp.xemacs.org/pub/packages/&lt;br /&gt;     - 130前後のパッケージあり。&lt;br /&gt;&lt;br /&gt; - ソースパッケージリポジトリ&lt;br /&gt;   - XEmacs CVSリポジトリの一部。次の構造。&lt;br /&gt;&lt;br /&gt;     &amp;lt;repo-root&gt;/&lt;br /&gt;       packages/&lt;br /&gt;         Makefile&lt;br /&gt;         iterate.rules&lt;br /&gt;         meta-iterate.rules&lt;br /&gt;         XEmacs.rules&lt;br /&gt;         Local.rules&lt;br /&gt;         Local.rules.template&lt;br /&gt;         Local.rules.mk&lt;br /&gt;         Local.rules.inc&lt;br /&gt;         package-compile.el&lt;br /&gt;         xemacs-packages/&lt;br /&gt;           Makefile&lt;br /&gt;           pkg-A-name/&lt;br /&gt;           pkg-B-name/&lt;br /&gt;           ...&lt;br /&gt;         mule-packages/&lt;br /&gt;           Makefile&lt;br /&gt;           pkg-1-name/&lt;br /&gt;           pkg-2-name/&lt;br /&gt;           ...&lt;br /&gt;   - 再帰的makeによって、パッケージ全体をビルドす&lt;br /&gt;     るようだ。&lt;br /&gt;&lt;br /&gt; - パッケージの作法&lt;br /&gt;   - パッケージのflavor&lt;br /&gt;     - 2つのflavorがある。&lt;br /&gt;       - Regular Packages&lt;br /&gt;         - elispファイル達総体として機能をなすもの。&lt;br /&gt;         - 部分的に削除すると、機能しなくなる。&lt;br /&gt;       - Single-File Packages&lt;br /&gt;         - 個別elispファイルで機能するもの。そういっ&lt;br /&gt;           たものを共通テーマでくくったもの。&lt;br /&gt;         - 部分的に削除しても残りのものは機能する。&lt;br /&gt;   - ファイル名&lt;br /&gt;     - pkgname-&lt;version&gt;-pkg.tar.gz&lt;br /&gt;   - バイナリパッケージの中身の構成&lt;br /&gt;&lt;br /&gt;     _pkg.el&lt;br /&gt;     auto-autoloads.el&lt;br /&gt;     custom-load.el&lt;br /&gt;     ChangeLog&lt;br /&gt;     lib/pkgname/&lt;br /&gt;     lib-src/pkgname/&lt;br /&gt;     etc/pkgname/&lt;br /&gt;     info/&lt;br /&gt;     lisp/maybe-pkgname/&lt;br /&gt;     man/maybe-pkgname/&lt;br /&gt;     pkginfo/MANIFEST.pkgname&lt;br /&gt;&lt;br /&gt;     - _pkg.el&lt;br /&gt;       - パッケージ管理システム向け情報。&lt;br /&gt;     - auto-autoloads.el&lt;br /&gt;       - autoloadを中心に、pkgを使う(使えるように&lt;br /&gt;         する)ための設定を含む。&lt;br /&gt;     - custom-load.el&lt;br /&gt;       - customに対する設定を含む。&lt;br /&gt;     - pkginfo/MANIFEST.pkgname&lt;br /&gt;       - インストール対象ファイルの一覧を含む。&lt;br /&gt;&lt;br /&gt;   - ソースパッケージの構成&lt;br /&gt;     - バイナリパッケージの '_pkg.el' 、&lt;br /&gt;       'auto-autoloads.el'、'custom-load.el' は生&lt;br /&gt;       成物。そのかわりに、次のものがある。&lt;br /&gt;&lt;br /&gt;       Makefile&lt;br /&gt;       package-info.in&lt;br /&gt;&lt;br /&gt;   - 制御ファイル (Control Files)&lt;br /&gt;     - ソースとバイナリにまたがって、制御系のファ&lt;br /&gt;       イル達のことを制御ファイルと呼ぶ。具体的に&lt;br /&gt;       は、次のとおり。&lt;br /&gt;&lt;br /&gt;       Makefile&lt;br /&gt;       package-info.in&lt;br /&gt;       _pkg.el&lt;br /&gt;       auto-autoloads.el&lt;br /&gt;       custom-load.el&lt;br /&gt;&lt;br /&gt; - インストール&lt;br /&gt;   - 基本的にはパッケージ階層のトップにてuntarする&lt;br /&gt;     だけ。&lt;br /&gt;   - elispによるインストールフロントエンドもあり。&lt;br /&gt;&lt;br /&gt; - アンインストール&lt;br /&gt;   - 関数：package-admin-delete-binary-packageにて&lt;br /&gt;     削除可能。&lt;br /&gt;&lt;br /&gt; - 依存関係&lt;br /&gt;   - 依存関係を扱う機構は無い。&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-2021931246044641509?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/2021931246044641509/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=2021931246044641509' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/2021931246044641509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/2021931246044641509'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2009/12/xemacs-package-system.html' title='XEmacs package system'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-2081655356418159667</id><published>2009-12-07T16:48:00.003+09:00</published><updated>2009-12-07T18:25:08.761+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs packaging'/><title type='text'>Auto Install</title><content type='html'>現在自分が使用しているRev.1.18を読んでみた。&lt;br /&gt;印象は、EmacsWikiのElispAreaインターフェイス。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;* Auto Install&lt;br /&gt; - ソースがきれい。ちゃんとしている雰囲気。&lt;br /&gt;** パッケージの取得先&lt;br /&gt; - auto-install-emacswiki-base-url&lt;br /&gt;   - "http://www.emacswiki.org/cgi-bin/wiki/download/"&lt;br /&gt; - auto-install-gist-base-url&lt;br /&gt;   - "http://gist.github.com/"&lt;br /&gt; - auto-install-filter-url&lt;br /&gt;   - '(("color-grep" "http://www.bookshelf.jp/elc/"))&lt;br /&gt; - auto-install-batch-list&lt;br /&gt;   - バッチインストールのためのパッケージ情報。&lt;br /&gt;** パッケージのデフォルト保存場所&lt;br /&gt; - auto-install-directory&lt;br /&gt;   - "~/.emacs.d/auto-install/"&lt;br /&gt;   - 新規に導入するelispファイルの置き場所。&lt;br /&gt;** 基本的な動作&lt;br /&gt; - emacswikiのelisp areaをelispの主たるアーカイブと&lt;br /&gt;   位置付けている。副次的なものとして、gist、&lt;br /&gt;   filter-urlがある。&lt;br /&gt; - elisp areaから、'.el'ファイルの一覧を取得し、こ&lt;br /&gt;   れを取扱い可能ライブラリの名前として利用する。&lt;br /&gt; - 基本動作としては、この名前でライブラリを指定し&lt;br /&gt;   て、ダウンロード-中身確認-採用-配置となる。&lt;br /&gt; - ライブラリの指定は、mini-bufferで指定する方法と、&lt;br /&gt;   既存のelispをdired上で指定する方法の二種類がある。&lt;br /&gt; - 配置場所も二種類ある。すでにそのライブラリが&lt;br /&gt;   load-path上に存在するなら、それへの上書き配置が&lt;br /&gt;   可能である。load-path上に存在しないなら、&lt;br /&gt;   auto-install-directory内に配置される。&lt;br /&gt; - 依存関係を自動処理する方法は無いようだ。&lt;br /&gt; - ただし、複数ファイルで構成されるライブラリについ&lt;br /&gt;   ては、auto-install-batch-listにて明示的にelisp&lt;br /&gt;   ファイルのグループをつくることによって、一括イ&lt;br /&gt;   ンストールが可能。&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;あとはXEmacsのPackage Systemだ。&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-2081655356418159667?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/2081655356418159667/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=2081655356418159667' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/2081655356418159667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/2081655356418159667'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2009/12/auto-install.html' title='Auto Install'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-420773519688432470</id><published>2009-12-05T18:29:00.002+09:00</published><updated>2009-12-07T16:54:07.840+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs packaging'/><title type='text'>ELPA (Emacs Lisp Package Archive)</title><content type='html'>&lt;pre&gt;&lt;br /&gt;* ELPA (Emacs Lisp Package Archive)&lt;br /&gt; - 次の2つのファイルがパッケージ一覧の基本情報。&lt;br /&gt;   package-list-packagesを呼ぶと、&lt;br /&gt;   package-refresh-contentsによってWebから取得され&lt;br /&gt;   る。&lt;br /&gt;   - http://tromey.com/elpa/archive-contents&lt;br /&gt;     - これがELPA提供のパッケージの一覧を含むファ&lt;br /&gt;       イル。依存関係も記述されている。&lt;br /&gt;     - 104個のパッケージを含む。&lt;br /&gt;   - http://tromey.com/elpa/builtin-packages&lt;br /&gt;     - Emacs組込パッケージと衝突しているものについ&lt;br /&gt;       て、整理情報を記述。22.0用と23.0用が含まれ&lt;br /&gt;       ている。&lt;br /&gt; - バージョンを考慮した依存関係管理をしている。&lt;br /&gt; - パッケージの様式&lt;br /&gt;   - &amp;lt;package-user-dir&gt;/&amp;lt;NAME-VERSION&gt;/にそれぞれのパッ&lt;br /&gt;     ケージをダウンロードする。&lt;br /&gt;     - .el&lt;br /&gt;       - ELPA上では'NAME-VERSION.el'というファイル名&lt;br /&gt;         をもつ。&lt;br /&gt;       - DLすると、'NAME-VERSION'というディレクト&lt;br /&gt;         リに'NAME.el'というファイル名で格納する。&lt;br /&gt;     - .tar&lt;br /&gt;       - "PACKAGE-pkg.el"を含まなければならない。&lt;br /&gt;         - このファイルの中では、define-packageが&lt;br /&gt;           呼ばれている。&lt;br /&gt;   - define-package&lt;br /&gt;     - パッケージを定義して、package-alistにパッケー&lt;br /&gt;       ジ情報を格納する関数。&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-420773519688432470?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/420773519688432470/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=420773519688432470' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/420773519688432470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/420773519688432470'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2009/12/elpa-emacs-lisp-package-archive.html' title='ELPA (Emacs Lisp Package Archive)'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-7116496182376816514</id><published>2009-12-05T13:08:00.001+09:00</published><updated>2009-12-05T13:11:11.696+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs packaging'/><title type='text'>Emacs Lisp List</title><content type='html'>&lt;pre&gt;&lt;br /&gt;* Emacs Lisp List&lt;br /&gt; - http://www.damtp.cam.ac.uk/user/sje30/emacs/ell.html&lt;br /&gt; - さて、前回ell.elをローダと書いたが、ローダでは&lt;br /&gt;   なかった。&lt;br /&gt; - これは、ell.xmlをemacsのbufferにきれいに表示す&lt;br /&gt;   るものだ。いくつか機能を提供している。&lt;br /&gt;   - 著者名によるソート機能。&lt;br /&gt;   - ell.xmlに更新があった場合、更新項目に"&amp;lt;new&gt;"&lt;br /&gt;     をつける。&lt;br /&gt;   - すでに導入済みのライブラリについては、項目の頭&lt;br /&gt;     に"*"をつける。&lt;br /&gt;     - ちなみに、Emacsではelispを含んだファイルをお&lt;br /&gt;       しなべてライブラリと呼ぶ。&lt;br /&gt; - avltree&lt;br /&gt;   - ell.xmlをパースしてavltreeにする。&lt;br /&gt;   - 作成したavltreeは'~/.ell-last-read'にファイル&lt;br /&gt;     として保持して差分確認にも利用する。&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-7116496182376816514?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/7116496182376816514/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=7116496182376816514' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/7116496182376816514'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/7116496182376816514'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2009/12/emacs-lisp-list.html' title='Emacs Lisp List'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-5230601905691428120</id><published>2009-12-04T01:22:00.004+09:00</published><updated>2009-12-07T16:53:46.705+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs packaging'/><title type='text'>Emacsのパッケージング事情</title><content type='html'>debian emacs policyを理解できてきたところで、他のパッケージ管理機構についてざっと調べてみた。結構いろいろな情報がある。&lt;br /&gt;&lt;br /&gt;何かひとつをちゃんと知るということは、やっぱり大変なことだなぁと再認識した。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;* Emacsのパッケージング事情&lt;br /&gt;** ヘッダ等の慣習&lt;br /&gt;*** Conventional Headers for Emacs Libraries&lt;br /&gt;  - http://www.gnu.org/software/emacs/manual/html_node/elisp/Library-Headers.html#Library-Headers&lt;br /&gt;  - GNU Emacs Lisp Referenceの一部。&lt;br /&gt;  - Elispファイルを書くときの慣習。&lt;br /&gt;    - ライブラリのメタデータ(著者等)をコメントとして&lt;br /&gt;      記述するための慣習。&lt;br /&gt;    - ライブラリの中身をコメントで構造化するための慣習。&lt;br /&gt;  - 例：メタデータ&lt;br /&gt;&lt;br /&gt;    ;;; lisp-mnt.el --- minor mode for Emacs Lisp maintainers&lt;br /&gt;    &lt;br /&gt;    ;; Copyright (C) 1992 Free Software Foundation, Inc.&lt;br /&gt;    &lt;br /&gt;    ;; Author: Eric S. Raymond &amp;lt;esr@snark.thyrsus.com&gt;&lt;br /&gt;    ;; Maintainer: Eric S. Raymond &amp;lt;esr@snark.thyrsus.com&gt;&lt;br /&gt;    ;; Created: 14 Jul 1992&lt;br /&gt;    ;; Version: 1.2&lt;br /&gt;    ;; Keywords: docs&lt;br /&gt;    &lt;br /&gt;    ;; This file is part of GNU Emacs.&lt;br /&gt;    ...&lt;br /&gt;    ;; along with GNU Emacs.  If not, see &amp;lt;http://www.gnu.org/licenses/&gt;.&lt;br /&gt;&lt;br /&gt;    ここに本体コード。&lt;br /&gt;  &lt;br /&gt;    ;;; filename --- description&lt;br /&gt;&lt;br /&gt;  - 例：構造化コメント&lt;br /&gt;&lt;br /&gt;    ;;; Commentary:&lt;br /&gt;    ;;; Documentation:&lt;br /&gt;    ;;; Change Log:&lt;br /&gt;    ;;; Code:&lt;br /&gt;    ;;; filename ends here&lt;br /&gt;&lt;br /&gt;*** Elisp Area Conventions&lt;br /&gt;  - http://www.emacswiki.org/cgi-bin/wiki/ElispAreaConventions&lt;br /&gt;  - EmacsWikiのElisp Areaに置くelispのかきぶりの慣&lt;br /&gt;    習の説明。&lt;br /&gt;  - GNU Emacs Lispの慣習をベースにして、詳細化や拡&lt;br /&gt;    張を実施している。&lt;br /&gt;&lt;br /&gt;** ヘッダツール&lt;br /&gt;*** Automatic File Headers&lt;br /&gt;  - http://www.emacswiki.org/emacs/AutomaticFileHeaders&lt;br /&gt;**** auto insert mode&lt;br /&gt; - ユーザが定義したテンプレートにしたがって、ファイ&lt;br /&gt;   ル作成時にヘッダを自動的に挿入する。&lt;br /&gt;   auto-insert-alistでファイル名パターンとテンレプー&lt;br /&gt;   トを紐付ける。&lt;br /&gt;**** header2.el&lt;br /&gt; - Elisp Area Conventionsに対応したヘッダを自動挿入&lt;br /&gt;   や自動更新するelisp。&lt;br /&gt; - そのライブラリが必要とするfeaturesを記述する欄を&lt;br /&gt;   設けている。(これは他のConventionsでは定義されて&lt;br /&gt;   いない)&lt;br /&gt;   - ;; Features that might be required by this library:&lt;br /&gt;**** lib-requires.el&lt;br /&gt; - ライブラリの依存情報を調査して、木構造をつくる&lt;br /&gt;   elisp。&lt;br /&gt;**** elisp-depend.el&lt;br /&gt; - elispファイルをparseして、そのelispで依存してい&lt;br /&gt;   るライブラリを探索し、それぞれについて、それが&lt;br /&gt;   providedならば、require式を出力し、そうでなけれ&lt;br /&gt;   ばautoload式を出力する。&lt;br /&gt;**** checkdoc&lt;br /&gt; - http://www.emacswiki.org/emacs/CheckDoc&lt;br /&gt; - elispファイルのヘッダをチェックする。GNU慣習と&lt;br /&gt;   EmacsArea慣習の双方に対応している。&lt;br /&gt;&lt;br /&gt;** パッケージ管理機構&lt;br /&gt;***  Emacs Lisp List&lt;br /&gt; - http://www.damtp.cam.ac.uk/user/sje30/emacs/ell.html&lt;br /&gt; - http://www.damtp.cam.ac.uk/user/sje30/emacs/ell.xml&lt;br /&gt; - http://www.damtp.cam.ac.uk/user/sje30/emacs/ell.el&lt;br /&gt; - パッケージ一覧ファイル(ell.xml)とそれを参照する&lt;br /&gt;   ローダ(ell.el)を提供。&lt;br /&gt; - ell.elではavltreeをつかってパッケージのキャッシュ&lt;br /&gt;   を作成し管理している。興味深い。&lt;br /&gt;&lt;br /&gt;*** Auto Install&lt;br /&gt; - http://www.emacswiki.org/emacs/AutoInstall&lt;br /&gt; - フルセットのパッケージ管理が可能。&lt;br /&gt; - パッケージの取得先はEmacsWiki他、いくつか指定可&lt;br /&gt;   能。&lt;br /&gt; - パッケージの依存関係の管理などがどうなっている&lt;br /&gt;   のかは要調査。&lt;br /&gt;&lt;br /&gt;*** ELPA&lt;br /&gt; - http://tromey.com/elpa/&lt;br /&gt; - パッケージアーカイブとそれを参照するローダを提&lt;br /&gt;   供。&lt;br /&gt; - Web上の説明が簡素なため、理解するためには使って&lt;br /&gt;   みる必要がありそう。&lt;br /&gt; - パッケージアーカイブの仕様を調べてみたい。&lt;br /&gt;&lt;br /&gt;*** Install Lisp&lt;br /&gt; - http://www.emacswiki.org/emacs/InstallElisp&lt;br /&gt; - Auto Installの前身と考えてよさそう。&lt;br /&gt;&lt;br /&gt;*** XEmacs package system&lt;br /&gt; - http://www.xemacs.org/Documentation/packageGuide.html&lt;br /&gt; - XEmacsはパッケージ管理機構を組み込みでもってい&lt;br /&gt;   る。専用のパッケージアーカイブも存在する。&lt;br /&gt; - debian-emacs-policyとはどういう関係になるのだろ&lt;br /&gt;   う。&lt;br /&gt; - 詳細は要調査。&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-5230601905691428120?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/5230601905691428120/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=5230601905691428120' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/5230601905691428120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/5230601905691428120'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2009/12/emacs.html' title='Emacsのパッケージング事情'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-7096645968118201458</id><published>2009-12-02T17:24:00.002+09:00</published><updated>2009-12-04T12:12:59.707+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maxima'/><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><title type='text'>【maxima】ちょっと不安定？</title><content type='html'>ちょこちょこmaximaで遊んでいるが、いろいろなところで、Segmentation Faultとか、Stack Overflowとかが発生する。ちょっと不安定なような？&lt;br /&gt;&lt;br /&gt;例えば。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;Maxima 5.13.0 http://maxima.sourceforge.net&lt;br /&gt;Using Lisp GNU Common Lisp (GCL) GCL 2.6.8 (aka GCL)&lt;br /&gt;Distributed under the GNU Public License. See the file COPYING.&lt;br /&gt;Dedicated to the memory of William Schelter.&lt;br /&gt;This is a development version of Maxima. The function bug_report()&lt;br /&gt;provides bug reporting information.&lt;br /&gt;(%i1) eq1:[x^2+y*x-1,x*y^2-x+y];&lt;br /&gt;                                 2         2&lt;br /&gt;(%o1)                    [x y + x  - 1, x y  + y - x]&lt;br /&gt;(%i2) ans:algsys(eq1,[x,y]);&lt;br /&gt;&lt;br /&gt;Unrecoverable error: invocation history stack overflow.&lt;br /&gt;&lt;br /&gt;Process maxima aborted&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Interpidのmaximaはgclを内包しているようだ。これを、allegroなり、sbclなりに変更すれば、common lispの中で状況を追えるかな？ GCLだとGDBで追うことになりそうな。Maxima/GCL/C/Executableという階層でMaximaの問題をExecutableで追うのはかなりきつい。。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-7096645968118201458?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/7096645968118201458/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=7096645968118201458' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/7096645968118201458'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/7096645968118201458'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2009/12/maxima.html' title='【maxima】ちょっと不安定？'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-3131584460881290214</id><published>2009-12-01T09:38:00.001+09:00</published><updated>2009-12-01T09:42:05.223+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>debian-emacs-policyのポイント (2)</title><content type='html'>perlを思い出しつつ、スクリプトを多少調べてみた。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;* emacsen-commonのスクリプト&lt;br /&gt; - debian-emacs-policyにある例を理解できない。それ&lt;br /&gt;   を理解したい。&lt;br /&gt; - 例1&lt;br /&gt;&lt;br /&gt;1) Xemacs21 and the add-on packages tm and auctex are already installed,&lt;br /&gt;   and now someone installs emacs21.&lt;br /&gt;&lt;br /&gt;   In it's postinst, emacs21 would make this call:&lt;br /&gt;&lt;br /&gt;     /usr/lib/emacsen-common/emacs-install emacs21&lt;br /&gt;&lt;br /&gt;   which would result in calls to&lt;br /&gt;&lt;br /&gt;     /usr/lib/emacsen-common/packages/install/auctex emacs xemacs21&lt;br /&gt;     /usr/lib/emacsen-common/packages/install/auctex emacs21 xemacs21&lt;br /&gt;     /usr/lib/emacsen-common/packages/emacs21/install/tm emacs xemacs21&lt;br /&gt;     /usr/lib/emacsen-common/packages/emacs/install/tm emacs21 xemacs21&lt;br /&gt;&lt;br /&gt; - わからないところの特定&lt;br /&gt;   - /usr/lib/emacsen-common/emacs-install emacs21&lt;br /&gt;     - これはわかる。これをpostinstで実行するとがポ&lt;br /&gt;       リシーだから。&lt;br /&gt;   - しかし、上の呼出しが、&lt;br /&gt;&lt;br /&gt;     /usr/lib/emacsen-common/packages/install/auctex emacs xemacs21&lt;br /&gt;     /usr/lib/emacsen-common/packages/install/auctex emacs21 xemacs21&lt;br /&gt;     /usr/lib/emacsen-common/packages/emacs21/install/tm emacs xemacs21&lt;br /&gt;     /usr/lib/emacsen-common/packages/emacs/install/tm emacs21 xemacs21&lt;br /&gt;&lt;br /&gt;     これになるのはわからない。特に、なんで'emacs&lt;br /&gt;     が呼ばれるの？というところ。具体的には、&lt;br /&gt;&lt;br /&gt;     /usr/lib/emacsen-common/packages/install/auctex emacs21 xemacs21&lt;br /&gt;     /usr/lib/emacsen-common/packages/emacs/install/tm emacs21 xemacs21&lt;br /&gt;&lt;br /&gt;     こうじゃないの？ と。&lt;br /&gt;&lt;br /&gt; - ソース解読&lt;br /&gt;   - 解決。私の「こうじゃないの？」で正しそう。&lt;br /&gt;   - 根拠。&lt;br /&gt;     - install済みのflavorsは、&lt;br /&gt;&lt;br /&gt;       /var/lib/emacsen-common/installed-flavors&lt;br /&gt;&lt;br /&gt;       に記載されており、emacs-install&lt;br /&gt;       scriptも'other-flavors'の値はこれを使用してい&lt;br /&gt;       る。なので、ここに何が書いてあるかが、展開し&lt;br /&gt;       て実行する命令群を決める。&lt;br /&gt;     - すると、ポイントは、meta packageである'emacs'&lt;br /&gt;       がここに含まれるかどうか、だ。私の環境では、&lt;br /&gt;&lt;br /&gt;       i   emacs                           - The GNU Emacs editor (metapackage)        &lt;br /&gt;       i   emacs22                         - The GNU Emacs editor (Emacs 22)           &lt;br /&gt;&lt;br /&gt;       というinstall状況だが、installed-flavors&lt;br /&gt;       は'emacs22' のみを内容として含んでいる。&lt;br /&gt;   - 実証。&lt;br /&gt;     - 'emacs22'と'xemacs21'がinstall済みの状態で、&lt;br /&gt;       'emacs21'にて、emacs-install scriptをdry&lt;br /&gt;       runさせてみる。を入れてみよう。&lt;br /&gt;     - emacs-installをcopyしてemacs-install-testと&lt;br /&gt;       して、my $dry_run = 1;とする。&lt;br /&gt;       &lt;br /&gt;emacsen-common $ ./emacs-install-test emacs21&lt;br /&gt;emacs-install emacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/apel emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/cedet-common emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/debian-el emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/dictionaries-common emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/emacs-extra emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/emacs-goodies-el emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/emacsen-common emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/global emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/latex-cjk-common emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/lookup-el emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/mdk emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/mew emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/mmm-mode emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/octave3.0-emacsen emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/paredit-el emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/prolog-el emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/ruby1.8-elisp emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/w3m-el emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/flim emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/elscreen emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/ddskk emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/speedbar emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/eieio emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/dpkg-dev-el emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/slime emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/nxml-mode emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/maxima-emacs emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/latex-cjk-thai emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/ede emacs21 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/install/semantic emacs21 emacs22 xemacs21&lt;br /&gt;Installed flavors are now: emacs22 xemacs21 emacs21&lt;br /&gt;emacsen-common $ &lt;br /&gt;     - うむ。実証できた。&lt;br /&gt;&lt;br /&gt; - 例2&lt;br /&gt;   - これは例1のremove版なのでinstallと同様の動作&lt;br /&gt;     であろう。内容確認は割愛。&lt;br /&gt;&lt;br /&gt; - 例3&lt;br /&gt;   - an add-on packageをremoveする例。&lt;br /&gt;   - 'emacs22'と'xemacs21'がinstall済みとする。&lt;br /&gt;   - 'wget-el' add-on packageがinstall済みとする。&lt;br /&gt;   - 'wget-el'をremoveする。&lt;br /&gt;   - 例の挙動は、次のとおり。&lt;br /&gt;     - prermにて、emacsen-package-removeが'wget-el'を&lt;br /&gt;       引数にて呼ばれる。&lt;br /&gt;     - その結果、次の命令群が生成される。&lt;br /&gt;&lt;br /&gt;       /usr/lib/emacsen-common/packages/remove/wget-el emacs emacs22 xemacs21&lt;br /&gt;       /usr/lib/emacsen-common/packages/remove/wget-el emacs22 emacs22 xemacs21&lt;br /&gt;       /usr/lib/emacsen-common/packages/remove/wget-el xemacs21 emacs22 xemacs21&lt;br /&gt;&lt;br /&gt;     - ここでも、'emacs'が何故存在するのかがわから&lt;br /&gt;       ない。次のものならわかる。&lt;br /&gt;&lt;br /&gt;       /usr/lib/emacsen-common/packages/remove/wget-el emacs22 xemacs21&lt;br /&gt;       /usr/lib/emacsen-common/packages/remove/wget-el xemacs21 emacs22&lt;br /&gt;   - dry run。&lt;br /&gt;     - 今度は先にdry runしてみる。&lt;br /&gt;&lt;br /&gt;emacsen-common $ ./emacs-package-test-remove wget-el&lt;br /&gt;/usr/lib/emacsen-common/packages/remove/wget-el emacs emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/remove/wget-el emacs22 emacs22 xemacs21&lt;br /&gt;/usr/lib/emacsen-common/packages/remove/wget-el xemacs21 emacs22 xemacs21&lt;br /&gt;emacsen-common $ &lt;br /&gt;&lt;br /&gt;     - なんと。。。&lt;br /&gt;&lt;br /&gt;   - ソース解読。&lt;br /&gt;     - あ、&lt;br /&gt;&lt;br /&gt;map {&lt;br /&gt;  my $script = $lib_dir . "/packages/$action/$_";&lt;br /&gt;  execute($script, 'emacs', @installed_flavors) if -e $script;&lt;br /&gt;} @pkgs_to_handle;&lt;br /&gt;&lt;br /&gt;       なるものがいる。&lt;br /&gt;     - なので、add-on packagesについては&lt;br /&gt;       install/removeにおいて、'emacs'がかならず引&lt;br /&gt;       数に入ってくるのだな。&lt;br /&gt;     - そもそも、なんでothersをならべる必要がある&lt;br /&gt;       のか？&lt;br /&gt;     - packages/remove/wget-elをみてみる。&lt;br /&gt;&lt;br /&gt;#!/bin/sh -e&lt;br /&gt;# /usr/lib/emacsen-common/packages/remove/emacs-wget&lt;br /&gt;&lt;br /&gt;FLAVOR=$1&lt;br /&gt;PACKAGE=wget-el&lt;br /&gt;&lt;br /&gt;if [ ${FLAVOR} != emacs ]; then&lt;br /&gt;#    if test -x /usr/sbin/install-info-altdir; then&lt;br /&gt;#        echo remove/${PACKAGE}: removing Info links for ${FLAVOR}&lt;br /&gt;#        install-info-altdir --quiet --remove --dirname=${FLAVOR} /usr/info/emacs-wget.info.gz&lt;br /&gt;#    fi&lt;br /&gt;&lt;br /&gt;    echo remove/${PACKAGE}: purging byte-compiled files for ${FLAVOR}&lt;br /&gt;    rm -rf /usr/share/${FLAVOR}/site-lisp/${PACKAGE}&lt;br /&gt;fi&lt;br /&gt;     - うむー。$1しか使っていない。&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-3131584460881290214?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/3131584460881290214/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=3131584460881290214' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/3131584460881290214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/3131584460881290214'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2009/12/debian-emacs-policy-2.html' title='debian-emacs-policyのポイント (2)'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-6758846477315757506</id><published>2009-11-30T18:26:00.002+09:00</published><updated>2009-11-30T18:32:24.896+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='maxima'/><category scheme='http://www.blogger.com/atom/ns#' term='Common Lisp'/><title type='text'>maximaをいじる</title><content type='html'>手元で数式処理できるツールが欲しいなぁ、と、だいぶ前からMaximaに目をつけていた。&lt;br /&gt;&lt;br /&gt;気分転換がてら、ちょこちょこいじってみようと思う。&lt;br /&gt;&lt;br /&gt;参考書は、&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.co.jp/dp/4777512010/"&gt;はじめてのMaxima&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;にする。&lt;br /&gt;&lt;br /&gt;ごりごり読むのではなくて、あくまでのんびり遊びながらつまみ食いする予定。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-6758846477315757506?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/6758846477315757506/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=6758846477315757506' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/6758846477315757506'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/6758846477315757506'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2009/11/maxima.html' title='maximaをいじる'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-5418427709888006039</id><published>2009-11-30T16:40:00.003+09:00</published><updated>2009-11-30T16:59:52.057+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>debian-emacs-policyのポイント</title><content type='html'>ざっとポイントをまとめた。&lt;br /&gt;これ以上理解するには、perlを多少勉強せねばならない。&lt;br /&gt;うーん。どうしたものか。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;* debian-emacs-policyのポイント&lt;br /&gt; - debian-emacs-policyでは、debian systemにてemacs&lt;br /&gt;   関連のpackagesを作成/管理するためのpolicyが規程&lt;br /&gt;   されている。&lt;br /&gt; - 簡明にまとまっている文書なので、メモ化する必要は&lt;br /&gt;   ないのだが、確実な理解のためにあえてメモを作成す&lt;br /&gt;   る。&lt;br /&gt; - policyの所在&lt;br /&gt;   - emacsen-common:&lt;br /&gt;     /usr/share/doc/emacsen-common/debian-emacs-policy.gz&lt;br /&gt;   - またはWeb。debian.org。&lt;br /&gt;&lt;br /&gt;** policyにおける用語&lt;br /&gt; - &amp;lt;emacs&gt;&lt;br /&gt;&lt;br /&gt;   emacs&lt;br /&gt;   xemacs21&lt;br /&gt;   emacs21&lt;br /&gt;   emacs22&lt;br /&gt;&lt;br /&gt; - &amp;lt;flavor&gt;&lt;br /&gt;&lt;br /&gt;   xemacs21&lt;br /&gt;   emacs21&lt;br /&gt;   emacs22&lt;br /&gt;&lt;br /&gt;   -  すなわち、&amp;lt;emacs&gt; - 'emacs'。&lt;br /&gt;&lt;br /&gt;** policyが求めるload-path&lt;br /&gt; - load-path&lt;br /&gt;   - debian emacs policyでは、最低、次の場所が次の&lt;br /&gt;     順(優先度が高い順)にload-pathに含まれることを求めている。&lt;br /&gt;     これはどのemacsenにおいても、である。&lt;br /&gt;&lt;br /&gt;     /etc/&amp;lt;flavor&gt;&lt;br /&gt;     /etc/emacs&lt;br /&gt;     /usr/local/share/emacs/&amp;lt;upstream&gt;/site-lisp&lt;br /&gt;     /usr/local/share/emacs/site-lisp&lt;br /&gt;     /usr/share/emacs/&amp;lt;flavor&gt;/site-lisp&lt;br /&gt;     /usr/share/emacs/site-lisp&lt;br /&gt;&lt;br /&gt;   - ここで、&amp;lt;upstream&gt;は、'22.2'などのupstream&lt;br /&gt;     version number。&lt;br /&gt;&lt;br /&gt;** emacsen-common package&lt;br /&gt; - emacsen-commonパッケージは、debian emacs policy&lt;br /&gt;   に従ったemacs packagesの管理のためのfacilityを提&lt;br /&gt;   供している。&lt;br /&gt; - 提供物一覧&lt;br /&gt;&lt;br /&gt;~ $ apt-file list emacsen-common&lt;br /&gt;emacsen-common: /etc/emacs/site-start.d/00debian-vars.el&lt;br /&gt;emacsen-common: /etc/emacs/site-start.el&lt;br /&gt;emacsen-common: /usr/lib/emacsen-common/emacs-install&lt;br /&gt;emacsen-common: /usr/lib/emacsen-common/emacs-package-install&lt;br /&gt;emacsen-common: /usr/lib/emacsen-common/emacs-package-remove&lt;br /&gt;emacsen-common: /usr/lib/emacsen-common/emacs-remove&lt;br /&gt;emacsen-common: /usr/lib/emacsen-common/generate-install-list&lt;br /&gt;emacsen-common: /usr/lib/emacsen-common/packages/install/emacsen-common&lt;br /&gt;emacsen-common: /usr/lib/emacsen-common/packages/remove/emacsen-common&lt;br /&gt;emacsen-common: /usr/share/doc/emacsen-common/changelog.gz&lt;br /&gt;emacsen-common: /usr/share/doc/emacsen-common/copyright&lt;br /&gt;emacsen-common: /usr/share/doc/emacsen-common/debian-emacs-policy.gz&lt;br /&gt;emacsen-common: /usr/share/emacs/site-lisp/debian-startup.el&lt;br /&gt;~ $ &lt;br /&gt;&lt;br /&gt; - /etc/emacs/site-start.el&lt;br /&gt;   - これはpackageに含まれてはいるが、local admin&lt;br /&gt;     が中身を管理するもの。&lt;br /&gt;&lt;br /&gt;*** 提供物の概要&lt;br /&gt;**** /usr/lib/emacsen-common/emacs-install&lt;br /&gt; - perl script。&lt;br /&gt; - コメント。&lt;br /&gt;&lt;br /&gt;# Call emacsen-common/packages/install/* install-flavor other-flavor ...&lt;br /&gt;# for every installed emacs add-on package.&lt;br /&gt;&lt;br /&gt;**** /usr/lib/emacsen-common/emacs-remove&lt;br /&gt; - emacs-installの別名。&lt;br /&gt;&lt;br /&gt;**** /usr/lib/emacsen-common/emacs-package-install&lt;br /&gt; - perl script。&lt;br /&gt; - コメント。&lt;br /&gt;&lt;br /&gt;# Was this called because we're installing/removing a new emacs&lt;br /&gt;# flavor?  This should probably be handled with getopt and a command&lt;br /&gt;# line opt, but it's freeze time, and I'm tired...&lt;br /&gt;&lt;br /&gt;**** /usr/lib/emacsen-common/emacs-package-remove&lt;br /&gt; - emacs-package-installの別名。&lt;br /&gt;&lt;br /&gt;**** /usr/lib/emacsen-common/generate-install-list&lt;br /&gt; - perl script。&lt;br /&gt; - ライブラリ。&lt;br /&gt; - コメント。&lt;br /&gt;&lt;br /&gt;# depends on: dpkg, tsort, perl&lt;br /&gt;&lt;br /&gt;# This script should be handed a list of add-on packages on stdin, and&lt;br /&gt;# it will sort them according to their dependencies.  It will also add&lt;br /&gt;# in other add-on packages that aren't mentioned, but are needed.&lt;br /&gt;&lt;br /&gt;# Test code&lt;br /&gt;# my @input_packages = &amp;lt;STDIN&gt;;&lt;br /&gt;# my @result = generate_add_on_install_list(@input_packages);&lt;br /&gt;# print "  " . join("\n  ", @result);&lt;br /&gt;&lt;br /&gt;**** /usr/lib/emacsen-common/packages/install/emacsen-common&lt;br /&gt; - shell script。&lt;br /&gt; - 使い方。&lt;br /&gt;   - /usr/lib/emacsen-common/packages/remove/emacsen-common &amp;lt;flavor&gt;&lt;br /&gt; - emacsen-commonパッケージが提供しているelファイ&lt;br /&gt;   ルについて、flavor用バイトコンパイルを実施する。&lt;br /&gt;**** /usr/lib/emacsen-common/packages/remove/emacsen-common&lt;br /&gt; - shell script。&lt;br /&gt; - 使い方。&lt;br /&gt;   - /usr/lib/emacsen-common/packages/remove/emacsen-common &amp;lt;flavor&gt;&lt;br /&gt; - emacsen-commonパッケージが提供しているelファイ&lt;br /&gt;   ルのflavor用バイトコンパイルを削除する。&lt;br /&gt;&lt;br /&gt;** emacsen main packages&lt;br /&gt; - 'emacs22'とか'xemacs21'とか、emacsen本体を提供&lt;br /&gt;   するパッケージのこと。&lt;br /&gt;*** 必須作法&lt;br /&gt;**** メンテナスクリプト&lt;br /&gt; - postinst&lt;br /&gt;   - postinstに記述するもの。&lt;br /&gt;     - "/usr/lib/emacsen-common/emacs-install &amp;lt;flavor&gt;"&lt;br /&gt;   - この記述によってemacs-installは次のものを実&lt;br /&gt;     行する。&lt;br /&gt;     - "/usr/lib/emacsen-common/packages/install/&amp;lt;pkg&gt; &amp;lt;flavor&gt; &amp;lt;others&gt;"&lt;br /&gt; - prerm&lt;br /&gt;   - prermに記述するもの。&lt;br /&gt;     - "/usr/lib/emacsen-common/emacs-remove &amp;lt;flavor&gt;"&lt;br /&gt;   - この記述によってemacs-removeは次のものを実&lt;br /&gt;     行する。&lt;br /&gt;     - "/usr/lib/emacsen-common/packages/remove/&amp;lt;pkg&gt; &amp;lt;flavor&gt; &amp;lt;others&gt;"&lt;br /&gt;**** バイナリシムリンク&lt;br /&gt; - /usr/bin/&amp;lt;package-name&gt;から&lt;br /&gt;   /usr/bin/&amp;lt;emacs-binary&gt;へのsymbolic linkが必須。&lt;br /&gt; - というのはadd-on packagesがinstall/removeすると&lt;br /&gt;   き、/usr/bin/$ARGV[0]を使ってバイトコンパイルな&lt;br /&gt;   どをするから。&lt;br /&gt;**** 依存関係 "Provides: emacsen"&lt;br /&gt; - emacsen main packageは、debian packageとして&lt;br /&gt;   controlファイルにおいて、"Provides:"に&lt;br /&gt;   "emacsen"と記述する。&lt;br /&gt; - 例：emacs22&lt;br /&gt;&lt;br /&gt;Provides: editor, emacsen, info-browser, mail-reader, news-reader&lt;br /&gt;&lt;br /&gt;** add-on packages&lt;br /&gt;*** 基本作法&lt;br /&gt; - 必須な作法は少い。&lt;br /&gt; - 何故かというと、もしadd-onしようとしている機能に&lt;br /&gt;   ついて、バイトコンパイルが不要であったり、インストー&lt;br /&gt;   ル時の調整(emacs毎)も不要であったりするならば、&lt;br /&gt;   単にそのadd-on packageは、しかるべき場所にしか&lt;br /&gt;   るべきファイルを置くだけで目的をはたせるからだ。&lt;br /&gt; - ここでは必須なものを含めて基本的なものを書く。&lt;br /&gt;**** 設置場所&lt;br /&gt; - add-on packagesが設置できる場所はつぎのとおり。&lt;br /&gt;   /etc/&amp;lt;emacs&gt;/site-start.d&lt;br /&gt;   /usr/share/&amp;lt;emacs&gt;/site-lisp/&amp;lt;package-name&gt;&lt;br /&gt; - これは必須作法である。&lt;br /&gt;**** load-path&lt;br /&gt; - add-on packagesはload-pathをいじってはいけない。&lt;br /&gt; - これは必須作法である。&lt;br /&gt;**** 依存関係&lt;br /&gt; - 'emacsen-common'をdependsするべきではない。その&lt;br /&gt;   かわりに、'emacsen'をdependsするか、対応している&lt;br /&gt;   flavorsをdependsする。&lt;br /&gt;**** 初期化ファイルの中身&lt;br /&gt; - site-start.dなどにおく初期化ファイルでは、load&lt;br /&gt;   ではなくautoloadを使うべし。&lt;br /&gt;&lt;br /&gt;*** 応用作法&lt;br /&gt; - 「バイトコンパイルが必要」など、flavorに依存した&lt;br /&gt;   install/remove処理が必要なものの作法。&lt;br /&gt;&lt;br /&gt;**** メンテナスクリプト&lt;br /&gt; - まず、次のファイルをパッケージにて提供すべし。&lt;br /&gt;&lt;br /&gt;   /usr/lib/emacsen-common/packages/install/&amp;lt;pkg&gt;&lt;br /&gt;   /usr/lib/emacsen-common/packages/remove/&amp;lt;pkg&gt;&lt;br /&gt;&lt;br /&gt;   - サンプル&lt;br /&gt;     - 仮想的なfooというパッケージに対するもの。&lt;br /&gt;     - flavor毎にバイトコンパイルをするもの。&lt;br /&gt;     - install&lt;br /&gt;&lt;br /&gt;     #!/bin/sh&lt;br /&gt;     # /usr/lib/emacsen-common/packages/install/foo&lt;br /&gt;     # [ This particular script hasn't been tested, so be careful. ]&lt;br /&gt;     set -e&lt;br /&gt;&lt;br /&gt;     FLAVOR=$1&lt;br /&gt;     echo install/foo: Handling install of emacsen flavor ${FLAVOR}&lt;br /&gt;&lt;br /&gt;     byte_compile_options="-batch -f batch-byte-compile"&lt;br /&gt;     el_files="some-file.el some-other-file.el etc.el" &lt;br /&gt;     el_dir=/usr/share/emacs/site-lisp/foo/&lt;br /&gt;     elc_dir=/usr/share/${FLAVOR}/site-lisp/foo/&lt;br /&gt;&lt;br /&gt;     if [ ${FLAVOR} != emacs ]&lt;br /&gt;     then&lt;br /&gt;       echo install/foo: byte-compiling for ${FLAVOR}&lt;br /&gt;&lt;br /&gt;       [ -d ${elc_dir} ] || mkdir ${elc_dir}&lt;br /&gt;&lt;br /&gt;       # Copy the temp .el files&lt;br /&gt;       (cd ${el_dir} &amp;&amp; cp ${el_files} ${elc_dir})&lt;br /&gt;&lt;br /&gt;       # Byte compile them&lt;br /&gt;       (cd ${elc_dir} \&lt;br /&gt;        &amp;&amp; ${FLAVOR} ${byte_compile_options} ${el_files} 2&gt; /dev/null)&lt;br /&gt;&lt;br /&gt;       # remove the redundant .el files&lt;br /&gt;       # presumes that any .el files in the &amp;lt;flavor&gt; dir are trash.&lt;br /&gt;       rm ${elc_dir}/*.el&lt;br /&gt;     fi&lt;br /&gt;     exit 0;&lt;br /&gt;&lt;br /&gt;     - remove&lt;br /&gt;&lt;br /&gt;     #!/bin/sh&lt;br /&gt;     # /usr/lib/emacsen-common/packages/remove/foo&lt;br /&gt;     # [ This particular script hasn't been tested either, so be careful. ]&lt;br /&gt;     set -e&lt;br /&gt;&lt;br /&gt;     FLAVOR=$1&lt;br /&gt;     elc_dir=/usr/share/${FLAVOR}/site-lisp/foo&lt;br /&gt;&lt;br /&gt;     echo remove/foo: Handling removal of emacsen flavor ${FLAVOR}&lt;br /&gt;&lt;br /&gt;     if [ ${FLAVOR} != emacs ]&lt;br /&gt;     then&lt;br /&gt;       echo emacsen-common: purging byte-compiled files for ${FLAVOR}&lt;br /&gt;       rm -f ${elc_dir}/*.elc&lt;br /&gt;       [ -d ${elc_dir} -a `ls -la ${elc_dir}|wc -l` -gt 3 ] &amp;&amp; rmdir ${elc_dir}&lt;br /&gt;     fi&lt;br /&gt;     exit 0;&lt;br /&gt;&lt;br /&gt; - その上で、メンテナスクリプトは次のようにすべき。&lt;br /&gt;   - postinst&lt;br /&gt;     - /usr/lib/emacsen-common/emacs-package-install &amp;lt;pkg&gt;&lt;br /&gt;   - prerm&lt;br /&gt;     - /usr/lib/emacsen-common/emacs-package-remove &amp;lt;pkg&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-5418427709888006039?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/5418427709888006039/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=5418427709888006039' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/5418427709888006039'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/5418427709888006039'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2009/11/debian-emacs-policy.html' title='debian-emacs-policyのポイント'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-3028641938290079501</id><published>2009-11-29T16:58:00.003+09:00</published><updated>2009-11-29T17:04:59.169+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Ubuntu/GNU Emacs22の起動プロセスにおけるload-pathの構築と利用</title><content type='html'>ソースを探ったり、いろいろビルドしたりして、結構わかった。&lt;br /&gt;完全とまではいきませんが、現状では十分。&lt;br /&gt;&lt;br /&gt;load-pathに限らず、Emacsの起動プロセスをいろいろ調べた。結果として、Emacsの仕組みについて多少詳しくなったのも嬉しい。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;* Ubuntu/GNU Emacs22の起動プロセスにおけるload-pathの構築と利用&lt;br /&gt;** src/epaths.in&lt;br /&gt; - epaths.hの素。&lt;br /&gt; - この中のPATH_LOADSEARCHがload-pathの素。&lt;br /&gt; - GNU配布状態:&lt;br /&gt;   #define PATH_LOADSEARCH "/usr/local/lib/emacs/lisp"&lt;br /&gt;&lt;br /&gt;** src/epaths.h&lt;br /&gt; - makeによって、epaths.inを素に生成される。&lt;br /&gt; - GNU配布状態: [./configure, makeの結果]&lt;br /&gt;   #define PATH_LOADSEARCH "/usr/local/share/emacs/22.2/site-lisp:/usr/local/share/emacs/site-lisp:/usr/local/share/emacs/22.2/lisp:/usr/local/share/emacs/22.2/leim"&lt;br /&gt; - Ubuntu: [debuildの結果]&lt;br /&gt;   #define PATH_LOADSEARCH "/etc/emacs22:/etc/emacs:/usr/local/share/emacs/22.2/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/22.2/site-lisp:/usr/share/emacs/site-lisp:/usr/share/emacs/22.2/leim:/usr/share/emacs/22.2/lisp:/usr/share/emacs/22.2/leim"&lt;br /&gt;&lt;br /&gt;** src/emacs.c&lt;br /&gt; - main&lt;br /&gt;   - init_lread関数[lread.c]の実行&lt;br /&gt;     - normal = PATH_LOADSEARCH;&lt;br /&gt;     - Vload_path = decode_env_path ("EMACSLOADPATH", normal);&lt;br /&gt;       - dcode_env_pathはパス達のリストを返す。&lt;br /&gt;   - Vtop_level変数の構成&lt;br /&gt;     - 起動時に評価するlispを格納。&lt;br /&gt;     - 値の形式は(load . (hoge))。すなわちhogeをロー&lt;br /&gt;       ドする。&lt;br /&gt;     - hogeは、&lt;br /&gt;       - emacsオプションで'-l'指定があればそのelファ&lt;br /&gt;         イル。&lt;br /&gt;       - そうでなければ、'loadup.el'。&lt;br /&gt;         - GNU:&lt;br /&gt;           (load "loadup.el")&lt;br /&gt;   - Frecursive_edit関数の実行&lt;br /&gt;     - editor command loop に入る。&lt;br /&gt;     - recursive_edit_1 [keyboard.c]&lt;br /&gt;       - command_loop [keyboard.c]&lt;br /&gt;         - internal_catch (Qtop_level, top_level_1, Qnil)&lt;br /&gt;           - top_level_1 [keyboad.c]&lt;br /&gt;             - internal_condition_case (top_level_2, Qerror, cmd_error) [eval.c]&lt;br /&gt;               - top_level_2 [keyboard.c]&lt;br /&gt;                 - Feval (Vtop_level) [eval.c]&lt;br /&gt;                   - ここにいたり、先にVtop_level&lt;br /&gt;                     で設定した(load "loadup.el")が&lt;br /&gt;                     評価される。&lt;br /&gt;&lt;br /&gt;** lisp/loadup.el&lt;br /&gt; - このelispに入った時点では、emacs.cのVload_path&lt;br /&gt;   がload-pathの値である。&lt;br /&gt;&lt;br /&gt;*** load-path変数の調整&lt;br /&gt; - bootstrappingするときだけ、load-pathを次のように&lt;br /&gt;   加工する。通常はこの加工はしない。&lt;br /&gt;&lt;br /&gt;(let ((dir (car load-path)))&lt;br /&gt;      ;; We'll probably overflow the pure space.&lt;br /&gt;      (setq purify-flag nil)&lt;br /&gt;      (setq load-path (list dir&lt;br /&gt;       (expand-file-name "emacs-lisp" dir)&lt;br /&gt;       (expand-file-name "language" dir)&lt;br /&gt;       (expand-file-name "international" dir)&lt;br /&gt;       (expand-file-name "textmodes" dir))))&lt;br /&gt;&lt;br /&gt;*** (load "startup") [lisp/startup.el]&lt;br /&gt; - (defcustom site-run-file "site-start" ...)&lt;br /&gt; - (defconst debian-emacs-flavor 'emacs22 ...)&lt;br /&gt;   [*debian patch*]&lt;br /&gt; - (setq top-level '(normal-top-level))&lt;br /&gt; - normal-top-level関数を定義&lt;br /&gt;   - この関数の中で次の処理が定義されている。&lt;br /&gt;   - load-pathの拡張&lt;br /&gt;     - load-pathに含まれるパスを順次処理する。&lt;br /&gt;       - 処理は、そのパスに、subdirs.elや&lt;br /&gt;         leim-list.elがあれば、それらをloadするとい&lt;br /&gt;         うもの。&lt;br /&gt;         - subdirs.elの中身の典型は、次の2つ。&lt;br /&gt;           - normal-top-level-add-subdirs-\&lt;br /&gt;             to-load-path を引数無しで呼ぶ。これは&lt;br /&gt;             カレントディレクトリ配下のサブディレク&lt;br /&gt;             トリを全てload-pathに追加する。&lt;br /&gt;           - normal-top-level-add-subdirs-\&lt;br /&gt;             to-load-path を引数有で呼ぶ。これはカ&lt;br /&gt;             レントディレクトリ配下のサブディレクト&lt;br /&gt;             リについて、引数で指定されたものを&lt;br /&gt;             load-pathに追加する。&lt;br /&gt;         - leim-list.elの中身の典型は、次のよう。&lt;br /&gt;           - register-input-method関数の実行を列記。&lt;br /&gt;           - loadやautoloadをここに記述することも&lt;br /&gt;             ある。&lt;br /&gt;   - command-line関数を実行する。&lt;br /&gt;   - emacs-starup-hookを呼ぶ。&lt;br /&gt;   - term-startup-hookを呼ぶ。&lt;br /&gt; - command-line関数を定義&lt;br /&gt;   - この関数の中で次の処理が定義されている。&lt;br /&gt;   - (load site-run-file t t)&lt;br /&gt;   - (load "debian-startup" t t nil) [*debian patch*]&lt;br /&gt;     - "debian-startup.el"の中身は関数群定義のみ。&lt;br /&gt;     - 定義される関数の一覧。&lt;br /&gt;       - debian-pkg-add-load-path-item&lt;br /&gt;       - debian-unique-strings&lt;br /&gt;       - debian-run-directories&lt;br /&gt;       - debian-startup&lt;br /&gt;   - (debian-startup debian-emacs-flavor)の実行 [*debian patch*]&lt;br /&gt;     - (let ((common-dir "/etc/emacs/site-start.d")&lt;br /&gt;             (flavor-dir (concat "/etc/" (symbol-name flavor) "/site-start.d")))&lt;br /&gt;        (debian-run-directories flavor-dir common-dir))))&lt;br /&gt;       - (debian-run-directories flavor-dir common-dir)&lt;br /&gt;         - flavor-dirやcommon-dirに入っているすべての&lt;br /&gt;           ディレクトリについて、NNfilename.elや&lt;br /&gt;           NNfilename.elcの形のファイル名のものを探索&lt;br /&gt;           収集し、アルファベティカルにソートして、重&lt;br /&gt;           複を削除したリストを作成する。このリス&lt;br /&gt;           トをbase-namesと呼ぶ。&lt;br /&gt;         - load-pathに、flavor-dirとcommon-dirを追&lt;br /&gt;           加する。&lt;br /&gt;         - base-namesの中身(file)をひとつずつloadす&lt;br /&gt;           る。&lt;br /&gt;         - 前項のloadをした結果として、load-pathが&lt;br /&gt;           さらに拡張されているかもしれない。そこで、&lt;br /&gt;           load-pathをflavor-dirとcommon-dirを追加&lt;br /&gt;           しただけの状態に戻す。&lt;br /&gt;   - (load site-run-file t t nil) [*debian patch*]&lt;br /&gt;&lt;br /&gt;   - user-init-file-1の調整&lt;br /&gt;     - user-init-file-1は、いわゆる'~/.emacs'となる。&lt;br /&gt;   - (load user-init-file-1 t t)&lt;br /&gt;   - otherfileの調整&lt;br /&gt;     - いわゆる'~/.emacs.d'の中の'init'というファイ&lt;br /&gt;       ル。&lt;br /&gt;   - (load otherfile t t)&lt;br /&gt;   - (load "default" t t)&lt;br /&gt;     - inihibit-default-initがnilのときは読み込まな&lt;br /&gt;       い。&lt;br /&gt;&lt;br /&gt;*** (load "site-load" t)&lt;br /&gt; - 'site-load.el'がload-pathのどこかに存在すれば&lt;br /&gt;   それをloadする。&lt;br /&gt;&lt;br /&gt; - これはtemacsからemacsをdumpするときに含めたい&lt;br /&gt;   elispを指定するために存在している。計算機の速度&lt;br /&gt;   が向上しているため最近は使わない。&lt;br /&gt; - そもそもの目的はdumpに含めることなのだが、起動時&lt;br /&gt;   に読み込ませるelispの設置場所としても使えると言&lt;br /&gt;   えば使える。&lt;br /&gt; - ホストのelisp共通設定は、ここではなく&lt;br /&gt;   て'default.el'に書くべきである。そちらはユーザ&lt;br /&gt;   によって読み込みの制御ができるから。&lt;br /&gt;&lt;br /&gt;*** (load "site-init" t)&lt;br /&gt; - 'site-init.el'がload-pathのどこかに存在すれば&lt;br /&gt;   それをloadする。&lt;br /&gt;&lt;br /&gt; - これもsite-loadと同種の目的のもの。タイミングが&lt;br /&gt;   違う。site-initに書いたものはdumped imageにdoc&lt;br /&gt;   stringsが読み込まれる。こちらに書いたものは&lt;br /&gt;   dumped imageには読み込まれない。&lt;br /&gt; - そもそもの目的はdumpに含めることなのだが、起動時&lt;br /&gt;   に読み込ませるelispの設置場所としても使えると言&lt;br /&gt;   えば使える。&lt;br /&gt; - ホストのelisp共通設定は、ここではなく&lt;br /&gt;   て'default.el'に書くべきである。そちらはユーザ&lt;br /&gt;   によって読み込みの制御ができるから。&lt;br /&gt;&lt;br /&gt; - site-init.el [*debian patch*]&lt;br /&gt;   - flavor-specificなinfo dirの追加処理が記述され&lt;br /&gt;     ている。&lt;br /&gt;&lt;br /&gt;*** (eval top-level)&lt;br /&gt; - (eval top-level)&lt;br /&gt;   - normal-top-level関数[startup.el]の実行 &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-3028641938290079501?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/3028641938290079501/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=3028641938290079501' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/3028641938290079501'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/3028641938290079501'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2009/11/ubuntugnu-emacs22load-path.html' title='Ubuntu/GNU Emacs22の起動プロセスにおけるload-pathの構築と利用'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-3577706153199924082</id><published>2009-11-26T10:54:00.002+09:00</published><updated>2009-11-26T10:58:56.944+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='入門Debianパッケージ'/><title type='text'>【入門DP】4.1 パッケージ作成のための基礎知識</title><content type='html'>教本で知識を確認しつつ、その知識をつかって、emacs22のパッケージをいじってみる。その様子を掲載する。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;** 4 パッケージの作成と配布&lt;br /&gt;*** 4.1 パッケージ作成のための基礎知識&lt;br /&gt; - Ubuntu Interpidのemacs22をサンプルとしよう。&lt;br /&gt;&lt;br /&gt;**** apt-cache showsrc emacs22&lt;br /&gt; - これによって、ダウンロード前に情報をみれる。&lt;br /&gt;&lt;br /&gt;$ apt-cache showsrc emacs22&lt;br /&gt;Package: emacs22&lt;br /&gt;Binary: emacs22-common, emacs22-bin-common, emacs22, emacs22-gtk, emacs22-nox, emacs22-el, emacs&lt;br /&gt;Version: 22.2-0ubuntu2&lt;br /&gt;Priority: optional&lt;br /&gt;Section: editors&lt;br /&gt;Maintainer: Ubuntu Core Developers &lt;ubuntu-devel-discuss@lists.ubuntu.com&gt;&lt;br /&gt;Original-Maintainer: Michael W. Olson (GNU address) &lt;mwolson@gnu.org&gt;&lt;br /&gt;Build-Depends: libncurses5-dev, texinfo, liblockfile-dev, libgif-dev, libtiff-dev, xaw3dg-dev, libpng12-dev, libjpeg62-dev, libgtk2.0-dev, dpkg-dev (&gt;&gt; 1.10.0), quilt (&gt;= 0.42), lsb-release, debhelper (&gt;= 5.0.0), libxaw7-dev, libasound2-dev [!hurd-i386 !kfreebsd-i386 !kfreebsd-amd64]&lt;br /&gt;Architecture: any&lt;br /&gt;Standards-Version: 3.7.2&lt;br /&gt;Format: 1.0&lt;br /&gt;Directory: pool/main/e/emacs22&lt;br /&gt;Files:&lt;br /&gt; 04ef020a8f1f98965a6b1f881800414b 1461 emacs22_22.2-0ubuntu2.dsc&lt;br /&gt; d6ee586b8752351334ebf072904c4d51 38694318 emacs22_22.2.orig.tar.gz&lt;br /&gt; 2d264719b7d1aea7e446e73c5e68c654 26934 emacs22_22.2-0ubuntu2.diff.gz&lt;br /&gt;Vcs-Bzr: http://code.launchpad.net/%7Eubuntu-elisp/emacs/ubuntu/&lt;br /&gt;Checksums-Sha1: &lt;br /&gt; 7a371332cb8400d44e8eb31f19e432bbc93523a0 38694318 emacs22_22.2.orig.tar.gz&lt;br /&gt; b6e448aa81a7bf5a04a754f3b7ed39e4923079ef 26934 emacs22_22.2-0ubuntu2.diff.gz&lt;br /&gt;Checksums-Sha256: &lt;br /&gt; 216839e1fb38ca4f2ed0a07689fb47ee80d90845f34e0a56fe781d6aa462e367 38694318 emacs22_22.2.orig.tar.gz&lt;br /&gt; 5dcfd2a13f68972124174271d5c7f532954500f107c972df94364ef560f2b1a6 26934 emacs22_22.2-0ubuntu2.diff.gz&lt;br /&gt;&lt;br /&gt;$ &lt;br /&gt;&lt;br /&gt;**** ソースのダウンロード&lt;br /&gt; - '-d'をつけなければ、自動的にorig.tar.gzと&lt;br /&gt;   diff.gzが展開される。ここではあえて展開させない。&lt;br /&gt;&lt;br /&gt;$ apt-get -d source emacs22&lt;br /&gt;パッケージリストを読み込んでいます... 完了&lt;br /&gt;依存関係ツリーを作成しています       &lt;br /&gt;状態情報を読み取っています... 完了&lt;br /&gt;NOTICE: 'emacs22' packaging is maintained in the 'Bzr' version control system at:&lt;br /&gt;http://code.launchpad.net/%7Eubuntu-elisp/emacs/ubuntu/&lt;br /&gt;Please use:&lt;br /&gt;bzr get http://code.launchpad.net/%7Eubuntu-elisp/emacs/ubuntu/&lt;br /&gt;to retrieve the latest (possible unreleased) updates to the package.&lt;br /&gt;38.7MB のソースアーカイブを取得する必要があります。&lt;br /&gt;取得:1 http://jp.archive.ubuntu.com intrepid/main emacs22 22.2-0ubuntu2 (dsc) [1461B]&lt;br /&gt;取得:2 http://jp.archive.ubuntu.com intrepid/main emacs22 22.2-0ubuntu2 (tar) [38.7MB]&lt;br /&gt;取得:3 http://jp.archive.ubuntu.com intrepid/main emacs22 22.2-0ubuntu2 (diff) [26.9kB]&lt;br /&gt;38.7MB を 7s で取得しました (5385kB/s)&lt;br /&gt;ダウンロードオンリーモードでパッケージのダウンロードが完了しました&lt;br /&gt;$ ls&lt;br /&gt;emacs22_22.2-0ubuntu2.diff.gz  emacs22_22.2-0ubuntu2.dsc  emacs22_22.2.orig.tar.gz&lt;br /&gt;$&lt;br /&gt;&lt;br /&gt; - dscファイルの確認。&lt;br /&gt;&lt;br /&gt;$ cat emacs22_22.2-0ubuntu2.dsc &lt;br /&gt;-----BEGIN PGP SIGNED MESSAGE-----&lt;br /&gt;Hash: SHA1&lt;br /&gt;&lt;br /&gt;Format: 1.0&lt;br /&gt;Source: emacs22&lt;br /&gt;Binary: emacs22-common, emacs22-bin-common, emacs22, emacs22-gtk, emacs22-nox, emacs22-el, emacs&lt;br /&gt;Architecture: any&lt;br /&gt;Version: 22.2-0ubuntu2&lt;br /&gt;Maintainer: Ubuntu Core Developers &lt;ubuntu-devel-discuss@lists.ubuntu.com&gt;&lt;br /&gt;Standards-Version: 3.7.2&lt;br /&gt;Vcs-Bzr: http://code.launchpad.net/%7Eubuntu-elisp/emacs/ubuntu/&lt;br /&gt;Build-Depends: libncurses5-dev, texinfo, liblockfile-dev, libgif-dev, libtiff-dev, xaw3dg-dev, libpng12-dev, libjpeg62-dev, libgtk2.0-dev, dpkg-dev (&gt;&gt; 1.10.0), quilt (&gt;= 0.42), lsb-release, debhelper (&gt;= 5.0.0), libxaw7-dev, libasound2-dev [!hurd-i386 !kfreebsd-i386 !kfreebsd-amd64]&lt;br /&gt;Checksums-Sha1: &lt;br /&gt; 7a371332cb8400d44e8eb31f19e432bbc93523a0 38694318 emacs22_22.2.orig.tar.gz&lt;br /&gt; b6e448aa81a7bf5a04a754f3b7ed39e4923079ef 26934 emacs22_22.2-0ubuntu2.diff.gz&lt;br /&gt;Checksums-Sha256: &lt;br /&gt; 216839e1fb38ca4f2ed0a07689fb47ee80d90845f34e0a56fe781d6aa462e367 38694318 emacs22_22.2.orig.tar.gz&lt;br /&gt; 5dcfd2a13f68972124174271d5c7f532954500f107c972df94364ef560f2b1a6 26934 emacs22_22.2-0ubuntu2.diff.gz&lt;br /&gt;Files: &lt;br /&gt; d6ee586b8752351334ebf072904c4d51 38694318 emacs22_22.2.orig.tar.gz&lt;br /&gt; 2d264719b7d1aea7e446e73c5e68c654 26934 emacs22_22.2-0ubuntu2.diff.gz&lt;br /&gt;Original-Maintainer: Michael W. Olson (GNU address) &lt;mwolson@gnu.org&gt;&lt;br /&gt;&lt;br /&gt;-----BEGIN PGP SIGNATURE-----&lt;br /&gt;Version: GnuPG v1.4.6 (GNU/Linux)&lt;br /&gt;&lt;br /&gt;iD8DBQFIv/MoW0JvuRdL8BoRAt5eAJ9vlp/tLgrk4OKHKlqexuK5E2SKcQCdHPuB&lt;br /&gt;5DPs97j8ZSQHIjDU74XphAM=&lt;br /&gt;=MKWY&lt;br /&gt;-----END PGP SIGNATURE-----&lt;br /&gt;$ &lt;br /&gt;&lt;br /&gt;**** orig.tar.gzの中身を確認&lt;br /&gt; - emacs-22.2として展開される。これはGNU配布版その&lt;br /&gt;   ままなのだろう。&lt;br /&gt;&lt;br /&gt;$ tar zxf emacs22_22.2.orig.tar.gz &lt;br /&gt;$ ls&lt;br /&gt;emacs-22.2  emacs22_22.2-0ubuntu2.diff.gz  emacs22_22.2-0ubuntu2.dsc  emacs22_22.2.orig.tar.gz&lt;br /&gt;$ cd emacs-22.2&lt;br /&gt;$ ls&lt;br /&gt;AUTHORS     INSTALL   configure lib-src    mac     nt     vpath.sed&lt;br /&gt;BUGS     Makefile.in   configure.in lisp    make-dist    oldXMenu&lt;br /&gt;CONTRIBUTE  README   etc  lispintro  man     site-lisp&lt;br /&gt;COPYING     config.bat   info  lispref    mkinstalldirs   src&lt;br /&gt;ChangeLog   config.guess  install-sh lwlib    move-if-change  update-subdirs&lt;br /&gt;FTP     config.sub   leim  m4    msdos    vms&lt;br /&gt;$ &lt;br /&gt;&lt;br /&gt;**** diffファイルの中身を確認&lt;br /&gt; - すべて新規ファイルの作成である。&lt;br /&gt; - すべて、debian/配下のファイルである。&lt;br /&gt;&lt;br /&gt;--- emacs22-22.2.orig/debian/emacs-bin-common.overrides.linda&lt;br /&gt;+++ emacs22-22.2/debian/emacs-bin-common.overrides.linda&lt;br /&gt;@@ -0,0 +1,2 @@&lt;br /&gt;+Tag: no-manual-for-binary&lt;br /&gt;+Data: (e|c)(tags|macsclient).emacs22&lt;br /&gt;--- emacs22-22.2.orig/debian/emacsclient.desktop&lt;br /&gt;+++ emacs22-22.2/debian/emacsclient.desktop&lt;br /&gt;@@ -0,0 +1,13 @@&lt;br /&gt;+[Desktop Entry]&lt;br /&gt;+Version=1.0&lt;br /&gt;[snip]&lt;br /&gt;&lt;br /&gt;**** dpkg-sourceで展開&lt;br /&gt; - ソースパッケージの展開にはdpkg-sourceを使う。&lt;br /&gt; - これまでの作業で展開したものなどは念のため削除&lt;br /&gt;   しておく。&lt;br /&gt;&lt;br /&gt;$ ls&lt;br /&gt;emacs22_22.2-0ubuntu2.diff.gz  emacs22_22.2-0ubuntu2.dsc  emacs22_22.2.orig.tar.gz&lt;br /&gt;$ dpkg-source -x emacs22_22.2-0ubuntu2.dsc &lt;br /&gt;gpg: 2008年09月04日 23時39分36秒 JSTにDSA鍵ID 174BF01Aで施された署名&lt;br /&gt;gpg: 署名を検査できません: 公開鍵が見つかりません&lt;br /&gt;dpkg-source: extracting emacs22 in emacs22-22.2&lt;br /&gt;dpkg-source: info: unpacking emacs22_22.2.orig.tar.gz&lt;br /&gt;dpkg-source: info: applying emacs22_22.2-0ubuntu2.diff.gz&lt;br /&gt;$ ls&lt;br /&gt;emacs22-22.2         emacs22_22.2-0ubuntu2.dsc&lt;br /&gt;emacs22_22.2-0ubuntu2.diff.gz  emacs22_22.2.orig.tar.gz&lt;br /&gt;$ cd emacs22-22.2/&lt;br /&gt;$ ls&lt;br /&gt;AUTHORS     INSTALL   configure leim    m4     msdos    vms&lt;br /&gt;BUGS     Makefile.in   configure.in lib-src    mac     nt     vpath.sed&lt;br /&gt;CONTRIBUTE  README   debian lisp    make-dist    oldXMenu&lt;br /&gt;COPYING     config.bat   etc  lispintro  man     site-lisp&lt;br /&gt;ChangeLog   config.guess  info  lispref    mkinstalldirs   src&lt;br /&gt;FTP     config.sub   install-sh lwlib    move-if-change  update-subdirs&lt;br /&gt;$ &lt;br /&gt;&lt;br /&gt; - 確かに、debian/が増えているだけである。&lt;br /&gt; - orig.tar.gzを展開したときはemacs-22.2だったが、&lt;br /&gt;   dpkg-sourceした後は、emacs22-22.2になっている。&lt;br /&gt;   これは、orig.tar.gzのファイル名はdebianポリシー&lt;br /&gt;   にあわせるが、中身は上流のままというのがポリシー&lt;br /&gt;   なのだろう。それを展開時に修正しているのが、&lt;br /&gt;&lt;br /&gt;   dpkg-source: extracting emacs22 in emacs22-22.2&lt;br /&gt; &lt;br /&gt;   なのだろう。&lt;br /&gt;&lt;br /&gt;$ tar -tvf emacs22_22.2.orig.tar.gz &lt;br /&gt;drwxrwxrwx cyd/cyd           0 2008-03-26 22:55 emacs-22.2/&lt;br /&gt;-rw-r--r-- cyd/cyd       92389 2008-03-26 13:55 emacs-22.2/AUTHORS&lt;br /&gt;-rw-r--r-- cyd/cyd         210 2007-04-15 10:34 emacs-22.2/FTP&lt;br /&gt;[snip]&lt;br /&gt;&lt;br /&gt;**** debian/の中身&lt;br /&gt;***** debian/control&lt;br /&gt; - このソースツリーから生成するすべてのパッケージ&lt;br /&gt;   のメタデータが記載されている。&lt;br /&gt;&lt;br /&gt;Source: emacs22&lt;br /&gt;Section: editors&lt;br /&gt;Priority: optional&lt;br /&gt;Maintainer: Ubuntu Core Developers &lt;ubuntu-devel-discuss@lists.ubuntu.com&gt;&lt;br /&gt;XSBC-Original-Maintainer: Michael W. Olson (GNU address) &lt;mwolson@gnu.org&gt;&lt;br /&gt;Build-Depends: libncurses5-dev, texinfo, liblockfile-dev, libgif-dev, libtiff-dev, xaw3dg-dev, libpng12-dev, libjpeg62-dev, libgtk2.0-dev, dpkg-dev (&gt;&gt; 1.10.0), quilt (&gt;= 0.42), lsb-release, debhelper (&gt;= 5.0.0), libxaw7-dev, libasound2-dev [!hurd-i386 !kfreebsd-i386 !kfreebsd-amd64]&lt;br /&gt;Standards-Version: 3.7.2&lt;br /&gt;XS-Vcs-Bzr: http://code.launchpad.net/%7Eubuntu-elisp/emacs/ubuntu/&lt;br /&gt;&lt;br /&gt;Package: emacs22-common&lt;br /&gt;Section: editors&lt;br /&gt;Priority: optional&lt;br /&gt;Architecture: all&lt;br /&gt;Depends: emacsen-common (&gt;= 1.4.10), dpkg (&gt;= 1.9.0)&lt;br /&gt;Suggests: emacs22-el&lt;br /&gt;Conflicts: emacs22-el (&lt;&lt; ${source:Version}), w3-el, dictionaries-common (&lt;&lt; 0.60.0), emacs22-common-non-dfsg&lt;br /&gt;Replaces: emacs22-common-non-dfsg&lt;br /&gt;Description: The GNU Emacs editor's common infrastructure&lt;br /&gt; GNU Emacs is the extensible self-documenting text editor.&lt;br /&gt; This package contains the infrastructure common between emacs22,&lt;br /&gt; emacs22-gtk, and emacs22-nox.&lt;br /&gt;&lt;br /&gt;Package: emacs22-bin-common&lt;br /&gt;Section: editors&lt;br /&gt;Priority: optional&lt;br /&gt;Architecture: any&lt;br /&gt;Depends: emacs22-common (= ${source:Version}), ${shlibs:Depends}&lt;br /&gt;Description: The GNU Emacs editor's shared, architecture dependent files&lt;br /&gt; GNU Emacs is the extensible self-documenting text editor.&lt;br /&gt; This package contains the architecture dependent infrastructure&lt;br /&gt; that's shared by emacs22, emacs22-gtk, and emacs22-nox.&lt;br /&gt;[snip]&lt;br /&gt;&lt;br /&gt;***** debian/rules&lt;br /&gt; - パッケージの構築を実施するプログラム。&lt;br /&gt; - rulesファイルの一行目は&lt;br /&gt;&lt;br /&gt;   #!/usr/bin/make -f&lt;br /&gt;&lt;br /&gt;   でなければならない。&lt;br /&gt; - またインターフェイスとして次のターゲットは必須&lt;br /&gt;   である。&lt;br /&gt;&lt;br /&gt;   build        [必須]&lt;br /&gt;   binary       [必須]&lt;br /&gt;   binary-arch  [必須]&lt;br /&gt;   binary-indep [必須]&lt;br /&gt;   clean&lt;br /&gt;   build-arch&lt;br /&gt;   build-indep&lt;br /&gt;   get-orig-source&lt;br /&gt;&lt;br /&gt; - 中身を多少追ってみる。本格的に追うのはdebhelper&lt;br /&gt;   の節にて。&lt;br /&gt;&lt;br /&gt;   - binaryターゲットは？&lt;br /&gt;&lt;br /&gt;binary: binary-indep binary-arch&lt;br /&gt;&lt;br /&gt;   - この前提条件達は？&lt;br /&gt;&lt;br /&gt;binary-indep: build install&lt;br /&gt; dh_testdir -i&lt;br /&gt; dh_testroot -i&lt;br /&gt; dh_installchangelogs -i&lt;br /&gt; dh_installdocs -i&lt;br /&gt; dh_link -i&lt;br /&gt; dh_strip -i&lt;br /&gt; dh_compress -XREADME.Debian -i&lt;br /&gt; dh_fixperms -i&lt;br /&gt; dh_installdeb -i&lt;br /&gt; # don't install maintainer scripts in the metapackage&lt;br /&gt; rm -vf debian/emacs/DEBIAN/{post,pre}{inst,rm}&lt;br /&gt; dh_shlibdeps -i&lt;br /&gt; dh_gencontrol -i&lt;br /&gt; dh_md5sums -i&lt;br /&gt; dh_builddeb -i&lt;br /&gt;&lt;br /&gt;binary-arch: build install&lt;br /&gt; dh_testdir -a&lt;br /&gt; dh_testroot -a&lt;br /&gt; dh_installinfo -a&lt;br /&gt; dh_installman -a&lt;br /&gt; dh_installchangelogs -a&lt;br /&gt; dh_installdocs -a&lt;br /&gt; dh_installexamples -a&lt;br /&gt; dh_installmenu -a&lt;br /&gt; dh_desktop -a&lt;br /&gt; dh_link -a&lt;br /&gt; dh_strip -a&lt;br /&gt; dh_compress -a&lt;br /&gt; dh_fixperms -a -X${movemail_bin}&lt;br /&gt; dh_installdeb -a&lt;br /&gt; dh_shlibdeps -a&lt;br /&gt; dh_gencontrol -a&lt;br /&gt; dh_md5sums -a&lt;br /&gt; dh_builddeb -a&lt;br /&gt;&lt;br /&gt;   - buildターゲットは？&lt;br /&gt;&lt;br /&gt;build: patch build-stamp&lt;br /&gt;&lt;br /&gt;   - patchターゲットは？&lt;br /&gt;&lt;br /&gt;     これはrulesには存在しない。おそらく、&lt;br /&gt;&lt;br /&gt;include /usr/share/quilt/quilt.make&lt;br /&gt;&lt;br /&gt;     こちらの中にあるのでは。&lt;br /&gt;&lt;br /&gt;   - build-stampターゲットは？&lt;br /&gt;&lt;br /&gt;build-stamp: bootstrap emacs emacs-gtk emacs-nox&lt;br /&gt; dh_testdir&lt;br /&gt; touch $@&lt;br /&gt;&lt;br /&gt;   - bootstrapターゲットは？&lt;br /&gt;&lt;br /&gt;bootstrap: bootstrap-stamp&lt;br /&gt;bootstrap-stamp:&lt;br /&gt; dh_testdir&lt;br /&gt;&lt;br /&gt; # Emacs must be bootstrapped at least once in order to&lt;br /&gt; # generate .elc files&lt;br /&gt; CFLAGS="${CFLAGS}" ./configure ${emacs_confflags}&lt;br /&gt; ${build_cmd} bootstrap&lt;br /&gt; ${build_cmd} distclean&lt;br /&gt;&lt;br /&gt; touch $@&lt;br /&gt;&lt;br /&gt;     - ここでAutotoolsのbootstrapをやってるのだな。&lt;br /&gt;   - emacsターゲットは？&lt;br /&gt;   &lt;br /&gt;emacs: bootstrap emacs-stamp&lt;br /&gt;emacs-stamp:&lt;br /&gt; dh_testdir&lt;br /&gt;&lt;br /&gt; $(call emacs_build,${emacs_confflags},x-emacs)&lt;br /&gt; ${build_cmd} distclean&lt;br /&gt;&lt;br /&gt; touch $@&lt;br /&gt;&lt;br /&gt;   - emacs_buildマクロとは？&lt;br /&gt;&lt;br /&gt;define emacs_build&lt;br /&gt; # Build emacs&lt;br /&gt; CFLAGS="${CFLAGS}" ./configure ${1}&lt;br /&gt; ${build_cmd}&lt;br /&gt; # Check for pure space overflow&lt;br /&gt; ${check_pure_space}&lt;br /&gt; # save binary from deletion&lt;br /&gt; mv src/emacs src/${2}&lt;br /&gt;endef&lt;br /&gt;&lt;br /&gt;     - ここで./configureをやる。&lt;br /&gt;&lt;br /&gt;   - build_cmdマクロとは？&lt;br /&gt;&lt;br /&gt;define build_cmd&lt;br /&gt; ${MAKE} CFLAGS="${CFLAGS}" LDFLAGS="${LDFLAGS}"&lt;br /&gt;endef&lt;br /&gt;&lt;br /&gt;     - お、ここでmakeを呼ぶのか。&lt;br /&gt;&lt;br /&gt; - パッチあてて、./configureとmakeの流れがどう記述&lt;br /&gt;   さているかは理解できた。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;**** ビルド環境確認&lt;br /&gt; - 環境はそろっているようだ。&lt;br /&gt;&lt;br /&gt;$ sudo apt-get -s build-dep emacs22&lt;br /&gt;パッケージリストを読み込んでいます... 完了&lt;br /&gt;依存関係ツリーを作成しています       &lt;br /&gt;状態情報を読み取っています... 完了&lt;br /&gt;アップグレード: 0 個、新規インストール: 0 個、削除: 0 個、保留: 0 個。&lt;br /&gt;$ &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;スタックをかなり積んだ成果が出ている。rulesの中身など、いろいろよく分かる。&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-3577706153199924082?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/3577706153199924082/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=3577706153199924082' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/3577706153199924082'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/3577706153199924082'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2009/11/dp41.html' title='【入門DP】4.1 パッケージ作成のための基礎知識'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-8362349409258993411</id><published>2009-11-26T08:08:00.002+09:00</published><updated>2009-11-26T08:18:54.939+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debian'/><category scheme='http://www.blogger.com/atom/ns#' term='GNU Autotools'/><title type='text'>GNUからDebianへ</title><content type='html'>調べてみたところ、GNU Autoconf/Automake/Libtoolは、第11章以降について、サンプルの現代化がなされていないようだ。自分で現代化していく、というのも勉強になりそうだが、Autotoolsの知識を得ることはスタックの途中にすぎないので、ちょっと重い。&lt;br /&gt;&lt;br /&gt;そこで、この本は第10章(US第11章)でいったん区切りとする。先々、今度は主たる目的としてAutotoolsを攻めてみたい。&lt;br /&gt;&lt;br /&gt;さて、スタックがひとつ巻き戻った。&lt;br /&gt;&lt;br /&gt;次は、Debian Systemのパッケージ構造の基礎を再確認しよう。&lt;br /&gt;&lt;br /&gt;教本は、&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.co.jp/dp/477412768X/"&gt;[入門] Debian パッケージ&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;にする。昔一度読んだことがあるので、パッケージ構造に関わる部分だけ復習する。&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-8362349409258993411?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/8362349409258993411/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=8362349409258993411' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/8362349409258993411'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/8362349409258993411'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2009/11/gnudebian.html' title='GNUからDebianへ'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-5441182537565464999</id><published>2009-11-26T07:16:00.002+09:00</published><updated>2009-11-26T07:24:33.337+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GNU Autoconf/Automake/Libtool'/><category scheme='http://www.blogger.com/atom/ns#' term='GNU Autotools'/><category scheme='http://www.blogger.com/atom/ns#' term='GNU toolchain'/><title type='text'>【autotools】10(US 11) GNU Libtoolとconfigure.inおよびMakefile.am</title><content type='html'>Autotoolsの新刊がもうすぐ発売される。&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.amazon.co.jp/dp/1593272065/"&gt;AUTOTOOLS&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;GNU Autoconf/Automake/Libtoolは、少々古いので、それを補えるかもしれない。楽しみです。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;** 10(US 11) GNU Libtoolとconfigure.inおよびMakefile.am&lt;br /&gt; - この章は、Automake&amp;Autoconfと一緒にlibtoolを使&lt;br /&gt;   う方法の説明。&lt;br /&gt; - 一通り読み、ソースを追い、サンプルを試してみた。&lt;br /&gt; - しかし、何かを「わかった」という実感はない。&lt;br /&gt; - こういう内容は結局実戦で使うときに、理解が発生&lt;br /&gt;   するのだろう。&lt;br /&gt; - 今は、触れておくことによってその準備をしている&lt;br /&gt;   と考えておく。&lt;br /&gt; - なお、サンプルは、私の環境では、なぜか&lt;br /&gt;   Segmentation fault。。。&lt;br /&gt;&lt;br /&gt;convenience-2.0 $ ./convenience&lt;br /&gt;cos (0) =&gt; 1&lt;br /&gt;Segmentation fault&lt;br /&gt;convenience-2.0 $&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-5441182537565464999?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/5441182537565464999/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=5441182537565464999' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/5441182537565464999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/5441182537565464999'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2009/11/autotools10us-11-gnu.html' title='【autotools】10(US 11) GNU Libtoolとconfigure.inおよびMakefile.am'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-6119454560649142135</id><published>2009-11-25T10:36:00.002+09:00</published><updated>2009-11-25T10:58:54.341+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GNU Autoconf/Automake/Libtool'/><category scheme='http://www.blogger.com/atom/ns#' term='GNU Autotools'/><category scheme='http://www.blogger.com/atom/ns#' term='libtool'/><title type='text'>【autotools】9(US 10) GNU Libtool入門 (2)</title><content type='html'>&lt;pre&gt;&lt;br /&gt;** 9(US 10) GNU Libtool入門&lt;br /&gt; - Libtoolを単に利用するだけではなく、中身も探って&lt;br /&gt;   みよう、シェルプロンプトからLibtoolを使ってみよ&lt;br /&gt;   う、というお話。&lt;br /&gt; - ここで、ざっと読んでみるが困難を感じる。&lt;br /&gt; - GNU Libtool Infoをちらっと見てみる。やはり困難&lt;br /&gt;   を感じる。&lt;br /&gt; - Linkers &amp; Loadersで勉強。完了。&lt;br /&gt; - GNU Libtool Infoもざっとやる。問題なし。&lt;br /&gt; - そしてこの章に戻ってきた。&lt;br /&gt; - 内容はわかるが、libtoolの利用例が古いlibtoolの&lt;br /&gt;   もので、そのままでは動かない。。。&lt;br /&gt; - 最新のlibtoolでの操作に置き換えてみる。&lt;br /&gt;&lt;br /&gt; - 訳書P93&lt;br /&gt;   - ltconfigによるホスト用libtoolの生成方法が記載&lt;br /&gt;     されている。しかし、現状のlibtoolではltconfig&lt;br /&gt;     は廃止されており、configureにてホスト用&lt;br /&gt;     libtoolを生成するようである。&lt;br /&gt;   - Ubuntuでは、Ubuntu用のlibtoolが生成済みで配布&lt;br /&gt;     されており、この作業にはソースパッケージが必&lt;br /&gt;     要である。&lt;br /&gt;   - ここでは割愛する。&lt;br /&gt; - 訳書P97&lt;br /&gt;   - ここはlibtoolのI/Fが変更になっているところ。&lt;br /&gt;   - 現在は次のとおり。&lt;br /&gt;&lt;br /&gt;9-US10 $ libtool --mode=compile gcc -c hello.c&lt;br /&gt;libtool: compile:  gcc -c hello.c  -fPIC -DPIC -o .libs/hello.o&lt;br /&gt;libtool: compile:  gcc -c hello.c -o hello.o &gt;/dev/null 2&gt;&amp;1&lt;br /&gt;9-US10 $ ls&lt;br /&gt;hello.c  hello.lo  hello.o&lt;br /&gt;9-US10 $ libtool --mode=link gcc -rpath /usr/local/lib -o libhello.la hello.lo&lt;br /&gt;libtool: link: gcc -shared  .libs/hello.o      -Wl,-soname -Wl,libhello.so.0 -o .libs/libhello.so.0.0.0&lt;br /&gt;libtool: link: (cd ".libs" &amp;&amp; rm -f "libhello.so.0" &amp;&amp; ln -s "libhello.so.0.0.0" "libhello.so.0")&lt;br /&gt;libtool: link: (cd ".libs" &amp;&amp; rm -f "libhello.so" &amp;&amp; ln -s "libhello.so.0.0.0" "libhello.so")&lt;br /&gt;libtool: link: ar cru .libs/libhello.a  hello.o&lt;br /&gt;libtool: link: ranlib .libs/libhello.a&lt;br /&gt;libtool: link: ( cd ".libs" &amp;&amp; rm -f "libhello.la" &amp;&amp; ln -s "../libhello.la" "libhello.la" )&lt;br /&gt;9-US10 $ ls&lt;br /&gt;hello.c  hello.lo  hello.o  libhello.la&lt;br /&gt;9-US10 $ &lt;br /&gt;&lt;br /&gt;   - 次の部分は、本文にコンパイルとあるのでmodeを&lt;br /&gt;     compileにしているが、rpathスイッチがあるとい&lt;br /&gt;     うことはリンクすべきではないか。&lt;br /&gt;&lt;br /&gt;9-US10 $ libtool --mode=compile c89 -rpath /usr/local/lib -c hello.c&lt;br /&gt;libtool: compile: unable to infer tagged configuration&lt;br /&gt;libtool: compile: specify a tag with `--tag'&lt;br /&gt;9-US10 $ &lt;br /&gt;&lt;br /&gt; - 訳書P98&lt;br /&gt;&lt;br /&gt;9-US10 $ libtool --mode=link gcc -static -o libhello.la hello.lo&lt;br /&gt;libtool: link: ar cru .libs/libhello.a  hello.o&lt;br /&gt;libtool: link: ranlib .libs/libhello.a&lt;br /&gt;libtool: link: ( cd ".libs" &amp;&amp; rm -f "libhello.la" &amp;&amp; ln -s "../libhello.la" "libhello.la" )&lt;br /&gt;9-US10 $ ls&lt;br /&gt;hello.c  hello.lo  hello.o  libhello.la&lt;br /&gt;9-US10 $ &lt;br /&gt;&lt;br /&gt; - 訳書P100&lt;br /&gt;&lt;br /&gt;9-US10 $ libtool --mode=link gcc -o libtrim.la trim.lo&lt;br /&gt;libtool: link: ar cru .libs/libtrim.a .libs/trim.o &lt;br /&gt;libtool: link: ranlib .libs/libtrim.a&lt;br /&gt;libtool: link: ( cd ".libs" &amp;&amp; rm -f "libtrim.la" &amp;&amp; ln -s "../libtrim.la" "libtrim.la" )&lt;br /&gt;9-US10 $ &lt;br /&gt;&lt;br /&gt; - 訳書P100からP101へのまたぎ&lt;br /&gt;&lt;br /&gt;9-US10 $ libtool --mode=link gcc -o libgraphics.la -lpng -ltiff -ljpeg -lz&lt;br /&gt;libtool: link: ar cru .libs/libgraphics.a &lt;br /&gt;libtool: link: ranlib .libs/libgraphics.a&lt;br /&gt;libtool: link: ( cd ".libs" &amp;&amp; rm -f "libgraphics.la" &amp;&amp; ln -s "../libgraphics.la" "libgraphics.la" )&lt;br /&gt;9-US10 $ &lt;br /&gt;&lt;br /&gt; - 訳書P101からP102へのまたぎ&lt;br /&gt;   - 実行可能ファイルのリンクをする前の仮定が省略&lt;br /&gt;     されているのでそこもやっておく。&lt;br /&gt;   &lt;br /&gt;hello $ ls&lt;br /&gt;Makefile.am  bootstrap configure.ac  hello.c  main.c&lt;br /&gt;hello $ libtool --mode=compile gcc -c hello.c&lt;br /&gt;libtool: compile:  gcc -c hello.c  -fPIC -DPIC -o .libs/hello.o&lt;br /&gt;libtool: compile:  gcc -c hello.c -o hello.o &gt;/dev/null 2&gt;&amp;1&lt;br /&gt;hello $ libtool --mode=link gcc -rpath /usr/local/lib -o libhello.la hello.lo&lt;br /&gt;libtool: link: gcc -shared  .libs/hello.o      -Wl,-soname -Wl,libhello.so.0 -o .libs/libhello.so.0.0.0&lt;br /&gt;libtool: link: (cd ".libs" &amp;&amp; rm -f "libhello.so.0" &amp;&amp; ln -s "libhello.so.0.0.0" "libhello.so.0")&lt;br /&gt;libtool: link: (cd ".libs" &amp;&amp; rm -f "libhello.so" &amp;&amp; ln -s "libhello.so.0.0.0" "libhello.so")&lt;br /&gt;libtool: link: ar cru .libs/libhello.a  hello.o&lt;br /&gt;libtool: link: ranlib .libs/libhello.a&lt;br /&gt;libtool: link: ( cd ".libs" &amp;&amp; rm -f "libhello.la" &amp;&amp; ln -s "../libhello.la" "libhello.la" )&lt;br /&gt;hello $ ls&lt;br /&gt;Makefile.am  bootstrap configure.ac  hello.c  hello.lo  hello.o  libhello.la  main.c&lt;br /&gt;hello $ libtool --mode=link gcc -o hello main.c libhello.la&lt;br /&gt;libtool: link: gcc -o .libs/hello main.c  ./.libs/libhello.so&lt;br /&gt;hello $ ls&lt;br /&gt;Makefile.am  configure.ac  hello.c   hello.o   main.c&lt;br /&gt;bootstrap    hello    hello.lo  libhello.la&lt;br /&gt;hello $ ./hello&lt;br /&gt;Hello, World!&lt;br /&gt;hello $ &lt;br /&gt;&lt;br /&gt; - 訳書P102&lt;br /&gt;&lt;br /&gt;hello $ libtool --mode=link gcc -static -o hello main.c libhello.la&lt;br /&gt;libtool: link: gcc -o hello main.c  ./.libs/libhello.a&lt;br /&gt;hello $ &lt;br /&gt;&lt;br /&gt; - 訳書P103&lt;br /&gt;&lt;br /&gt;   - この例は、loader.oが存在しないので実行できな&lt;br /&gt;     い。&lt;br /&gt;&lt;br /&gt; - 訳書P105&lt;br /&gt;&lt;br /&gt;intro-hello $ rm hello *.a *.o&lt;br /&gt;intro-hello $ libtool --mode=compile gcc -c trim.c&lt;br /&gt;libtool: compile:  gcc -c trim.c  -fPIC -DPIC -o .libs/trim.o&lt;br /&gt;libtool: compile:  gcc -c trim.c -o trim.o &gt;/dev/null 2&gt;&amp;1&lt;br /&gt;intro-hello $ libtool --mode=link gcc -rpath /usr/local/lib -o libtrim.la trim.lo&lt;br /&gt;libtool: link: gcc -shared  .libs/trim.o      -Wl,-soname -Wl,libtrim.so.0 -o .libs/libtrim.so.0.0.0&lt;br /&gt;libtool: link: (cd ".libs" &amp;&amp; rm -f "libtrim.so.0" &amp;&amp; ln -s "libtrim.so.0.0.0" "libtrim.so.0")&lt;br /&gt;libtool: link: (cd ".libs" &amp;&amp; rm -f "libtrim.so" &amp;&amp; ln -s "libtrim.so.0.0.0" "libtrim.so")&lt;br /&gt;libtool: link: ar cru .libs/libtrim.a  trim.o&lt;br /&gt;libtool: link: ranlib .libs/libtrim.a&lt;br /&gt;libtool: link: ( cd ".libs" &amp;&amp; rm -f "libtrim.la" &amp;&amp; ln -s "../libtrim.la" "libtrim.la" )&lt;br /&gt;intro-hello $ &lt;br /&gt;&lt;br /&gt; - 訳書P106&lt;br /&gt;&lt;br /&gt;intro-hello $ libtool --mode=compile gcc -c hello.c&lt;br /&gt;libtool: compile:  gcc -c hello.c  -fPIC -DPIC -o .libs/hello.o&lt;br /&gt;libtool: compile:  gcc -c hello.c -o hello.o &gt;/dev/null 2&gt;&amp;1&lt;br /&gt;intro-hello $ libtool --mode=link gcc -rpath /usr/local/lib -o libhello.la hello.lo libtrim.la&lt;br /&gt;libtool: link: gcc -shared  .libs/hello.o   -Wl,-rpath -Wl,/home/aka/scratch/autotools/9-US10/hello-2.0/intro-hello/.libs ./.libs/libtrim.so    -Wl,-soname -Wl,libhello.so.0 -o .libs/libhello.so.0.0.0&lt;br /&gt;libtool: link: (cd ".libs" &amp;&amp; rm -f "libhello.so.0" &amp;&amp; ln -s "libhello.so.0.0.0" "libhello.so.0")&lt;br /&gt;libtool: link: (cd ".libs" &amp;&amp; rm -f "libhello.so" &amp;&amp; ln -s "libhello.so.0.0.0" "libhello.so")&lt;br /&gt;libtool: link: ar cru .libs/libhello.a  hello.o&lt;br /&gt;libtool: link: ranlib .libs/libhello.a&lt;br /&gt;libtool: link: ( cd ".libs" &amp;&amp; rm -f "libhello.la" &amp;&amp; ln -s "../libhello.la" "libhello.la" )&lt;br /&gt;intro-hello $ ls&lt;br /&gt;hello.c  hello.lo  hello.o  libhello.la  libtrim.la  main.c  trim.c  trim.lo  trim.o&lt;br /&gt;intro-hello $ libtool --mode=link gcc -o hello main.c libhello.la&lt;br /&gt;libtool: link: gcc -o .libs/hello main.c  ./.libs/libhello.so /home/aka/scratch/autotools/9-US10/hello-2.0/intro-hello/.libs/libtrim.so&lt;br /&gt;main.c: In function 'main':&lt;br /&gt;main.c:7: warning: incompatible implicit declaration of built-in function 'exit'&lt;br /&gt;intro-hello $ ./hello&lt;br /&gt;Hello, World!&lt;br /&gt;intro-hello $ &lt;br /&gt;&lt;br /&gt; - 訳書P107&lt;br /&gt;&lt;br /&gt;intro-hello $ libtool --mode=link gcc -o hello-again -static main.c libhello.la&lt;br /&gt;libtool: link: gcc -o hello-again main.c  ./.libs/libhello.a /home/aka/scratch/autotools/9-US10/hello-2.0/intro-hello/.libs/libtrim.a&lt;br /&gt;main.c: In function 'main':&lt;br /&gt;main.c:7: warning: incompatible implicit declaration of built-in function 'exit'&lt;br /&gt;intro-hello $ ls&lt;br /&gt;hello      hello.c   hello.o     libtrim.la trim.c  trim.o&lt;br /&gt;hello-again  hello.lo  libhello.la  main.c trim.lo&lt;br /&gt;intro-hello $ ./hello-again&lt;br /&gt;Hello, World!&lt;br /&gt;intro-hello $ &lt;br /&gt;&lt;br /&gt;intro-hello $ libtool --mode=link gcc -o hello main.c libhello.la&lt;br /&gt;libtool: link: gcc -o .libs/hello main.c  ./.libs/libhello.so -Wl,-rpath -Wl,/home/aka/scratch/autotools/9-US10/hello-2.0/intro-hello/_inst&lt;br /&gt;main.c: In function 'main':&lt;br /&gt;main.c:7: warning: incompatible implicit declaration of built-in function 'exit'&lt;br /&gt;intro-hello $ ./hello&lt;br /&gt;Hello, World!&lt;br /&gt;intro-hello $ &lt;br /&gt;&lt;br /&gt; - 訳書P109&lt;br /&gt;&lt;br /&gt;intro-hello $ libtool --mode=execute gdb hello&lt;br /&gt;GNU gdb 6.8-debian&lt;br /&gt;Copyright (C) 2008 Free Software Foundation, Inc.&lt;br /&gt;License GPLv3+: GNU GPL version 3 or later &lt;http://gnu.org/licenses/gpl.html&gt;&lt;br /&gt;This is free software: you are free to change and redistribute it.&lt;br /&gt;There is NO WARRANTY, to the extent permitted by law.  Type "show copying"&lt;br /&gt;and "show warranty" for details.&lt;br /&gt;This GDB was configured as "x86_64-linux-gnu"...&lt;br /&gt;(gdb) run&lt;br /&gt;Starting program: /home/aka/local/work/scratch/autotools/9-US10/hello-2.0/intro-hello/.libs/lt-hello &lt;br /&gt;Hello, World!&lt;br /&gt;&lt;br /&gt;Program exited normally.&lt;br /&gt;(gdb) &lt;br /&gt;&lt;br /&gt; - 訳書P109&lt;br /&gt;   - libhelloはインストールできるが、libtrimはイン&lt;br /&gt;     ストールできない。なぜか。&lt;br /&gt;&lt;br /&gt;intro-hello $ sudo libtool --mode=install cp libtrim.la /usr/local/lib/&lt;br /&gt;libtool: install: cp .libs/libtrim.lai /usr/local/lib/libtrim.la&lt;br /&gt;cp: cannot stat `.libs/libtrim.lai': No such file or directory&lt;br /&gt;intro-hello $ sudo libtool --mode=install install -c libtrim.la /usr/local/lib/&lt;br /&gt;libtool: install: install -c .libs/libtrim.lai /usr/local/lib/libtrim.la&lt;br /&gt;install: cannot stat `.libs/libtrim.lai': No such file or directory&lt;br /&gt;intro-hello $ sudo libtool --mode=install install -c libhello.la /usr/local/lib/&lt;br /&gt;libtool: install: install -c .libs/libhello.so.0.0.0 /usr/local/lib/libhello.so.0.0.0&lt;br /&gt;libtool: install: (cd /usr/local/lib &amp;&amp; { ln -s -f libhello.so.0.0.0 libhello.so.0 || { rm -f libhello.so.0 &amp;&amp; ln -s libhello.so.0.0.0 libhello.so.0; }; })&lt;br /&gt;libtool: install: (cd /usr/local/lib &amp;&amp; { ln -s -f libhello.so.0.0.0 libhello.so || { rm -f libhello.so &amp;&amp; ln -s libhello.so.0.0.0 libhello.so; }; })&lt;br /&gt;libtool: install: install -c .libs/libhello.lai /usr/local/lib/libhello.la&lt;br /&gt;libtool: install: install -c .libs/libhello.a /usr/local/lib/libhello.a&lt;br /&gt;libtool: install: chmod 644 /usr/local/lib/libhello.a&lt;br /&gt;libtool: install: ranlib /usr/local/lib/libhello.a&lt;br /&gt;libtool: install: warning: remember to run `libtool --finish /home/aka/scratch/autotools/9-US10/hello-2.0/intro-hello/_inst'&lt;br /&gt;intro-hello $ &lt;br /&gt;&lt;br /&gt;   - そうか。コンビニエンスライブラリの流れ&lt;br /&gt;     で、-rpathを一度/usr/local/libから外している&lt;br /&gt;     から駄目なんだろうな。通常のライブラリでやり&lt;br /&gt;     直していれてみる。&lt;br /&gt;&lt;br /&gt;intro-hello $ rm hello hello-again *.la *.lo *.o&lt;br /&gt;intro-hello $ ls&lt;br /&gt;hello.c  main.c  trim.c&lt;br /&gt;intro-hello $ libtool --mode=compile gcc -c trim.c&lt;br /&gt;libtool: compile:  gcc -c trim.c  -fPIC -DPIC -o .libs/trim.o&lt;br /&gt;libtool: compile:  gcc -c trim.c -o trim.o &gt;/dev/null 2&gt;&amp;1&lt;br /&gt;intro-hello $ libtool --mode=link gcc -rpath /usr/local/lib -o libtrim.la trim.lo&lt;br /&gt;libtool: link: rm -fr  .libs/libtrim.a .libs/libtrim.la&lt;br /&gt;libtool: link: gcc -shared  .libs/trim.o      -Wl,-soname -Wl,libtrim.so.0 -o .libs/libtrim.so.0.0.0&lt;br /&gt;libtool: link: (cd ".libs" &amp;&amp; rm -f "libtrim.so.0" &amp;&amp; ln -s "libtrim.so.0.0.0" "libtrim.so.0")&lt;br /&gt;libtool: link: (cd ".libs" &amp;&amp; rm -f "libtrim.so" &amp;&amp; ln -s "libtrim.so.0.0.0" "libtrim.so")&lt;br /&gt;libtool: link: ar cru .libs/libtrim.a  trim.o&lt;br /&gt;libtool: link: ranlib .libs/libtrim.a&lt;br /&gt;libtool: link: ( cd ".libs" &amp;&amp; rm -f "libtrim.la" &amp;&amp; ln -s "../libtrim.la" "libtrim.la" )&lt;br /&gt;intro-hello $ libtool --mode=compile gcc -c hello.c&lt;br /&gt;libtool: compile:  gcc -c hello.c  -fPIC -DPIC -o .libs/hello.o&lt;br /&gt;libtool: compile:  gcc -c hello.c -o hello.o &gt;/dev/null 2&gt;&amp;1&lt;br /&gt;intro-hello $ libtool --mode=link gcc -rpath /usr/local/lib -o libhello.la hello.lo libtrim.la&lt;br /&gt;libtool: link: rm -fr  .libs/libhello.a .libs/libhello.la .libs/libhello.lai .libs/libhello.so .libs/libhello.so.0 .libs/libhello.so.0.0.0&lt;br /&gt;libtool: link: gcc -shared  .libs/hello.o   -Wl,-rpath -Wl,/home/aka/scratch/autotools/9-US10/hello-2.0/intro-hello/.libs ./.libs/libtrim.so    -Wl,-soname -Wl,libhello.so.0 -o .libs/libhello.so.0.0.0&lt;br /&gt;libtool: link: (cd ".libs" &amp;&amp; rm -f "libhello.so.0" &amp;&amp; ln -s "libhello.so.0.0.0" "libhello.so.0")&lt;br /&gt;libtool: link: (cd ".libs" &amp;&amp; rm -f "libhello.so" &amp;&amp; ln -s "libhello.so.0.0.0" "libhello.so")&lt;br /&gt;libtool: link: ar cru .libs/libhello.a  hello.o&lt;br /&gt;libtool: link: ranlib .libs/libhello.a&lt;br /&gt;libtool: link: ( cd ".libs" &amp;&amp; rm -f "libhello.la" &amp;&amp; ln -s "../libhello.la" "libhello.la" )&lt;br /&gt;intro-hello $ libtool --mode=link gcc -o hello main.c libhello.la&lt;br /&gt;libtool: link: gcc -o .libs/hello main.c  ./.libs/libhello.so /home/aka/scratch/autotools/9-US10/hello-2.0/intro-hello/.libs/libtrim.so&lt;br /&gt;main.c: In function 'main':&lt;br /&gt;main.c:7: warning: incompatible implicit declaration of built-in function 'exit'&lt;br /&gt;intro-hello $ ./hello&lt;br /&gt;Hello, World!&lt;br /&gt;intro-hello $ ls .libs&lt;br /&gt;hello     libhello.la   libhello.so.0      libtrim.la   libtrim.so.0     trim.o&lt;br /&gt;hello.o     libhello.lai  libhello.so.0.0.0  libtrim.lai  libtrim.so.0.0.0&lt;br /&gt;libhello.a  libhello.so   libtrim.a      libtrim.so   lt-hello&lt;br /&gt;intro-hello $ sudo libtool --mode=install cp libtrim.la /usr/local/lib&lt;br /&gt;[sudo] password for aka: &lt;br /&gt;libtool: install: cp .libs/libtrim.so.0.0.0 /usr/local/lib/libtrim.so.0.0.0&lt;br /&gt;libtool: install: (cd /usr/local/lib &amp;&amp; { ln -s -f libtrim.so.0.0.0 libtrim.so.0 || { rm -f libtrim.so.0 &amp;&amp; ln -s libtrim.so.0.0.0 libtrim.so.0; }; })&lt;br /&gt;libtool: install: (cd /usr/local/lib &amp;&amp; { ln -s -f libtrim.so.0.0.0 libtrim.so || { rm -f libtrim.so &amp;&amp; ln -s libtrim.so.0.0.0 libtrim.so; }; })&lt;br /&gt;libtool: install: cp .libs/libtrim.lai /usr/local/lib/libtrim.la&lt;br /&gt;libtool: install: cp .libs/libtrim.a /usr/local/lib/libtrim.a&lt;br /&gt;libtool: install: chmod 644 /usr/local/lib/libtrim.a&lt;br /&gt;libtool: install: ranlib /usr/local/lib/libtrim.a&lt;br /&gt;libtool: finish: PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin:/sbin" ldconfig -n /usr/local/lib&lt;br /&gt;----------------------------------------------------------------------&lt;br /&gt;Libraries have been installed in:&lt;br /&gt;   /usr/local/lib&lt;br /&gt;&lt;br /&gt;If you ever happen to want to link against installed libraries&lt;br /&gt;in a given directory, LIBDIR, you must either use libtool, and&lt;br /&gt;specify the full pathname of the library, or use the `-LLIBDIR'&lt;br /&gt;flag during linking and do at least one of the following:&lt;br /&gt;   - add LIBDIR to the `LD_LIBRARY_PATH' environment variable&lt;br /&gt;     during execution&lt;br /&gt;   - add LIBDIR to the `LD_RUN_PATH' environment variable&lt;br /&gt;     during linking&lt;br /&gt;   - use the `-Wl,-rpath -Wl,LIBDIR' linker flag&lt;br /&gt;   - have your system administrator add LIBDIR to `/etc/ld.so.conf'&lt;br /&gt;&lt;br /&gt;See any operating system documentation about shared libraries for&lt;br /&gt;more information, such as the ld(1) and ld.so(8) manual pages.&lt;br /&gt;----------------------------------------------------------------------&lt;br /&gt;intro-hello $ &lt;br /&gt;&lt;br /&gt;   - 入った。&lt;br /&gt;&lt;br /&gt; - 訳書P109&lt;br /&gt;&lt;br /&gt;intro-hello $ sudo libtool --mode=execute cp hello /usr/local/bin&lt;br /&gt;intro-hello $ &lt;br /&gt;&lt;br /&gt;   - helloではなく、lt-helloとして入る。&lt;br /&gt;   - ライブラリパスをみるとローカルになっている。&lt;br /&gt;     なんでだろう。&lt;br /&gt;&lt;br /&gt;intro-hello $ readelf -d /usr/local/bin/lt-hello&lt;br /&gt;&lt;br /&gt;Dynamic section at offset 0xe10 contains 24 entries:&lt;br /&gt;  Tag        Type                         Name/Value&lt;br /&gt; 0x0000000000000001 (NEEDED)             Shared library: [libhello.so.0]&lt;br /&gt; 0x0000000000000001 (NEEDED)             Shared library: [libtrim.so.0]&lt;br /&gt; 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]&lt;br /&gt; 0x000000000000000f (RPATH)              Library rpath: [/home/aka/scratch/autotools/9-US10/hello-2.0/intro-hello/.libs]&lt;br /&gt; 0x000000000000000c (INIT)               0x400568&lt;br /&gt; 0x000000000000000d (FINI)               0x4007b8&lt;br /&gt; 0x0000000000000004 (HASH)               0x400278&lt;br /&gt; 0x000000006ffffef5 (GNU_HASH)           0x4002b8&lt;br /&gt; 0x0000000000000005 (STRTAB)             0x4003f8&lt;br /&gt; 0x0000000000000006 (SYMTAB)             0x4002f0&lt;br /&gt; 0x000000000000000a (STRSZ)              213 (bytes)&lt;br /&gt; 0x000000000000000b (SYMENT)             24 (bytes)&lt;br /&gt; 0x0000000000000015 (DEBUG)              0x0&lt;br /&gt; 0x0000000000000003 (PLTGOT)             0x600fe8&lt;br /&gt; 0x0000000000000002 (PLTRELSZ)           72 (bytes)&lt;br /&gt; 0x0000000000000014 (PLTREL)             RELA&lt;br /&gt; 0x0000000000000017 (JMPREL)             0x400520&lt;br /&gt; 0x0000000000000007 (RELA)               0x400508&lt;br /&gt; 0x0000000000000008 (RELASZ)             24 (bytes)&lt;br /&gt; 0x0000000000000009 (RELAENT)            24 (bytes)&lt;br /&gt; 0x000000006ffffffe (VERNEED)            0x4004e8&lt;br /&gt; 0x000000006fffffff (VERNEEDNUM)         1&lt;br /&gt; 0x000000006ffffff0 (VERSYM)             0x4004ce&lt;br /&gt; 0x0000000000000000 (NULL)               0x0&lt;br /&gt;intro-hello $ &lt;br /&gt;&lt;br /&gt;&lt;br /&gt; - 訳書P115&lt;br /&gt;   - lt-helloが謎だ。&lt;br /&gt;&lt;br /&gt;intro-hello $ sudo libtool --mode=execute cp hello /usr/local/bin&lt;br /&gt;intro-hello $ sudo libtool --mode=uninstall rm -f /usr/local/bin/hello&lt;br /&gt;intro-hello $ ls /usr/local/bin&lt;br /&gt;gauche-cesconv gauche-config  gauche-install  gauche-package  gosh  lt-hello&lt;br /&gt;intro-hello $ sudo libtool --mode=uninstall rm -f /usr/local/lib/libhello.la&lt;br /&gt;libtool: uninstall: rm -f /usr/local/lib/libhello.la /usr/local/lib/libhello.so.0.0.0 /usr/local/lib/libhello.so.0 /usr/local/lib/libhello.so /usr/local/lib/libhello.a&lt;br /&gt;intro-hello $ sudo libtool --mode=uninstall rm -f /usr/local/bin/lt-hello&lt;br /&gt;libtool: uninstall: rm -f /usr/local/bin/lt-hello&lt;br /&gt;intro-hello $ sudo libtool --mode=uninstall rm -f /usr/local/lib/libtrim.la&lt;br /&gt;libtool: uninstall: rm -f /usr/local/lib/libtrim.la /usr/local/lib/libtrim.so.0.0.0 /usr/local/lib/libtrim.so.0 /usr/local/lib/libtrim.so /usr/local/lib/libtrim.a&lt;br /&gt;intro-hello $ ls /usr/local/lib&lt;br /&gt;eclipse  gauche  libgauche.so  libgauche.so.0  libgauche.so.0.8.14  python2.5  site_ruby&lt;br /&gt;intro-hello $ &lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-6119454560649142135?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/6119454560649142135/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=6119454560649142135' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/6119454560649142135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/6119454560649142135'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2009/11/autotools9us-10-gnu-libtool-2.html' title='【autotools】9(US 10) GNU Libtool入門 (2)'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-5473117974239967327</id><published>2009-11-24T22:45:00.002+09:00</published><updated>2009-11-24T22:48:32.542+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GNU Autoconf/Automake/Libtool'/><category scheme='http://www.blogger.com/atom/ns#' term='libtool'/><title type='text'>【autotools】9(US 10) GNU Libtool入門</title><content type='html'>この章、libtoolが古い。&lt;br /&gt;インターフェイスが大幅変更する前のものみたいだ。&lt;br /&gt;サンプルソースは、バージョンアップしており、最新のlibtoolでも動くようだ。&lt;br /&gt;&lt;br /&gt;どうしたものか。&lt;br /&gt;&lt;br /&gt;ちょっと考えてみる。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-5473117974239967327?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/5473117974239967327/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=5473117974239967327' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/5473117974239967327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/5473117974239967327'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2009/11/autotools9us-10-gnu-libtool.html' title='【autotools】9(US 10) GNU Libtool入門'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-3330295966101077866</id><published>2009-11-24T04:26:00.002+09:00</published><updated>2009-11-24T04:34:54.478+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linkers and Loaders'/><title type='text'>【Linkers&amp;Loaders】8 ロードとオーバレイ</title><content type='html'>オーバレイは、ページングシステム以前の技法。現在は廃れているが、歴史的な意義ありとして記載されている。&lt;br /&gt;&lt;br /&gt;ロード自体はシンプルな処理。本章はロード処理の説明は手短に終えて、位置独立コード（PIC)の紹介が主体になっている。&lt;br /&gt;&lt;br /&gt;さて、本書も残すは、&lt;br /&gt;&lt;br /&gt; 9 共有ライブラリ&lt;br /&gt;10 動的なリンクとロード&lt;br /&gt;11 高度なテクニック&lt;br /&gt;&lt;br /&gt;の3章となった。このあたりでLibtoolに戻ろう。これら残りの章はLibtoolを学びながら並行して実施することにする。&lt;br /&gt;&lt;br /&gt;ふう。スタック、ひとつ巻き戻る。&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-3330295966101077866?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/3330295966101077866/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=3330295966101077866' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/3330295966101077866'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/3330295966101077866'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2009/11/linkers_5766.html' title='【Linkers&amp;Loaders】8 ロードとオーバレイ'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-8747605011413044912</id><published>2009-11-24T03:29:00.002+09:00</published><updated>2009-11-24T03:34:05.737+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linkers and Loaders'/><title type='text'>【Linkers&amp;Loaders】7 再配置</title><content type='html'>この章は、再配置の概要。主に再配置エントリの形式の紹介と再配置の計算方法を取り扱っている。リンカの出力ファイルは、再配置可能や再リンク可能にすることができ、それぞれリンカの出力として再配置用情報や再リンク用情報を含めることになる。&lt;br /&gt;&lt;br /&gt;再配置の話題になるとアドレスがいろいろでてくるので、アドレスの計算について自分なりに整理した。&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;*** アドレスの計算いくつか&lt;br /&gt; - アドレスの計算を簡単にできるようになりたい。&lt;br /&gt; - そこで自分なりにまとめておく。&lt;br /&gt; - 32ビットアーキテクチャでバイトアドレッシングを&lt;br /&gt;   想定する。&lt;br /&gt; - するとアドレス空間のサイズは、K-&gt;M-&gt;G で、4Gであ&lt;br /&gt;   り、単一のアドレス空間にて取り扱えるメモリの最大&lt;br /&gt;   値は4GB。&lt;br /&gt; - アドレスの2進数表記は32桁、16進数表記は8桁にな&lt;br /&gt;   る。&lt;br /&gt;   b: 00000000 00000000 00000000 00000000&lt;br /&gt;   x: 00 00 00 00&lt;br /&gt;&lt;br /&gt; - すると、アドレス0x0から0x100がどれだけのバイト&lt;br /&gt;   サイズの領域かというと、16進数で100バイトという&lt;br /&gt;   こと。そうか、要は16進&lt;-&gt;10進になれておけばいい&lt;br /&gt;   んだ。&lt;br /&gt; - 16進と10進&lt;br /&gt;   &lt;br /&gt;   0x00000001 &amp;lt;-&gt; 16^0     = 1&lt;br /&gt;   0x00000010 &amp;lt;-&gt; 16^1     = 16&lt;br /&gt;   0x00000100 &amp;lt;-&gt; 16^2     = 256&lt;br /&gt;   0x00001000 &amp;lt;-&gt; 16^3     = 4096&lt;br /&gt;   0x00010000 &amp;lt;-&gt; 16^4     = 65536&lt;br /&gt;   0x00100000 &amp;lt;-&gt; 16^5     = 1048567&lt;br /&gt;   0x01000000 &amp;lt;-&gt; 16^6     = 16777216&lt;br /&gt;   0x10000000 &amp;lt;-&gt; 16^7     = 268435456&lt;br /&gt;   0xFFFFFFFF &amp;lt;-&gt; 16^8 - 1 = 4294967295&lt;br /&gt;&lt;br /&gt; - 巾をつかった表示&lt;br /&gt;&lt;br /&gt;   0x00000001 &amp;lt;-&gt; 16^0     = 2^0  =    1&lt;br /&gt;   0x00000010 &amp;lt;-&gt; 16^1     = 2^4  =   16&lt;br /&gt;   0x00000100 &amp;lt;-&gt; 16^2     = 2^8  =  256&lt;br /&gt;   0x00001000 &amp;lt;-&gt; 16^3     = 2^12 =   4K&lt;br /&gt;   0x00010000 &amp;lt;-&gt; 16^4     = 2^16 =  64K&lt;br /&gt;   0x00100000 &amp;lt;-&gt; 16^5     = 2^20 =   1M&lt;br /&gt;   0x01000000 &amp;lt;-&gt; 16^6     = 2^24 =  16M&lt;br /&gt;   0x10000000 &amp;lt;-&gt; 16^7     = 2^28 = 256M&lt;br /&gt;   0xFFFFFFFF &amp;lt;-&gt; 16^8 - 1 = 2^32 = 4G - 1&lt;br /&gt;&lt;br /&gt; - 16進と割合&lt;br /&gt;&lt;br /&gt;   10進だと100の半分は50だ。では16進では？&lt;br /&gt;&lt;br /&gt;   0x100の半分は、&lt;br /&gt;&lt;br /&gt;   1234567 8 9ABCDEF&lt;br /&gt;&lt;br /&gt;   なので、0x80。そうか8は何かの半分なんだな。&lt;br /&gt;&lt;br /&gt;   10進とちがって1/4が表現しやすい。&lt;br /&gt;&lt;br /&gt;   0x100の1/4は、0x40、3/4は、0xC0、などなど。&lt;br /&gt;&lt;br /&gt;   さて、8は半分なので、32ビットアドレス空間の真ん&lt;br /&gt;   中あたりというのは、&lt;br /&gt;&lt;br /&gt;   0x80000000&lt;br /&gt;&lt;br /&gt;   ということ。&lt;br /&gt;&lt;br /&gt; - 上位16ビットと下位16ビット&lt;br /&gt;&lt;br /&gt;   さて、アドレスを16で分割する。0x00010000 は64K&lt;br /&gt;   なので、上位16ビットは64K単位の領域を指定してい&lt;br /&gt;   うことになる。このあたりがセグメントシステムの&lt;br /&gt;   計算か。&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-8747605011413044912?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/8747605011413044912/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=8747605011413044912' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/8747605011413044912'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/8747605011413044912'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2009/11/linkers_24.html' title='【Linkers&amp;Loaders】7 再配置'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-3789824609776043435</id><published>2009-11-24T01:14:00.002+09:00</published><updated>2009-11-24T01:19:10.172+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linkers and Loaders'/><title type='text'>【Linkers&amp;Loaders】6 ライブラリ 〜サンプルでみるLinuxのライブラリ(私家版)〜</title><content type='html'>本書では、ライブラリの構造以外に、作成・検索・weak外部シンボルのお話などがある。&lt;br /&gt;ここでは、Linuxにて、ELFオブジェクトファイルを使ったarライブラリを眺めてみる。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;**** サンプルでみるLinuxのライブラリ(私家版)&lt;br /&gt; - まずここでは静的にリンクするライブラリを扱う。&lt;br /&gt; - すると基本的にはarで固めてある。&lt;br /&gt; - /usr/lib/libc.aを対象に調べてみよう。&lt;br /&gt; - まず、ar形式ファイルは"!&amp;lt;arch&gt;\n"で始まる。&lt;br /&gt;&lt;br /&gt;lib $ od -tx1 -c -N 8 libc.a&lt;br /&gt;0000000 21 3c 61 72 63 68 3e 0a&lt;br /&gt;          !   &amp;lt;   a   r   c   h   &gt;  \n&lt;br /&gt;0000010&lt;br /&gt;lib $ &lt;br /&gt;&lt;br /&gt; - これ以降はarメンバが連なる。arメンバは、基本的&lt;br /&gt;   にオブジェクトファイルである。ただしすぐ見るよ&lt;br /&gt;   うにライブラリディレクトリ情報が例外として含ま&lt;br /&gt;   れる。&lt;br /&gt; - 各arメンバは先頭に60Bのヘッダを持つ。&lt;br /&gt; - Linuxにて、ELFライブラリとしてar形式を使う場合、&lt;br /&gt;   第一メンバの名前は"/"であり、ライブラリのディレ&lt;br /&gt;   クトリ情報を保持する。ヘッダの最後は、"`\n"とな&lt;br /&gt;   る。&lt;br /&gt;&lt;br /&gt;lib $ od -tx1 -c -N 68 libc.a&lt;br /&gt;0000000 21 3c 61 72 63 68 3e 0a 2f 20 20 20 20 20 20 20&lt;br /&gt;          !   &amp;lt;   a   r   c   h   &gt;  \n   /                            &lt;br /&gt;0000020 20 20 20 20 20 20 20 20 31 32 33 33 32 35 31 38&lt;br /&gt;                                          1   2   3   3   2   5   1   8&lt;br /&gt;0000040 31 34 20 20 30 20 20 20 20 20 30 20 20 20 20 20&lt;br /&gt;          1   4           0                       0                    &lt;br /&gt;0000060 30 20 20 20 20 20 20 20 35 36 30 37 32 20 20 20&lt;br /&gt;          0                               5   6   0   7   2            &lt;br /&gt;0000100 20 20 60 0a&lt;br /&gt;                  `  \n&lt;br /&gt;0000104&lt;br /&gt;lib $ &lt;br /&gt;&lt;br /&gt; - このヘッダの構造をみてみると、すべて単なる文字&lt;br /&gt;   列となっている。headで見てみる。&lt;br /&gt;&lt;br /&gt;lib $ head -c 68 libc.a&lt;br /&gt;!&amp;lt;arch&gt;&lt;br /&gt;/               1233251814  0     0     0       56072     `&lt;br /&gt;lib $ &lt;br /&gt;&lt;br /&gt; - これの解釈は次のとおり。&lt;br /&gt;&lt;br /&gt;/               1233251814  0     0     0       56072     `&lt;br /&gt;012345678901234567890123456789012345678901234567890123456789&lt;br /&gt;|               |           |     |     |       |         +--終端の"`\n"&lt;br /&gt;|               |           |     |     |       +--メンバサイズ[バイト](10B)&lt;br /&gt;|               |           |     |     +--8進ファイルモード(8B)&lt;br /&gt;|               |           |     +--グループID(6B)&lt;br /&gt;|               |           +--ユーザID(6B)&lt;br /&gt;|               +--修正日時[1970/1/1T00:00:00からの秒数](12B)&lt;br /&gt;+--メンバ名(16)&lt;br /&gt;&lt;br /&gt; - すきまは空白文字(0x20)でパディングされている。&lt;br /&gt; - さて、arのメンバヘッダの形式がこういうものだとす&lt;br /&gt;   ると、16文字よりも長い名前をもつ要素はどうする&lt;br /&gt;   か。&lt;br /&gt;&lt;br /&gt; - これは、"/"メンバの次のメンバとして"//"という名&lt;br /&gt;   前のメンバをつくり、そこに格納するルール。調べ&lt;br /&gt;   てみる。"/"メンバのサイズは56072Bなので、その後&lt;br /&gt;   の60Bが次のメンバのヘッダ。&lt;br /&gt;&lt;br /&gt;libc-anatomy $ tail -c +56141 libc.a | head -c 60&lt;br /&gt;//                                              1712      `&lt;br /&gt;libc-anatomy $ &lt;br /&gt;&lt;br /&gt; - 1772Bなので、そこまで見てみる。&lt;br /&gt;&lt;br /&gt;libc-anatomy $ tail -c +56141 libc.a | head -c 1772&lt;br /&gt;//                                              1712      `&lt;br /&gt;lc-measurement.o/&lt;br /&gt;lc-identification.o/&lt;br /&gt;C-identification.o/&lt;br /&gt;__start_context.o/&lt;br /&gt;isoc99_vfscanf.o/&lt;br /&gt;isoc99_vsscanf.o/&lt;br /&gt;printf-parsemb.o/&lt;br /&gt;printf-parsewc.o/&lt;br /&gt;thread-freeres.o/&lt;br /&gt;argz-stringify.o/&lt;br /&gt;string-inlines.o/&lt;br /&gt;isoc99_vwscanf.o/&lt;br /&gt;isoc99_fwscanf.o/&lt;br /&gt;isoc99_vfwscanf.o/&lt;br /&gt;isoc99_swscanf.o/&lt;br /&gt;isoc99_vswscanf.o/&lt;br /&gt;lc-time-cleanup.o/&lt;br /&gt;getdirentries64.o/&lt;br /&gt;sched_getaffinity.o/&lt;br /&gt;sched_setaffinity.o/&lt;br /&gt;spawn_faction_init.o/&lt;br /&gt;spawn_faction_destroy.o/&lt;br /&gt;spawn_faction_addclose.o/&lt;br /&gt;spawn_faction_addopen.o/&lt;br /&gt;spawn_faction_adddup2.o/&lt;br /&gt;spawnattr_init.o/&lt;br /&gt;spawnattr_destroy.o/&lt;br /&gt;spawnattr_getdefault.o/&lt;br /&gt;spawnattr_setdefault.o/&lt;br /&gt;spawnattr_getflags.o/&lt;br /&gt;spawnattr_setflags.o/&lt;br /&gt;spawnattr_getpgroup.o/&lt;br /&gt;spawnattr_setpgroup.o/&lt;br /&gt;spawnattr_getsigmask.o/&lt;br /&gt;spawnattr_getschedpolicy.o/&lt;br /&gt;spawnattr_getschedparam.o/&lt;br /&gt;spawnattr_setsigmask.o/&lt;br /&gt;spawnattr_setschedpolicy.o/&lt;br /&gt;spawnattr_setschedparam.o/&lt;br /&gt;sched_cpucount.o/&lt;br /&gt;sched_cpualloc.o/&lt;br /&gt;posix_fadvise64.o/&lt;br /&gt;posix_fallocate.o/&lt;br /&gt;posix_fallocate64.o/&lt;br /&gt;have_o_cloexec.o/&lt;br /&gt;internal_statvfs.o/&lt;br /&gt;internal_statvfs64.o/&lt;br /&gt;sync_file_range.o/&lt;br /&gt;remap_file_pages.o/&lt;br /&gt;get_kernel_syms.o/&lt;br /&gt;inotify_add_watch.o/&lt;br /&gt;inotify_rm_watch.o/&lt;br /&gt;timerfd_create.o/&lt;br /&gt;timerfd_settime.o/&lt;br /&gt;timerfd_gettime.o/&lt;br /&gt;argp-fmtstream.o/&lt;br /&gt;libc-lowlevellock.o/&lt;br /&gt;libc-cancellation.o/&lt;br /&gt;register-atfork.o/&lt;br /&gt;unregister-atfork.o/&lt;br /&gt;libc_pthread_init.o/&lt;br /&gt;libc_multiple_threads.o/&lt;br /&gt;service-lookup.o/&lt;br /&gt;network-lookup.o/&lt;br /&gt;backtracesymsfd.o/&lt;br /&gt;readlinkat_chk.o/&lt;br /&gt;getlogin_r_chk.o/&lt;br /&gt;gethostname_chk.o/&lt;br /&gt;getdomainname_chk.o/&lt;br /&gt;mbsnrtowcs_chk.o/&lt;br /&gt;wcsnrtombs_chk.o/&lt;br /&gt;stack_chk_fail.o/&lt;br /&gt;stack_chk_fail_local.o/&lt;br /&gt;getrpcbynumber.o/&lt;br /&gt;getrpcbyname_r.o/&lt;br /&gt;getrpcbynumber_r.o/&lt;br /&gt;getaliasname_r.o/&lt;br /&gt;getipv4sourcefilter.o/&lt;br /&gt;setipv4sourcefilter.o/&lt;br /&gt;getsourcefilter.o/&lt;br /&gt;setsourcefilter.o/&lt;br /&gt;nscd_initgroups.o/&lt;br /&gt;nscd_getserv_r.o/&lt;br /&gt;dl-iteratephdr.o/&lt;br /&gt;libc-anatomy $ &lt;br /&gt;&lt;br /&gt; - ふむ。極めてシンプル。&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-3789824609776043435?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/3789824609776043435/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=3789824609776043435' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/3789824609776043435'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/3789824609776043435'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2009/11/linkers-linux.html' title='【Linkers&amp;Loaders】6 ライブラリ 〜サンプルでみるLinuxのライブラリ(私家版)〜'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-6297526991824262568</id><published>2009-11-23T23:05:00.002+09:00</published><updated>2009-11-23T23:11:57.996+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linkers and Loaders'/><title type='text'>【Linkers&amp;Loaders】5 シンボルの管理</title><content type='html'>シンボルという言葉を見ると、「男性のシンボル」云々というネタが条件反射で思い出される。「初めての人のためのLisp」のやつだ。これはもう、竹内先生の呪いといってよいだろう。&lt;br /&gt;&lt;br /&gt;本章の内容は、シンプル。&lt;br /&gt;&lt;br /&gt;コンパイラが作ったシンボルテーブルを、リンカが2passの中でどのようにリンカ自身のシンボルテーブルを構築しリンクに使うかというお話。&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-6297526991824262568?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/6297526991824262568/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=6297526991824262568' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/6297526991824262568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/6297526991824262568'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2009/11/linkers_6048.html' title='【Linkers&amp;Loaders】5 シンボルの管理'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-602831358206946014</id><published>2009-11-23T04:15:00.002+09:00</published><updated>2009-11-23T04:17:28.922+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linkers and Loaders'/><title type='text'>【Linkers&amp;Loaders】4 記憶領域の割り当て</title><content type='html'>&lt;pre&gt;&lt;br /&gt;** 4 記憶領域の割り当て&lt;br /&gt;*** セクション、セグメント、ページ、セグメントシステムのセグメント&lt;br /&gt; - ちょっと用語の整理、というか、ここまでの知識の確認を。&lt;br /&gt;   - まず、セクションというのは、オブジェクトファイ&lt;br /&gt;     ルの内部構造を指すときに使う。これは「記憶領域&lt;br /&gt;     の割り当て」の前の整理と考えてよい。&lt;br /&gt;&lt;br /&gt;   - 次に、セグメントというのは、メモリ上の内部構造  &lt;br /&gt;     を指す。セグメント毎に読み書きの設定などを行う。&lt;br /&gt;&lt;br /&gt;   - セクションとセグメントのマッピングをするのが&lt;br /&gt;     「記憶領域の割り当て」の作業のひとつ。前回の例&lt;br /&gt;     のように、ひとつのセグメントに複数のセクション&lt;br /&gt;     を含むのが基本。&lt;br /&gt;&lt;br /&gt;   - ページはページングシステムがメモリを取り扱う単&lt;br /&gt;     位。なのでページングシステムに対応したシステム&lt;br /&gt;     では、セグメントのサイズや配置がページングシス&lt;br /&gt;     テムに適合するように調整する。なお、バイト整列&lt;br /&gt;     条件への対応はページングシステムか否かに関わ&lt;br /&gt;     らずセグメントのアドレス確定の際に実施する。&lt;br /&gt;&lt;br /&gt;   - 以上のセグメントは、セグメントシステムのセグメ&lt;br /&gt;     ントと直接は関係がない。セグメントシステムを利&lt;br /&gt;     用する場合は、以上の考え方にセグメトシステム対&lt;br /&gt;     応のための調整を合わせこんで実施する。&lt;br /&gt;&lt;br /&gt;   - セグメントシステムは悪名高いとのことだが、リン&lt;br /&gt;     カにとってはそんなに厄介なものではないようだ。&lt;br /&gt;     アドレス指定をベースアドレスとオフセットに常に&lt;br /&gt;     分けられるので、それを活用すると再配置が簡単に&lt;br /&gt;     なるところがあるらしい。&lt;br /&gt;&lt;br /&gt; - どうやら記憶領域の割り当ての基本的な考え方は、&lt;br /&gt;   この用語の定義レベルの内容でよいようだ。アーキ&lt;br /&gt;   テクチャの事情などに起因して特殊ケースがいくつ&lt;br /&gt;   か存在する。この章はその説明が主体のようだ。&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5289049604340113831-602831358206946014?l=aka-cs-blog.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://aka-cs-blog.blogspot.com/feeds/602831358206946014/comments/default' title='コメントの投稿'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5289049604340113831&amp;postID=602831358206946014' title='0 件のコメント'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/602831358206946014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5289049604340113831/posts/default/602831358206946014'/><link rel='alternate' type='text/html' href='http://aka-cs-blog.blogspot.com/2009/11/linkers_23.html' title='【Linkers&amp;Loaders】4 記憶領域の割り当て'/><author><name>aka</name><uri>http://www.blogger.com/profile/02301993913128404609</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5289049604340113831.post-482394861288398671</id><published>2009-11-23T01:30:00.000+09:00</published><updated>2009-11-23T01:30:14.611+09:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linkers and Loaders'/><title type='text'>【Linkers&amp;Loaders】3 オブジェクトファイル 〜サンプルで見るELFの基本構造(私家版)〜</title><content type='html'>本書は、COM-&gt;EXE-&gt;a.out-&gt;ELF-&gt;PE-&gt;OMFと横断的に概要を紹介している。&lt;br /&gt;ここでは、ELFに絞って、本書よりも多少深めに記述する。&lt;br /&gt;サンプルの内部を具体的に調べる形で見ていく。&lt;br /&gt;&lt;br /&gt;とても読みにくい、と思うのですが、まあ学習メモなので、、、&lt;br /&gt;そんなものでも誰かの何かに役立つかもしれないので。&lt;br /&gt;&lt;br /&gt;こつこつ。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;*** サンプルで見るELFの基本構造(私家版)&lt;br /&gt;**** ソース&lt;br /&gt;***** a.c&lt;br /&gt;3.7 $ cat a.c&lt;br /&gt;char a(char *s)&lt;br /&gt;{&lt;br /&gt;     return s[0];&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;***** m.c&lt;br /&gt;3.7 $ cat m.c&lt;br /&gt;extern char a(char *);&lt;br /&gt;int main(int ac, char**av)&lt;br /&gt;{&lt;br /&gt;     static char string[] = "Hello, world!\en";&lt;br /&gt;     a(string);&lt;br /&gt;     return 0;&lt;br /&gt;}&lt;br /&gt;3.7 $ &lt;br /&gt;&lt;br /&gt;**** 再配置可能オブジェクトの構造&lt;br /&gt;***** a.o&lt;br /&gt;3.7 $ readelf -a a.o&lt;br /&gt;ELF Header:&lt;br /&gt;  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 &lt;br /&gt;  Class:                             ELF64&lt;br /&gt;  Data:                              2's complement, little endian&lt;br /&gt;  Version:                           1 (current)&lt;br /&gt;  OS/ABI:                            UNIX - System V&lt;br /&gt;  ABI Version:                       0&lt;br /&gt;  Type:                              REL (Relocatable file)&lt;br /&gt;  Machine:                           Advanced Micro Devices X86-64&lt;br /&gt;  Version:                           0x1&lt;br /&gt;  Entry point address:               0x0&lt;br /&gt;  Start of program headers:          0 (bytes into file)&lt;br /&gt;  Start of section headers:          272 (bytes into file)&lt;br /&gt;  Flags:                             0x0&lt;br /&gt;  Size of this header:               64 (bytes)&lt;br /&gt;  Size of program headers:           0 (bytes)&lt;br /&gt;  Number of program headers:         0&lt;br /&gt;  Size of section headers:           64 (bytes)&lt;br /&gt;  Number of section headers:         11&lt;br /&gt;  Section header string table index: 8&lt;br /&gt;&lt;br /&gt;Section Headers:&lt;br /&gt;  [Nr] Name              Type             Address           Offset&lt;br /&gt;       Size              EntSize          Flags  Link  Info  Align&lt;br /&gt;  [ 0]                   NULL             0000000000000000  00000000&lt;br /&gt;       0000000000000000  0000000000000000           0     0     0&lt;br /&gt;  [ 1] .text             PROGBITS         0000000000000000  00000040&lt;br /&gt;       0000000000000011  0000000000000000  AX       0     0     4&lt;br /&gt;  [ 2] .data             PROGBITS         0000000000000000  00000054&lt;br /&gt;       0000000000000000  0000000000000000  WA       0     0     4&lt;br /&gt;  [ 3] .bss              NOBITS           0000000000000000  00000054&lt;br /&gt;       0000000000000000  0000000000000000  WA       0     0     4&lt;br /&gt;  [ 4] .eh_frame         PROGBITS         0000000000000000  00000058&lt;br /&gt;       0000000000000038  0000000000000000   A       0     0     8&lt;br /&gt;  [ 5] .rela.eh_frame    RELA             0000000000000000  000004b0&lt;br /&gt;       0000000000000018  0000000000000018           9     4     8&lt;br /&gt;  [ 6] .comment          PROGBITS         0000000000000000  00000090&lt;br /&gt;       0000000000000025  0000000000000000           0     0     1&lt;br /&gt;  [ 7] .note.GNU-stack   PROGBITS         0000000000000000  000000b5&lt;br /&gt;       0000000000000000  0000000000000000           0     0     1&lt;br /&gt;  [ 8] .shstrtab         STRTAB           0000000000000000  000000b5&lt;br /&gt;       0000000000000054  0000000000000000           0     0     1&lt;br /&gt;  [ 9] .symtab           SYMTAB           0000000000000000  000003d0&lt;br /&gt;       00000000000000d8  0000000000000018          10     8     8&lt;br /&gt;  [10] .strtab           STRTAB           0000000000000000  000004a8&lt;br /&gt;       0000000000000007  0000000000000000           0     0     1&lt;br /&gt;Key to Flags:&lt;br /&gt;  W (write), A (alloc), X (execute), M (merge), S (strings)&lt;br /&gt;  I (info), L (link order), G (group), x (unknown)&lt;br /&gt;  O (extra OS processing required) o (OS specific), p (processor specific)&lt;br /&gt;&lt;br /&gt;There are no section groups in this file.&lt;br /&gt;&lt;br /&gt;There are no program headers in this file.&lt;br /&gt;&lt;br /&gt;Relocation section '.rela.eh_frame' at offset 0x4b0 contains 1 entries:&lt;br /&gt;  Offset          Info           Type           Sym. Value    Sym. Name + Addend&lt;br /&gt;000000000020  00020000000a R_X86_64_32       0000000000000000 .text + 0&lt;br /&gt;&lt;br /&gt;There are no unwind sections in this file.&lt;br /&gt;&lt;br /&gt;Symbol table '.symtab' contains 9 entries:&lt;br /&gt;   Num:    Value          Size Type    Bind   Vis      Ndx Name&lt;br /&gt;     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND &lt;br /&gt;     1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS a.c&lt;br /&gt;     2: 0000000000000000     0 SECTION LOCAL  DEFAULT    1 &lt;br /&gt;     3: 0000000000000000     0 SECTION LOCAL  DEFAULT    2 &lt;br /&gt;     4: 0000000000000000     0 SECTION LOCAL  DEFAULT    3 &lt;br /&gt;     5: 0000000000000000     0 SECTION LOCAL  DEFAULT    4 &lt;br /&gt;     6: 0000000000000000     0 SECTION LOCAL  DEFAULT    7 &lt;br /&gt;     7: 0000000000000000     0 SECTION LOCAL  DEFAULT    6 &lt;br /&gt;     8: 0000000000000000    17 FUNC    GLOBAL DEFAULT    1 a&lt;br /&gt;&lt;br /&gt;No version information found in this file.&lt;br /&gt;&lt;br /&gt;***** m.o&lt;br /&gt;3.7 $ readelf -a m.o&lt;br /&gt;ELF Header:&lt;br /&gt;  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 &lt;br /&gt;  Class:                             ELF64&lt;br /&gt;  Data:                              2's complement, little endian&lt;br /&gt;  Version:                           1 (current)&lt;br /&gt;  OS/ABI:                            UNIX - System V&lt;br /&gt;  ABI Version:                       0&lt;br /&gt;  Type:                              REL (Relocatable file)&lt;br /&gt;  Machine:                           Advanced Micro Devices X86-64&lt;br /&gt;  Version:                           0x1&lt;br /&gt;  Entry point address:               0x0&lt;br /&gt;  Start of program headers:          0 (bytes into file)&lt;br /&gt;  Start of section headers:          296 (bytes into file)&lt;br /&gt;  Flags:                             0x0&lt;br /&gt;  Size of this header:               64 (bytes)&lt;br /&gt;  Size of program headers:           0 (bytes)&lt;br /&gt;  Number of program headers:         0&lt;br /&gt;  Size of section headers:           64 (bytes)&lt;br /&gt;  Number of section headers:         12&lt;br /&gt;  Section header string table index: 9&lt;br /&gt;&lt;br /&gt;Section Headers:&lt;br /&gt;  [Nr] Name              Type             Address           Offset&lt;br /&gt;       Size              EntSize          Flags  Link  Info  Align&lt;br /&gt;  [ 0]                   NULL             0000000000000000  00000000&lt;br /&gt;       0000000000000000  0000000000000000           0     0     0&lt;br /&gt;  [ 1] .text             PROGBITS         0000000000000000  00000040&lt;br /&gt;       0000000000000020  0000000000000000  AX       0     0     4&lt;br /&gt;  [ 2] .rela.text        RELA             0000000000000000  00000548&lt;br /&gt;       0000000000000030  0000000000000018          10     1     8&lt;br /&gt;  [ 3] .data             PROGBITS         0000000000000000  00000060&lt;br /&gt;       0000000000000010  0000000000000000  WA       0     0     16&lt;br /&gt;  [ 4] .bss              NOBITS           0000000000000000  00000070&lt;br /&gt;       0000000000000000  0000000000000000  WA       0     0     4&lt;br /&gt;  [ 5] .eh_frame         PROGBITS         0000000000000000  00000070&lt;br /&gt;       0000000000000038  0000000000000000   A       0     0     8&lt;br /&gt;  [ 6] .rela.eh_frame    RELA             0000000000000000  00000578&lt;br /&gt;       0000000000000018  0000000000000018          10     5     8&lt;br /&gt;  [ 7] .comment          PROGBITS         0000000000000000  000000a8&lt;br /&gt;       0000000000000025  0000000000000000           0     0     1&lt;br /&gt;  [ 8] .note.GNU-stack   PROGBITS         0000000000000000  000000cd&lt;br /&gt;       0000000000000000  0000000000000000           0     0     1&lt;br /&gt;  [ 9] .shstrtab         STRTAB           0000000000000000  000000cd&lt;br /&gt;       0000000000000059  0000000000000000           0     0     1&lt;br /&gt;  [10] .symtab           SYMTAB           0000000000000000  00000428&lt;br /&gt;       0000000000000108  0000000000000018          11     9     8&lt;br /&gt;  [11] .strtab           STRTAB           0000000000000000  00000530&lt;br /&gt;       0000000000000018  0000000000000000           0     0     1&lt;br /&gt;Key to Flags:&lt;br /&gt;  W (write), A (alloc), X (execute), M (merge), S (strings)&lt;br /&gt;  I (info), L (link order), G (group), x (unknown)&lt;br /&gt;  O (extra OS processing required) o (OS specific), p (processor specific)&lt;br /&gt;&lt;br /&gt;There are no section groups in this file.&lt;br /&gt;&lt;br /&gt;There are no program headers in this file.&lt;br /&gt;&lt;br /&gt;Relocation section '.rela.text' at offset 0x548 contains 2 entries:&lt;br /&gt;  Offset          Info           Type           Sym. Value    Sym. Name + Addend&lt;br /&gt;000000000010  00030000000a R_X86_64_32       0000000000000000 .data + 0&lt;br /&gt;000000000015  000a00000002 R_X86_64_PC32     0000000000000000 a + fffffffffffffffc&lt;br /&gt;&lt;br /&gt;Relocation section '.rela.eh_frame' at offset 0x578 contains 1 entries:&lt;br /&gt;  Offset          Info           Type           Sym. Value    Sym. Name + Addend&lt;br /&gt;000000000020  00020000000a R_X86_64_32       0000000000000000 .text + 0&lt;br /&gt;&lt;br /&gt;There are no unwind sections in this file.&lt;br /&gt;&lt;br /&gt;Symbol table '.symtab' contains 11 entries:&lt;br /&gt;   Num:    Value          Size Type    Bind   Vis      Ndx Name&lt;br /&gt;     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND &lt;br /&gt;     1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS m.c&lt;br /&gt;     2: 0000000000000000     0 SECTION LOCAL  DEFAULT    1 &lt;br /&gt;     3: 0000000000000000     0 SECTION LOCAL  DEFAULT    3 &lt;br /&gt;     4: 0000000000000000     0 SECTION LOCAL  DEFAULT    4 &lt;br /&gt;     5: 0000000000000000    16 OBJECT  LOCAL  DEFAULT    3 string.1551&lt;br /&gt;     6: 0000000000000000     0 SECTION LOCAL  DEFAULT    5 &lt;br /&gt;     7: 0000000000000000     0 SECTION LOCAL  DEFAULT    8 &lt;br /&gt;     8: 0000000000000000     0 SECTION LOCAL  DEFAULT    7 &lt;br /&gt;     9: 0000000000000000    32 FUNC    GLOBAL DEFAULT    1 main&lt;br /&gt;    10: 0000000000000000     0 NOTYPE  GLOBAL DEFAULT  UND a&lt;br /&gt;&lt;br /&gt;No version information found in this file.&lt;br /&gt;3.7 $ &lt;br /&gt;&lt;br /&gt;***** a.oの解説&lt;br /&gt;&lt;br /&gt;3.7 $ readelf -a a.o&lt;br /&gt;ELF Header:&lt;br /&gt;  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 &lt;br /&gt;&lt;br /&gt;char magic[4] = "\177ELF"&lt;br /&gt;#o177は制御記号のdel。&lt;br /&gt;(format "%x" (print ?E))&lt;br /&gt;; =&gt; "45"&lt;br /&gt;(format "%x" (print ?L))&lt;br /&gt;; =&gt; "4c"&lt;br /&gt;(format "%x" (print ?F))&lt;br /&gt;; =&gt; "46"&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  Class:                             ELF64&lt;br /&gt;&lt;br /&gt;アドレスのサイズ&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  Data:                              2's complement, little endian&lt;br /&gt;&lt;br /&gt;バイトオーダ他。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  Version:                           1 (current)&lt;br /&gt;&lt;br /&gt;ELFのバージョン。固定らしい。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  OS/ABI:                            UNIX - System V&lt;br /&gt;&lt;br /&gt;ELFOSABI_LINUXの運用はまちまち。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  ABI Version:                       0&lt;br /&gt;&lt;br /&gt;文字通り。&lt;br /&gt;&lt;br /&gt;  Type:                              REL (Relocatable file)&lt;br /&gt;&lt;br /&gt;ELFのタイプ。&lt;br /&gt;&lt;br /&gt;  Machine:                           Advanced Micro Devices X86-64&lt;br /&gt;&lt;br /&gt;  Version:                           0x1&lt;br /&gt;&lt;br /&gt;  Entry point address:               0x0&lt;br /&gt;&lt;br /&gt;エントリーポイント。実行可能ファイル以外は0。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  Start of program headers:          0 (bytes into file)&lt;br /&gt;&lt;br /&gt;開始位置。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  Start of section headers:          272 (bytes into file)&lt;br /&gt;&lt;br /&gt;開始位置。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  Flags:                             0x0&lt;br /&gt;&lt;br /&gt;アーキテクチャ固有フラグ。通常は0。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  Size of this header:               64 (bytes)&lt;br /&gt;&lt;br /&gt;このELFヘッダのサイズ。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  Size of program headers:           0 (bytes)&lt;br /&gt;&lt;br /&gt;プログラムヘッダのエントリひとつのサイズ。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  Number of program headers:         0&lt;br /&gt;&lt;br /&gt;  Size of section headers:           64 (bytes)&lt;br /&gt;&lt;br /&gt;セクションヘッダのエントリひとつのサイズ。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  Number of section headers:         11&lt;br /&gt;  Section header string table index: 8&lt;br /&gt;&lt;br /&gt;セクション名文字列を格納しているセクションの番号。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Section Headers:&lt;br /&gt;&lt;br /&gt;ELFファイルの内部構造は2つのViewをもつ。&lt;br /&gt;Section Viewはそのひとつ。&lt;br /&gt;Section HeadersはSection Viewの構造を記述する。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  [Nr] Name              Type             Address           Offset&lt;br /&gt;       Size              EntSize          Flags  Link  Info  Align&lt;br /&gt;&lt;br /&gt;Nr      : 文字列テーブルにおける名前のインデックス。&lt;br /&gt;Name    : Nrを名前解決したもの。&lt;br /&gt;Type    : セクションタイプ。セクション内に格納する&lt;br /&gt;          情報によって分類。&lt;br /&gt;  NULL: 0&lt;br /&gt;    このセクションヘッダはinactive。対応するセクショ&lt;br /&gt;    ンは存在しない。&lt;br /&gt;  PROGBITS: 1&lt;br /&gt;    プログラムの内容を含むもの。コード、データ、デ&lt;br /&gt;    バッガ情報等。&lt;br /&gt;  SYMTAB: 2&lt;br /&gt;    シンボルテーブル。&lt;br /&gt;  STRTAB: 3&lt;br /&gt;    文字列テーブル。&lt;br /&gt;  RELA: 4&lt;br /&gt;    再配置情報。ベース値自体をこのセクションに含む&lt;br /&gt;    方式。&lt;br /&gt;  HASH: 5&lt;br /&gt;    実行時のシンボルハッシュテーブル。&lt;br /&gt;  DYNAMIC: 6&lt;br /&gt;    動的リンク情報。&lt;br /&gt;  NOTE: 7&lt;br /&gt;  NOBITS: 8&lt;br /&gt;    対応するセクションは存在しないが、それ以外は、&lt;br /&gt;    PROGBITS:と同じ。BSSにつかう。&lt;br /&gt;  REL: 9&lt;br /&gt;    再配置情報。コードに記述されている値をベース値&lt;br /&gt;    とする方式。&lt;br /&gt;  SHLIB: 10&lt;br /&gt;    予約されているが、意味が未確定。現状では、これ&lt;br /&gt;    がELFファイルに存在するなら、そのELFファイルは&lt;br /&gt;    System V ABIのConformance violationとなる。&lt;br /&gt;  DYNSYM: 11&lt;br /&gt;    動的リンク用のシンボル。&lt;br /&gt;  LOPROC: 0x70000000&lt;br /&gt;    processor固有情報の開始位置。processor固有情報&lt;br /&gt;    として何を記述するかというSemanticsはSysV ABIの&lt;br /&gt;    プロセッサ補遺で定義。&lt;br /&gt;  HIPROC: 0x7fffffff&lt;br /&gt;    processor固有情報の終了位置。&lt;br /&gt;  LOUSER: 0x80000000&lt;br /&gt;    application固有情報の開始位置。application固有&lt;br /&gt;    情報として何を記述するかというSematicsは個別に&lt;br /&gt;    定めてよい。&lt;br /&gt;  HIUSER: 0xffffffff&lt;br /&gt;    application固有情報の終了位置。&lt;br /&gt;&lt;br /&gt;Address : lodableファイルの場合は、ベースアドレス。&lt;br /&gt;          それ以外は0。&lt;br /&gt;Offset  : セクションの先頭のファイル内の位置。&lt;br /&gt;Size    : セクションのサイズ(Byte)。&lt;br /&gt;EntSize : セクションが配列の場合のエントリのサイズ&lt;br /&gt;          (Byte)。&lt;br /&gt;Flags   : フラグビット。ロード関係の情報。&lt;br /&gt;  SHF_WRITE (0x1)&lt;br /&gt;    このセクションを、実行時に、メモリ上で書き込み可能とする。&lt;br /&gt;  SHF_ALLOC (0x2)&lt;br /&gt;    このセクションを、実行時にメモリ上に配置する。&lt;br /&gt;  SHF_EXECINSTR (0x4)&lt;br /&gt;    このセクションは、実行可能なマシン語を含む。&lt;br /&gt;  SHF_MASKPROC (0xf0000000)&lt;br /&gt;    このマスクに含まれているビットは、processor固有&lt;br /&gt;    情報となる。processor補遺で定義する。&lt;br /&gt;&lt;br /&gt;Link    : 関連する情報を持つセクション。関連が無い&lt;br /&gt;          場合は、0。&lt;br /&gt;Info    : セクション固有の情報&lt;br /&gt;Align   : セクションを移動する場合の整列の粒度&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  [ 0]                   NULL             0000000000000000  00000000&lt;br /&gt;       0000000000000000  0000000000000000           0     0     0&lt;br /&gt;&lt;br /&gt;セクションヘッダの先頭に置くセクションはNULLと決まっ&lt;br /&gt;ている。&lt;br /&gt;&lt;br /&gt;  [ 1] .text             PROGBITS         0000000000000000  00000040&lt;br /&gt;       0000000000000011  0000000000000000  AX       0     0     4&lt;br /&gt;&lt;br /&gt;a.outのテキストセクション相当。&lt;br /&gt;&lt;br /&gt;  [ 2] .data             PROGBITS         0000000000000000  00000054&lt;br /&gt;       0000000000000000  0000000000000000  WA       0     0     4&lt;br /&gt;&lt;br /&gt;a.outのデータセクション相当。&lt;br /&gt;&lt;br /&gt;  [ 3] .bss              NOBITS           0000000000000000  00000054&lt;br /&gt;       0000000000000000  0000000000000000  WA       0     0     4&lt;br /&gt;&lt;br /&gt;a.outのBSSセクション相当。&lt;br /&gt;&lt;br /&gt;  [ 4] .eh_frame         PROGBITS         0000000000000000  00000058&lt;br /&gt;       0000000000000038  0000000000000000   A       0     0     8&lt;br /&gt;&lt;br /&gt;GCC拡張セクション？&lt;br /&gt;例外が発生したときのアンワインドに関する情報を保持。&lt;br /&gt;&lt;br /&gt;  [ 5] .rela.eh_frame    RELA             0000000000000000  000004b0&lt;br /&gt;       0000000000000018  0000000000000018           9     4     8&lt;br /&gt;&lt;br /&gt;.relaNAMEは、NAMEセクションに対する再配置情報。&lt;br /&gt;&lt;br /&gt;  [ 6] .comment          PROGBITS         0000000000000000  00000090&lt;br /&gt;       0000000000000025  0000000000000000           0     0     1&lt;br /&gt;&lt;br /&gt;説明文字列用。&lt;br /&gt;&lt;br /&gt;  [ 7] .note.GNU-stack   PROGBITS         0000000000000000  000000b5&lt;br /&gt;       0000000000000000  0000000000000000           0     0     1&lt;br /&gt;&lt;br /&gt;.noteセクションは、処理系が独自に情報を保持すると&lt;br /&gt;きに使う。この有無や内容は、ABIコンフォーマンスと&lt;br /&gt;は無関係。&lt;br /&gt;&lt;br /&gt;  [ 8] .shstrtab         STRTAB           0000000000000000  000000b5&lt;br /&gt;       0000000000000054  0000000000000000           0     0     1&lt;br /&gt;&lt;br /&gt;セクション名用文字列を保持。&lt;br /&gt;&lt;br /&gt;  [ 9] .symtab           SYMTAB           0000000000000000  000003d0&lt;br /&gt;       00000000000000d8  0000000000000018          10     8     8&lt;br /&gt;&lt;br /&gt;シンボルテーブル。&lt;br /&gt;&lt;br /&gt;  [10] .strtab           STRTAB           0000000000000000  000004a8&lt;br /&gt;       0000000000000007  0000000000000000           0     0     1&lt;br /&gt;&lt;br /&gt;シンボルテーブル用文字列を保持。他のもの用の文字列&lt;br /&gt;を含むこともあり。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Key to Flags:&lt;br /&gt;  W (write), A (alloc), X (execute), M (merge), S (strings)&lt;br /&gt;  I (info), L (link order), G (group), x (unknown)&lt;br /&gt;  O (extra OS processing required) o (OS specific), p (processor specific)&lt;br /&gt;&lt;br /&gt;There are no section groups in this file.&lt;br /&gt;&lt;br /&gt;There are no program headers in this file.&lt;br /&gt;&lt;br /&gt;まだ.oファイルだからか、プログラムヘッダは存在しな&lt;br /&gt;い。&lt;br /&gt;&lt;br /&gt;Relocation section '.rela.eh_frame' at offset 0x4b0 contains 1 entries:&lt;br /&gt;  Offset          Info           Type           Sym. Value    Sym. Name + Addend&lt;br /&gt;000000000020  00020000000a R_X86_64_32       0000000000000000 .text + 0&lt;br /&gt;&lt;br /&gt;再配置セクションについては後述。&lt;br /&gt;&lt;br /&gt;There are no unwind sections in this file.&lt;br /&gt;&lt;br /&gt;Symbol table '.symtab' contains 9 entries:&lt;br /&gt;   Num:    Value          Size Type    Bind   Vis      Ndx Name&lt;br /&gt;     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND &lt;br /&gt;     1: 0000000000000000     0 FILE    LOCAL  DEFAULT  ABS a.c&lt;br /&gt;     2: 0000000000000000     0 SECTION LOCAL  DEFAULT    1 &lt;br /&gt;     3: 0000000000000000     0 SECTION LOCAL  DEFAULT    2 &lt;br /&gt;     4: 0000000000000000     0 SECTION LOCAL  DEFAULT    3 &lt;br /&gt;     5: 0000000000000000     0 SECTION LOCAL  DEFAULT    4 &lt;br /&gt;     6: 0000000000000000     0 SECTION LOCAL  DEFAULT    7 &lt;br /&gt;     7: 0000000000000000     0 SECTION LOCAL  DEFAULT    6 &lt;br /&gt;     8: 0000000000000000    17 FUNC    GLOBAL DEFAULT    1 a&lt;br /&gt;&lt;br /&gt;これはELFのシンボルテーブルの中身。&lt;br /&gt;&lt;br /&gt; - Value : シンボルの値&lt;br /&gt; - Type : データ、関数、セクションシンボル、ファイ&lt;br /&gt;   ル他。&lt;br /&gt; - Bind : local, global、weak他。&lt;br /&gt; - Vis : 不明。&lt;br /&gt; - Ndx : このシンボルが定義されているセクション番号。&lt;br /&gt;   またはABS、COMMONまたはUNDEF。&lt;br /&gt; - Name : これは実際は、文字列テーブルの番号が入っ&lt;br /&gt;   ている。ここではその番号から引き当てた文字列を&lt;br /&gt;   表示している。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;No version information found in this file.&lt;br /&gt;&lt;br /&gt;***** m.oの解説&lt;br /&gt;a.oとほぼ同じなので割愛。&lt;br /&gt;&lt;br /&gt;***** 再配置セクションについて&lt;br /&gt; - a.oの場合。&lt;br /&gt;&lt;br /&gt;Relocation section '.rela.eh_frame' at offset 0x4b0 contains 1 entries:&lt;br /&gt;  Offset          Info           Type           Sym. Value    Sym. Name + Addend&lt;br /&gt;000000000020  00020000000a R_X86_64_32       0000000000000000 .text + 0&lt;br /&gt;&lt;br /&gt; - m.oの場合。&lt;br /&gt;&lt;br /&gt;Relocation section '.rela.text' at offset 0x548 contains 2 entries:&lt;br /&gt;  Offset          Info           Type           Sym. Value    Sym. Name + Addend&lt;br /&gt;000000000010  00030000000a R_X86_64_32       0000000000000000 .data + 0&lt;br /&gt;000000000015  000a00000002 R_X86_64_PC32     0000000000000000 a + fffffffffffffffc&lt;br /&gt;&lt;br /&gt;Relocation section '.rela.eh_frame' at offset 0x578 contains 1 entries:&lt;br /&gt;  Offset          Info           Type           Sym. Value    Sym. Name + Addend&lt;br /&gt;000000000020  00020000000a R_X86_64_32       0000000000000000 .text + 0&lt;br /&gt;&lt;br /&gt;&lt;br /&gt; - RELAの構造&lt;br /&gt;&lt;br /&gt;r_offset :&lt;br /&gt; - 再配置可能ファイルでは、セクション相対にて再配置&lt;br /&gt;   が必要な位置。&lt;br /&gt; - 実行可能ファイルでは、仮想アドレス上の位置。&lt;br /&gt;&lt;br /&gt;r_info :&lt;br /&gt;&lt;br /&gt;2つを含む。&lt;br /&gt; - シンボルテーブルのインデックス番号。このエントリ&lt;br /&gt;   が再配置情報を提供しているシンボルを特定する。&lt;br /&gt; - 再配置のタイプ&lt;br /&gt;&lt;br /&gt;r_append :&lt;br /&gt; - 再配置フィールドの値の算出に使用する定数。&lt;br /&gt;&lt;br /&gt;**** 再配置可能オブジェクトのセクションの内容&lt;br /&gt;***** a.oの全てのセクション&lt;br /&gt;3.7 $ objdump -s a.o&lt;br /&gt;&lt;br /&gt;a.o:     file format elf64-x86-64&lt;br /&gt;&lt;br /&gt;Contents of section .text:&lt;br /&gt; 0000 554889e5 48897df8 488b45f8 0fb600c9  UH..H.}.H.E.....&lt;br /&gt; 0010 c3                                   .               &lt;br /&gt;Contents of section .eh_frame:&lt;br /&gt; 0000 14000000 00000000 017a5200 01781001  .........zR..x..&lt;br /&gt; 0010 030c0708 90010000 1c000000 1c000000  ................&lt;br /&gt; 0020 00000000 11000000 00410e10 8602430d  .........A....C.&lt;br /&gt; 0030 06000000 00000000                    ........        &lt;br /&gt;Contents of section .comment:&lt;br /&gt; 0000 00474343 3a202855 62756e74 7520342e  .GCC: (Ubuntu 4.&lt;br /&gt; 0010 332e322d 31756275 6e747531 32292034  3.2-1ubuntu12) 4&lt;br /&gt; 0020 2e332e32 00                          .3.2.           &lt;br /&gt;&lt;br /&gt;***** m.oの全てのセクション&lt;br /&gt;3.7 $ objdump -s m.o&lt;br /&gt;&lt;br /&gt;m.o:     file format elf64-x86-64&lt;br /&gt;&lt;br /&gt;Contents of section .text:&lt;br /&gt; 0000 554889e5 4883ec10 897dfc48 8975f0bf  UH..H....}.H.u..&lt;br /&gt; 0010 00000000 e8000000 00b80000 0000c9c3  ................&lt;br /&gt;Contents of section .data:&lt;br /&gt; 0000 48656c6c 6f2c2077 6f726c64 211b6e00  Hello, world!.n.&lt;br /&gt;Contents of section .eh_frame:&lt;br /&gt; 0000 14000000 00000000 017a5200 01781001  .........zR..x..&lt;br /&gt; 0010 030c0708 90010000 1c000000 1c000000  ................&lt;br /&gt; 0020 00000000 20000000 00410e10 8602430d  .... ....A....C.&lt;br /&gt; 0030 06000000 00000000                    ........        &lt;br /&gt;Contents of section .comment:&lt;br /&gt; 0000 00474343 3a202855 62756e74 7520342e  .GCC: (Ubuntu 4.&lt;br /&gt; 0010 332e322d 31756275 6e747531 32292034  3.2-1ubuntu12) 4&lt;br /&gt; 0020 2e332e32 00                          .3.2.           &lt;br /&gt;&lt;br /&gt;***** a.oの.text&lt;br /&gt;3.7 $ objdump -d a.o&lt;br /&gt;&lt;br /&gt;a.o:     file format elf64-x86-64&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Disassembly of section .text:&lt;br /&gt;&lt;br /&gt;0000000000000000 &amp;lt;a&gt;:&lt;br /&gt;   0: 55                    push   %rbp&lt;br /&gt;   1: 48 89 e5              mov    %rsp,%rbp&lt;br /&gt;   4: 48 89 7d f8           mov    %rdi,-0x8(%rbp)&lt;br /&gt;   8: 48 8b 45 f8           mov    -0x8(%rbp),%rax&lt;br /&gt;   c: 0f b6 00              movzbl (%rax),%eax&lt;br /&gt;   f: c9                    leaveq &lt;br /&gt;  10: c3                    retq   &lt;br /&gt;3.7 $ &lt;br /&gt;&lt;br /&gt;***** m.oの.text&lt;br /&gt;3.7 $ objdump -d m.o&lt;br /&gt;&lt;br /&gt;m.o:     file format elf64-x86-64&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Disassembly of section .text:&lt;br /&gt;&lt;br /&gt;0000000000000000 &amp;lt;main&gt;:&lt;br /&gt;   0: 55                    push   %rbp&lt;br /&gt;   1: 48 89 e5              mov    %rsp,%rbp&lt;br /&gt;   4: 48 83 ec 10           sub    $0x10,%rsp&lt;br /&gt;   8: 89 7d fc              mov    %edi,-0x4(%rbp)&lt;br /&gt;   b: 48 89 75 f0           mov    %rsi,-0x10(%rbp)&lt;br /&gt;   f: bf 00 00 00 00        mov    $0x0,%edi&lt;br /&gt;  14: e8 00 00 00 00        callq  19 &amp;lt;main+0x19&gt;&lt;br /&gt;  19: b8 00 00 00 00        mov    $0x0,%eax&lt;br /&gt;  1e: c9                    leaveq &lt;br /&gt;  1f: c3                    retq   &lt;br /&gt;3.7 $    &lt;br /&gt;&lt;br /&gt;**** 実行可能ファイルの構造&lt;br /&gt;***** a.outの構造&lt;br /&gt;3.7 $ readelf -a a.out&lt;br /&gt;ELF Header:&lt;br /&gt;  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 &lt;br /&gt;  Class:                             ELF64&lt;br /&gt;  Data:                              2's complement, little endian&lt;br /&gt;  Version:                           1 (current)&lt;br /&gt;  OS/ABI:                            UNIX - System V&lt;br /&gt;  ABI Version:                       0&lt;br /&gt;  Type:                              EXEC (Executable file)&lt;br /&gt;  Machine:                           Advanced Micro Devices X86-64&lt;br /&gt;  Version:                           0x1&lt;br /&gt;  Entry point address:               0x4003c0&lt;br /&gt;  Start of program headers:          64 (bytes into file)&lt;br /&gt;  Start of section headers:          6208 (bytes into file)&lt;br /&gt;  Flags:                             0x0&lt;br /&gt;  Size of this header:               64 (bytes)&lt;br /&gt;  Size of program headers:           56 (bytes)&lt;br /&gt;  Number of program headers:         9&lt;br /&gt;  Size of section headers:           64 (bytes)&lt;br /&gt;  Number of section headers:         37&lt;br /&gt;  Section header string table index: 34&lt;br /&gt;&lt;br /&gt;Section Headers:&lt;br /&gt;  [Nr] Name              Type             Address           Offset&lt;br /&gt;       Size              EntSize          Flags  Link  Info  Align&lt;br /&gt;  [ 0]                   NULL             0000000000000000  00000000&lt;br /&gt;       0000000000000000  0000000000000000           0     0     0&lt;br /&gt;  [ 1] .interp           PROGBITS         0000000000400238  00000238&lt;br /&gt;       000000000000001c  0000000000000000   A       0     0     1&lt;br /&gt;  [ 2] .note.ABI-tag     NOTE             0000000000400254  00000254&lt;br /&gt;       0000000000000020  0000000000000000   A       0     0     4&lt;br /&gt;  [ 3] .hash             HASH             0000000000400278  00000278&lt;br /&gt;       0000000000000018  0000000000000004   A       5     0     8&lt;br /&gt;  [ 4] .gnu.hash         GNU_HASH         0000000000400290  00000290&lt;br /&gt;       000000000000001c  0000000000000000   A       5     0     8&lt;br /&gt;  [ 5] .dynsym           DYNSYM           00000000004002b0  000002b0&lt;br /&gt;       0000000000000048  0000000000000018   A       6     1     8&lt;br /&gt;  [ 6] .dynstr           STRTAB           00000000004002f8  000002f8&lt;br /&gt;       0000000000000038  0000000000000000   A       0     0     1&lt;br /&gt;  [ 7] .gnu.version      VERSYM           0000000000400330  00000330&lt;br /&gt;       0000000000000006  0000000000000002   A       5     0     2&lt;br /&gt;  [ 8] .gnu.version_r    VERNEED          0000000000400338  00000338&lt;br /&gt;       0000000000000020  0000000000000000   A       6     1     8&lt;br /&gt;  [ 9] .rela.dyn         RELA             0000000000400358  00000358&lt;br /&gt;       0000000000000018  0000000000000018   A       5     0     8&lt;br /&gt;  [10] .rela.plt         RELA             0000000000400370  00000370&lt;br /&gt;       0000000000000018  0000000000000018   A       5    12     8&lt;br /&gt;  [11] .init             PROGBITS         0000000000400388  00000388&lt;br /&gt;       0000000000000018  0000000000000000  AX       0     0     4&lt;br /&gt;  [12] .plt              PROGBITS         00000000004003a0  000003a0&lt;br /&gt;       0000000000000020  0000000000000010  AX       0     0     4&lt;br /&gt;  [13] .text             PROGBITS         00000000004003c0  000003c0&lt;br /&gt;       00000000000001f8  0000000000000000  AX       0     0     16&lt;br /&gt;  [14] .fini             PROGBITS         00000000004005b8  000005b8&lt;br /&gt;       000000000000000e  0000000000000000  AX       0     0     4&lt;br /&gt;  [15] .rodata           PROGBITS         00000000004005c8  000005c8&lt;br /&gt;       0000000000000004  0000000000000004  AM       0     0     4&lt;br /&gt;  [16] .eh_frame_hdr     PROGBITS         00000000004005cc  000005cc&lt;br /&gt;       000000000000002c  0000000000000000   A       0     0     4&lt;br /&gt;  [17] .eh_frame         PROGBITS         00000000004005f8  000005f8&lt;br /&gt;       00000000000000b4  0000000000000000   A       0     0     8&lt;br /&gt;  [18] .ctors            PROGBITS         0000000000600e18  00000e18&lt;br /&gt;       0000000000000010  0000000000000000  WA       0     0     8&lt;br /&gt;  [19] .dtors            PROGBITS         0000000000600e28  00000e28&lt;br /&gt;       0000000000000010  0000000000000000  WA       0     0     8&lt;br /&gt;  [20] .jcr              PROGBITS         0000000000600e38  00000e38&lt;br /&gt;       0000000000000008  0000000000000000  WA       0     0     8&lt;br /&gt;  [21] .dynamic          DYNAMIC          0000000000600e40  00000e40&lt;br /&gt;       00000000000001a0  0000000000000010  WA       6     0     8&lt;br /&gt;  [22] .got              PROGBITS         0000000000600fe0  00000fe0&lt;br /&gt;       0000000000000008  0000000000000008  WA       0     0     8&lt;br /&gt;  [23] .got.plt          PROGBITS         0000000000600fe8  00000fe8&lt;br /&gt;       0000000000000020  0000000000000008  WA       0     0     8&lt;br /&gt;  [24] .data             PROGBITS         0000000000601010  00001010&lt;br /&gt;       0000000000000020  0000000000000000  WA       0     0     16&lt;br /&gt;  [25] .bss              NOBITS           0000000000601030  00001030&lt;br /&gt;       0000000000000010  0000000000000000  WA       0     0     8&lt;br /&gt;  [26] .comment          PROGBITS         0000000000000000  00001030&lt;br /&gt;       0000000000000128  0000000000000000           0     0     1&lt;br /&gt;  [27] .debug_aranges    PROGBITS         0000000000000000  00001160&lt;br /&gt;       0000000000000090  0000000000000000           0     0     16&lt;br /&gt;  [28] .debug_pubnames   PROGBITS         0000000000000000  000011f0&lt;br /&gt;       0000000000000025  0000000000000000           0     0     1&lt;br /&gt;  [29] .debug_info       PROGBITS         0000000000000000  00001215&lt;br /&gt;       00000000000001d7  0000000000000000           0     0     1&lt;br /&gt;  [30] .debug_abbrev     PROGBITS         0000000000000000  000013ec&lt;br /&gt;       000000000000006f  0000000000000000           0     0     1&lt;br /&gt;  [31] .debug_line       PROGBITS         0000000000000000  0000145b&lt;br /&gt;       0000000000000151  0000000000000000           0     0     1&lt;br /&gt;  [32] .debug_str        PROGBITS         0000000000000000  000015ac&lt;br /&gt;       00000000000000a7  0000000000000001  MS       0     0     1&lt;br /&gt;  [33] .debug_ranges     PROGBITS         0000000000000000  00001660&lt;br /&gt;       0000000000000090  0000000000000000           0     0     16&lt;br /&gt;  [34] .shstrtab         STRTAB           0000000000000000  000016f0&lt;br /&gt;       0000000000000149  0000000000000000           0     0     1&lt;br /&gt;  [35] .symtab           SYMTAB           0000000000000000  00002180&lt;br /&gt;       0000000000000720  0000000000000018          36    58     8&lt;br /&gt;  [36] .strtab           STRTAB           0000000000000000  000028a0&lt;br /&gt;       00000000000001ff  0000000000000000           0     0     1&lt;br /&gt;Key to Flags:&lt;br /&gt;  W (write), A (alloc), X (execute), M (merge), S (strings)&lt;br /&gt;  I (info), L (link order), G (group), x (unknown)&lt;br /&gt;  O (extra OS processing required) o (OS specific), p (processor specific)&lt;br /&gt;&lt;br /&gt;There are no section groups in this file.&lt;br /&gt;&lt;br /&gt;Program Headers:&lt;br /&gt;  Type           Offset             VirtAddr           PhysAddr&lt;br /&gt;                 FileSiz            MemSiz              Flags  Align&lt;br /&gt;  PHDR           0x0000000000000040 0x0000000000400040 0x0000000000400040&lt;br /&gt;                 0x00000000000001f8 0x00000000000001f8  R E    8&lt;br /&gt;  INTERP         0x0000000000000238 0x0000000000400238 0x0000000000400238&lt;br /&gt;                 0x000000000000001c 0x000000000000001c  R      1&lt;br /&gt;      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]&lt;br /&gt;  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000&lt;br /&gt;                 0x00000000000006ac 0x00000000000006ac  R E    200000&lt;br /&gt;  LOAD           0x0000000000000e18 0x0000000000600e18 0x0000000000600e18&lt;br /&gt;                 0x0000000000000218 0x0000000000000228  RW     200000&lt;br /&gt;  DYNAMIC        0x0000000000000e40 0x0000000000600e40 0x0000000000600e40&lt;br /&gt;                 0x00000000000001a0 0x00000000000001a0  RW     8&lt;br /&gt;  NOTE           0x0000000000000254 0x0000000000400254 0x0000000000400254&lt;br /&gt;                 0x0000000000000020 0x0000000000000020  R      4&lt;br /&gt;  GNU_EH_FRAME   0x00000000000005cc 0x00000000004005cc 0x00000000004005cc&lt;br /&gt;                 0x000000000000002c 0x000000000000002c  R      4&lt;br /&gt;  GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000&lt;br /&gt;                 0x0000000000000000 0x0000000000000000  RW     8&lt;br /&gt;  GNU_RELRO      0x0000000000000e18 0x0000000000600e18 0x0000000000600e18&lt;br /&gt;                 0x00000000000001e8 0x00000000000001e8  R      1&lt;br /&gt;&lt;br /&gt; Section to Segment mapping:&lt;br /&gt;  Segment Sections...&lt;br /&gt;   00     &lt;br /&gt;   01     .interp &lt;br /&gt;   02     .interp .note.ABI-tag .hash .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame &lt;br /&gt;   03     .ctors .dtors .jcr .dynamic .got .got.plt .data .bss &lt;br /&gt;   04     .dynamic &lt;br /&gt;   05     .note.ABI-tag &lt;br /&gt;   06     .eh_frame_hdr &lt;br /&gt;   07     &lt;br /&gt;   08     .ctors .dtors .jcr .dynamic .got &lt;br /&gt;&lt;br /&gt;Dynamic section at offset 0xe40 contains 21 entries:&lt;br /&gt;  Tag        Type                         Name/Value&lt;br /&gt; 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]&lt;br /&gt; 0x000000000000000c (INIT)               0x400388&lt;br /&gt; 0x000000000000000d (FINI)               0x4005b8&lt;br /&gt; 0x0000000000000004 (HASH)               0x400278&lt;br /&gt; 0x000000006ffffef5 (GNU_HASH)           0x400290&lt;br /&gt; 0x0000000000000005 (STRTAB)             0x4002f8&lt;br /&gt; 0x0000000000000006 (SYMTAB)             0x4002b0&lt;br /&gt; 0x000000000000000a (STRSZ)              56 (bytes)&lt;br /&gt; 0x000000000000000b (SYMENT)             24 (bytes)&lt;br /&gt; 0x0000000000000015 (DEBUG)              0x0&lt;br /&gt; 0x0000000000000003 (PLTGOT)             0x600fe8&lt;br /&gt; 0x0000000000000002 (PLTRELSZ)           24 (bytes)&lt;br /&gt; 0x0000000000000014 (PLTREL)             RELA&lt;br /&gt; 0x0000000000000017 (JMPREL)             0x400370&lt;br /&gt; 0x0000000000000007 (RELA)               0x400358&lt;br /&gt; 0x0000000000000008 (RELASZ)             24 (bytes)&lt;br /&gt; 0x0000000000000009 (RELAENT)            24 (bytes)&lt;br /&gt; 0x000000006ffffffe (VERNEED)            0x400338&lt;br /&gt; 0x000000006fffffff (VERNEEDNUM)         1&lt;br /&gt; 0x000000006ffffff0 (VERSYM)             0x400330&lt;br /&gt; 0x0000000000000000 (NULL)               0x0&lt;br /&gt;&lt;br /&gt;Relocation section '.rela.dyn' at offset 0x358 contains 1 entries:&lt;br /&gt;  Offset          Info           Type           Sym. Value    Sym. Name + Addend&lt;br /&gt;000000600fe0  000100000006 R_X86_64_GLOB_DAT 0000000000000000 __gmon_start__ + 0&lt;br /&gt;&lt;br /&gt;Relocation section '.rela.plt' at offset 0x370 contains 1 entries:&lt;br /&gt;  Offset          Info           Type           Sym. Value    Sym. Name + Addend&lt;br /&gt;000000601000  000200000007 R_X86_64_JUMP_SLO 0000000000000000 __libc_start_main + 0&lt;br /&gt;&lt;br /&gt;There are no unwind sections in this file.&lt;br /&gt;&lt;br /&gt;Version symbols section '.gnu.version' contains 3 entries:&lt;br /&gt; Addr: 0000000000400330  Offset: 0x000330  Link: 5 (.dynsym)&lt;br /&gt;  000:   0 (*local*)       0 (*local*)       2 (GLIBC_2.2.5)&lt;br /&gt;&lt;br /&gt;Version needs section '.gnu.version_r' contains 1 entries:&lt;br /&gt; Addr: 0x0000000000400338  Offset: 0x000338  Link: 6 (.dynstr)&lt;br /&gt;  000000: Version: 1  File: libc.so.6  Cnt: 1&lt;br /&gt;  0x0010:   Name: GLIBC_2.2.5  Flags: none  Version: 2&lt;br /&gt;&lt;br /&gt;Notes at offset 0x00000254 with length 0x00000020:&lt;br /&gt;  Owner  Data size Description&lt;br /&gt;  GNU  0x00000010 NT_GNU_ABI_TAG (ABI version tag)&lt;br /&gt;3.7 $ &lt;br /&gt;&lt;br /&gt;***** a.outの構造の解説&lt;br /&gt;再配置可能オブジェクトとの差異を中心にコメントする。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;ELF Header:&lt;br /&gt;  Magic:   7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 &lt;br /&gt;  Class:                             ELF64&lt;br /&gt;  Data:                              2's complement, little endian&lt;br /&gt;  Version:                           1 (current)&lt;br /&gt;  OS/ABI:                            UNIX - System V&lt;br /&gt;  ABI Version:                       0&lt;br /&gt;  Type:                              EXEC (Executable file)&lt;br /&gt;&lt;br /&gt;実行可能ファイルであることを示す。&lt;br /&gt;&lt;br /&gt;  Machine:                           Advanced Micro Devices X86-64&lt;br /&gt;  Version:                           0x1&lt;br /&gt;  Entry point address:               0x4003c0&lt;br /&gt;  Start of program headers:          64 (bytes into file)&lt;br /&gt;&lt;br /&gt;再配置可能オブジェクトと異り、プログラムヘッダが存&lt;br /&gt;在する。&lt;br /&gt;&lt;br /&gt;  Start of section headers:          6208 (bytes into file)&lt;br /&gt;  Flags:                             0x0&lt;br /&gt;  Size of this header:               64 (bytes)&lt;br /&gt;  Size of program headers:           56 (bytes)&lt;br /&gt;  Number of program headers:         9&lt;br /&gt;  Size of section headers:           64 (bytes)&lt;br /&gt;  Number of section headers:         37&lt;br /&gt;  Section header string table index: 34&lt;br /&gt;&lt;br /&gt;Section Headers:&lt;br /&gt;  [Nr] Name              Type             Address           Offset&lt;br /&gt;       Size              EntSize          Flags  Link  Info  Align&lt;br /&gt;  [ 0]                   NULL             0000000000000000  00000000&lt;br /&gt;       0000000000000000  0000000000000000           0     0     0&lt;br /&gt;  [ 1] .interp           PROGBITS         0000000000400238  00000238&lt;br /&gt;       000000000000001c  0000000000000000   A       0     0     1&lt;br /&gt;&lt;br /&gt;プログラムインタプリタのパスを含む。&lt;br /&gt;&lt;br /&gt;  [ 2] .note.ABI-tag     NOTE             0000000000400254  00000254&lt;br /&gt;       0000000000000020  0000000000000000   A       0     0     4&lt;br /&gt;&lt;br /&gt;ABI-tagが何を意味するかはGCCまたはLinuxの調査が必&lt;br /&gt;要。&lt;br /&gt;&lt;br /&gt;  [ 3] .hash             HASH             0000000000400278  00000278&lt;br /&gt;       0000000000000018  0000000000000004   A       5     0     8&lt;br /&gt;&lt;br /&gt;シンボルハッシュテーブル。&lt;br /&gt;       &lt;br /&gt;  [ 4] .gnu.hash         GNU_HASH         0000000000400290  00000290&lt;br /&gt;       000000000000001c  0000000000000000   A       5     0     8&lt;br /&gt;&lt;br /&gt;GCC拡張？&lt;br /&gt;&lt;br /&gt;  [ 5] .dynsym           DYNSYM           00000000004002b0  000002b0&lt;br /&gt;       0000000000000048  0000000000000018   A       6     1     8&lt;br /&gt;&lt;br /&gt;動的リンクのためのシンボルテーブル。&lt;br /&gt;&lt;br /&gt;  [ 6] .dynstr           STRTAB           00000000004002f8  000002f8&lt;br /&gt;       0000000000000038  0000000000000000   A       0     0     1&lt;br /&gt;&lt;br /&gt;.dynsymのための文字列テーブル。主にシンボル文字列&lt;br /&gt;を含む。&lt;br /&gt;&lt;br /&gt;  [ 7] .gnu.version      VERSYM           0000000000400330  00000330&lt;br /&gt;       0000000000000006  0000000000000002   A       5     0     2&lt;br /&gt;&lt;br /&gt;GCC拡張？&lt;br /&gt;&lt;br /&gt;  [ 8] .gnu.version_r    VERNEED          0000000000400338  00000338&lt;br /&gt;       0000000000000020  0000000000000000   A       6     1     8&lt;br /&gt;&lt;br /&gt;GCC拡張？&lt;br /&gt;&lt;br /&gt;  [ 9] .rela.dyn         RELA             0000000000400358  00000358&lt;br /&gt;       0000000000000018  0000000000000018   A       5     0     8&lt;br /&gt;&lt;br /&gt;.dynのための再配置情報。&lt;br /&gt;&lt;br /&gt;  [10] .rela.plt         RELA             0000000000400370  00000370&lt;br /&gt;       0000000000000018  0000000000000018   A       5    12     8&lt;br /&gt;&lt;br /&gt;.pltのための再配置情報。&lt;br /&gt;&lt;br /&gt;  [11] .init             PROGBITS         0000000000400388  00000388&lt;br /&gt;       0000000000000018  0000000000000000  AX       0     0     4&lt;br /&gt;&lt;br /&gt;mainプログラムのまえに呼ぶコード。&lt;br /&gt;&lt;br /&gt;  [12] .plt              PROGBITS         00000000004003a0  000003a0&lt;br /&gt;       0000000000000020  0000000000000010  AX       0     0     4&lt;br /&gt;&lt;br /&gt;procedure linkage table (手続きリンクテーブル)。&lt;br /&gt;&lt;br /&gt;  [13] .text             PROGBITS         00000000004003c0  000003c0&lt;br /&gt;       00000000000001f8  0000000000000000  AX       0     0     16&lt;br /&gt;  [14] .fini             PROGBITS         00000000004005b8  000005b8&lt;br /&gt;       000000000000000e  0000000000000000  AX       0     0     4&lt;br /&gt;&lt;br /&gt;process termination codeの後で実行されるコード。&lt;br /&gt;&lt;br /&gt;  [15] .rodata           PROGBITS         00000000004005c8  000005c8&lt;br /&gt;       0000000000000004  0000000000000004  AM       0     0     4&lt;br /&gt;&lt;br /&gt;読み出し専用データを含む.&lt;br /&gt;&lt;br /&gt;  [16] .eh_frame_hdr     PROGBITS         00000000004005cc  000005cc&lt;br /&gt;       000000000000002c  0000000000000000   A       0     0     4&lt;br /&gt;&lt;br /&gt;GCC拡張？&lt;br /&gt;&lt;br /&gt;  [17] .eh_frame         PROGBITS         00000000004005f8  000005f8&lt;br /&gt;       00000000000000b4  0000000000000000   A       0     0     8&lt;br /&gt;  [18] .ctors            PROGBITS         0000000000600e18  00000e18&lt;br /&gt;       0000000000000010  0000000000000000  WA       0     0     8&lt;br /&gt;&lt;br /&gt;GCC拡張？&lt;br /&gt;&lt;br /&gt;  [19] .dtors            PROGBITS         0000000000600e28  00000e28&lt;br /&gt;       0000000000000010  0000000000000000  WA       0     0     8&lt;br /&gt;&lt;br /&gt;GCC拡張？&lt;br /&gt;&lt;br /&gt;  [20] .jcr              PROGBITS         0000000000600e38  00000e38&lt;br /&gt;       0000000000000008  0000000000000000  WA       0     0     8&lt;br /&gt;&lt;br /&gt;GCC拡張？&lt;br /&gt;&lt;br /&gt;  [21] .dynamic          DYNAMIC          0000000000600e40  00000e40&lt;br /&gt;       00000000000001a0  0000000000000010  WA       6     0     8&lt;br /&gt;&lt;br /&gt;動的リンク情報。&lt;br /&gt;&lt;br /&gt;  [22] .got              PROGBITS         0000000000600fe0  00000fe0&lt;br /&gt;       0000000000000008  0000000000000008  WA       0     0     8&lt;br /&gt;&lt;br /&gt;global offset table。&lt;br /&gt;&lt;br /&gt;  [23] .got.plt          PROGBITS         0000000000600fe8  00000fe8&lt;br /&gt;       0000000000000020  0000000000000008  WA       0     0     8&lt;br /&gt;&lt;br /&gt;GCC拡張？&lt;br /&gt;&lt;br /&gt;  [24] .data             PROGBITS         0000000000601010  00001010&lt;br /&gt;       0000000000000020  0000000000000000  WA       0     0     16&lt;br /&gt;  [25] .bss              NOBITS           0000000000601030  00001030&lt;br /&gt;       0000000000000010  0000000000000000  WA       0     0     8&lt;br /&gt;  [26] .comment          PROGBITS         0000000000000000  00001030&lt;br /&gt;       0000000000000128  0000000000000000           0     0     1&lt;br /&gt;  [27] .debug_aranges    PROGBITS         0000000000000000  00001160&lt;br /&gt;       0000000000000090  0000000000000000           0     0     16&lt;br /&gt;&lt;br /&gt;GCC拡張？DWARF拡張？&lt;br /&gt;&lt;br /&gt;  [28] .debug_pubnames   PROGBITS         0000000000000000  000011f0&lt;br /&gt;       0000000000000025  0000000000000000           0     0     1&lt;br /&gt;&lt;br /&gt;GCC拡張？DWARF拡張？&lt;br /&gt;&lt;br /&gt;  [29] .debug_info       PROGBITS         0000000000000000  00001215&lt;br /&gt;       00000000000001d7  0000000000000000           0     0     1&lt;br /&gt;&lt;br /&gt;GCC拡張？DWARF拡張？&lt;br /&gt;&lt;br /&gt;  [30] .debug_abbrev     PROGBITS         0000000000000000  000013ec&lt;br /&gt;       000000000000006f  0000000000000000           0     0     1&lt;br /&gt;&lt;br /&gt;GCC拡張？DWARF拡張？&lt;br /&gt;&lt;br /&gt;  [31] .debug_line       PROGBITS         0000000000000000  0000145b&lt;br /&gt;       0000000000000151  0000000000000000           0     0     1&lt;br /&gt;&lt;br /&gt;GCC拡張？DWARF拡張？&lt;br /&gt;&lt;br /&gt;  [32] .debug_str        PROGBITS         0000000000000000  000015ac&lt;br /&gt;       00000000000000a7  0000000000000001  MS       0     0     1&lt;br /&gt;&lt;br /&gt;GCC拡張？DWARF拡張？&lt;br /&gt;&lt;br /&gt;  [33] .debug_ranges     PROGBITS         0000000000000000  00001660&lt;br /&gt;       0000000000000090  0000000000000000           0     0     16&lt;br /&gt;&lt;br /&gt;GCC拡張？DWARF拡張？&lt;br /&gt;&lt;br /&gt;  [34] .shstrtab         STRTAB           0000000000000000  000016f0&lt;br /&gt;       0000000000000149  0000000000000000           0     0     1&lt;br /&gt;  [35] .symtab           SYMTAB           0000000000000000  00002180&lt;br /&gt;       0000000000000720  0000000000000018          36    58     8&lt;br /&gt;  [36] .strtab           STRTAB           0000000000000000  000028a0&lt;br /&gt;       00000000000001ff  0000000000000000           0     0     1&lt;br /&gt;Key to Flags:&lt;br /&gt;  W (write), A (alloc), X (execute), M (merge), S (strings)&lt;br /&gt;  I (info), L (link order), G (group), x (unknown)&lt;br /&gt;  O (extra OS processing required) o (OS specific), p (processor specific)&lt;br /&gt;&lt;br /&gt;There are no section groups in this file.&lt;br /&gt;&lt;br /&gt;Program Headers:&lt;br /&gt;&lt;br /&gt;プログラムヘッダは、ファイルの内部構造をメモリ上の&lt;br /&gt;イメージにもっていくための中心的情報である。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  Type           Offset             VirtAddr           PhysAddr&lt;br /&gt;                 FileSiz            MemSiz              Flags  Align&lt;br /&gt;&lt;br /&gt;フィールドの意味は次のとおり。&lt;br /&gt;&lt;br /&gt;p_type :&lt;br /&gt;&lt;br /&gt;各ヘッダエントリのタイプを表す。&lt;br /&gt;&lt;br /&gt;  PT_NULL (0)&lt;br /&gt;&lt;br /&gt;    このエントリは使われていないことを示す。&lt;br /&gt;&lt;br /&gt;  PT_LOAD (1)&lt;br /&gt;&lt;br /&gt;    loadableセグメント。&lt;br /&gt;&lt;br /&gt;  PT_DYNAMIC (2)&lt;br /&gt;&lt;br /&gt;    このエントリは、動的リンクに関する情報を保持する。&lt;br /&gt;&lt;br /&gt;  PT_INTERP (3)&lt;br /&gt;&lt;br /&gt;    このエントリは、インタプルタのパスを保持する。&lt;br /&gt;&lt;br /&gt;  PT_NOTE (4)&lt;br /&gt;&lt;br /&gt;    このエントリは、追加情報を保持する。&lt;br /&gt;&lt;br /&gt;  PT_SHLIB (5)&lt;br /&gt;&lt;br /&gt;    これはまだ運用されていない。&lt;br /&gt;&lt;br /&gt;  PT_PHDR (6)&lt;br /&gt;&lt;br /&gt;    プログラムヘッダの位置自身を示す。&lt;br /&gt;&lt;br /&gt;  PT_LOPROC (0x70000000)&lt;br /&gt;&lt;br /&gt;    プロセッサ固有のフラグ領域の開始位置。&lt;br /&gt;&lt;br /&gt;  PT_HIPROC (0x7fffffff)&lt;br /&gt;&lt;br /&gt;    プロセッサ固有のフラグ領域の終了位置。&lt;br /&gt;&lt;br /&gt;p_offset :&lt;br /&gt;セグメントの先頭バイトの位置(ファイル先頭からバイト&lt;br /&gt;で測る)&lt;br /&gt;&lt;br /&gt;p_vaddr :&lt;br /&gt;&lt;br /&gt;セグメントの先頭バイトの位置(仮想アドレス上におい&lt;br /&gt;て)&lt;br /&gt;&lt;br /&gt;p_paddr :&lt;br /&gt;&lt;br /&gt;セグメントの先頭バイトの位置(物理アドレス上におい&lt;br /&gt;て)。物理アドレスに配置するシステム用。&lt;br /&gt;&lt;br /&gt;p_filesz :&lt;br /&gt;&lt;br /&gt;ファイル上における該当セグメントのサイズ。&lt;br /&gt;&lt;br /&gt;p_memsz :&lt;br /&gt;&lt;br /&gt;メモリ上における該当セグメントのサイズ。&lt;br /&gt;&lt;br /&gt;p_flags :&lt;br /&gt;&lt;br /&gt;  PF_X&lt;br /&gt;    Execute&lt;br /&gt;  PF_W&lt;br /&gt;    Write&lt;br /&gt;  PF_R&lt;br /&gt;    Read&lt;br /&gt;  PF_MASKPROC&lt;br /&gt;    undefined (processor specific)&lt;br /&gt;  &lt;br /&gt;p_align :&lt;br /&gt;&lt;br /&gt;ページ整列のための情報。&lt;br /&gt;&lt;br /&gt;さて各ヘッダエントリ。&lt;br /&gt;&lt;br /&gt;  Type           Offset             VirtAddr           PhysAddr&lt;br /&gt;                 FileSiz            MemSiz              Flags  Align&lt;br /&gt;  PHDR           0x0000000000000040 0x0000000000400040 0x0000000000400040&lt;br /&gt;                 0x00000000000001f8 0x00000000000001f8  R E    8&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  INTERP         0x0000000000000238 0x0000000000400238 0x0000000000400238&lt;br /&gt;                 0x000000000000001c 0x000000000000001c  R      1&lt;br /&gt;      [Requesting program interpreter: /lib64/ld-linux-x86-64.so.2]&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  LOAD           0x0000000000000000 0x0000000000400000 0x0000000000400000&lt;br /&gt;                 0x00000000000006ac 0x00000000000006ac  R E    200000&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  LOAD           0x0000000000000e18 0x0000000000600e18 0x0000000000600e18&lt;br /&gt;                 0x0000000000000218 0x0000000000000228  RW     200000&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  DYNAMIC        0x0000000000000e40 0x0000000000600e40 0x0000000000600e40&lt;br /&gt;                 0x00000000000001a0 0x00000000000001a0  RW     8&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  NOTE           0x0000000000000254 0x0000000000400254 0x0000000000400254&lt;br /&gt;                 0x0000000000000020 0x0000000000000020  R      4&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  GNU_EH_FRAME   0x00000000000005cc 0x00000000004005cc 0x00000000004005cc&lt;br /&gt;                 0x000000000000002c 0x000000000000002c  R      4&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  GNU_STACK      0x0000000000000000 0x0000000000000000 0x0000000000000000&lt;br /&gt;                 0x0000000000000000 0x0000000000000000  RW     8&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  GNU_RELRO      0x0000000000000e18 0x0000000000600e18 0x0000000000600e18&lt;br /&gt;                 0x00000000000001e8 0x00000000000001e8  R      1&lt;br /&gt;&lt;br /&gt; Section to Segment mapping:&lt;br /&gt;  Segment Sections...&lt;br /&gt;   00     &lt;br /&gt;   01     .interp &lt;br /&gt;   02     .interp .note.ABI-tag .hash .gnu.hash .dynsym .dynstr .gnu.version .gnu.version_r .rela.dyn .rela.plt .init .plt .text .fini .rodata .eh_frame_hdr .eh_frame &lt;br /&gt;   03     .ctors .dtors .jcr .dynamic .got .got.plt .data .bss &lt;br /&gt;   04     .dynamic &lt;br /&gt;   05     .note.ABI-tag &lt;br /&gt;   06     .eh_frame_hdr &lt;br /&gt;   07     &lt;br /&gt;   08     .ctors .dtors .jcr .dynamic .got &lt;br /&gt;&lt;br /&gt;このマッピングは、ヘッダが明示的に保持しているので&lt;br /&gt;はなく、Section ViewとProgram Viewを重ねあわせて、&lt;br /&gt;readelfが構成しているのだと思う。&lt;br /&gt;&lt;br /&gt;Dynamic section at offset 0xe40 contains 21 entries:&lt;br /&gt;  Tag        Type                         Name/Value&lt;br /&gt; 0x0000000000000001 (NEEDED)             Shared library: [libc.so.6]&lt;br /&gt; 0x000000000000000c (INIT)               0x400388&lt;br /&gt; 0x000000000000000d (FINI)               0x4005b8&lt;br /&gt; 0x0000000000000004 (HASH)               0x400278&lt;br /&gt; 0x000000006ffffef5 (GNU_HASH)           0x400290&lt;br /&gt; 0x0000000000000005 (STRTAB)             0x4002f8&lt;br /&gt; 0x0000000000000006 (SYMTAB)             0x4002b0&lt;br /&gt; 0x000000000000000a (STRSZ)              56 (bytes)&lt;br /&gt; 0x000000000000000b (SYMENT)             24 (bytes)&lt;br /&gt; 0x0000000000000015 (DEBUG)              0x0&lt;br /&gt; 0x0000000000000003 (PLTGOT)             0x600fe8&lt;br /&gt; 0x0000000000000002 (PLTRELSZ)           24 (bytes)&lt;br /&gt; 0x0000000000000014 (PLTREL)             RELA&lt;br /&gt; 0x0000000000000017 (JMPREL)             0x400370&lt;br /&gt; 0x0000000000000007 (RELA)               0x400358&lt;br /&gt; 0x0000000000000008 (RELASZ)             24 (bytes)&lt;br /&gt; 0x0000000000000009 (RELAENT)            24 (bytes)&lt;br /&gt; 0x000000006ffffffe (VERNEED)            0x400338&lt;br /&gt; 0x000000006fffffff (VERNEEDNUM)         1&lt;br /&gt; 0x000000006ffffff0 (VERSYM)             0x400330&lt;br /&gt; 0x0000000000000000 (NULL)               0x0&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;動的リンクは先の話題なので割愛。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Relocation section '.rela.dyn' at offset 0x358 contains 1 entries:&lt;br /&gt;  Offset          Info           Type           Sym. Value    Sym. Name + Addend&lt;br /&gt;000000600fe0  000100000006 R_X86_64_GLOB_DAT 0000000000000000 __gmon_start__ + 0&lt;br /&gt;&lt;br /&gt;Relocation section '.rela.plt' at offset 0x370 contains 1 entries:&lt;br /&gt;  Offset          Info           Type           Sym. Value    Sym. Name + Addend&lt;br /&gt;000000601000  000200000007 R_X86_64_JUMP_SLO 0000000000000000 __libc_start_main + 0&lt;br /&gt;&lt;br /&gt;There are no unwind sections in this file.&lt;br /&gt;&lt;br /&gt;Version symbols section '.gnu.version' contains 3 entries:&lt;br /&gt; Addr: 0000000000400330  Offset: 0x000330  Link: 5 (.dynsym)&lt;br /&gt;  000:   0 (*local*)       0 (*local*)       2 (GLIBC_2.2.5)&lt;br /&gt;&lt;br /&gt;Version needs section '.gnu.version_r' contains 1 entries:&lt;br /&gt; Addr: 0x0000000000400338  Offset: 0x000338  Link: 6 (.dynstr)&lt;br /&gt;  000000: Version: 1  File: libc.so.6  Cnt: 1&lt;br /&gt;  0x0010:   Name: GLIBC_2.2.5  Flags: none  Version: 2&lt;br /&gt;&lt;br /&gt;Notes at offset 0x00000254 with length 0x00000020:&lt;br /&gt;  Owner  Data size Description&lt;br /&gt;  GNU  0x00000010 NT_GNU_ABI_TAG (ABI version tag)&lt;br /&gt;3.7 $ &lt;br /&gt;&lt;br /&gt;***** a.outのセクション全て&lt;br /&gt;3.7 $ objdump -s a.out&lt;br /&gt;&lt;br /&gt;a.out:     file format elf64-x86-64&lt;br /&gt;&lt;br /&gt;Contents of section .interp:&lt;br /&gt; 400238 2f6c6962 36342f6c 642d6c69 6e75782d  /lib64/ld-linux-&lt;br /&gt; 400248 7838362d 36342e73 6f2e3200           x86-64.so.2.    &lt;br /&gt;Contents of section .note.ABI-tag:&lt;br /&gt; 400254 04000000 10000000 01000000 474e5500  ............GNU.&lt;br /&gt; 400264 00000000 02000000 06000000 08000000  ................&lt;br /&gt;Contents of section .hash:&lt;br /&gt; 400278 01000000 03000000 02000000 00000000  ................&lt;br /&gt; 400288 00000000 01000000                    ........        &lt;br /&gt;Contents of section .gnu.hash:&lt;br /&gt; 400290 01000000 01000000 01000000 00000000  ................&lt;br /&gt; 4002a0 00000000 00000000 00000000           ............    &lt;br /&gt;Contents of section .dynsym:&lt;br /&gt; 4002b0 00000000 00000000 00000000 00000000  ................&lt;br /&gt; 4002c0 00000000 00000000 01000000 20000000  ............ ...&lt;br /&gt; 4002d0 00000000 00000000 00000000 00000000  ................&lt;br /&gt; 4002e0 1a000000 12000000 00000000 00000000  ................&lt;br /&gt; 4002f0 00000000 00000000                    ........        &lt;br /&gt;Contents of section .dynstr:&lt;br /&gt; 4002f8 005f5f67 6d6f6e5f 73746172 745f5f00  .__gmon_start__.&lt;br /&gt; 400308 6c696263 2e736f2e 36005f5f 6c696263  libc.so.6.__libc&lt;br /&gt; 400318 5f737461 72745f6d 61696e00 474c4942  _start_main.GLIB&lt;br /&gt; 400328 435f322e 322e3500                    C_2.2.5.        &lt;br /&gt;Contents of section .gnu.version:&lt;br /&gt; 400330 00000000 0200                        ......          &lt;br /&gt;Contents of section .gnu.version_r:&lt;br /&gt; 400338 01000100 10000000 10000000 00000000  ................&lt;br /&gt; 400348 751a6909 00000200 2c000000 00000000  u.i.....,.......&lt;br /&gt;Contents of section .rela.dyn:&lt;br /&gt; 400358 e00f6000 00000000 06000000 01000000  ..`.............&lt;br /&gt; 400368 00000000 00000000                    ........        &lt;br /&gt;Contents of section .rela.plt:&lt;br /&gt; 400370 00106000 00000000 07000000 02000000  ..`.............&lt;br /&gt; 400380 00000000 00000000                    ........        &lt;br /&gt;Contents of section .init:&lt;br /&gt; 400388 4883ec08 e85b0000 00e8ea00 0000e8e5  H....[..........&lt;br /&gt; 400398 01000048 83c408c3                    ...H....        &lt;br /&gt;Contents of section .plt:&lt;br /&gt; 4003a0 ff354a0c 2000ff25 4c0c2000 0f1f4000  .5J. ..%L. ...@.&lt;br /&gt; 4003b0 ff254a0c 20006800 000000e9 e0ffffff  .%J. .h.........&lt;br /&gt;Contents of section .text:&lt;br /&gt; 4003c0 31ed4989 d15e4889 e24883e4 f0505449  1.I..^H..H...PTI&lt;br /&gt; 4003d0 c7c0e004 400048c7 c1f00440 0048c7c7  ....@.H....@.H..&lt;br /&gt; 4003e0 c0044000 e8c7ffff fff49090 4883ec08  ..@.........H...&lt;br /&gt; 4003f0 488b05e9 0b200048 85c07402 ffd04883  H.... .H..t...H.&lt;br /&gt; 400400 c408c390 90909090 90909090 90909090  ................&lt;br /&gt; 400410 554889e5 534883ec 08803d10 0c200000  UH..SH....=.. ..&lt;br /&gt; 400420 754bb830 0e600048 8b150a0c 2000482d  uK.0.`.H.... .H-&lt;br /&gt; 400430 280e6000 48c1f803 488d58ff 4839da73  (.`.H...H.X.H9.s&lt;br /&gt; 400440 250f1f80 00000000 488d4201 488905e5  %.......H.B.H...&lt;br /&gt; 400450 0b2000ff 14c5280e 6000488b 15d70b20  . ....(.`.H.... &lt;br /&gt; 400460 004839da 72e2c605 c30b2000 014883c4  .H9.r..... ..H..&lt;br /&gt; 400470 085bc9c3 6666662e 0f1f8400 00000000  .[..fff.........&lt;br /&gt; 400480 5548833d af092000 004889e5 741ab800  UH.=.. ..H..t...&lt;br /&gt; 400490 00000048 85c07410 bf380e60 004989c3  ...H..t..8.`.I..&lt;br /&gt; 4004a0 c941ffe3 0f1f4000 c9c39090 554889e5  .A....@.....UH..&lt;br /&gt; 4004b0 48897df8 488b45f8 0fb600c9 c3909090  H.}.H.E.........&lt;br /&gt; 4004c0 554889e5 4883ec10 897dfc48 8975f0bf  UH..H....}.H.u..&lt;br /&gt; 4004d0 20106000 e8d3ffff ffb80000 0000c9c3   .`.............&lt;br /&gt; 4004e0 f3c36666 6666662e 0f1f8400 00000000  ..fffff.........&lt;br /&gt; 4004f0 48896c24 d84c897c 24f8488d 2d130920  H.l$.L.|$.H.-.. &lt;br /&gt; 400500 004c8d3d 0c092000 4c896424 e04c896c  .
