xyzzyのlispサイト上からファイルをダウンロードしてくる方法

投稿者: Anonymous xyzzy の lisp を使ってサイト上からファイルを取得したいのですが、サンプルなどが見つからず全くわからない状態です…。 site-lisp内をgrepを使いhttp://を検索しても見ましたがそれらしい所が見つかりませんでした。 どうやって xyzzy の lisp で HTTP上のファイルを開きファイルに保存すればよいでしょうか? 解決 xyzzy には標準ではそのようなライブラリはありません。 直接ネットワークに接続して応答をファイルに出力させるだけならば次のようなコードになります。ただし、HTTPヘッダを考慮していない等々使い勝手はよくありません。 (with-open-file (out “~/output.html” :direction :output :encoding :binary) (with-open-stream (stream (connect “www.yahoo.co.jp” 80)) (set-stream-encoding stream :binary) (format stream “GET / HTTP/1.0~%”) (format stream “~%”) (loop (multiple-value-bind (line missing-newline-p) (read-line stream nil) (unless line (return)) (princ line out) (unless missing-newline-p…(Continue Reading)

バッククオート記法について

投稿者: Anonymous (defmacro define-class (class inst-vars class-vars &body methods) (let ,class-vars (mapcar #’ensure-generic-fn ‘,(mapcar #’first methods)) (defun ,class ,inst-vars #'(lambda (message) (case message ,@(mapcar #’make-clause methods)))))) をccl で評価したところ Comma not inside backquote While executing: CCL::SIGNAL-READER-ERROR, in process listener(1) とおこられたのですが、どうしていけないのかわかりません。どなたかおしえてください 解決 バッククォートされた式の中でないと使えないということです。 つまり、 `(let ,class-vars … のようにする必要があります。 回答者: Anonymous

Common Lispのdefstructのスロットの:read-onlyオプションについて

投稿者: Anonymous defstructのスロットに:read-onlyオプションを付けますが、SBCL等ではスロットに書き込めてしまいます。 他の処理系では、セッターを定義しないことで書き込みをしにくくしているようですが、 なにかもっと良い方法はないのでしょうか。 (defstruct foo (x nil :read-only t) y z) (setf (foo-x (make-foo 😡 9)) 8) ;sbcl => 8 ;!> allegro: `(SETF FOO-X)’ is not fbound ;!> ecl: The function (SETF FOO-X) is undefined. ;!> clisp: FUNCALL: undefined function |(SETF COMMON-LISP-USER:FOO-X)| ;; ※ANSI CL仕様外 (setf (slot-value (make-foo 😡 9) ‘x) 8) ;=>…(Continue Reading)

おすすめのR7RS規格Scheme処理系は?

投稿者: Anonymous Schemeの最新仕様である R7RS の仕様が決まってから数年経過しますが、現在お勧めのR7RS処理系を教えてください。 その処理系の R7RS仕様準拠度 特長 を教えてもらえると参考になります。 解決 現時点で充分に R7RS の仕様を満たしていると私が認識しているのは以下の五つです。 Gauche Sagittarius Foment Chibi Picrin それぞれについて私の感想を述べます。 Gauche 人気のある処理系で、日本語のドキュメントがあるのがありがたいです。 スクリプト言語的な利用に便利な拡張も多く持っています。 作者自身が仕事に使っていることもあって、泥臭い現実的な用途にも使えるよう配慮しつつ、汚なくならないようにうまくバランスをとった実用的な処理系だと思います。 強いて言えばマクロ (syntax-rules) に既知のバグが最初からあるのですが、次か更にその次あたりのリリースではマクロ展開器を根本的に書き直す計画があるようですし、多くの場合は簡単に迂回できるので問題にならないでしょう。 それと、元々が R5RS に独自拡張を足した処理系だったので、後からサポートした R7RS としての部分と独自拡張の部分が少し統合しきれてないような印象を受けるのですが、実際の使い勝手を見ながら徐々に修正されるのではないでしょうか。 Sagittarius 元々は R6RS 処理系でしたが、後から R7RS もサポートするようになりました。 R7RS のプログラムから R6RS のライブラリを、またはその逆を利用可能というのが他にない大きな特徴です。 日常的に使いそうな便利なライブラリを多くもっており、作者自身が仕事上必要であることから暗号関係が充実している傾向にあるようです。 月に一度の定期リリース体制になっているので、たまにバグを見付けてもよほど難しい根本的なものでない限りは次のリリースに素早く修正が反映される安心感があります。 Foment 私が使った感触としては R7RS 準拠度が特に高いように思うのですが SRFI のサポートは少ししかなく、独自の拡張もほとんどありません。 実用しようと思うと物足りないことが多いかもしれません。 Chibi 事実上の参照実装という立場であることから R7RS 準拠度は高いと思います。 SRFI…(Continue Reading)

chicken schemeにおけるimport と useの違い。

投稿者: Anonymous 最近、scheme処理系の一つであるchicken schemeで遊んでいるのですが、 chickenではモジュールのロードの方法に大きく use と、importの二種類があるようです。 そこでお尋ねしたいのですが、use とimport の違いは何でしょうか。 また、どのように使い分けたらいいのでしょうか。 よろしくお願いいたします。 解決 importはモジュールのロードは行いません。既にロードもしくはリンクされているモジュールを、現在の名前空間から見えるようにするだけです。 http://wiki.call-cc.org/man/4/Modules#import useはモジュールを(必要なら)ロードした上でimportを行います。 http://wiki.call-cc.org/man/4/Non-standard%20macros%20and%20special%20forms#making-extra-libraries-and-extensions-available 回答者: Anonymous

Elispで変数を指定する際 ‘hoge と #’hoge の違いとは

投稿者: Anonymous (add-hook ‘hook-name ‘hoge)などで変数名がクオートのみのもの(’hoge)とシャープのついたもの(#’hoge)を見かけますが、違いは何でしょうか。 またこれはEmacs Lisp特有でしょうか。 解決 まず、クオートは、(quote hoge)の略記、シャープクォートは、 (function hoge) の略記になります。 この、’hoge (quote hoge) と #’hoge (function hoge) の違いはEmacs 特有ではありません。 最初期のLISPである、LISP 1.5 から連綿と受け継がれているものです。 詳しく書くととても長くなるので、大きく2つに分けて、乱暴に箇条書きにしてしまうと、 Quote vs Function スコープ篇 初期のLISP (1959年)で関数を引数にした場合意図しない動作となることが指摘される LISP 1.5では、上記に対応するため、functionとfunargを導入し、quoteと使い分けるが、本当に実現したかったものは、Schemeのようにレキシカルスコープを持つ方式だった Common Lispや最近のEmacs 24ではレキシカルスコープが利用できるようになった 等々ですが、Common Lispと最近のEmacs Lispでは、quoteとfunctionは、レキシカルスコープで書かれた場合に違いがでてきます。 具体的には、 クロージャーを作る(quoteだと作れない) ローカル関数等を作る ですが、Emacs Lispにはローカル関数がありませんので、前者の違いのみだと思います。 Quote vs Function 束縛アクセスの戦略篇 なぜEmacs Lispでquoteやfunctionが殆ど同じような動作になってしまったかというと、Emacs Lispの先祖のMACLISPがクロージャーのようなものは重視せず、処理系の速度向上を図ったためです。 当時の実用的なプログラミングスタイルでは、クロージャーが多用されることは考えられておらず、そこをきちんと処理して遅くなるよりは、別の部分の速度や効率を向上させよう、という選択です。 MACLISPを先祖に持つCommon Lispではレキシカルスコープが採用されたため、クロージャーもサポートされることになるのですが、Schemeとは違い、付け足した感じは否めません。…(Continue Reading)

Common Lispで、#.を使って値の埋め込みをしたい

投稿者: Anonymous SBCLでライブラリを作っています。 原始的な例ですが、test.lispの中に (defparameter default-data #.(let ((size 10)) (make-array size :initial-contents (alexandria:iota size)))) のように書くと、コンパイルする時――例えば(asdf:load-system :test-system)を実行したとき――に#.以降の部分を評価して、faslファイルには結果のarrayのみを埋め込んでくれる、つまり、test.faslをライブラリとしてロードする際にいちいち再計算されない、という理解をしています。 これを活用したいのですが、次の似た例ではうまくいきません。 (defun test-func (size) (make-array size :initial-contents (alexandria:iota size))) (defparameter default-data #.(test-func 10)) ; caught ERROR: ; READ error during COMPILE-FILE: ; ; The function TEST-SYSTEM::TEST-FUNC is undefined. こうなるのは、コンパイル時には(defun test-func …)がまだ評価されていないからだ、という理解でいます。しかし、実際にこういう問題をどう解決すればいいのかわかりません。 上の例ではtest-funcを(eval-when (:compile-toplevel :load-toplevel :execute) …)で括れば解決するようですが、自分のコードではtest-funcがまた別のライブラリ内の関数を呼び……という構造になっています。それらの定義もすべてeval-whenで括ると、1/3くらいはeval-whenで括り、残りはいらない……というような見た目になります。それだったら、eval-whenが必要な関数や変数を、最初にほうにまとめて括り、残りはいらない、という風にすべきかも……でも、ライブラリ内の種々のルーチンのまとまり、つながりから考えるに、それとは別の順番にしたほうがずっとわかりやすい……いっそのこと、全部の定義をまとめてeval-whenで括る手もあるけれど、それはそれで不要な処理をしている気がするし……という風に悩んでいます。 こういったことに、もっとスマートな解決策はあるでしょうか? それとも、すべては解決できないので、上で考えた選択肢のどれかを取るしかないでしょうか? 追記 g000001さんの…(Continue Reading)

let 束縛の括弧を忘れてつい (let (x 1) e) と書いてしまいます。静的なチェッカはありませんか?

投稿者: Anonymous たまに Emacs Lisp を書くのですが、一つだけの束縛を持つ let 式で、 (let ((x 1)) x) と書くべきところをつい (let (x 1) x) と書いてしまい、実行時エラーで苦しんでいます。もちろんデバッガを使えばわかることなのですが、実際にコードを走らせて見る前にこのような間違いを見つける方法はないでしょうか。たとえば、このような怪しい束縛はハイライトしてくれるととても助かります。( (let (x) x) で x が nil になることは理解しています… ) 解決 elintの他にバイトコンパイルする手段があります. (let (x 1) x) というファイルをバイトコンパイルすると, 以下のようにエラーが出ます. Compiling file /home/syohei/junk/elisp/test2.el at Tue Dec 16 15:41:42 2014 test2.el:1:1:Error: Wrong type argument: listp, 1 また lexical-bindingsを有効にすると ;;; some-package.el —…(Continue Reading)

evalの妥当な使いどころ

投稿者: Anonymous evalは強力過ぎるのでできるだけ使うな、とは良くいわれることですが、では、妥当な使いどころはどういう場合でしょうか。 私が思い付く限りでは、quoteの逆操作としてevalを利用するのは妥当かなと思います。 (eval ”foo) → foo リスト操作でも可能ではありますが、 (cadr ”foo) → foo はちょっと気持ち悪いですし、妥当かなと。 他には、どういった例があるでしょうか。 解決 簡易的な言語処理系の実行器としての用途に使えるということを考えたことはありますね。 パース結果をS式として組み立てて、 (ちょっと複雑な言語なら間に意味解析なども狭んで) 適当な名前空間で eval すればそのまま言語処理系になります。 外部からの入力を eval するのはセキュリティ上の問題になりやすいとは言われていますが、パース (と場合によっては意味解析) の段階で正当性を検証済みならば問題になりませんし、有用な使い方だと思います。 回答者: Anonymous

sbcl,slime上でlispbuilder-examplesのタイトルバーが正しく表示されない

投稿者: Anonymous OSX10.10です。 SBCL1.2.10 lispbuilder-sdl quicklispでlispbuilder導入後、sbcl、slime上で (sb-int:with-float-traps-masked (:invalid) (sdl-examples:particles)) を実行するとタイトルバーが真っ白で正しく表示されません。 画面描画は正しくされているのですがマウスやキーボードでの操作は受け付けませんでした。 ターミナル上でサンプルを実行すると問題なく動作します。 しかしターミナルでも似た動作を発生する時があり (sb-int:with-float-traps-masked (:invalid) (sdl-examples:particles)) では正しく動くのですが (sdl-examples:particles) と実行するとFLOATING-POINT-INEXACTが発生、ABORTして そのまま (sb-int:with-float-traps-masked (:invalid) (sdl-examples:particles)) を実行するとタイトルバーは銀色なのですがボタンとタイトルが表示されません。 何か解決方法があればご教授頂ければとお願いいたします。 解決 https://code.google.com/p/lispbuilder/wiki/DownloadInstallation の下の方にコメントがあり、どうも ~/.swank.lisp に (setf swank:*communication-style* :fd-handler) と書いておくとよいようです。 こちらの環境は以下の通りです: SBCL: sbcl @1.2.10_0+fancy (macportsでインストール) Emacs: emacs-mac-app @5.4_0 (macportsでインストール) SLIME: 2.13 (quicklispでインストール) OS: MacOS X 10.9.5 ;; https://stackoverflow.com/questions/18345464/cl-opengl-under-slime-on-macos-crashing-sbcl-bug が関連しそうな気がします(私はあまり追っていませんが)。 回答者: Anonymous

`[]`という括弧の役割とその挙動がよくわからない

投稿者: Anonymous 普段、Lisp処理系としてRacketを利用することが多く、見よう見まねでスクリプトを書いています。その中で、Racketでは[]という括弧を利用することが多々あります。具体的にはletとcondの中で使われますが、この括弧の挙動が漠然としていて、自分の中でモヤモヤしてしまいます。 具体的なコードを挙げると、下のようになります: #lang racket (define (plus-one x) (let ([plus-one-x (+ x 1)]) plus-one-x)) (define (fizzbuzz x) (cond [(= (modulo x 15) 0) “FizzBuzz”] [(= (modulo x 3) 0) “Fizz”] [(= (modulo x 5) 0) “Buzz”] [else x])) 具体的にDocumentも読んでみたのですが、自分の読解力だと、どのような挙動をするものなのか、いまいちピンと来ません。 この[]の挙動について、具体的にどのような役割と、挙動をするものなのでしょうか? 解決 SchemeのR6RSでは、()と[]は同様に利用できるため、まとまりを強調したりするのに使えます。 使い分けについて: * Use of square brackets: http://www.r6rs.org/final/html/r6rs-app/r6rs-app-Z-H-5.html#node_chap_C * Gauche ユーザーリファレンス: http://practical-scheme.net/gauche/man/gauche-refj_22.html Racketは、R6RSをベースにしたScheme方言という形で枝分かれしましたが、独自拡張で、{}も使えるのだと思います。…(Continue Reading)