阿房峠

tunaguinfoのブログ

メモ Windows で Common Lisp の練習環境は Xyzzy

見出のとおり、日本のWindowsユーザには Xyzzy という Common Lisp 環境があるじゃないですか、というネタ。

 

AutoLISP と Common Lisp と代入 - 阿房峠 で挙げたとおり、AutoLISPがCommon Lisp のサブセット+図形編集コマンドであるとすると、再帰も使えるのではないかと考えているのだけど、再帰を使った AutoLISP のコードはまだ見てない。再帰じゃなくて多分 while で記述できるだろうし、AutoCADのユーザはたぶんCとかVBとかVBAとかの手続き型の言語を使っている人が多いだろう。

探し方が悪いだけできっとあるのだろう。検索キーワードも"再帰"と漢字なので英語の検索はしていない。AutoLISPで再帰がつかえたらなんかいいのかと聞かれても、何も返せない。悟りが開けるらしいとか、……云々。

自分のことを挙げれば関数の展開がわかっていない。返り値の格納場所とか言ってる時点で多分間違い。関数が鉛筆で解けない。だから再帰がわからないし頓珍漢な答えをだすのだ。

でも、AutoLISP ではメニューマクロの置き換え位はできるようになった。ところが公開されている AutoLISP が読めてはいない。コードを追って値がどうなっているのか説明できる自信がない。ということで、他のLISPで何かをつかめればいいなあと思うのだった。

お盆の間は 「Land of Lisp」 をやって、「リスト遊び」と「もう一つのScheme入門」を読んでいたのだけれど困ったのは実行環境だった。Emacs は使っているから EmacsLisp は困らないのだけれど Land of LispCLISP で書かれているので CLISPの実行環境がいる(ちなみにSchemeはNexus7で実行してる)。ところが本文で示されたURLは"帯域使い杉"とかで制限されてる。仕方なくgoogleで検索してlispboxの中のclisp.exeだけ使ったりするんだけど、これってマニアック過ぎないのだろうか。WindowsユーザでLispをやってみたい人はみんなEmacsな人なのだろうかと思ったところで、気がついた。

Xyzzy がありました。しかも、XyzzyCommon Lisp 入門 も Makoto HIROI さんが作ってくれてる。これがいいんじゃないかな。今晩帰ったら早速始めたいと思います。そのためのメモ。

 

xyzzyWindowsで動作するテキストエディタEmacsと一般的なテキストエディタの利点を取り込んでいる。作者は亀井哲弥。マクロ言語としてCommon Lisp系のxyzzy Lispを実装しており、高機能なLisp処理系としての側面も持つ。現在は派生版の開発が続いている。

xyzzy - Wikipedia

 

xyzzy はカスタマイズ可能で軽快な Windows 用のテキストエディタのようなものです。 作者も使ったことのないような機能を満載しています。

xyzzy - カスタマイズ可能で軽快な Windows 用テキストエディタ

 

Xyzzy Wiki
亀井さん作成のエディタxyzzyに関する情報をまとめるwikiです。オフィシャルなwikiでは無いのでご注意ください。

FrontPage - XyzzyWiki

 

はじめに

xyzzy は 亀井哲弥氏 が作成された Emacs 系のエディタです。xyzzy に搭載されている Lisp (以後 xyzzy Lisp と記述) は、Lisp の標準である Common Lisp に準拠 [*1] している優れた処理系です。この xyzzy Lisp を使って、Lisp でプログラミングを楽しもうというのが本ページの趣旨であります。Lisp は初めてという方は Common Lisp 入門 を読んでみてください。Common Lisp の基本を詳しく説明しています。

M.Hiroi's Home Page / xyzzy Lisp Programming

 

そして、Lisp をすすめる最大の理由が、プログラミングが簡単でとても面白いからです。少し勉強しただけで、プログラムを作ることができるようになります。Emacs Lisp は仕様が旧式なため少々使いにくいところがありますが、xyzzy Lisp ならば大丈夫です。優秀な処理系が身近にあるのですから、これを機会に Lisp の世界に足を踏み入れてみましょう。

M.Hiroi's Home Page / xyzzy Lisp Programming Common Lisp 入門

 

丸善に来たからって舞い上がって、Land of Lisp を買うんじゃなかった。まずは、XyzzyCommon Lispだったな。ずいぶん遠回りしたものだ。

Android で Scheme

Here's a preliminary version of Gambit Scheme for the Android platform, inspired by Marc Feeley's iOS version.
Gambit Scheme is a "complete, portable, efficient, and reliable implementation of the Scheme programming language, conforming to the R4RS, R5RS and IEEE Scheme standards, and implementing all optional features. Tail calls and first class continuations conform to the Scheme semantics. The full numeric tower is implemented, including: arbitrary precision integers (bignums), rationals, inexact reals (floating point numbers), and complex numbers."
Gambit for Android includes the ability to interact with a Gambit Scheme REPL (read-evaluate-print-loop), add and save Scheme scripts, and start and telnet into a REPL server running on the device.

Gambit for Android - Google Play の Android アプリ

 

PCが手元にあるときは Common Lisp でも Scheme でも実行環境があるからいいのだけど、枕元とかで本を読んでいる時に関数を試してみたい時があって、以前から ○○lispとか○○Scheme とかを Nexus7 に落としては試していた。実際に関数を入れてみると例題にある式と返り値が違っていたり、組み込み関数?がなかったりでがっかりするのだった。

ついに今日は使える環境にたどり着いて、上記の Gambit で紫藤さんのもう一つのScheme入門を楽しんでいる。3章までの四則演算やリストの評価もテキストとおりに返ってくる。楽しい。

 

AutoLISP と Common Lisp と代入

  • 実はXLISP、と一概に言っても、Ver.1.0、2.0、と3.0ではまるで違う言語である。
  • XLISP1.0は過去の(現代の観点から言うと)貧弱なハードウェアでも動く小さいオブジェクト指向Lisp方言、XLISP2.0はCommon Lispのサブセットであった。
  • AutodeskVisual LISPはXLISP1.0から派生している。

XLISP - 紫藤のWiki

ということで、AutoLISPの練習としてCommon Lispを練習している。Common Lispの参考書は新しいものは少なくてしかも激高なのでつい、Schemeの入門書のようなところに手を出してしまう。そこには

Scheme は基本的に関数型プログラミング言語なので、基本的には代入を用いないでプログラムを書くことができます。しかし、代入を用いたほうがかえって簡潔に書ける場合もあり、 内部状態や継続を利用する時は代入を使う必要があります。

https://www.shido.info/lisp/scheme_asg.html もう一つのScheme入門 10.代入

と書いてある。代入しないなんて……。どうしたらいいんだろう。とまた手が止まる。

まあ、そういう時はあれだ、Google先生だ。で聞いた結果、やっぱりいつもの先生方との対面となるのだった。

関数型プログラミングでは、よく「代入は使ってはならない」と言われます。関数型言語の一種である Emacs Lisp を生業とする僕は、この言葉に長年悩まされてきました。代入を使わないで実用的なプログラムを書くことは無理だからです。

Emacs Lisp は、Common Lisp に近く、Common Lisp は命令型言語ですので、再代入は避けられないというのが、最近の僕の結論です。

関数型プログラミングと代入 - あどけない話 (山本和彦さん)

なので、安心してAutoLISPではsetqすることにした。

 

山本さんみたいなすごいヒトでも、呪いに縛られることがあるのか。しかし、それを解決できるところがすごいヒトのすごいところ。(なんだか「すごい」ってのは、言葉としてはずいぶんと安い感じではあるとは思うけど)

ちなみに、自分では自分自身、擬似科学とか代替医療とかにはわりと鼻が利くホウだと思っているのだけど、ことプログラミングのこととなるとまったく自信がない。多分代替医療に嵌るヒトはこういうプロセスを踏むことができずに、何を信用していいのかわからずに、でも何かを選択せざるを得ない状況で、仕方なく選んでしまうのだと思う。選んでしまえばそこには慣性が生じるので捨てることは難しいのでは、と思うのだった。

 

ところが、Lisp は完全な関数型言語ではありません。引数以外の変数を定義して、setq などで値を代入することができるからです。つまり、変数の値を書き換えることでプログラムを実行する「手続き型言語」の機能もあるわけです。とくに Common Lisp の場合、手続き型言語からいろいろな機能が持ち込まれたため、ほかの関数型言語に比べると不純度の高い関数型言語になっています。

M.Hiroi's Home Page / xyzzy Lisp Programming

ここにも!!。

 

 

 

再帰

先日からLand of Lispを読み進めている。目的は再帰とlambdaの理解なのだけど最初に出てきた再帰の式だけでも???が浮かんで前に進まない。

 

というわけで、わからないことはGoogle先生に聴くとこにした。

lisp 再帰 - Google 検索

その中でも理解できそうなページは以下のもの。

 

7. 繰り返し

1. 初めに

今回は繰り返しについて説明します。繰り返しができれば、一通りプログラムを書くことができます。 繰り返しのための構文 do もありますが、一般に、Scheme は繰り返しのために再帰を使います。
2. 再帰

再帰関数とは関数定義の中で自分自身を呼び出す関数です。 慣れないと奇妙な感じがしますが、慣れてしまえば、気にならなくなります。

 

https://www.shido.info/lisp/idx_scm.html もう一つのScheme入門(紫藤貴文さん)

https://www.shido.info/lisp/scheme7.html  7.繰り返し

 

再帰関数というのは自分自身を呼び出す関数です。たとえば、以下の関数は再帰関数です。

再帰関数(初級) - 八発白中 (深町英太郎さん)

再帰関数(上級) - 八発白中 こちらには末尾再帰の例が載っている。

 

紫藤さんのページも平行して読んでいたのだけどそこまでは進んでいないし、深町さんのページもいつも検索には引っかかるのだけど読んでおらず、改めて本気で読まないと頭に入らないなあと。ただし、Land of Lispの例文にある (1+ hoge hoge)の(1+)の返り値はどこに溜め込むのは理解できてない。形としては、アンチョコとして使えるとは思うのだけど、他人には説明できないなあ。

アンチョコということでは、

lispの再帰関数,関数作成の練習 - Set::prototype

には数十もの再帰の例が載っていた。

 

さて、Land of Lispの訳者で役者(

川合史朗@Gaucheは、ハワイで俳優をしている|【Tech総研】

)の川合史郎さんのサイト

http://practical-scheme.net/index-j.html

)には、「なんでも再帰」(

http://practical-scheme.net/docs/tailcall-j.html

)というページでCのforとScheme再帰の比較をしている。これもまあ、全く理解できない。いつかわかる日が来るのだろうか?

それとPaul Graham氏の記事の翻訳が多数。

org-mode

org-modeとは

Org-mode は、ノートの保存、TODOリストの管理、プロジェクト計画のためのモードです。高速で効率的なプレーンテキストのシステムを使ってファイルを編集します。

Org mode for Emacs: あなたの生活をプレーンテキストで

 

Org-modeはCarsten Dominik氏が作成したEmacsのOutline-modeを大幅に拡張したアウトライナーLisp(マクロ)である。Org=organizerという名のとおり、アウトライナーの域を超えて、プロジェクトやTODOを管理したり、スケジュールを組んだりするオーガナイザーである。

OrgMode - Emacs上のアウトライナー

 

Org-modeとは,Emacs上で動く ノート/タスク管理/プロジェクト管理/執筆 管理ツールです.

本サイトは,org-modeの情報を日本語で発信していく非公式サイトです.

orgmode.jp

 

このドキュメントは、Emacs と Org-mode を使って HTML 文書を作成するのに必要な最低限のノウハウをまとめたものです。

Org-mode を使えば、簡単に、整った HTML 文書を書くことができます。 HTML の知識はほとんど必要ありません。 (知識があれば、さらに高度なことをすることもできます。) Org-mode 自体の知識もほとんど必要ありせん。 Org-mode の記法の知識は多少必要ですが、 HTML を直接エディタで編集するよりはずっと楽です。 何せ、Org-mode 用のソースファイルは、それ自体をテキスト文書として他人に読んでもらうことができるくらいです。 (読み手が Emacs を使っていればなおさら。)

 

Org-mode による HTML 文書作成入門

 

EmacsのOrg-modeでGTDを実践しているCharles Cave 氏のサイトにある一連のOrg-modeの活用方法のうち、「How I use Emacs and Org-mode to implement GTDGTDを実践するためにどのようにEmacsとOrg-modeを使っているか)」を翻訳してみました。英語が得意なわけではないので、よくわからないところありますし、誤訳もあると思いますが、Org-modeの使い方がわかればと思います。

OrgMode/Org-modeでGTD実践(翻訳) - How I use Emacs and Org-mode to implement GTDの翻訳

 

どうして org-mode なのかというと、先日来読んでいるSchemeのチューターに「org-modeで作成されました」みたいなことが載っていてしかもきれいに整形されていたってのが大きい。きれいなhtmlが吐けると、Google-chromeのようなものでpdfを作ってもそれなりに印刷に使えることがわかって嬉しかった。これから、作成する文書もこういうツールで整形できると楽なんじゃないかなと。

 

 

AutoLISPの編集環境はEmacs

Emacsは無料で入手できる上に、マニュアルやカスタマイズの情報が豊富なのがいいんだけど、最初の一歩がものすごく敷居が高いせいでサンデーなというか平日はCADオペレータとして生活しているヒトには習得が難しいのかもしれない。

今日は久しぶりに仕事場の作業環境を整えようとして結局できなかった。自宅と同じ環境を構築しようとしたのだけれど、どこのサイトを参照していていたのかわからず、迷っているだけで何もできなかった。

で、帰宅してから確認したのは、init.dの中身とサイト。

http://qiita.com/catatsuy/items/5f1cd86e2522fd3384a0

結局ココのサイトの環境そのままだった。auto-complete してくれるし、色は勝手につくし、いい時代になったなあ。

 

auto complete mode

Auto Complete Mode(通称、auto-complete.el, auto-complete-mode)はGNU Emacs(以下Emacs)の補完システムを自動化・高度化する拡張です。従来の補完システムと比べて以下の点で優れています。

  • 視覚的な操作感
  • 統計的手法による補完オーバーヘッドの削減
  • 拡張性

本マニュアルはインストール方法から基本的な使い方・設定方法、また拡張方法までを網羅しています。不明な点があれば開発者まで連絡をください。

 

Auto Complete Modeユーザーマニュアル

AutoLISP の参考書・サイト

AutoLISP の参考書・サイト

Amazon.co.jp: すぐに使えて役に立つ!AutoLISP with Dialog: 中森 隆道: 本

AutoCAD ユーザ向け。AutoLISP初心者にわかるよう段階を踏んでAutoLISPを学べる。DCLに関しては和書では唯一の解説書。(2014時点ではDCLには手を付けていないので内容は不明、悪しからず)2012年6月発行

 

Amazon.co.jp: AutoLISPの初歩―AutoCADを使いこなすために: 岡島 正夫: 本

AutoCAD ユーザ、プログラミング経験者向け。LISP の解説から入る由緒正しき LISP の教科書。200ページ中60ページを費やし LISP の基本的な構造を解説するため、冒頭の60ページはプログラミングができない人には難読。ただし、わかってくると染みてくる。A5サイズで持ち歩きやすい。 2001年3月発行

 

AutoLISP入門講座 (OffshoreCAD & Management Inc.)

林 秀生氏によるAutoLISP実践講座。テキストエディタの選定や使い方からなので一見初心者向けかと思いきや簡潔な記述のため、初心者がついていくのは難しい。写経レベルは脱した人向け。バグ取りや開発方法、DCLの解説もある。

 

Gizmo Labs Wiki

AutoCAD と ICAD の開発に関するテキスト。その他のLISP関連の情報も(これが重要)。

 

□□autocad report□□     □□Lisp□□ ( 新Lisp作り方こーざ)

全くの初心者向け、プログラミング経験のないひと向け。とにかくプログラミングも AutoLISP もわからないけど手は動く人向けのチュートリアル。行きつ戻りつ、必要な機能を追加していく。

 

自分に最も合っていたサイトは  □□Lisp□□ ( 新Lisp作り方こーざ)だった。

何度か AutoLISP に接する機会はあったものの、獲得するまでには至らなかったのだがこのサイトのチューターで獲得することができた。期間は約3週間。最初は読めなかった演習用のLISPも何度か繰り返しているうちに読めるようになった。

チューターにある関数やコマンド等の説明は完全なではないので上記の解説書類は必要。コマンドの機能や変数の中身がどう変わっていくのかを考えることで、AutoLISPを理解できる。チュートリアルは初心者に必要な機能に絞られ、解説にはプログラミングの専門用語を使わないために、何気なく進めてしまう。ここが重要で書籍では諦めていたことが、このサイトのチュートリアルでは諦めることなく完遂できた。

AutoLISPのロード、バグ取り等は

AutoLISP講座【準備編-6】AutoLISPを作る、読ませる、直す、の手順 | 建築図面専門!オフショア・キャドCAD

を参考に。

 追記 20190314

Manual Chair Japan - Top page が見つかった。

GizmoLabs は更新している。