LISP Scheme Part7

このエントリーをはてなブックマークに追加
1デフォルトの名無しさん
2デフォルトの名無しさん:03/01/10 11:55
□参考リンク□

日本Lispユーザ会(日本語)
http://jp.franz.com/jlug/index.html
ここにかなりの情報があります。
http://jp.franz.com/
削るとAllegro Common Lispのページへ

プログラミング言語Scheme(日本語)
ttp://www.sci.toyama-u.ac.jp/~iwao/Scheme/scheme.html
Schemeの人はまずここを見ましょう。

Lisper への道(日本語)
ttp://www.geocities.co.jp/SiliconValley-Oakland/1680/rakup.html
判りやすいLISP入門サイト。

Schemeへの道(日本語)
ttp://www.stdio.h.kyoto-u.ac.jp/~hioki/gairon-enshuu/SchemeNotes/scheme.html
ここはschemeの入門サイト。

3デフォルトの名無しさん:03/01/10 11:55
慶応の授業のページ・記号処理プログラミング 2001
http://buri.sfc.keio.ac.jp/lisp/menu.html

Practical Scheme(日本語)
ttp://www.shiro.dreamhost.com/scheme/index-j.html
「普通のやつらの上を行け」など、興味深い文書を沢山翻訳されてます。
(Gaucheという完成度の高いscheme処理系作者さんのページでもあります。)

Scheme Hash(英語)
http://okmij.org/ftp/Scheme/index.html
S式でXMLを使える様にするSXMLなど

John McCarthy's Home Page
http://www-formal.stanford.edu/jmc/
LISPの生みの親、J・マッカーシーのページだそうです。

お隣りのプログラマ板のLISPスレのログです。(dat落ち)
http://mentai.2ch.net/prog/kako/963/963134110.html
4デフォルトの名無しさん:03/01/10 11:55
□仕様書関係□

Common Lisp the Language, 2nd Edition(英語)
http://www.cs.cmu.edu/afs/cs.cmu.edu/project/ai-repository/ai/html/cltl/cltl2.html
CommonLispの仕様書です。

アルゴリズム言語Schemeに関する第五改訂報告書 R5RS(日本語)
http://www.sci.toyama-u.ac.jp/~iwao/Scheme/r5rsj/html/r5rsj_toc.html
http://www.biwa.ne.jp/~mmura/scheme/tspl.html#r5rs
日本語訳はここ以外にもあるそうです。

Scheme Requests for Implementation SRFI (英語)
http://srfi.schemers.org/

Scheme Frequently Asked Questions (英語)
http://www.schemers.org/Documents/FAQ/
5デフォルトの名無しさん:03/01/10 11:55
□SICP関係□

SICP(英語)
http://mitpress.mit.edu/sicp/full-text/book/book.html
「計算機プログラムの構造と解釈」の原書です。
全てオンラインで読めます。

計算機プログラムの構造と解釈 第二版 (snip) に関連するホームページ
http://www.ipl.t.u-tokyo.ac.jp/sicp/

SICPの回答集
http://www.melt.kyutech.ac.jp/~gogogo/sicp_ex/
http://pluto.aurorasd.co.jp/~mkama/sicp/
http://www.ipl.t.u-tokyo.ac.jp/sicp/solution.root.html
http://www.sampou.org/scheme/sicp/answer/
6デフォルトの名無しさん:03/01/10 11:56
□その他□

Schemeで書かれた正規表現ライブラリ
ttp://www.cs.rice.edu/~dorai/pregexp/pregexp.html

幻の「入門Scheme」
ttp://www4.ocn.ne.jp/~inukai/scheme_primer_j.html
オンラインで読める

各種scheme処理系をcygwin上からビルドする方法など。
ttp://www.geocities.co.jp/SiliconValley-PaloAlto/7043/

Bit - Implantation compacte de Scheme
http://www.iro.umontreal.ca/~dube/
mini-schemeよりも小さい(?)bytecode変換系

Lisp 言語処理系: CAMPUS LIsP, Lemon version
http://aten.aial.hiroshima-u.ac.jp/~kakugawa/clisp/index-ja.shtml
Cコードによるわずか1000行の実装

7デフォルトの名無しさん:03/01/10 11:56
Scheme 処理系に追加( Scheme 処理系を自作したい人向け)。

Minischeme: 1 ファイルに凝縮された Scheme 処理系
http://tinyscheme.sourceforge.net/minischeme.tar.gz

TinyScheme: Minischeme の発展版
http://tinyscheme.sourceforge.net/

KI-Scheme, AM-Scheme, etc...
http://www.nifty.com/download/dos/prog/lisp/

LispMe: Palm 上で動く Scheme 処理系
http://www.lispme.de/lispme/

>>1
乙カレ〜。

Bibliography of Scheme-related Research
http://library.readscheme.org/
Scheme関連の論文リンク集
スレ立て乙>>1
"ANSI Common Lisp" 買ったsage。
>>14
漏れも買った。でも読んでない…。
わたしは買ってない…。でも読んだ。
ANSI Common Lisp買った!
(display '関係無い話は余所でやってください)
ANSI Common Lisp いいでつね。
やっとcons.orgが復活したみたい。
18LISPスレ住人その1:03/01/12 21:17
とりあえず一連の意味不明レスを削除依頼してこようか?(このレスを含め)
判別できるのは、
>>10-13
>>16-20
>>22-27
>>30-32
>>34-37
>>39-41
これでok?
19LISPスレ住人その1:03/01/12 21:26
レス削除依頼完了。
最近人いないなあ・・・
大抵の Linux ディストリビューションには usb-scheme っていう scheme 処理系が
入ってるみたいなんだけど、これの歴史的な理由を御存じの方います? 何か MLD に
も入ってるみたいでびびった。
21山崎渉:03/01/13 18:29
(^^)
22デフォルトの名無しさん:03/01/13 19:09
http://www.javaopen.org/jfriends/sicp.html

こんなのがあるんだね
既出?
それ翻訳者の和田先生が来るらしいね。
一度いってみたいなあと思ってます。
その時はよろしこ(藁
ふぁーすと
せかんど
さーど
ふぉんど
ふぁいぶんど
>>47
資料を見てみると、だいぶしまいの方まで来てるぞ。
行く前に終わってるんじゃないか。(W
姉妹?終い?
たしかに漏れは終わっている部類の人間だが、
そんなことは関係なし。先生に会いに行くのだ(藁
もう来た回は終わってるのでは?
なるほど、そういうことね。失礼しました。
cl.el使えばEmacs LispもCommon Lispにレベルアップですか?
30デフォルトの名無しさん:03/01/15 12:39
>>22
申し込んだけどまだ2章。だめぽ.....。
31山崎渉:03/01/15 17:46
(^^)
33デフォルトの名無しさん:03/01/16 16:09
質問です。
内部エンコーディングがEUC-JPのGaucheを使って、Shift-jisコードを
16進数で表示しようとしています。

(char->integer #\あ)とすることによって、内部エンコーディングを
10進数で表示できました。しかし、Shift-JISの表示は分かりませんでし
た。

(char->integer (ces-convert #\あ "EUCJP" "SHIFTJIS"))では、String
がchar->integerに渡されるためにNGでした。

御面倒ですが、アドバイスをお願いします。
34デフォルトの名無しさん:03/01/16 17:09
gaucheの「文字オブジェクト」は内部エンコーディングに固定なので
char->integerは使えない。
変換後の文字列を1バイトづつ取り出すしかないのでは。

(let ((sjis (ces-convert "あ" "eucjp" "shift_jis")))
(fold (lambda (index num)
(+ (* num 256) (string-byte-ref sjis index)))
0
(iota (string-size sjis))))


>>32
LISPのLIの字も出てこんなあ。けしからん。
お叱りの言葉と「 不充分・不完全である」
にチェック入れてフィードバックすた。
>>32 世間はそこまでして Lisp をそらすのか…。> → ) にならんもんですかね?
(xsl:template priceSum (productList)
 (xsl:choose
  (xsl:when productList
   (xsl:variable (recursive_result)
    (xsl:call-template priceSum
     (xsl:with-param (productList (cdr productList)))))
   (xsl:value-of (+ (number (substring-after (/ $productList[1] Price) '$'))
            $recursive_result))
  (xsl:otherwise (xsl:value-of 0))))
何か1つくらい関数型言語の例を挙げてくれてもよかろうに。
39デフォルトの名無しさん:03/01/17 11:14
>>34
具体的にコードまで教えていただきありがとうございしました。
理解できました。
XSLってquoteの概念ってあるの?
どうも$つけて変数ってしてるみたいだから
必要ないんじゃないだろうか。
42C++厨:03/01/19 15:13
MIT MIT MIT〜〜( ゚∀゚ )
43デフォルトの名無しさん:03/01/20 20:11
cmucl の News に
>2003-01-10
>Antonio Leitao has posted the code of an Emacs-based debugger and inspector
> for CMUCL, that is based on ILISP. See the cmucl-imp mailing list for the source code.
とあるのですが gmane.org 経由でのぞいても Antonio タンの記事が見つからないんです。
うわぁぁん、使ってみたいよ〜。cmucl-imp 購読者な神よ、ウプキボンヌ!
44山崎渉:03/01/23 20:07
(^^)
年末辺りからカキコ少ないなあ。
lisperは普段どこ行ってるの?
46デフォルトの名無しさん:03/01/26 21:36
「知の限界」 G.J.チャイティン 著 黒川利明 訳

これ、面白い。
47デフォルトの名無しさん:03/01/27 04:23
"ANSI Common Lisp" の8章の練習問題で、
「123ページのdefpackageの呼び出しでは、引数にはストリングしか使わなかっ
た。シンボルを使うこともできたのだが、これは危険なことがある。なぜか。」
というのがありますが、具体的にどうまずいのか思いつきません。
御存じの方いらっしゃいましたら御教示下さい。

123ページの…というのは
(defpackage "MY-APPLICATION"
(:use "COMMON-LISP" "MY-UTILITIES")
(:nicknames "APP")
(:export "WIN" "LOSE" "DRAW"))
という一般的な例です。
48デフォルトの名無しさん:03/01/27 11:11
>>47
引数がシンボルだと、defpackage形式を読み込むパッケージによっては
意図しているのと違うパッケージのシンボルを指してしまうことが
あるからかなあ。
パッケージ違いによるバグは結構はまる。プログラムコードをいくら
睨んでもわからないから。
49デフォルトの名無しさん:03/01/27 17:31
おぉ、47 ではないですがためになります。ちょっと疑問に思ったんですが
シンボルじゃなくてキーワードを使うのはどうなんでしょう?
(defpackage :mypackage (:use ...))
みたいな。文字列だと *readtable* を考慮するのが面倒なんですが…。
皆 :UPPERCASE なんで気にしなくていいんですかね?
>>49
キーワードもシンボルなのだが、それはそれとして、
キーワードを使用するのは極めて一般的です。
5147:03/01/28 03:19
>>48
なんかそういうことが起こりそうだなあという気はするのですが、
今日は色々試していたのですが残念ながら中々そういう事態をうま
く作りだせませんでした。
お心あたりがありましたら、例を頂けると有難いです。

それとは別に、試行錯誤しているうちに一つ発見したのは、
読み込む側のシンボルテーブルを汚染してシンボルを作ってしまう
ために、useしようとしたパッケージがたまたま重なった名前を
exportしていると、シンボルが衝突してしまうということですね。


52デフォルトの名無しさん:03/01/28 23:36
正直 AI に興味ないのだが、Lisp を読みたくて
Paradigms of Artifical Intelligence Programming
を買ちゃった age
5347:03/01/29 02:27
"ANSI Common Lisp" 読み終えたので記念にあげます。
あー面白かった。

ちょっと悔しいのが、型宣言をうまく使えなかったことで、高速化
を扱った9章の練習問題にて(例に出てきた)レイトレーサのプログ
ラムに型宣言を追加せよ、というのがあったのですが、これに型宣
言を追加するとかえって遅くなってしまいました。その前のCLOSの
章の練習問題にてdefstructをクラスにしたものをベースに、あち
こちにsingle-floatの宣言を入れてついでに多く使われてるものは
inlineも指定したんですが、型宣言を入れる前には追い付けずじまい。
どうするのがいいのやら。
5447:03/01/29 02:28
ああしまった、あげてなかったので今度こそあげます。すまそ。
55 :03/02/01 16:25
clispのソースを読もうと思いましたが挫折しますた。

_clips.cのexecvでlisp.runを起動させて
lisp.run側で処理をするんだとは思うのですが、
このlisp.runのソースはどれなんでしょうか?

clisp/src/spvw.dがソースかとも思ったんですが、
cのコードっぽいけどなんかcのソースファイルじゃないし・・・
56デフォルトの名無しさん:03/02/04 20:34
なにかいいことない?
>>56 何か英語のリファレンスとかソフトを日本語に訳して自分でいいこと提供してみるとか。
>>57
英語のSICP読むの諦めて
図書館で日本語訳借りてきた俺にはだめぽ
60拒食症:03/02/08 22:48
SICPを読んでいます。はじめて作りました。どうでしょうか・・・。
(define square
  (lambda (x)
    (* x x)))

(define make-prime
  (lambda (upper)
    (let ((ls (list 2 3)))
      (let f ((x 5))
        (if (> x upper)
            ls
            (let g ((_ls ls))
              (cond
               ((zero? (modulo x (car _ls)))
                (f (+ x 2)))
               ((> (square (car _ls)) x)
                (set! ls (append ls (list x)))
                (f (+ x 2)))
               (else
                (g (cdr _ls))))))))))
61拒食症:03/02/08 22:53
間違ってsageちゃいました。
どうでしょうか、って何が?
63 :03/02/10 00:36
いまから libguile であそびます。
http://nis-www.lanl.gov/~rosalia/mydocs/learn_libguile_toc.html
http://nis-www.lanl.gov/~rosalia/mydocs/learn_libguile.ps
おまえらも遊びませんか?
64 :03/02/10 01:44
がーん、なんか >>63 のは古いドキュメントだった。
http://www.cs.utexas.edu/users/bdbryant/guile-for-ada/guile-tut_toc.html
見て遊んできます。
65デフォルトの名無しさん:03/02/12 15:44
ANSI Common Lisp
http://www.amazon.co.jp/exec/obidos/ASIN/4894714337/250-8225561-7907410
の練習問題のP51の5(c)のmapcarを使う場合のpos+の定義方法がよく分かりません

pos+の引数のリストから(0 1 2 3)のようなリストを作成した後にmapcarする
(mapcar #'+ lst (make-pos-lst lst)) ;;make-pos-lstは(0 1 2 3)のような
                    ;;リストを作成する

のような考え方でよいのでしょうか
66 :03/02/12 20:54
>>65
漏れならこう書くが、合ってるかどうかは知らん。
ANSI Common Lisp持ってないし。

(defun pos+ (l)
 (let ((n -1))
  (mapcar #'(lambda (x) (+ x (incf n))) l)))
>>65
私もちょうど同じところでひっかかりました。

それと、P.51の3問目、要求仕様を満たすものはできるのですが、
どうもダサいものしかできません。恥を忍んでさらしますので、ど
なたかもっと美しい答えを貼ってもらえんでしょうか。

(defun occurrences (lst)
(let (result)
(dolist (item lst)
(setq result (occurrences-sub item result)))
(sort result #'> :key #'cdr)))

(defun occurrences-sub (item result)
(let ((pair (assoc item result)))
(cond (pair (setf (cdr pair) (1+ (cdr pair)))
result)
(t (cons (cons item 1) result)))))

どこかに練習問題の模範回答はないんかな?
私のはこう。

>>65
(defun pos+ (lst)
(let ((n -1))
(mapcar #'(lambda (x)
(setf n (+ n 1))
(+ n x))
lst))))

>>67
(defun occurrences-help (count lst)
(let* ((elem (car lst))
(a (assq elem count)))
(cond
((null lst) (sort count #'(lambda (a b) (> (cdr a) (cdr b)))))
(a (setf (cdr a) (+ (cdr a) 1))
(occurrences-help count (cdr lst)))
(t (occurrences-help (cons (cons elem 1) count) (cdr lst))))))

(defun occurrences (lst)
(occurrances-help '() lst))
69 :03/02/13 05:15
lisp は Emacs Lisp を使っている程度です。
最近卒論でちょっとしたシミュレータを作っていまして、
そのシミュレーションシナリオの記述言語として lisp を採用してみたいと思っています。
一般的に C/C++ に lisp インタープリタとしての機能を付け加えたいとき、
なにかおすすめのライブラリなどはありますでしょうか?

Scheme でも OK なのですが、 libguile はちょっと敷居が高いと感じていまして。
70 :03/02/13 05:23
http://www.shiro.dreamhost.com/scheme/gauche/devinfo-j.html
をみると Gauche にも予定では
by version 0.9.0
Revise C API. More extensions. C API documentation.
となっていたり、
http://www.shiro.dreamhost.com/scheme/gauche/man/gauche-refe_1.html#SEC1
を見ると

This manual only deals with Scheme side of things.
Gauche has another face, a C interface. Details of it will be discussed
in a separate document to be written.
Those who wants to use Gauche as an embedded language,
or wants to write an extension, need that volume.

だったりします。
7167:03/02/13 10:20
>>68 THNX
>>69
他の動的な言語もそうだけど、LISPにはGCの存在があるので、
Cとかに組みこむ時にはちょっと気をつけないといけない事がある。
C側で参照しているLISPオブジェクトがあり、その上でLISP側の
処理が走りGCが起動すると、LISP側で参照されていない(GCが
把握していない)オブジェクトはゴミとして回収されてしまう。
このとき、C側(親)で参照していたオブジェクトは、何も対策を作って
ないと、いつのまにか無効な物になっていたりして、なかなか取れない
バグの原因になる。
例として、EmacsLisp向けのCによるコードを書く時は、LISP側の処理
を起動させる直前に外部(C側)で使用しているLISPオブジェクトへの
参照を全てGCに把握させるコードを埋め込む必要がある。
この辺はかなり注意深く書かないと容易に不具合を引き起こす。

しかし、この問題は保守的な(conservative)GCを採用すればほぼ
解決する。保守的なGCはCで使用されるスタックをすべてGCが管理
すべきオブジェクトのポインタとみなし、アドレスがGC側でアロケート
した領域であれば自動でそれを保護してくれる。ただし見なすという
性質上、回収漏れが起きたりする。これはスタックが深くならない限り
はそれほど問題にはならない。
きちんと管理したくない場合は、保守的なGCを採用したLISP
を使うのがいいと思う。
(ちなみにlibguileはたしか保守的GCを使ってない。)
gaucheは下のBoehmの保守GCを改造して使ってたと思う。

有名な保守的GC
http://www.hpl.hp.com/personal/Hans_Boehm/gc/
7365:03/02/13 11:06
>>66,68
どうもありがとうございます
そうかlambdaを使えばnをインクリメントさせて加算できるのか・・・

>>67
私はそれ作るのに50行以上かかりました(鬱
74 :03/02/13 11:09
>>72
詳しいレスありがとうございます。
GC 周りでは気をつけなければならないことが多そうですね。
注意深くやりたいと思います。

もう少し借用させて頂けそうな lisp / scheme の実装を
探してみたいと思います。

問題の本質とは関係ありませんが、
お偉方は Windows しか使えないので最終的には Win32 な
バイナリを吐く必要があるのも、困難な点の一つです。
Gauche / Guile は cygwin 環境下で動いているようです。
さすがに Native Win32 環境下では難しそうですね。

自分のマシンは Linux (Debian GNU/Linux 3.0r1) と IBM AIX 5L です。
AIX は借り物ですけど。
7572:03/02/13 12:15
あ、libguileもconservativeだった。スマソ
>>69
libguile か librep がいいんじゃない。
この2つははじめから組み込みを意識して作られていますから。
C への組み込み方法がドキュメントに載ってるよ。
7772ではないです:03/02/14 17:36
librepって速度的にはどうですか。
昔のGuileは激遅だったので。
78デフォルトの名無しさん:03/02/15 03:40
Guileって速度面でいい評判聞かないね
79デフォルトの名無しさん:03/02/15 11:39
GuileはSCMをベースにしてるのにSCMより遅い。発展途上だからね。
組み込みならSIODも軽くていいかもね。
>79
GuileとSCMは枝分かれしたのがずいぶん前だからね。
一本化ってできなかったのかなー
うーむ、保守しとくか。
Unix板のスレは活気があるのにね、なんでだろ。
    ∧ ╋   / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄
    / †|. ┃ < 我が偉大なる神 Emacsに祈りを捧げよ
   |`ー┐λ  \_____________
    |::.ヽ丿.┃
    |::.  |.| ┃
   ノ::::...ノ | ┃
 ̄` ̄ ̄ ̄´ ̄ ̄
84デフォルトの名無しさん:03/02/23 20:59
>>60
再帰使ったほうがLispっぽいと思う。
(define (square x) (* x x))

(define (prime? x ls)
(cond ((null? ls) #t)
((zero? (modulo x (car ls))) #f)
((> (square (car ls)) x) #t)
(else (prime? x (cdr ls)))))

(define (add-prime x ls)
(if (prime? x ls) (append ls (list x))
ls)))

(define (make-prime upper)
(if (< upper 2) '()
(add-prime upper (make-prime (- upper 1)))))
>>82
だからじゃないか?
「計算機プログラムの構造と解釈 」
この本に関して質問です。
原書と翻訳版とでページ数がかなり異なりますが、何か理由があるのでしょうか?
(どこかのしょうが削られているとか、、、)

それと、日本語訳はうわさどおり、読みにくいものなのでしょうか?
たいてい翻訳の方が分量が多くなるんだけど、
SICP第2版は翻訳版の方が紙がだいぶ大きい。
(版形っていうんだっけ?)
88デフォルトの名無しさん:03/02/26 20:22
【何処も】情報科学総合スッドレ【板違い】
http://science.2ch.net/test/read.cgi/rikei/1046173479/l50
gauche で書かれた mail filter の scmail のソースの中に

(if (eq? status :next)
  (process-rule config mail field-name
         (cdr patterns) command param)
  :last))))

のように :next とか :last とかあるんですがこれって何か意味があるんでしょ
うか? ソースや info 見ても手掛かりを見つけられなかったのですが。。。
infoの"Keywords"の節を参照。
>>90
単純に symbol として使っているみたいですね。if 文が keyword 引数を取っ
ているのかと勘違いしてました。
92デフォルトの名無しさん:03/02/27 13:38
ピアソンから出てるANSI Common Lisp (ポール・グレアム著)の問題の答え教えれ
自分で考えた末にまだ悩んだものならここで相談すればよかろう。
95デフォルトの名無しさん:03/03/01 00:31
どの方言/実装を使うのがいいの?
できるだけWeb上に情報が多い奴がいいんだけど
1) Scheme
2) Emacs
3) Common Lisp
>95
quoteやlambda辺りがちゃんとしてれば、何でもいい気がする。
結局は何からスタートしても、大抵のソースは慣れで読める様になるし。
CommonLispまんせ〜
>>95 フリーな実装なら、
Scheme: Gauche
Common Lisp: CLISP, CMU Common Lisp
あたりか? emacs + ilisp と組み合わせて使うのがお勧めだ。
金出す気があるなら、黙って Allegro Common Lisp を買え。
Allegroは、すご〜くいいのだけど、値段もすご〜いのだぁ
Personal版とか作って欲しい
101デフォルトの名無しさん:03/03/01 15:09
↓↓↓↓↓★ココだ★↓↓↓↓↓
http://www.pink-angel.jp/betu/linkvp/linkvp.html
肛門Lispは?
Cormanは日本語通らず。
意表をついて、こんなのとか。scheme の亜流といっていいのか?
標準でTCP/IP や Tk へのインターフェース、正規表現有り。
Windows/UNIX で動く移植性の高さ!
http://www.newlisp.org/
>104
schemeの末尾再帰最適化やcontinueationは無いみたいね。
#'も無いから、schemeっぽく書けるLISPという感じ?
ソースをちょろっと見た感じでは、
インタプリタ駆動で、コンパイラの類は正規表現の変換を除いて無し、
外部モジュールに頼る都合かcase sensitive、真偽値はtrue/nil、
eq系述語が無い(=で代用)とか、色々特殊っぽい。
CLISP思ったより遅い。コンパイルしても遅い。
107デフォルトの名無しさん:03/03/02 21:18
WIN98で動くフリーの日本語のlispってありますか?
>107
emacsやxyzzyとか。
エディタ付きだし、
下手に他の処理系探すよりお勧め。
>>107 xyzzy (セクシーじじぃ) のこと?
110デフォルトの名無しさん:03/03/02 23:09
>108
ありがとうございます♪今落としてきました。
とても使いやすくていい感じです♪
さぁ、俺lisper目指すぞ
くさいじじぃ
112デフォルトの名無しさん:03/03/03 02:34
xyzzyのLISPのキーワードって色つける方法ってないの?
調べても出てこないよ・・・
113デフォルトの名無しさん:03/03/03 08:45
114デフォルトの名無しさん:03/03/03 09:07
115デフォルトの名無しさん:03/03/03 18:17
>113
をを、サンクスです。もうすこし修行してみます。
>104のnewlispって、pcreを組み込んじゃってるけど、
pcre.dll(や.so)を使うわけにはいかなかったのかねえ。
まあ使い方わからんけども。
117デフォルトの名無しさん:03/03/03 19:58
最近見つけたLispScheme情報.既出だたらゴメン

Show's Hot Corner
http://www.asahi-net.or.jp/~ki4s-nkmr/#wabijo
中村正三郎さんのページ.LISPの昔話がでてますね.

ChezEdit-NT
http://www5a.biglobe.ne.jp/~sasagawa/MLEdit/Scheme/index.html
Petit Chez SchemeのWindows用グラフィカルフロントエンドだそうです.
ドネーション(寄付)ウェアなのね…なぜMLEditの下にディレクトリが?
禿げしくガイシュツ
xyzzyのlispソースってバイトコードにする方法ってあります?

>>119
byte-compile-file
ってこれくらい調べりゃ簡単にわかるだろが。
問題なんて勝手に解釈して解けばいいとも思いますが...

ANSI Common Lisp の 5 章の問題 4 「svref の代わりに case を使え.」
case でどうやってベクタを読むの?
>>121
テーブルルックアップをcase文のハードコーディングで置き換えろってことだろ。
123 :03/03/05 18:22
急にLISPがつかえる電卓がほしくなった〜〜〜〜

以下の仕様でどこか作ってくれ

1:ANSI Common lisp 対応
2:HotSyncでPCからマクロや関数を自動追加可能
3:3万以下

(・∀・)イイ!
入力が禿げしくめんどうだと思われる
125123:03/03/05 19:06
関数電卓でのsin,cosみたいに特定のボタンを押すと
入力補助をしてくれる機能があれば(・∀・)イイ!

もちろんボタンと文字列の組み合わせは
(setf f10 "(hogehoge ")

のように外部から変更可にすれば(゚д゚) ウマー
lispなOSを載せたPDAみたい
電卓って、ハードの電卓か。
LISPのポケコンは昔あった気がするけど、今更な機能なんだろうね。
PDA向けの処理系探してきて、カスタマイズするしかない。
128121:03/03/05 20:47
>>122 どうもありがとう.そこも変えるやり方しかないんですね.

;; ほかにも,4 章の問題 1 で array-dimensions を自分で設計するのかと勘違いし,
;; aref だけでベクタの大きさを知る方法があるのかと悩んでしまいました.

ところで,
* どうして scheme の map は Common Lisp の mapcar のように
要素を取り出す順番を保証しないのでしょうか.
わざと不便なことをしているのでしょうか.
これでは高尚な「写像」中に汚い破壊的操作ができません.
* Common Lisp では末尾再帰を必ず最適化するわけではないそうですが,
せっかくできる最適化をしない処理系なんてあるのですか?
129123:03/03/05 21:35
なんか欲しいぞ>>LISPなポケコン

>PDA向けの処理系探してきて、カスタマイズするしかない。
向けのLISPってあったっけ?探してみよう。
130123:03/03/05 21:39
Palm向けね

#p2で書き込むと時々文字が抜けちゃうなぁ
>128
>* どうして scheme の map〜保証しないのでしょうか.

これはC言語等でも起こりうる問題です。
単純な話、mapで適用されるリストの評価順序が
schemeの仕様で規定されていない為です。

例えば下の様なmapの実装だと、
(define (map1 proc x)
 (let loop ((l x))
  (if (pair? l)
   (cons (proc (car l)) (loop (cdr l)))
   '())))

consの両辺の引数の評価順序は仕様では規定されてないので、
どっちが先に評価されるかは、完全に処理系に依存します。
この実装でもschemeのmapの仕様は満たしています。
破壊操作を前提とするなら、専用のmapを作るか持ってくる
必要があります。

>* Common Lisp では末尾再帰〜

実装者が手抜きすれば当然、最適化してくれません。
まともな処理系ならコンパイルすれば最適化されると思います。
ただし、仕様に完全に組みこまれているわけではないので、
実際に「最適化可能」と謳っていても、schemeのスペシャリストが
書く様な複雑怪奇な再帰を使ったコードが完全に最適化される
可能性は低いと思います。
LISPをマスターすると悟りを開けるってホントですか?
LISP に限らずマスターしたら悟りは開けると思うけど
>>128
schemeのmapの仕様の理由は >>131 に同意。
順序が重要なら、srfi-1にmap-in-orderというのがある。
135128:03/03/06 21:51
>>131 ありがとうございます.為になります.

> 例えば下の様なmapの実装だと、

「先頭からやるのが一番合理的」という観念にとらわれていました.
順序を保証しない場合のメリットもあるんですね.

> 破壊操作を前提とするなら、専用のmapを作るか持ってくる
> 必要があります。
>>134
> 順序が重要なら、srfi-1にmap-in-orderというのがある。

やはり需要があるみたい.頭のトンがった方々のコードをたくさん読めば
「map は写像なり」って言い切れるようになりますかね.

> まともな処理系ならコンパイルすれば最適化されると思います。
...
> 可能性は低いと思います。

「なんでも再帰」の相互末尾再帰がカッコいいなと思ったんですけれど,
これじゃちょっと残念ですね.
フリーのCLOSってない?
出来るなら日本語対応の。

馬鹿な質問だからsage
for-each使うか、メモリ気にせずにmap使うかだと思うけどねえ。
doとかループを使えば?
(do ((a x (cdr a))
(b '() (cons (f (car a)) b)))
((null? a) (reverse b)))
139デフォルトの名無しさん:03/03/07 02:50
> (1 + 2 + 3)
Error: attempt to apply non-procedure 1.
ついやってしまうのだが。
140デフォルトの名無しさん:03/03/07 04:36
>>135
簡単に作れるから規格にはでてないだけでしょう。
(define (map-in-order f . a)
(let ((b '()))
(apply for-each (lambda a (set! b (cons (apply f a) b))) a)
(reverse b)))
多分これでいいと思うけど。

あとmap-in-order使う例を教えてよ。
工夫すればmap-in-order使わなくても簡潔に書けるかもしれないし。
schemeでdoって使うもん?
なんかおれ、構文思い出せなくて、いつもnamed-let使ってますが。
(let loop (( ...))
(if (...) ...
(begin .... (loop ...))))
こんな形になるときは使ったほうがいいんじゃない?
(do ((...))
((,,,) ,,,))
....)
ってなるから。
>>140
> 簡単に作れるから規格にはでてないだけでしょう。

簡単に作れちゃう scheme だからこそ,モジュール機能が処理系依存なのが
もったいない気持ちになることがありませんか?

> あとmap-in-order使う例を教えてよ。
> 工夫すればmap-in-order使わなくても簡潔に書けるかもしれないし。

>>65-68 では Common Lisp なものの,
先頭から適用されることを期待したコードがあったので,
scheme では map に落とし穴(誰も掘ってない?)があるのを思いだしたんです.

>>136 clisp. 日本Lispユーザー会サイトには処理系ごとの日本語の可否が載ってます.

>>139 私は C で (atan 1) * 4 としてしまう事の方が多いです.
144デフォルトの名無しさん:03/03/07 10:46
cmuclって、windowsじゃcygwinでも動かないの?
>Platforms: what does it run on?
>CMUCL should work on the following combinations of operating system
>and architecture:

http://www.cons.org/cmucl/platforms.html
>>65-68はmapcar使えって問題だしなあ。
schemeならループか
(define (pos+ lst)
 (let loop ((a lst) (b '()) (n 0))
  (if (null? a) (reverse b)
    (loop (cdr a) (cons (+ (car a) n) b) (+ n 1)))))
再帰か
(define (pos+ lst)
 (if (null? lst) '()
   (cons (car lst) (map (lambda (x) (+ x 1)) (pos+ (cdr lst))))))
carやcdrが面倒になったらfor-each使うかなあ。
(define (pos+ lst)
 (let ((a '()) (n -1))
  (for-each (lambda (x) (set! n (+ n 1)) (set! a (cons (+ n x) a))) lst)
  (reverse a)))
これはmap-in-order使うのと同じことだけど。
147デフォルトの名無しさん:03/03/07 17:22
ISLISP使ってる人っていないの?
そんなにいないんじゃない?
あえてISLISP使うメリットって、あんまりなさそうな気がする。
ISLISPでも動く様に書く、って人はいるかもしれないけど。
でも、日本人が率先して使わなかったら、なんの為の規格なんだろうね。
使ってるとしたら一部の大学とかじゃないかな。
ISLISP コンパイラってあるの?ライブラリもある程度欲しいんだけど…
>>147

ちょっとした計算とかスクリプトに oki lab. の islisp 使っていたけど、サイト消滅しちゃいました。
tisl と OpenLisp は bignum がなくて使いにくいので、今は Ruby を使っていたり。
151デフォルトの名無しさん:03/03/07 22:43
Lisp や scheme で書かれた数値計算プログラムのソースコードが見たい.
>151
maximaとか?
reduce とか?あとは Emacs 向けの数式処理システム calc とか?
つーか「数値計算プログラム」が何を指して言ってるのかわからん。
(+ 1 1)
のことだろ
MS JVMを書いたDavid A.MoonってCommon Lisp the Language, 2nd Edition
の著者だったのね。
>156
おれもそれ最近知った。
だからどう、ってわけでもないけど。
158デフォルトの名無しさん:03/03/08 09:52
>>150
tisl って bignum 無いんだぁ。
更新しないのかなぁ と他力本願してみる。
>>151 et.al.
統計言語GNU R(Sのクローン)はSchemeに皮をかぶせて作ったと聞きましたが,本当?
160(define (´∀`) 'マターリ):03/03/08 15:42
>>151
過去スレより微分
(define (deriv f)
(if (null? f) '()
(map + (cdr f) (cons 0 (deriv (cdr f))))))

(deriv '(1 2 3))
(2 6)
>>156

おかげで、当時はMSのJVMはかなり動作が速かったです。
でも、GC周りをMSの人間が十分把握できなくて、いじれなくなり JVM の開発をやめたという噂も。(ォ
>>160
s/(null? f)/(null? (cdr f))/
みたいですよ.なんと言うか,余計にもう一回やろうとしてエラーになります.

「かけ算は足し算の繰り返し.」基本なんですね.

;; 過去スレにあるはずが,ググルからは出てきませんでした.
163デフォルトの名無しさん:03/03/08 17:48
Common Lisp にはハッシュがあり,これは alist より高速だ.

じゃあ alist を使うメリットって?
設定を書くようなときだけ?
(define (deriv f)
(if (or (null? f) (null? (cdr f))) '()
(map + (cdr f) (cons 0 (deriv (cdr f))))))

(map + '() (cons 0 '()))
ができんよな。うちのは()を返すけど。

過去スレPart5の786あたりから。別のやり方だけど。
>163
alistは順序が必要なデータ構造、
例えば構文解析用のスタックとして良く使う。
166162:03/03/08 18:30
>>164
> (map + '() (cons 0 '()))
> ができんよな。うちのは()を返すけど。

うちの guile 1.4 はヘコたれてしまいます.
シュガーではなくて,ここで () を返すのが正しいと思うんですが,残念です.
167デフォルトの名無しさん:03/03/08 23:50
練習がてらperlのjoinと互換のやつ作ってみました。
どうですか?

(define(join sep strlist)
 (let loop ((x strlist)(r '()))
  (if(pair? x)
   (cond
    ((eq? x strlist)
     (loop(cdr x)(cons(car x)r)))
    (else
     (loop(cdr x)(cons(car x)(cons sep r)))))
   (apply string-append(reverse r)))))

(join "," '("j""o""i""n"))
==>"j,o,i,n"
一つのcondの方がいいと思うけど。
(define (join sep strlist)
(let loop ((x strlist) (r '()))
(cond ((null? x) (apply string-append (reverse r)))
((null? r) (loop (cdr x) (cons (car x) r)))
(else (loop (cdr x) (cons (car x) (cons sep r)))))))

(cons (car x) (cons sep r))を
(hoge (car x) sep r)って書けるとなあ。

末尾再帰でない方がわかりやすいかも。
(define (join sep strlist)
(cond ((null? strlist) "")
((null? (cdr strlist)) (car strlist))
(else (string-append (car strlist) sep (join sep (cdr strlist))))))
>168
cons*とかlist*
つーのがあるよ。どっちも意味は同じ。
(list* 'a 'b 'c) => (a b . c)
SRFIのリストライブラリね。
(define (join sep strlist)
 (let loop ((x strlist) (r '()))
  (if (null? x) (apply string-append (reverse r))
    (loop (cdr x) (cons (car x) (if (null? r) r (cons sep r)))))))

(define (join sep strlist)
 (if (null? strlist) ""
   (apply string-append
       (cdr (apply append (map (lambda (x) (list sep x)) strlist))))))
172デフォルトの名無しさん:03/03/09 00:46
だいぶ短くなるもんですね。
あとでsplitも作ってみます。
正規表現はつかえませんが。
173デフォルトの名無しさん:03/03/09 01:35
splitも出来ました。
あと、strstrみたいなのが無いので作りました。
(substringを使ってるので効率悪そうです。)
strstrを正規表現マッチに変えればperlと互換になると思います。

;文字列strの中から文字列keyを探し、その位置を返す。見つからなければ#f
(define (strstr str key)
 (let loop ((str str) (pos 0))
  (cond
   ((< (string-length str) (string-length key)) #f)
   ((string=? (substring str 0 (string-length key)) key) pos)
   (else (loop (substring str 1) (+ pos 1))))))

(define (split sep str)
 (let loop ((str str) (r '()) (pos (strstr str sep)))
  (if pos
   (if (zero? (string-length sep))
    '()
    (let ((next (substring str (+ pos (string-length sep)))))
     (loop next (cons (substring str 0 pos) r) (strstr next sep))))
   (reverse (cons str r)))))

>(split "/" "s/p//li/t//")
=>("s" "p" "" "li" "t" "" "")
strstrはposだけでできるね。
(define (strstr str key)
 (let loop ((pos 0))
  (and (>= (string-length str) (+ pos (string-length key)))
     (if (string=? (substring str pos (+ pos (string-length key))) key) pos
       (loop (+ pos 1))))))
一つにまとめて、strのかわりに位置を保存して
その位置をrと一緒にlambdaでまとめて
(define (split sep str)
 (let loop ((p 0) (q (lambda (x) (list (substring str 0 x))))
       (s (string-length str)) (k (string-length sep)))
  (cond ((< s (+ p k)) (reverse (q s)))
     ((string=? sep (substring str p (+ p k)))
      (loop (+ p k) (lambda (x) (cons (substring str (+ p k) x) (q p))) s k))
     (else (loop (+ p 1) q s k)))))
Tinyschemeまんせー
177dynamic-winder:03/03/10 18:07
(define conti '())
(call/cc (lambda (c) (set! conti c)))
(dynamic-wind
(lambda () (conti 'new))
(lambda () 'hoge)
(lambda () 'after))
)
とやると、'afterは、どうなるのでしょうか?
現在tinyscheme-hack中で、どうしましょうと考えているのですが、、、
>177
tinyschemeは色々不具合あるから、動作の参考にはならんと思うが、
継続は、beginとかletのシーケンス上から取ってきた場合と、
トップレベルから取ってきて実行した場合で、動作に違いがある。
トップレベルでの各動作は、仕様が決まってないので処理系に依存する。

petite-schemeの場合、
シーケンス上にあるなら、newnewnewnewnewnewnewnew....
と永遠に繰り返されて、hogeやafterには移らない。
これは多分、どの処理系でも同じ。

トップレベルにあるなら、newを一回実行して停止する。
これもhogeやafterには移らない。
トップレベルをシーケンスとみなさない処理系なら、
この動作になると思う。
179dynamic-winder:03/03/10 21:12
>178
177です。
ということは、大くの処理系において
まんなかに制御がはいらないかぎり、
いわゆるwind-outは、発動しないのですね。
それは、R5RS(でしたっけ)にありましたっけ?
もしかして、処理依存?

tiny-schemeの目につく不具合(continuation)は、なおしましたが、
他にも不具合があるのでしょうか?
もし知ていれば、おしえてくれませんか?
また、ほかにもっとまともな、小さい処理系があれば、教えてくれませんか?
defclassをマクロで実装したらどんな風になりますか?
>>180
(defmacro defclass (name direct-superclasses direct-slots &rest options)
(expand-defclass name direct-superclasses direct-slots options))
182178:03/03/11 00:47
>179
before区間では継続をまだ取り出してないので、こういう動作になる。
結局この辺は実装を見た方が早い。
call/ccを上書きするdynamic-windのポータブルな実装がWeb上の
どっかにあったと思う。
R5RSにはhogeまで到達した時のbefore/afterの呼び出しタイミング
についてしか言及されてない筈。

tiny-schemeの不具合について昔調べた限りでは、組み込みの
リスト処理関数全般と、内部定義(define)の適用順序がおかしかった。
実装者はセルのポインタ付け替えに慣れてない気がする。
全体的に結構いいかげんな作りなので、もし手を加えていくなら、
元のmini-schemeからの拡張部分は全て疑った方がいいかも。
183178:03/03/11 01:16
>179
他の小さい実装としては、SECDR-Schemeがお奨め。
中身はmini-schemeの兄弟みたいな物なので、mini-schemeが
読めるなら、難易度的にあんまり変わらない。
ただしこっちはVMで動く。構成はmini-scheme大して変わらないけど、
SECDR(Stack/Env/Code/Dump/Return)という5つのレジスタを使う。
VMからのブートストラップで動くので、解析は多少難しいかもしれない。
schemeコードによるVMへのcompiler/disassemblerが付属する。
速度的にはmini-schemeとたいして変わらないけど、オペコードを
細かくするなり、VMを最適化していけば、それなりの速度にはなるはず。
184dynamic-winder:03/03/11 01:37
おせわになってます。
すいません、へたれものでSECDR-Schemeへのポインタが分かりません。
もしよろしければ、SECDR-Schemeへのポインタをしめしてください。

tinyschemeをもそうとう直しているので、
(conitnuation,dynamic-wind,list*,apply,,,,,などなど)
このままいくか、それとも?

でも、小さい実装系のソース元すべてが、
モリワキさんであることは、ちょっと驚き。
日本人は、Lisp/Scheme系が得意なのか?
185178:03/03/11 01:51
>184
SECDR-Scheme1.0.tgz
ここにアップしました。お早めに。
http://www.42ch.net/UploaderSmall/source/1047314983.tgz
186dynamic-winder:03/03/11 03:05
有り難うございました。
内部は、相当おもしろそうですね。
研究してみます。

そもそもなぜこのようなことをしているかというと、
現在、bourne-shellにschemeを組み込もうとしているからです。
(シェルでプログラムをしていて、速度的、機構的限界を感じたため)
>>186
完成したら公開きぼんぬ
188dynamic-winder:03/03/11 04:25
>187
私は、サイズに制限があるために、そのようなことをしていますが、
schemeをshellとして使うなら、scshがありますよ。
EPF,SREなど優れた機構もあります。
189dynamic-winder:03/03/11 15:37
自作のdynamic-wind,call/ccを作ってみました。
どんなもんでしょうか?(でも、Cでローレベルサポートの方がいいかも)
transp-letは、
(transp-let let ((a b)) (define c a))
-> (begin (define c '()) (let ((a b)) (set! c a)))
という代物です。
190dynamic-winder:03/03/11 15:38
(transp-let letrec
((l-call/cc call/cc)
(winder '())
(winder-push (lambda (x) (set! winder (cons x winder))))
(winder-pop (lambda()
(let ((x winder)) (begin (set! winder (cdr winder)) (car x)))))
(make-winder (lambda (a b) (winder-push (cons a b))))
(apply-before (lambda (x) ((caar x))))
(apply-after (lambda (x) ((cdar x))))
(winder-resolv
(lambda (to-winder)
(w-r# (list-length to-winder) (list-length winder) to-winder '())))
(w-r# (lambda (tl fl tw bwa))
(cond
((eq? tw fw)
(w-r#up bwa))
((< tl fl) ;from longer
(begin
(apply-after (winder-pop))
(w-r# tl (- fl 1) tw bwa)))
(else
(w-r# (- tl 1) fl (cdr tw) (cons tw bwa)))))
(w-r#up
(lambda (bw)
(if (null? bw)
'()
(begin
(set! winder (car bw))
(apply-before winder)
(w-r#up (cdr bw)))))))
191dynamic-winder:03/03/11 15:38

(define (dynamic-wind b m a)
(begin
(b)
(winder-push (make-winder b a))
(m)
(winder-pop)
(a)
))
(define (call/cc recvr)
(l-call/cc
(lambda (rcon)
(recvr
(let
((towinder winder))
(lambda (retv)
(winder-resolv towinder)
(rcon retv))))))))
192dynamic-winder:03/03/11 15:40
なぜ美しいインデントが消える?
醜いから
>>192
navi2ch使ってないんですか?
195デフォルトの名無しさん:03/03/11 16:58
clisp2.30使ってるんですが、これってdefgenericはstandardしかつかえないんですか?

[14]> (defgeneric price (x) (:method-combination +))

*** - DEFGENERIC PRICE: The only valid method combination is STANDARD : (:METHOD
-COMBINATION +)

こんなん出るんですが・・・
196178:03/03/11 20:05
>195
clos.lispに
> ;; 3. Apply method combination:
> ;; Only STANDARD method-combination is implemented.
って、書いてあるよ。
197178:03/03/11 20:09
>189
http://zurich.ai.mit.edu/pipermail/rrrs-authors/1992-August/001461.html
これがdynamic-windのポータブルなやつ。
mini-schemeとかでも動くと思う。
198195:03/03/11 22:58
>196
ありがとうございます
clos.lispなんて一回も目を通していませんでした>反省しる!オレ
xyzzyでGUIって作れる?
作れるよ
>200
マジですか!?教えてください。お願いします。

ちなみにこれってどうですか?
ttp://www.lispworks.com/downloads/lw-personal-edition.html
>>201
xyzzyはDLLの関数を呼べるんで、
(require "wip/winapi")
(c:define-dll-entry winapi:HWND CreateWindow (引数) "user32")
などとしてやる。
詳しいことはMLなど参照。
xyzzy Mailing List Archive
ttp://www3.tok2.com/home/xyzzy/

lispworksは知らない。
>202
最高にサンクスです。LISPでWINGUIができるとは夢のようです。
204デフォルトの名無しさん:03/03/14 03:01
多値使ってる人いる?
(get-decoded-time)
206デフォルトの名無しさん:03/03/15 01:10
すいません
schemeのappendをどなたか lambda式で書いてくれませんか?
(lambda (. lst) (apply append lst))
208デフォルトの名無しさん:03/03/15 01:21
>207
ジョークですか?
R5RSの関数って、いや結構例外多いなと思いまして、、
multi-arg-applyって?
何につかうんでしょうか?
(lambda (. lst)
(let rec ((x ())
(l lst))
(if (null? x)
(if (null? l)
()
(rec (car l) (cdr l)))
(cons (car x) (rec (cdr x) l)))))
>>206

(define (append . x)
 (define (xlist x tail)
  (if (pair? x)
   (cons (car x) (xlist (cdr x) tail))
   tail))
 (if (pair? x)
  (if (pair? (cdr x))
   (xlist (car x) (apply append (cdr x)))
   (car x))
  x))

(append '(1 2 3) '(a b c) '(4 5 . 6)) =>(1 2 3 a b c 4 5 . 6)

最後のリストはコピーしない。
いま作ったやつだから、間違ってるかも。
211デフォルトの名無しさん:03/03/15 01:46
末尾の元のリストが使われるとあるようですが、、、
おそらく
(if (null? l)
()
(rec ...)
このへんがちょっとちがう
それは、まあべつに難しかないですが、
なんでこれほど複雑にしなければならないのかが
分からない。
212デフォルトの名無しさん:03/03/15 02:00
ifが、末尾の場合にしか効いてなくて、
そのために実行速度を無用に落としているような、、、
特に無引数のappendは解せない。
このようなappendが使われるのは、
歴史的理由でしょうか?それも何か理由があってでしょうか?
213デフォルトの名無しさん:03/03/15 02:19
下のコードをSCMで実行すると即落ちする。
win98で実行したらOSごと落ちたよ(藁

;その1
(define v (vector ()))
(vector-set! v 0 v)
v

;その2
(define v1 (vector ()))
(define v2 (vector ()))
(vector-set! v1 0 v2)
(vector-set! v2 0 v1)
v1

さすがにPetite Chez Schemeは大丈夫だったが、
おまえらの使ってる処理系では大丈夫ですか?
214デフォルトの名無しさん:03/03/15 02:52
いいのができた
(define (append . x)
(if (null? x)
(let loop (left (reverse x))
(if (null? cdr(left))
(car left)
(loop (cons (concat-reverse (reverse (cadr x)) (car x)) (cddr x))
x)
(define (concat-reverse b a)
(if (null? b) a (let ((t (cdr b))) (concat-reverse t (begin (set-cdr! b a) b))))
215デフォルトの名無しさん:03/03/15 02:58
たくさんまちがえてます。
気にしないでください。

>>212
略しすぎ。
何言わんとしてるんだかさっぱりわかんね。

>ifが、末尾の場合にしか効いてなくて、
>そのために実行速度を無用に落としているような、、、


セルを消費するのを効率悪いと言ってるのなら、
append!という破壊関数もあるけど。

>特に無引数のappendは解せない。

(append)
のことか?
これが何か?

>このようなappendが使われるのは、
>歴史的理由でしょうか?それも何か理由があってでしょうか?

appendは昔からあるから、歴史的理由なんじゃないかな。
知らんけど。
(defun func((lambda (x)(* x x))))
ってなんで通らないの?
ラムダ式って引数にできないの?
え?
関数と構文の違いを理解してないと、LISPを使いこなすのは難しい
>218>219
すいません・・・lisperの道は遠いなぁ。
今までC++しか触ってなかったからとまどってしまう。
確かに凄い言語だと思うけどね。
特にマクロは凄い、と思う(自身ないけど)
(define (append . x)
 (let loop ((x (reverse x)) (r '()))
  (cond ((null? x) r)
     ((null? r) (loop (cdr x) (car x)))
     (else (loop (cdr x)
           (let loop ((x (reverse (car x))) (r r))
            (if (null? x) r
              (loop (cdr x) (cons (car x) r)))))))))
最後のを共有するのはconsセルを少なくしたかったからでしょう。
>>217
(defun func (x) (* x x)) とか
(let ((func (lambda (x) (* x x)))
 (funcall func 6))
とかなら動くんじゃない?
(define (append2 x y)
 (cond ((null? x) y)
    ((null? y) x)
    (else (cons (car x) (append2 (cdr x) y)))))

(define (append . x)
 (if (null? x) '()
   (append2 (car x) (apply append (cdr x)))))
>>217

やりたいのはこうかな?
(defmacro func (f x)
  `(,f ,x))

(func (lambda (x) (* x x)) 6)
なんだそりゃ・・
226217:03/03/15 11:31
こっちの方がいいか。

(defmacro func (x &rest rst)
 `(,f ,@rst))
227224=226:03/03/15 11:33
ごめん、名前欄間違えた
228224=226:03/03/15 11:36
訂正↓
(defmacro (f &rest rst)
 `(,f ,@rst))
229デフォルトの名無しさん:03/03/15 13:18
goshとかguileって有理数使えるんですか?
最近schemeの勉強し始めたばかりなんですが、
有理数を使える処理系を教えてください。
少なくとも
kawa Scheme
MIT Scheme
(Petite)Chez Scheme
は使えるよ。>有理数
231append の はなし:03/03/15 19:44
まえのことですいません。
無引数のappendがおかしいといったのは、
>221のソースを代用(ほぼ末尾再帰展開もされる完璧なソースだとおもいます)
(define (append . x)
 (let loop ((x (reverse x)) (r '()))
  (cond ((null? x) r)
     ((null? r) (loop (cdr x) (car x))) << ここ
     (else (loop (cdr x)
           (let loop ((x (reverse (car x))) (r r))
            (if (null? x) r
              (loop (cdr x) (cons (car x) r)))))))))
ここと示したところで、
(if (null? r))は、はじめの最初のループでしか意味をもちません。
もし、引数が必ずひとつ確定できるならば、rにその最後の一つをバインド
して、(null? r)と無用な初期値の前提(r '())を削除できるからです。
(r #f)、つまり、無引数=>#f と考える人がいた場合、
それもまた合理的であり、人の考えかたによって左右されるようなものを
標準とするのは、どうも納得がいかないというところがあります。
232デフォルトの名無しさん:03/03/15 19:45
括弧ばかり(嘲笑激藁
233append の はなし:03/03/15 19:55
私がいいたいのは、
appendの引数を、最低1つにするという
まあ、内部構造からすると自然なことをどうしてしないのか?

過去との互換性で、そのようになっているのだとすれば、
どのようなときに重要になってくるのか、
これがあるから外せないという場面、
を知りたいなとおもいまして、、、、
234デフォルトの名無しさん:03/03/15 20:22
>>233
論理構造としてそうあるべきだから。
それが嫌なら、(+) => 0。(*) => 1、(and)=>#t、(or)=>#f
もダメだよね。
235append の はなし:03/03/15 20:36
>>234
本当にそうですか?
andは、順次評価していき、
すべて評価しおわったときに#tになるというのは分かります。
R5RSのマクロを見れば分かります。
しかし、appendは、それとおなじように定義しようとしても、
論理構造として、そうあるべきとは、なりません。
それは、引数一つのappend が、それそのものであるように、
どのようにしても引数一個の状態を再帰的に引数ゼロ個の場合を
使って定義できないというところに問題があるのです。
ちなみに
(+ a b c NIL) => (+ a (+ b c NIL)) => (+ a (+ b (+ c NIL))) => (+ a (+ b (+ c (+ NIL))))
したがって(+ NIL) => 0 となります。分かっているとおもいますが、、
236append の はなし:03/03/15 20:46
(append a) => identity-a
(append a) => (append a (append NIL)) => copyed-list-a
となります。
a => (c d . e) だったばあい、
どうしようもないような
気がします。
237デフォルトの名無しさん:03/03/15 21:33
schemeの
内部定義って、どうして直接参照不可なの?
コンパイラ内の最適化を促すため?
(let ()
(define ada '())
(define aba '())
(set! ada ...)
(set! aba ...) ...)
なんてやられたら、あんまかわらんような?
>append の はなし

>(if (null? r))は、はじめの最初のループでしか意味をもちません。

考え方の前提がおかしいんじゃないか?
appendの'()を否定するって事は、リストの終端(空リスト)も
#fであるべきという事か?
意味的に (null? r)という述語は、「始めの最初のループかどうか」
ではなくて、「リストの終端(空リスト)かどうか」を示してると思うんだが。

>appendの引数を、最低1つにするという
>まあ、内部構造からすると自然なことをどうしてしないのか?

リストが0個の場合でも、それは「空リスト」と言って、
リストにとっては1つの形態として自然だから。
'(a b c) => '(a . (b . (c ())))
(length '(a b c)) => 3 (length '()) => 0
(length '())でも#fを返せというのか?

これを他の言語のデータ型に例えるとするなら、C言語の文字列かな。
文字列の長さをstrlenで調べて0が返されても、
実際には終端文字分の長さがあるのと同じ理屈。strlen("\0") => 0
"\0"は特別な値ではなく、あくまでも文字列の一部。

>(+ a b c NIL) => (+ a (+ b c NIL)) => (+ a (+ b (+ c NIL))) => (+ a (+ b (+ c (+ NIL))))
>したがって(+ NIL) => 0 となります。分かっているとおもいますが、、

(+ NIL) => Error: variable nil is not bound.
これで何を判れと?
もしかしてドット対の事を言ってるの?
いい例じゃないけど、括弧を取るflattenなんかは
(define (flatten x)
 (if (list? x) (apply append (map flatten x))
   (list x)))
(flatten '(1 (2 (3 (4 5) () 6)) 7 (8 9)))
-> (1 2 3 4 5 6 7 8 9)

(append) -> () でいいと思う。

(append) から (append a) は定義できないんだろうけど。
(define (append2 x y)
 (if (null? x) y
   (cons (car x) (append2 (cdr x) y)))
(define (append . x)
 (cond ((null? x) '())
    ((null? (cdr x)) (car x))
    (else (append2 (car x) (apply append (cdr x))))))

>>223から変えた理由は
(let ((x '(9 8))) (eq? x (append x '()))) が
#f にならないといけないようなので。
>append の はなし

つーか、どうもおかしいな。
一回でも処理系さわった事ある?

ちなみに、1個以上の引数を取りたいなら、
(define (append x . y) 〜)
という方法もあるんだが。
241デフォルトの名無しさん:03/03/15 22:01
最近お勧めなScheme実装ってGaucheなんですか?
それからCommon Lispって今でもまともに使っても大丈夫な言語ですか?
(car '(+ - *)) => +
((car '(+ - *)) 1 2) => Error: attempt to apply non-procedure +.

なんでですか?
'+ => + だけど + => + じゃない。
((car (list + - *)) 1 2) => 3
244242(勉強中):03/03/16 00:08
>>243
ありがとうございます。
quateとlistのまだ違いがわかってないようです。

(define a 1)
(list + a 2) => (#<procedure +> 1 2)
(quote (+ a 2)) => (+ a 2)

確かに結果がちがいますね。ゆっくり勉強します。
245デフォルトの名無しさん:03/03/16 01:05
SLIBのページが開けない
246デフォルトの名無しさん:03/03/16 01:36
>>238
>考え方の前提がおかしいんじゃないか?
>appendの'()を否定するって事は、
すいません、私の誤解かもしれませんので、
(append '()) なのか (append . '()) なのか 書いてください。
>リストが0個の場合でも、それは「空リスト」と言って、
>リストにとっては1つの形態として自然だから。
>'(a b c) => '(a . (b . (c ())))
>(length '(a b c)) => 3 (length '()) => 0
>(length '())でも#fを返せというのか?
いえそういっているのではありません
(length) -> ?
つまり、(length . '()) -> ?
といっているのです。(私の考えでは(length) -> #fでもいいのではないかと)
>>(+ a b c NIL) => (+ a (+ b c NIL)) => (+ a (+ b (+ c NIL))) => (+ a (+ b (+ c (+ NIL))))
もっとくわしく書きたいとおもいます。
(+ a b c . '()) -> (+ a (+ b c . '()))
-> (+ a (+ b (+ c . '()))) -> (+ a (+ b (+ c (+ . '()))))
つまり(+ . '()) -> (+) -> 0 と認識しています。
>>239
(append '() '(a b c . d)) -> '(a b c .d)
のことでしょうか、
括弧をとるflattenは、簡単にかけますが、
アトムを残すatom-flattenは、めんどいことになりませんか?
(atom-flatten '(a b c '(d e f '()) d '())) -> '(a b c d e f '() d '())
247デフォルトの名無しさん:03/03/16 01:40
すいませんチョンボです
(atom-flatten '(a b c (d e f ()) d ()))
-> '(a b c d e f () d ())
248デフォルトの名無しさん:03/03/16 02:12
>>238
もしかして
'(a b c d e) => '(a b c d e ())
とおもっていませんか?
(とかんがえれば、あなたのいっていることが通じる。
そうでなければ、もうしわけない)
'(a b c d e) => '(a b c d e . ())
ですよね,,,
249238:03/03/16 02:44
>>246

まずね、
ちゃんと読め。

>>235の、
>(+ a b c NIL) => (+ a (+ b c NIL)) => (+ a (+ b (+ c NIL))) => (+ a (+ b (+ c (+ NIL))))
>したがって(+ NIL) => 0 となります。分かっているとおもいますが、、

これは、ドット対のつもりだったのか?
ちなみにschemeではNILと書いてもただのシンボルであって、
defineされてなければエラーになる。
この前提さえ間違ってるから、既に話がかみ合ってない。
250238,240:03/03/16 02:54
続き。

>>246
>(append '()) なのか (append . '()) なのか 書いてください。

(append) もしくは (append . ())
ね。
所で、>>240 の話は無視ですか?



>>246
>(length) -> ?
>つまり、(length . '()) -> ?

これは単にエラーにすべき。
なぜならlengthは1引数を取る関数と定義されているので。

で、気になったのは、
君は固定引数の関数についてさえ、引数足りてなかったら、
定義と無関係に、勝手に#fを返す様にしたいのか?

それを仮に踏まえたとすると、
例えばこれはどうなるの?

((lambda(x) x))

エラーとせずに、#fを返すの?
251238,240:03/03/16 02:54
>>248
>もしかして
>'(a b c d e) => '(a b c d e ())
>とおもっていませんか?

おもっていません。

もしかしてバカにされてるのかなあ。
252246:03/03/16 03:03
模式てきなものでわかるかなとおもいまして、
NIL == . '() とすれば、あっているでしょうが、
NILのときは、きばってかきませんでしたが、
どうしてもというので246にきばってかいています。
それをよんでいないのは、あなたでしょう。
(そのようなことは、いわれずともわかっています。
処理系も複数個よんでいます。)
ところで、あなたが、238で不明瞭だった点を明かしていません。
>appendの'()を否定するって事は、
(append '()) ですか? (append . '())ですか?
253246:03/03/16 03:07
252
の記事は、時間がずれておりました。
もうしわけありません。なかったことにしてください。

#fを返すのいみがわかっていただけてないようです。
つまり、appendが無引数でよばれるような状態つまり、
(append . '())はエラーでもかまわないのではないかといっているのです。
254246:03/03/16 03:13
251の記事について、
申し訳ありません。
記事そのものにも書いておきましたが。
でも、じっさいあなたの書いた
>238
の記事には、(しかも、すべて)そうありましたが、、、、
簡略のためにかいたというのでしたら、指摘の行き過ぎでした、
申し訳ありません。
255246:03/03/16 03:19
もしかして、ここが誤解のはじまりなのか?
appendは、
r5rsにのってある関数で、標準関数として登録されています。
それは、無引数のappendを受けつけるようになっています。
そこで、
私の疑問は、そのわりに、どうしてこのようになっているのか
知りたいというものでした。
256238,240:03/03/16 03:26
>>252
>(append '()) ですか? (append . '())ですか?

それは>>250で書いたので読み返してね。

>>253
>つまり、appendが無引数でよばれるような状態つまり、
>(append . '())はエラーでもかまわないのではないかといっているのです。

appendは可変個の引数、つまり

「0(または1)個以上の引数を取る」

とは考えられないのかな。
それが嫌なら>>240の様に引数の個数を強制しろって
事を言いたかったんだけど、伝わってないみたいね。


>>255
今R5RSを見た限りでは、
(append list ...)
と書いてあるから、(listと...を別個に解釈して、)
1個以上の引数を取る様にも見えるなあ。
まあどっちでもいいけど。
257246:03/03/16 03:37
C の code でみるとわかりやすいですが
#ifdef R5RS_APPEND
if(sc->args==sc->NIL) {
s_return(sc,sc->NIL);
}
#endif
x = reverse_in_place(sc,sc->NIL,sc->args,0);
while( cdr(x) != sc->NIL ){
cadr(x) = append(sc,cadr(x),car(x));
x = cdr(x);
}
s_return(sc, car(x));
と、明らかに、ifが一個邪魔なようなきがします。
まあ、それだけといえばそれだけですが、
ちょっと関数の返り値に関連性がないなとおもいまして、、、
applyと連携する関係じゃないかな
これでいい?
(define (append2 x y)
 (let loop ((x (reverse x)) (y y))
  (if (null? x) y
   (loop (cdr x) (cons (car x) y))))))
(define (append y . args)
 (if (null? args) y
   (let ((x (reverse args)))
    (let loop ((x (cdr x)) (r (car x)))
     (if (null? x) (append2 y r)
       (loop (cdr x) (append2 (car x) r)))))))
260デフォルトの名無しさん:03/03/17 10:48
>>255

appendが無引数を許すようになっているのは、ほとんどの実装では
(append ())と(append)の内部表現が同じだからである。(ここで()はquoteされていないことに注意せよ)
そして違う内部表現を使ってこれを識別できるようにすると実装の効率がものすご〜く悪くなる。(重要:そうする必要もないしね)

ちなみにappendのR5RSでの定義は
(append list ...) 「0個以上のリストを引数に取る(Cとちがって1個以上とは読まないことに注意せよ)」
でも、R5RSには最後の引数はなんでも良いと書いてある。
(append '(1 2) 3) -> (1 2 . 3)
が動作するのはその為だ。

結局のところ「大人ってズルイ」ってことかもね。
261260:03/03/17 11:04
ごめん . が抜けてた
「(append . ())と(append)の内部表現が同じ」だった^^;
262260:03/03/17 11:13
>>253

>(append . '())はエラーでもかまわないのではないかといっているのです。
ちなみに、これは普通の実装なら立派なシンタックスエラーとなる。
なぜなら(append quote ())と同じ内部表現となるからだ。

若者よ、精進じゃ!
263260:03/03/17 11:20
ところで
. の右側に引数を書くのってあり?と思う者もいるかもしれないので、念のため
「ありじゃ」
(list . (1 2)) -> (1 2)

年寄りは小便の切れが悪くてすまん m(_ _)m
誰か教えてよ。
265デフォルトの名無しさん:03/03/18 06:06
clike使ってる人いる?
http://www.rojoma.com/~robertm/clike/
MzScheme と Guile でしか使えないけど。

なんでscheme自身で書かないんだろう。
266デフォルトの名無しさん:03/03/18 06:51
267デフォルトの名無しさん:03/03/19 01:32
最近 common lisp を使い始めたのですが、clos について
例えば
(defclass A ...)
(defmethod aaa ((x A)) ...)
(defclass B ...)
(defmethod aaa ((x B)) ...)
(defun f (x) (aaa x))
とか書くと、x の class によって動作を選べますよね
しかし、A のコード(最初の二行)と Bのコード(次の二行)が別のパッケージにあると
use しない限り A:aaa と B:aaa が別の名前になってしまってだめのようです。
全部 use してしまえば問題ないわけですが、それだと名前がよごれるのでこれはどうする
のがふつうなんでしょうか。

268268:03/03/19 01:40
sage
>>267
必要な名前だけimportすりゃいいんじゃないの?
270デフォルトの名無しさん:03/03/19 03:48
>>269
なんていうか、動くようにすることはできるのです。
しかし例えば、いろいろな数値クラスに to-string を定義して
ストリーム出力を全部それでやってもらうときなんかに
ストリームの方で全部 import しなくちゃならないんで、なんか変だなあと思うのですが。
Unlambda
272デフォルトの名無しさん:03/03/22 12:01
最初のMLはLISPで作られたっていうけど、
逆に型推論だけLISPやSchemeに持ってこれないものですか?
リスト構造的に全体で使うのは無理だから、
例えば数値→数値の時だけ使うとか。
273デフォルトの名無しさん:03/03/24 09:14
LSIP作ってる日本のメーカーってないの?
274デフォルトの名無しさん:03/03/24 09:15
あ、LISPだった。
275定・フセイン:03/03/24 10:49
>>272
型推論「だけ」とはどういう意味かの?
CLISPをWin98SEで使っていると,スタンバイができなくなったり,
ランチャから新しいプロセスを開始できなかったりする.
(bye) すると急にスタンバイしたり新しいアプリが始まる.
これはWin98が悪いのか?CLISPが悪いのか?漏れのマシンの低スペックが悪いのか?
別にいいんだけどさ.

あと誰かCLISPのForeign Function InterfaceのWindozeにおける可能性と使い方を
解説してるサイト見つけたら教えて.
277デフォルトの名無しさん:03/03/24 23:41
>276
CLISP FFI でぐぐったら日本のページほとんどヒットしなかった。

とりあえずperlのinline Cみたいな事をする試み?
http://www.stat.uiowa.edu/~luke/xls/projects/callback/callback.html

より高性能なcmuclのwindows-portがあれば話は早いんだろうけど、
なんで頓挫しちゃったんだろうねえ。

win2kでDrSchemeを使ってるのですが

> (* 7.0 0.1)
0.7000000000000001
> (* 6.0 0.1)
0.6000000000000001
> (* 5.0 0.1)
0.5
> (* 8.0 0.1)
0.8

というふうになってしまいます。
0.7とか、0.6にならないのはバグですか、仕様ですか?
>279
浮動小数点の精度の限界でそ
有理数が使えるのなら、それを使うのも手
質問すみません。CLISP って GUI を作成可能ですか?
GUI を作成可能なフリーの Common Lisp 処理系がありましたら教えて下さい。
すみません。
正規表現の最短マッチというのはないのでしょうか?
>>281
UNIX系だとX用があるみたい。
http://www.cliki.net/Graphics%20Toolkit
http://www.cliki.net/index
Windowsだと聞いたことないな。
cygwin経由で使うか、xemacs,xyzzyとか。
>>282
pregexpでできるよ
http://www.ccs.neu.edu/home/dorai/pregexp/pregexp.html
のマニュアルの
3.3.2 Non-greedy quantifiers
参照。
285デフォルトの名無しさん:03/03/26 15:32
>>281
LispWorksというところの処理系が教育用にフリーで(制限付きだが)開放されていた.
それはたしかGUIが開けたはず.
286282:03/03/26 16:16
>>284
ありがとうございました
287281:03/03/27 02:08
>>283,285
どうもありがとうございます。
環境も書かずに済みません。今、Mac OS X と Linux/Intel で使える Lisp/Scheme 処理系を
探していまして、次の用件を満たす物が無いかと考えています(わがままですよね・・・)。

1. 日本語文字列処理が可能
2. クロスプラットフォーム
3. GUI 作成可能
4. GUI 上で日本語表示可能
5. ネイティブコンパイル可能
6. インタープリタ上で開発可能

3 は Mac OS X, Linux/Intel 供に X Window System 上で考えています。
5 は C 言語へのトランスレータがあれば十分です。
5 の点では、調べた限り Scheme より Common Lisp が選択肢が多いようです。

教えて頂いたポインタを見た感じでは、CLISP + Garnet が良さそうな感じがしますが、既に
開発がストップしてしまっているようです。Linux/Intel は諦めて、Open MCL を使って
みようかとも考えています。取り敢えずは処理系を色々と試してみるつもりです。
どうもありがとうございました。
カッコいい
rep
CygwinでGaucheをコンパイルしようとすると
ext以下のcharconvとかuvectorとかがうまく
コンパイルできないのですが、私だけでしょうか?
gcc-2 使え。
293290:03/03/28 11:52
(=゚Д゚=))
調べてなかったすいません
逝ってきます
294デフォルトの名無しさん:03/03/28 12:30
>>290
うちはいくつかmake後のtestかなんかでエラーでたけど、
簡単な動作やった限り、特に支障はなかったよ。あんまり参考にならんか。
例のPerl.scmを公開してるページに書いてある方法に習った。
cygwinのパッケージは、一から入れ直して、Develop全部落とした。
一週間ぐらい前の話。
gcc -v
gcc version 3.2 20020927 (prerelease)
sawfish の rep で lisp の勉強をするのは邪道でしょうか?
rep って scheme だっけ?
別にいいんじゃない。ちゃんと処理系として成り立っているのなら。
和田英一って日本人ですか?
>296
ども。ドキュメントには emacs lisp と common lisp と scheme の良いトコ取り
と書いてあります。gnome が入っていれば、大抵 rep と rep-gtk もインストール
されているので、可搬性が高いかなと思ってます。
良いとこ取り = どっちつかずで言語としては・・・
ということが多い気がする
>>297
日本人じゃないの?

http://www.shiro.dreamhost.com/scheme/gauche/index-j.html

2003/3/30
Gauche release 0.6.8: メンテナンスリリース
303デフォルトの名無しさん:03/03/31 15:32
★みんなの情報局★みんなのリンク集★ココ最高★
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
http://www.pink-angel.jp/betu/linkvp2/linkvp.html
質問です
let* があれば let は必要ないと思うのですが,
必要なのですか?
関数の引数に型を追加したら、面白いと思うんですが、
こういうのを総称型っていうのかな。

(define (+ (l <number>) (r <number>)) (prim:+ l r))
(define (+ (l <number>) r) (+ l (cast <number> r)))
(define (+ (l <string>) (r <string>)) (prim:string-append l r))
(define (+ (l <string>) r) (+ l (cast <string> r)))
(define (+ l . args) (fold-left + l args))

(+ 0 "123" "456") =>579
(+ "0" 123 456) =>"0123456"
let があれば let* は必要ありません。
>304
意味違うじゃん。
(let ((x (+ x 1))(y x)) ...)
の様な時に困る。
そもそもlambdaの直呼び出しの構文唐だから、
let*より存在意義あるよ。
308デフォルトの名無しさん:03/04/02 18:16
lambdaがあるならletいらないじゃん。
>>305
こんなのどうでしょ。

(define prim:+ +)
(define-method + ((num <number>) . args)
 (apply prim:+ num
     (map (lambda (x) (if (not (number? x))
               (string->number x)
               x))
       args)))

(define-method + ((str <string>) . args)
 (apply string-append str
     (map (lambda (x) (if (not (string? x))
               (number->string x)
               x))
       args)))
>>309
文字列と数値に限定するのは、まずいんではないかと。
x->number
R5RSに無い機能の話するときは処理系書こうや。

x->numberはgauche.

引数の型によるディスパッチはCLOS系OOを持ってる処理系なら
使えるね。stklos, guile, gaucheあたり?

BOSとかいうシングルディスパッチャなOOパッケージを
マルチに改造して使ってます。結局CLOS風ということだけど。
obj.x => (slot-ref obj 'x)
obj.x := ... => (slot-set! obj 'x ...)
obj.m(x) => (m obj x)
obj.m(x).n() => (n (m obj x))
左みたいな構文糖衣のトランスレーター作りたくなる。
CommonLispならreadtableをいじればobj.x => (slot-ref obj 'x)は
簡単だし、やったこともある。
でも obj.m(x)は素直にやるとobj.m と (x)に分かれちゃうなあ。


315313:03/04/02 22:58
>>314
いや、こういう場合はreaderを完全に手作りにした方が結局早いです。
内緒ですが、うちではML風構文を読める様にしてます。
S式でいいやん
317313:03/04/03 17:14
>>316
データとしてのS式は否定しないけど、
開発効率が全然違います。
pregexp.scmを逆変換自動生成したsample
http://210.143.102.80/upload/source/d/1340.zip
この逆変換自動生成もML風言語による成果物です。
318313:03/04/03 17:15
あ、直リンしちゃったので、各自で削ってください。
やっぱり M式。
>>281
ACLはどう?
http://www.franz.com/downloads/

60日間のトライアルライセンスだけど
何回でも延長できる。
321320:03/04/03 20:48
日本語チュートリアルもあるし
http://jp.franz.com/doodler/index-j.htm
>317
> 開発効率が全然違います。

という根拠は?
「見た目」が多少違うぐらいで変わるとは思えないが
323313:03/04/03 22:18
>>322
sample見てもらえば判ると思いますが、
いくつか列挙すると、
・構文間違いがあっても特定しやすい。(適切なエラーとして検出できる可能性が高い。)エディタの補助不要。
 →S式だと括弧の対応を常に気にする必要あり。エディタの補助必要。
・ネストが減る。
 →S式だとlet多用するだけで地獄。
・意味的な違いはほとんどないので、大抵のschemeのコードなら逆変換してメンテできる。
・良く使う関数を演算子として書ける。
 string-append("a" "b" "c" ...) → "a" + "b" + "c" ...
これだけでも全然違います。
S式定数はそのまま埋めこめる様になってるんで、
移行の手間はありませんでした。
推論には縁の無い人でも,メリットいっぱいってこと?
>323
> ・構文間違いがあっても特定しやすい。(適切なエラーとして検出できる可能性が高い。)エディタの補助不要。

特定のエディタを常に使用しているのなら問題無い

> S式だと括弧の対応を常に気にする必要あり。エディタの補助必要。

エディタの補助があるから括弧を自分で気にする必要が無い。

> ・ネストが減る。
> →S式だとlet多用するだけで地獄。

インデントレベルが違ってみえるだけでは?
インデントルール次第でなんとでも

> ・良く使う関数を演算子として書ける。
>  string-append("a" "b" "c" ...) → "a" + "b" + "c" ...

(define s+ string-append)
としても同じようなものだし、構文すらいじっていない。


結局、好みの問題ということでは?
どれも S式を凌駕するような特徴には思えないんだが
>>325
勝手に作れば?という突っ込みは無し?

>>323
>> ・構文間違いがあっても特定しやすい。(適切なエラーとして検出できる可能性が高い。)エディタの補助不要。
>特定のエディタを常に使用しているのなら問題無い

こ、答えになってないよ

>結局、好みの問題ということでは?

結局これでしょ。

>どれも S式を凌駕するような特徴には思えないんだが

ある意味で判るが、明確な根拠は?
>326
>>> ・構文間違いがあっても特定しやすい。(適切なエラーとして検出できる可能性が高い。)エディタの補助不要。
>>特定のエディタを常に使用しているのなら問題無い
>こ、答えになってないよ

つまり、エディタが面倒なとこは補助してくれる、ってこと


>>結局、好みの問題ということでは?
>結局これでしょ。

>317 では
> 開発効率が全然違います。
といっているのだが? まるで根本から違うかのような書き方をして。


>>どれも S式を凌駕するような特徴には思えないんだが
>ある意味で判るが、明確な根拠は?

データとプログラムの表現が同じであるということ。
それ以外は 「見た目が多少違う」 程度だし。
あなたのいう 「ある意味」 とは?
喧嘩するなや
329324:03/04/04 19:03
で,このスレの方々は ML を便利に使っているってことなの?

それとも,そういうのが専門の人だけ?
S 式をやめると、簡単なマクロしかかけなくなりそうな気がするけど、どうなんでしょうか?
分野にもよるけど、マクロがまともに使えないと開発効率は下がる気がする。
>>313 いいなあ. すごくいいなあ. 公開してくれないの?

今でも一番愛する言語は scheme だけど,
a.foo(x).bar(y).baz(z)[i]
の味を覚えてしまって,
(list-ref (baz (bar (foo a x) y) z) i)
が正直ちょっとつらく…
>>330 別に S 式をやめるわけじゃないんでしょ?書きやすいように
見た目を変換してるだけで。
333326:03/04/05 02:02
>>327
>つまり、エディタが面倒なとこは補助してくれる、ってこと
いや、だから。つまり313=323さんは、S式を快適に使うには
エディタの補助が必要という点が、欠点だと言ってるのでしょ?
それを327さんは反論?としてエディタの補助が有れば良いというのが
それでは313=323さんの発言を認めているんじゃ・・・・ということです。

それとも私が勘違いしている?
>>332
「S 式は開発効率が高いか否か」という話をしているのでは?


エディタの補助についての議論は、正直どうでもいいんですけど、

S 式を採用している Lisp が他の言語と比べて開発効率が高い理由の 1 つは、
マクロを使って、ユーザが新しい構文を作ったり、対象としている問題に
適した言語を作ったりできることだと思うので、

S 式をやめて ML 風の記法を採用することによって、 >>327 の言う

> データとプログラムの表現が同じであるということ。

が失われてしまうと、マクロによる利点がなくなってしまい、
得るものより、失うもののほうが大きいのではないかと思います。

もちろん、対象とする問題によっては ML 風の記法のほうが開発効率
が高いことはあるでしょうが。
335313:03/04/05 10:00
色々と誤解がある様ですが・・

自分としてはデータ表現のS式は有効だと感じてますが、
コードにまでそれを強制する必要はないと思ってます。
S式を捨てるというわけではないです。
(というか、S式にかなりの部分依存してます。)
それと、S式の出力が欲しい時はいつでもexpandできるので、
逆変換してもcondとか以外は元通りになります。

繰り返しますが、エディタの補助がいらないのは十分なメリットです。
いつでもemacsなどを使える状況とは限らないし、
メモ帳しか知らない人でも楽に記述できます。
S式と比べて、記述したり修正する時間はだいたい半分以下です。
336313:03/04/05 10:01
>>334
マクロも普通の関数と同様に定義できます。
(基本的に評価規則は変化しない)
ただし、今のところ目的コードはS式なので、
LISPのマクロを書く感覚とまるっきり同じです。

//同一タグのリスト木をまとめる関数
define flat-tag (tag, totag, s) =>
let loop (x=s, r='()) in
if pair?(x)then
if tagged-list?(car(x), tag) then
loop(append(cdar(x), cdr(x)), r)
else loop(cdr(x), cons(car(x) , r))
else `(,totag ,@(reverse r));
//ネストするstring-appendをまとめるマクロ
define-macro +s x => flat-tag('+s, 'string-append, x);

このままでも関数形式で使えますが、
+s("a", +s("b", +s("c", "d")));
-> (string-append "a" "b" "c" "d")
=> "abcd"

これを2項演算子として登録すれば、
"a" +s "b" +s "c" +s "d";
-> (string-append "a" "b" "c" "d")
=> "abcd"
となります。(+を総称化してれば不用ですが)
M式にいろいろつけたしたようなものか?
>>313
Dylan風味?

確かにemacs使えない環境で編集しなくちゃならいときS式は辛い。
しかし逆にemacs使える環境では、\M-\C-tとか\M-\C-SPCとか
使いまくるとめちゃくちゃ効率が良くてもう戻れない。


339334:03/04/06 03:30
>>336
理解しました。確かにメモ帳で S 式書くのは大変です。
メモ帳しか知らない人が開発にかかわるなんてことありえるのか?
>>340
メモ帳(程度の編集環境)しか使えない環境というのは有り得るんでは。
クライアントの手元のPCで設定直すとか。
結局、>>317
> 開発効率が全然違います。
というのは、まともなエディタが無い、という通常はまず無いような状況を
あたかもよくある状況であるかのように前提を設定した場合、ということ?
メリットはだいたいわかった。
つーかS式は元々人間には読みずらいから、こういうフロントエンドを
作るってのは有効だろう。(ただGuileのC-likeはやりすぎな気がする。
あっちはS式捨ててるし。)
CommonLispやEmacsLispでもこういうのがあればいいな。
読むのに関しては、S 式は余計な記号が無くて頭に入りやすいと思うよ。
345デフォルトの名無しさん:03/04/06 17:24
Mac OS X の LispWorks のベータテストが始まったみたいだけど、
LispWorks ってどうよ?
Personal Edition はダウンロードしてみたんだけど、
使い込んでいる人の感想希望。
やっぱ、ACL よりはしょぼいのかねぇ。
誰かCMUCLをWindowsに移植してくれ
>>345
>やっぱ、ACL よりはしょぼいのかねぇ。
そういう事は試してから言え
M式 マンセー
sexp を捨てたら何が残るというのだ
S式読みやすいか?
実際のところXMLのタグ記法よりはマシって程度じゃない?
pretty-print必須だし。
そういやPaulGrahamが新しい方言作ってたみたいだけど、
結局S式が枷になってる風に見えたよ。
XML と比べれば遥かにマシだし、
pretty-print が必要なのはS式に限らず、ほぼどんな構文でも同じだし

少なくとも、わしにゃ1番読みやすい
mexp って、あんまり list 使わないような処理ならきれいに書けそうだけど…
list 処理多用するようなとこだと、かえって読み書きがつらそうな感じがした。
mexp 派の人はそうでもないのかな?
353デフォルトの名無しさん:03/04/08 16:56
mexpって何?
M式じゃない?
たしかmeta expression
なんでいきなりM式とやらの話になってんだよ
って、>>348か。マンセーならM式を説明してみろ
>>355
ほれ
ttp://www.em.edu.waseda.ac.jp/~moriya/education/CAI/infomath3/LISP.pdf

>>352
Lispだってリスト表現は、ドット表現を変換したものだし・・・
だいたいM式もS式も相互変換可能だし・・・
見た目や書きやすさ印象は別にして強さは、一緒のはず
M式の処理系紹介しる
>>356
そのリンクの内容じゃ説明になってないだろ。
そもそもM式をそこで使う意味がわからん。
>>356
うん、もちろん強さは同じだから、見た目とか書きやすさの問題として。
defun とか cond とかは楽しいんだけど…
セミコロンも、 S式の括弧みたいに、慣れれば気にならなくなるのかな…
M 式だとマクロはどうなるの?
つーかM式が何に使う物なのかわかんないんだけど。
M式言ってる人は、使ったことあるの?
最近は M式を勉強しないのか?
昔の教科書はかならずM式も書いてあったね。
でもウィンストンの本がはやってS式だけになった。
結局理論より実用優先。

364デフォルトの名無しさん:03/04/09 08:16
M式な処理系?
MLとかHaskellってM式じゃなかった?

Lispとは大分ちがうけど
365かおりん祭り:03/04/09 08:18
http://www.saitama.gasuki.com/kaorin/

  〜oノノハヽo〜
     ( ^▽^)/⌒\                       , −-
     ((ニ[二=(  こんなのがございま−−==≡≡す♪  ))
   /∧=:||  \_/                       `ー‐‐'
     じ/___/
>>364
ぜんぜん違うだろ。
適当な事言うな。
schemeって慣れるとほとんどcall/cc使わないね。
CPSで書くときもidentityあればいいし。
368デフォルトの名無しさん:03/04/09 18:46
LISPやってみたいんですが、お奨めの処理系ってなんですか?
自作しる
>363
理論って?
実用って?
具体的には何をさしてるの?
>>368
xyzzy
emacs
で慣らすとか。
>>370
>理論って?
純数学とか基礎論とか透明参照性とか・・・
>実用って?
手続きとか副作用とか構文糖とか・・・・

てっところ?みんなは如何思う?

>>368
schemeだけどDr.Scheme
へぼいけどbiggnerモードのstepperは魅力的
"プログラミング言語shceme"よんでるんだけど、call/ccがさっぱりわからん。
>>373
簡単に言うと、call/ccで渡された継続を関数形式で呼び出すと、
いつでもその継続を取得した直後に制御が移る、
でいいんじゃないかな。
375368:03/04/09 22:00
いままで過去ログ読んでましたが、
このスレ的にはschemeというのが優性っぽいですね。
違いがまだちょっとわからないですけど。
>>373
簡単に言えばスレッドみたいなもんだ。
(call/ccの実装でスレッドを使っているものが多いし)

call/ccでスレッドを停止し、そのスレッドを返す。
もちろん受け取ったスレッドは、何時でも(元の環境下で)再開できる。
>376
> 簡単に言えばスレッドみたいなもんだ。

違うし
継続は継続であってスレッドではない

継続を用いてスレッド (というかコルーチン) を実現することは可能だが、
それは本質ではない。
このあたりはちゃんと理解しておいた方がよい。たとえあまり使わないとしても。
昔のWindowsやMacの協調型マルチタスクと同じ様な事ができる。
>>377
>違うし
そのとおり。
>継続は継続であってスレッドではない
名前が違うし。(藁

判らん人に理解を促そうとしてるのに、変なツッコミ入れるね。
数学屋なの?
>>379
s/理解/誤解/ であろ。
人にものを説明するスキルがないと思われ。

382377:03/04/10 12:11
>379-380
たんに指摘しただけで一切説明はしようとしていないし
指摘だけして自己満足するオナニーならよそでやってちょ
嘘つきさん一所懸命ですね。
話がこんがらがっているように思えてならないのだが
具体的にどこまでわかってどこがわからんか言わないと
>>373 以上のレスは出ないような。
387379:03/04/10 18:45
>>382=377
>>379-380
>たんに指摘しただけで一切説明はしようとしていないし
で、何を指摘したかったの? 0文字以上1文字未満で答えよ。

>>380
>s/理解/誤解/ であろ。
Lisperがperl使うなー。

>人にものを説明するスキルがないと思われ。
そかも。消えます。
388デフォルトの名無しさん:03/04/10 18:56
結局継続とは?
>>388
>>374

アセンブラのjump先のラベルみたいなもの
あ、それと、
その時点でのスタックの中身
>>387
>>s/理解/誤解/ であろ。
>Lisperがperl使うなー。

これが perl?
379は知らんくせにいらん事書きすぎ
突っ込まれたいとしか思えない
393381:03/04/10 20:40
スルーされた・・・?
ヒットした 16 件を全部読んだら継続について理解出来るはず。
それでも駄目だったら gauche-devel-jp の過去ログを見れば幸せになれるよ。
394374:03/04/10 22:00
(+ 2
(call/cc
(lambda (k)
(* 5 (k 4)))))
⇒6

kに継続が入るらしい。

kを関数に見立て引数をいれることにより、call/ccの返り値を決定できる。

(+ 2 4)になり6になる。
と理解しました。

(call/cc
(lambda (k)
(* 5 4)))
⇒20

kに継続がはいるらしい。

kは特に使われていない。

call/ccの引数として与えられた、(* 5 4)を返す関数が実行され、call/ccの返り値になる。
395374:03/04/10 22:01
続き。

(let ((x (call/cc (lambda (k) k))))
(x (lambda (ignore) "hi")))
⇒"hi"

…わかりません。
どうやら、xに継続?が入るらしいのですが・・・。

(((call/cc (lambda (k) k)) (lambda (x) x)) "HEY!")
⇒"HEY!"

…謎。

こんな感じですが、よきアドバイス期待しております。
396373=394=395:03/04/10 22:16
>>374でなく>>373でした。
(let ((x (call/cc (lambda (k) k))))
(display x)(newline)
(x (lambda (ignore) "hi")))

とかで x の束縛を表示すると理解しやすいかもしれません。
((((call/cc call/cc) call/cc) call/cc) call/cc)
(((call/cc (lambda (k) k)) (lambda (x) x)) "HEY!")
kに継続が渡されてkを返してる。
((k (lambda (x) x)) "HEY!")
(k (lambda (x) x))で現在の継続を消して元の式の
(call/cc (lambda (k) k))を(lambda (x) x)で置き換える。
(((lambda (x) x) (lambda (x) x)) "HEY!")
((lambda (x) x) "HEY!")
"HEY!"
(let ((x (call/cc (lambda (k) k))))
(x (lambda (ignore) "hi")))
xに継続が渡される。
(x (lambda (ignore) "hi"))で元の式の
(call/cc (lambda (k) k))を(lambda (ignore) "hi")で置き換える。
(let ((x (lambda (ignore) "hi")))
(x (lambda (ignore) "hi")))
((lambda (ignore) "hi") (lambda (ignore) "hi"))
"hi"
401デフォルトの名無しさん:03/04/13 00:57
clisp, cmucl, gcl, acl
みなさんどれを使ってますか?
aclはちょっと高いから別物だとしても
他の三つの違いがいまいち分りません。
clisp はネイティブコンパイル出来ないんじゃなかったっけ?
>>401
gcl の開発って続いているの?
GNU では gcl よりも clisp が良さそうだけど.
R5RSに、mapはあってもfilter, foldl, foldr, zip, etc.が無いのが意外。
もっといろいろあってもいいと思うのに。
>404
SRFI-1
406404:03/04/14 00:40
>405
どうも。助かりました。
407デフォルトの名無しさん:03/04/14 03:17
で結局、継続の話はどうなった?

例外以外に使えるネタは無いのか?
良いイディオムは無いのか?
誰か教えて。
ケント デイヴィグの本に継続を使ったマルチタスクのサンプルが出てたよ。
ところで、schemer はアプリを配付したい時どうしてるの? まずは処理系をインスコしてね
だと、場合によっては面倒だよね。
ネイティブコードにコンパイルする処理系なら、大抵スタンドアロンバイナリが作れるんじゃない? BiglooとかStalinとか。
>>407
継続という概念が登場してきた歴史を勉強してくらさい
そうすれば、その存在理由もわかりまっす
>>409
Scheme48系はイメージを作って配布できるっぽい。
イメージとコアの2ファイルがいる。
CPSで副作用レスプログラミング
414407:03/04/14 18:06
>>411
馬鹿なので判りません。
出来れば教えてください。
>>407
「継続の使い方」
http://www.ice.nuie.nagoya-u.ac.jp/~h003149b/lang/block.html
というのがあった。
内容はコルーチンどまりだけど。

>>414
継続の歴史は、
Reynolds "The Discoveries of Continuations"
をがんばって読もう。

>415
コルーチンの例が set! 使っててイヤン
417デフォルトの名無しさん:03/04/16 12:21
5月頃に行われるCommon Lisp, CLOSの最新動向に関するセミナーの
情報キボンヌ
書類どっかにいった…
lispってデバッグやりにくいなぁ
追跡の仕方が下手なだけじゃないのか?
>418
どこらへんが?
トレースとかのデバッグ機能が普通はあるはずだが。
関数単位のテストが簡単にできたりとかもするし。
>>420
どの処理系使うかでぜんぜん違うでしょ。

普通なんていう言葉は、正確には定義できないので
使わないようにしましょう。
>421
だからこそ「普通は」といってるわけで
423Scheme 大好き:03/04/16 23:59
アンケートです。うざかったら無視して下さい。

1. 現在使っている処理系は何ですか?
2. その処理系でどんなプログラムを作っていますか?
3. 今までに Lisp/Scheme 処理系を自作した事がありますか?
4. :3 が yes の方は、どんな言語で実装しましたか?
5. :3 が yes の方は、その処理系にはどんな独自拡張をしましたか?
6. Lisp/Scheme の OO 拡張はよく使用する方ですか?
7. 今、一番イケテルと思う Lisp/Scheme 処理系は何ですか?
8. Lisp/Scheme 以外はどんな言語が好きですか?
9. ML/Haskell/Miranda/Clean/Dylan の内、幾つの言語の経験がありますか?
10. :9 で挙げた言語より、Lisp/Scheme を選んだ (?) のは何故ですか?
424デフォルトの名無しさん:03/04/17 03:53
schemeで、#\newlinrとかスペル間違えた場合、
エラーなのか、文字#\nとシンボルewlinrに分けるべきか、
どっちが正しいんでしょうか?
>>424
If <character> in #\<character> is alphabetic, then the character
following <character> must be a delimiter character such as a space or
parenthesis.

ttp://www.schemers.org/Documents/Standards/R5RS/HTML/r5rs-Z-H-9.html#%_sec_6.3.4
426山崎渉:03/04/17 15:13
(^^)
427デフォルトの名無しさん:03/04/17 18:20
>>424
ChezSchemeはエラー
LispWorks のIDEのリスナーでは、#\あ => #\あ と評価されるんだけど、
ILISP では #\あ => Error: Wrong character name: あ. とエラーになる。
どうしてだろう?
429デフォルトの名無しさん:03/04/19 16:31
>428
日本語に対応してないってだけでわ?
431山崎渉:03/04/20 02:57
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
432山崎渉:03/04/20 03:38
   ∧_∧
  (  ^^ )< ぬるぽ(^^)
>>417
苫米地ちゃん来るのかにょ?
>> 430
どうやら、コンソールだとだめっぽい。
load すれば大丈夫だから、*terminal-io* が日本語だめなのかも。
日本語使うときはILISPあきらめて、IDEかな。
435デフォルトの名無しさん:03/04/21 19:20
schemeマンセー
TinyScheme万世
437デフォルトの名無しさん:03/04/23 04:20
LISPって意外と速いね。
メモリ消費しまくりだと思った。
((lambda (x) (display "ナンカ") (x x)) (lambda (x) (display "ネタカケ") (x x)))
vi for schemer. ちょっと感動した。

www.ksky.ne.jp/~sakae/sicp/schemers-vi.html
'#'のreaderを拡張して、C言語のプリプロセッサ(cpp)風に

#if 条件式(S式)

#else

#endif

を書ける様にするのはどうでしょうか?
cppと違い、#ifの条件式にlispやschemeのS式を直接書ける利点があります。
それに、ブロックコメントの#|〜|#と同じ様に、切りだし規則が
S式と分離してるので、
(if 式
 (define hoge 〜)
 (define hoge 〜))
の様に、括弧の数を合わせたりする必要がない。
(define hoge
#if (eqv? version ...)
〜)
#else
〜)
#endif
自分の処理系にhookとして入れてありますが、
開発のバージョンで切り分けるときなどに重宝してます。
あと似た様な拡張で、
#q/〜/
で文字列引用符の切り替え(この場合#\"→#\/)、
#<<END

END
でperlのヒアドキュメントなど。
>>441
普通にifやcond使えばいいだけで魅力はないな。
文字列引用符切り替えやヒアドキュメントイイ!キボンヌ!
>>441
これはよさそうだね。
CommonLispの場合はマクロ文字で似たような事はできる
(ただしあくまでも文字なので#if〜とは書けない)と思うけど、
schemeだと処理系に依存してしまう状況だからねぇ。
>>442のヒアドキュメントも欲しい。
SRFI辺りに取り込んでもいい気がする。
Gaucheもこういうの入れてくれないかな。
ヒアドキュメントはchickenとscshにもあるね。
プリプロセッサ的なものはあってもいいけど(マクロでできるけど組み込みであると便利)、漏れはカッコの対応をエディタまかせなんで、対応がとれなくていいってのはあんまりメリットないなあ。
伝統的にやるならCommonLispの #+ と #- だろうけど、あれはあれで見にくい。

447デフォルトの名無しさん:03/04/26 10:25
ドット'.'って2個以上並んでるならシンボルにしていいんですか?
Petite Chez Scheme Version 6.0a
> '.
Error in read: unexpected dot (.).
> '..
..
> '...
...
> '....
....
> '.....
.....
> '.emacs
.emacs
ちょっと謎。
あと、
> '|.|
|.|
> '|..|
..


> '||
||
> (define (|| x) x)
> (|| 1)
1
縦棒|をシンボルとして使いたいんですが、そういう場合はどうすれば?
R5RS says:
>[ ] { } |
> Left and right square brackets and curly braces and vertical bar
> are reserved for possible future extensions to the language.
449デフォルトの名無しさん:03/04/28 01:17
qschmeってインタプリタにしては速いナー。
      fib[sec] tak[sec]
C       0.15   0.07
qschme   1.13    0.7
JRuby   415.35  173.89
Ruby    14.63   6.32
http://ruri.csys.ce.hiroshima-cu.ac.jp/~masato/diary/2001/09/
qscheme は indirect threaded code だっけ。
でもちょっと実装がアレだった記憶が…
451デフォルトの名無しさん:03/04/28 01:36
そうなんだ。
もったいないね。
たぶんPetiteとタメ張れるインタプリタってこれぐらいじゃない?
実装がアレってなーに??
http://www.abstractnonsense.com/schemix/
linuxに組み込みだってぽ
/dev/schemix にワラタあげ
システムに組み込むって、/dev/ から利用できればいいのかよ(w
すんまそん.勉強中ですが教えてください
(define (rotate-one n) (modulo (+ n 1) 4))
(define (rotate path)
(if (null? path) path
(append (rotate (cdr path))(list (rotate-one(car path))))))
(define (inverse-one n) (modulo (+ n 2) 4))
(define (inverse path)
(if (null? path) path
(cons (inverse-one (car path))
(inverse (cdr path)))))
(define (dragon-one path)
(if (null? path) path
(append (inverse (rotate path)) path)))
(define (dragon n)
(if (= n 0) '(0)
(dragon-one (dragon (- n 1)))))

(dragon 10)
standard input:82:7: In procedure if in expression (get-canvas-status drg):
standard input:82:7: Stack overflow
ABORT: (stack-overflow)


stack-over-flow になるのはなんででしょう?
もしかして rotate とかって末尾再帰にはなってないんでつか
(define (my-rotate path)
 (let loop ((path path) (acc '()))
  (if (null? path)
    acc
    (loop (cdr path)
       (cons (rotate-one (car path)) acc)))))
(define (my-inverse path)
(let loop ((path path) (acc '()))
(if (null? path)
(reverse! acc)
(loop (cdr path)
(cons (inverse-one (car path)) acc)))))
例えばこんなんどうでしょ。

1) リストの後に1個ずつ append するループ
2) リストの頭に1個ずつ cons して最後に reverse(!)

1)は効率がとても悪いです。何故でしょう?
>>456
全部末尾呼び出しになってないよ
>>456
(define (rotate path)
(rotete-rec path ()))

(define (rotete-rec path rest-path)
(if (null? path) rest-path
(rotete-rec (cdr path)
(cons (rotate-one (car path)) rest-path))))
460456:03/04/30 00:49
456です.レスありがとうございます.
勉強になるです.

>>457
append するのにリストの尻までたどらなければならないけど
reverse する場合はそれが一回でいいから?

>>458
関数の一番最後のカタマリの中にさえ
呼び出しがあれば末尾だとおもいこんでますた……
軽く首つってきます

>>456
カコイイですアリガトウゴザイマス
map使ったほうが簡潔に書けるよ。
(define (rotate-one n) (modulo (+ n 1) 4))
(define (rotate path) (reverse (map rotate-one path)))
(define (inverse-one n) (modulo (+ n 2) 4))
(define (inverse path) (map inverse-one path))
(define (dragon-one path) (append (inverse (rotate path)) path)))
(define (dragon n)
(if (= n 0) '(0)
(dragon-one (dragon (- n 1)))))
(define (dragon-one path)
(append (reverse (map (lambda (n) (modulo (+ n 3) 4)) path)) path))
(define (dragon n)
(if (= n 0) '(0)
(dragon-one (dragon (- n 1)))))

こんなのも書いたけど。
(define (dragon-one path)
(let loop ((a path) (b path))
(if (null? a) b
(loop (cdr a) (cons (modulo (+ (car a) 3) 4) b)))))
463456=460:03/04/30 01:47
>>460
s/>>456/>>459/
もー死にたい……
これはどうだろう。(dragon 10)は一緒だったけど・・・。
(define (dragon n)
(if (= n 0) '(0)
(apply append (map (lambda (n) (if (odd? n) (list n (modulo (+ n 3) 4))
(list (modulo (+ n 3) 4) n))) (dragon (- n 1))))))
465デフォルトの名無しさん:03/05/01 05:51
どう、って何が?
ちなみにそれも末尾呼び出しになってない。
466464:03/05/01 09:55
再帰パターン探してたら出たんだけど、本当に正しいか解らないから誰か証明してよ
ってぐらいの意味だったんですけどね。
最近は末尾再帰でなくてもいいや、動けばいいやって感じです。

(define (dragon n)
 (let loop ((n n) (r '(0)))
  (if (= n 0) r
    (loop (- n 1) (apply append (map (lambda (n) (if (odd? n) (list n (modulo (+ n 3) 4))
(list (modulo (+ n 3) 4) n))) r))))))
いつの日にか自動的に変換してくれますように。
468デフォルトの名無しさん:03/05/01 17:49
LISPでOOが流行らないのは、構文のせいですよね?
いいえ。
470デフォルトの名無しさん:03/05/01 18:16
schemeってなんて読むんですか?スチェメでいいんですよね?
スキーム
LISPはリスピーでいいんですよね。
リスプ
リス(プ
CLOSベンキョするのに良い文書しりませんか?
477デフォルトの名無しさん:03/05/04 03:58
schemeスゴーと思った。けど、
同時に括弧がマズーと思った。
>477
そう思って ML とか Dylan とか使ってみたけど、今度は逆に括弧が無いのが気になった。
Lisp/Scheme のコードを沢山読んでると括弧が無い方が変に見える。俺おかしいかな?
カッコなんて気にならなくなるよ
480デフォルトの名無しさん:03/05/04 04:05
そうですか。
昔のPC板でLISPの話されてますた。
Z80でLISP動いてたのか。

Oh!MZにお世話になった人のスレ
http://pc.2ch.net/test/read.cgi/i4004/1009098920/
lis?
=> #f
Linux Zaurusで、guileコンパイルしてみました。
これでついに胸ポケットにScheme。
Palm でも Windows CE でも Scheme は動いたりする。しかし Palm は文字コードが
Shift JIS なせいで日本語は厳しかったような。
Scheme コンパイラが欲すぃ。トランスレータじゃないやつ。
バイトコードコンパイラじゃないやつ。日本語が通るやつ。
>>486
素人なのでよくわかりませんが、
Cにコンパイルできればいい?
それともアセンブラ吐くやつ?

Cにコンパイルという事であれば、
(define (b n)
 (if (> n 0) (b (- n 1))
  #t))

の場合、

toplevel_b(n) {
b:if (n > 0) {
  n = n - 1;
  goto b;
 }
 return true; //#t
}
みたいなコードが吐ければいいのかな。

クロージャーを返したりするメカニズムはどうすんのだろ。
環境へのポインタと関数アドレスを一緒に返す?
末尾呼び出しされる関数だと、call/ret前提の関数じゃダメだから、
ラベルのアドレスを返すのかな。
アセンブラで考えると、基本的にcall/retはトップレベルから下は
使えない様な。
あ、トランポリンにして、末尾の式を特別扱いすれば作れるかも。
>487
私も素人ですが、トランスレータと書いたのがそれです。Chicken とか Stalin とか PLT
のとか Bigloo とか、ネイティブコードを作れる処理系は大抵 C にコンパイルしてから
ネイティブコードにコンパイルします。

Chez 欲しいなと思ってるのですが、Chez って日本語通りますか?
あと、Google で検索すると、Mac OS X 版の Chez があるような記述があったのですが、
実際に購入可能なのでしょうか? 購入する際は各プラットフォーム毎に課金されるの
ですか?
490デフォルトの名無しさん:03/05/06 04:38
>>489
Petite Chez Scheme Version 6.0a
を見る限りでは、|〜|で囲めば日本語のシンボルとか使えるみたいよ。

(define |加算| +)
(define |減算| -)
(define |より小さい| <)
(define (|フィボナッチ| n)
 (if(|より小さい| n 2) n
  (|加算| (|フィボナッチ| (|減算| n 1)) (|フィボナッチ| (|減算| n 2)))))
(|フィボナッチ| 30)
=>832040

これを使えるというのかは知らないけど。
491デフォルトの名無しさん:03/05/06 04:43
文字列に変換しても、
ちゃんと0x5cがエスケープされる。

> (symbol->string '|ソース表計算|)
"ソ\ース表\計算"
> (let ((s (symbol->string '|ソース表計算|)))
(eq? (string->symbol s) '|ソース表計算|))
#t

少なくとも可逆ではある。
ただし、

> (char->integer(string-ref (symbol->string '|ソース表計算|) 0))
131
> (char->integer(string-ref (symbol->string '|ソース表計算|) 1))
92
インプリメンタが一番手を焼くのは、
callback関数内での上位継続呼び出しじゃないだろうか。
stacklessにしても特別扱いしなきゃならない問題。
http://java.sun.com/features/2003/05/steele_qa.html

common lispといい、この人って言語仕様でかくするのが趣味なのか?
>>494
言語仕様とライブラリの区別はつくか?
ライブラリが言語仕様に含まれるか否か?
497マ板ハゲスレ住人:03/05/06 14:01
ACLの入門書とかで有名な、
ポール・グラハムの写真ありませんか?
498デフォルトの名無しさん:03/05/06 14:04
Steeleは、初期のSchemeに著しい貢献があるから、
「言語仕様でかくするのが趣味」ってことはないわな。
「lambdaがあるならletいらない(>>308)」schemeコンパイラの論文もあるし。

Common Lispについては、Steeleの考えだけでつくった仕様じゃないし…
MLの意見を集約していて爆発しちゃったんでしょう。
本人も今やり直すんなら修正したい点を井田さんのインタビューで答えてるしね。

500マ板ハゲスレ住人:03/05/06 14:12
>>499
おお、ありがとう。
生意気そうなツラですね。
フサフサかー
>>495
generic types, operator overloading, and constant classes

これはライブラリか?
>>501
その辺りはガイ・スティールの趣味というより、世間の要請だ─ね。
C#だって同じ拡張を試みてるもんね。

しかし、VMといい、GCといい、genericsといい、Lisp屋は先見の明がありますな─(w
俺はギュイなんだとおもってたよ。
>>496
文法には含まれないけど、仕様には一部のライブラリが含まれると思う。
505504:03/05/06 16:53
ありゃ、ここLispスレだった。
標準ライブラリがあるかどうかもしらん(^^;
なんか微妙にSmalltalkスレとシンクロしてておもろい(笑)
>>506
見てきた。禿げと言語/ライブラリですか…

あっちでは環境を抜きに言語仕様を語れないと妙に力説している人がいるけど、
一度考えてみたらいいんじゃないかと思う。(しかも肌で感じるだとよ…)

Lispの世界では、その結果SchemeとEuLispという成果があるわけだし。(ISISPも?)
>>507

ハゲフェチの人で気付いたわけですが(w
お互い影響を与えあってたのは事実だろうし(この辺どっち側からも文句つけられそうだが)、
一度そういう視点でみても罰はあたらんかな?とお気楽に考えちゃうのはネイティブじゃないから
なんだろうなぁ?と。

>あっちでは環境を抜きに言語仕様を語れないと妙に力説している人がいるけど、
>一度考えてみたらいいんじゃないかと思う。(しかも肌で感じるだとよ…)

たぶんGNUsmalltalkとかSmallScriptとかを引きあいに出した人もそういう感じなんだろうかな?と
好意的に解釈してみるのだが、肌で感じる部分がやはり入り口に立ってる人間に宗教臭いと思わせる
部分なのかな?>Smalltalk。

でもこの辺考えて見るとおもろいね。ちといろいろ遊んでみようかという気になってきますたよ。
509デフォルトの名無しさん:03/05/08 12:02
cygwin下で、

#!/usr/local/bin/scheme

;;日本語のコメント

(display '日本語も表示できます)
(newline)

;;EOF

スクリプトを書いて、
スクリプトの一行目にインタプリタのパスを書いて、
パーミッションを与えて、
実行すると、
実行できる。
日本語もバリバリ。

ができるスキームってどれですか?
>>499
ウホォ、いい男・・・
cygwinってパーミッションあるんだ。
Gaucheはどうなの?
>スクリプトの一行目にインタプリタのパスを書いて、
>パーミッションを与えて、
>実行すると、
>実行できる。

どれでもできる。
513デフォルトの名無しさん:03/05/09 04:06
>>512
はやく教えろハゲ
514_:03/05/09 05:02
>>513
tinyscheme
516_:03/05/09 08:01
517_:03/05/09 09:27
518_:03/05/09 10:54
519bloom:03/05/09 11:13
(defun a)であきらめた。
そうですcar
522_:03/05/09 12:21
523_:03/05/09 13:47
524_:03/05/09 15:14
ウゼエ
526_:03/05/09 16:40
(cdr ねえ)
それは「くだらねえ」って読むんですか?
それは「くだらねえ」って読むんですか?
それは「くだらねえ」って読むんですか?
それは「くだらねえ」って読むんですか?
それは「くだらねえ」って読むんですか?
それは「くだらねえ」って読むんですか?
それは「くだらねえ」って読むんですか?
それは「くだらねえ」って読むんですか?
それは「くだらねえ」って読むんですか?
それは「くだらねえ」って読むんですか?
それは「くだらねえ」って読むんですか?
それは「くだらねえ」って読むんですか?
懐かしいな。前スレだっけ?

ttp://www.ksky.ne.jp/~sakae/sicp/cont.html
>>528 再帰で書けよヴォケ
LISPでWiki書こうとしてるんだけど、クロスサイトスクリプティングの防ぎ方が
分からん・・・
532デフォルトの名無しさん:03/05/10 13:48
Perl でいう pack, unpack のようにバイナリデータを読んだり書いたりしたいんですが、
Lisp では通常どーやるもんなんでしょうか? Common Lisp でも Scheme どっちでもいいから
教えて〜
栗鼠腐厨
金銀パールプレゼントスレはここでふか。
>>532
漏れもよく知らんが、この辺を調べれば判ると思う。
(open path :ENCODING :binary)
(open path :element-type 'unsigned-byte)
(read-char) (write-char)
(read-byte) (write-byte)
調べてみたら、それしか無かったんでもしやと思いましたが…。では4バイト整数を
読むときは、read-byte, read-byte, read-byte, read-byte で読んで、shift して数値を
足しこんでいくしかないんですね。
あぁ、途中で送っちゃった。結局、pack モドキを自作してお茶を濁す事にしますた。
:element-type (unsigned-byte 32)
539デフォルトの名無しさん:03/05/13 15:05
Allegro Common LispのEnterprise Platinumの価格っていくら?
http://jp.franz.com/base/map_packages.html
540デフォルトの名無しさん:03/05/14 01:59
1700万じゃなかったかな。
小俣ちゃんから送られてきたメール会社で確認してみるよ。
541デフォルトの名無しさん:03/05/14 13:07
ネイティブコードに変換したLISP
ちょー速い。
>>541 なになにそんなに凄いの?もちっと具体的に自慢汁!
543540:03/05/14 23:38
訂正:サイトライセンスで1600万円也でした。
CLIMとかAllegroStore永久ラインセンスとか追加してくと2000万くらいには軽く手が届きますな。
544あぼーん:あぼーん
あぼーん
545デフォルトの名無しさん:03/05/15 21:37
なかなかですな
1600万円とはびっくり。
547デフォルトの名無しさん:03/05/17 00:12
1600万円かぁ。うへぇ。いくら速いとはいえ…
Allegro ODBC使うだけの方がいいかぁ。
これだとEnterpriseかぁ。
これも高いのかなぁ?
548540:03/05/17 01:34
Windows/Linux/FreeBSD/MacOSX
Professional 750,000
Enterprise 1,400,000
Platinum 2,000,000
CLIM 365,000

Sun/IBM/SGI/HP/Compaq(32bit)
Professional 1,300,000
Enterprise 2,000,000
Platinum 2,750,000
CLIM 365,000

Sun/IBM/SGI/HP/Compaq(64bit)
Enterprise 2,300,000
Platinum 3,200,000
CLIM 365,000

Site License
Professional 8,500,000
Enterprise 11,500,000
Platinum 16,000,000
CLIM 3,000,000

AllegroStore Permanent License
AllegroStore Server 1,400,000
AllegroStore Client 500,000

サイトライセンス以外は上記×ユーザ人数分なり。たけぇ〜。
ODBCぐらいは欲しいな。
ということは、enterpriseかよ。
・・・自作すりゃいいのか?
そもそも、professionalに配布向け一式?が無いのはおかしいって。
アレグロさんよー
10万ぐらいに負からんか?アレグロさんよー。
551sage:03/05/17 02:18
新日鉄がぼったくってんじゃないのかという気がしないこともない。
米国Franz社から直接購入した場合のお値段キボンヌ。
Lisp処理系なんて他にたくさんありそうだけどな。
Cコンパイラなんて他にたくさんありそうだけどな。
ただでさえマイナーなLISPが、ここまで高いと・・・
うぉぉ、ひょっとして、Windows/Linux/FreeBSD って、それぞれ別に
金払わなきゃ駄目なの?こりゃ漏れには一生ムリポ…。LispWorks かなぁ。
少なくとも個人なんか最初から相手にしてない
LISPのネイティブコードってあんまり想像できないんですが、
実際どんな感じなんでしょうか?
シンボルの参照とか。
>>557
直接埋めこみ不可な定数(シンボルや文字列など)は
別テーブルとして持ってると思う。
((ネイティブコード ...) (定数 ...))
>> 556
これだけの金額になると会社にACL導入させるのも至難の業かと。
導入を決意させる必殺の口説き方とか知ってたらレクチャーおながいします。
まず最低でもLISP使う仕事があって、
それなりの成果がある会社で
発言力のある上級lisperがいないことには。
>>557
cmuclなんかだと直接機械語になるし、アセンブルコードも見れるので
見てみるとよい。
Lisp導入してみて、成果が上がったら・・・とは思うけど。
ためしに導入するにもきつい金額だ
試しならそれこそトライアル版で十分なわけで。
>> 564
漏れが見極めたいのはAllegroStoreがどれだけのもんかとかトライアル版では
利用できない機能のポテンシャルなんだが・・・
営業窓口と相談しる
567デフォルトの名無しさん:03/05/21 17:04
リストのcar側のネストレベルをカウントする関数を作りたいんですが、
破壊操作なしで作れるでしょうか?

こういう入力の場合は、
'(a b c (a b c) d (a b c (d) e) e)
こういう結果を得たい。
a:1
b:1
c:1
a:2
b:2
c:2
d:1
a:2
b:2
c:2
d:3
e:2
e:1

つまり
'(a b c (a b c) d (a b c (d) e) e)
 1 1 1 2 2 2 1 2 2 2 3 2 1

呼び出し形式はこんな感じで
(hoge
 (lambda(x level) (display x)(display ":")(display level)(newline))
 '(a b c (a b c) d (a b c (d) e) e ))
なんで破壊操作がいるの?
569デフォルトの名無しさん:03/05/21 17:12
>>568
想像しただけなんで、深い意味はないです。
ご教授お願いします。
(define (hoge f a)
(let loop ((a a) (level 1))
(for-each (lambda (x) (if (pair? x) (loop x (+ level 1))
(f x level)))
a)))
571デフォルトの名無しさん:03/05/21 17:22
あー、パラメータを1つ増やして、>>567の階層カウント中に、それまでに
カウントした中の最大値を繰り返しで呼び出される関数に渡したい
とした場合はどうでしょうか。
これも破壊操作無しでできるでしょうか?
そもそも、リスト中の階層の深さのピークを得るのが目的だったんです・・・。

'(a b c (a b c) d (a b c (d) e) e)
変数名:階層:階層の最大値
a:1:1
b:1:1
c:1:1
a:2:2
b:2:2
c:2:2
d:1:2
a:2:2
b:2:2
c:2:2
d:3:3
e:2:3
e:1:3

(3を得たい)
572デフォルトの名無しさん:03/05/21 17:38
何に使うのかというと、関数中のletの変数の数をカウントして、
関数内で必要なローカル変数領域の最小限の大きさの取得とかです。

(define (f)
 (let (x) ; 1
  (let (y) ; 2
   :
  ))
 (let (z) ;1
  :
 ))

(この場合ローカル変数領域の大きさは2、という風に求めたい)
こんなんでよかったら・・・。
(define (hoge f a)
(let loop ((a a) (level 1) (max 1))
(cond ((null? a) max)
((pair? (car a)) (loop (cdr a) level (loop (car a) (+ level 1) (if (> (+ level 1) max) (+ level 1) max))))
(else (f (car a) level max) (loop (cdr a) level max)))))
574デフォルトの名無しさん:03/05/21 17:57
>>573
それでバッチリです。
ありがとうございました!
深さだけならこれでいいと思う。
(define (depth a)
(if (list? a) (+ 1 (apply max (map depth a)))
0))
誤爆すた
これでもいいか。
(define (depth a)
(if (pair? a) (max (+ 1 (depth (car a))) (depth (cdr a)))
0))
FreeBSD で scm を ports から入れているのですが、(require 'curses) すると
dyn:link: /usr/local/lib/scm/crs.so: Undefined symbol "wrefresh"
と言われてしまいます。どうしたらよいのでしょうか。
580デフォルトの名無しさん:03/05/24 17:13
UNIX USER 2003年7月号
6月7日発売 特別定価1,580円
特別企画「使って学ぶ!Gaucheによる Schemeスクリプトプログラミング」

http://www.unixuser.jp/next.html
Guileかと思ったらGaucheかー!
河合さん本人の記事かな?
よ〜し、父ちゃんUNIX USER買うぞ〜
ちょっと疑問に思ったんですけど、
apply という手続きを apply を使わずに定義することはできるのでしょうか。
自分自身を使わずに定義できない手続き(及び構文)をプリミティブというのでしょうか?
584デフォルトの名無しさん:03/05/25 17:06
>>583
できるけどさあ

>自分自身を使わずに定義できない手続き(及び構文)をプリミティブというのでしょうか?
自分自身を使わずって、
もうちょっと質問の仕方考えろよー
>>580
文法はなんとなくわかったけど、使い道がよくわかってないので、
とても楽しみ。
>>584
過去ログに car と cdr を他のプリミティブ手続きで定義したものが
あったのですが、プリミティブかどうかは定義できるできないに関わらず
仕様で決っているという解釈でよいですか?
apply については調べたら eval との相互再帰だと分りました。すいません。
なんにせよかなり原始的な手続きだということが分かって安心しました。
>>587
参考になった
>>587
Gauche の河合さんのインタビュー。
次の友達の輪は ポール・グラハムになりそうだな。
590山崎渉:03/05/28 12:45
     ∧_∧
ピュ.ー (  ^^ ) <これからも僕を応援して下さいね(^^)。
  =〔~∪ ̄ ̄〕
  = ◎――◎                      山崎渉
591デフォルトの名無しさん:03/05/28 17:48
qschemeがビルドできない
configureでlibgmpのテストがエラーになってしまう
OSとバージョンぐらい書けよ
日経ソフトウエアで特集されてたCurlってブラウザ上で動くLispなの???

http://www.cag.lcs.mit.edu/curl/
http://www.curl.com/html/
なにかと思ったらカールか。
予想通り全然ブレイクする気配なし。
595デフォルトの名無しさん:03/05/28 22:29
「webで」っていうだけで、
「日経ソフトウェア」にこんなマイナーな言語取り上げられるんだから笑っちゃうよね…
596デフォルトの名無しさん:03/05/29 17:54
え、カ^ルてLispなの?
597デフォルトの名無しさん:03/05/29 19:43
Lispにゃ見えんが・・・
598デフォルトの名無しさん:03/05/29 19:51
なんか、ただ括弧を{}に変えただけって気もする
糞だな
LISPと違うのは
1)ピリオドを跨いでシングルメソッドディスパッチを可能にした。
2)コロンを跨いで型を書ける様にした。
3)()→{}に変えた。
4)macroが無くなってる様な気がする。
5)消えたリスト関数群

1)はCLOS程の機構は必要ないと判断したのかな。
2)の影響で、数値計算とかは型を明示しない同等のLISPコード
よりは効率的になる。
ただし見る限りvectorとかのコンテナはいままで通り型無し。
コンテナにアクセスする度にタグの付け外しが必要。
3)の意味はあんまり無さそう。気分の問題?
理由を聞いても多分適当なコジツケを聞かされるだけだろう。
4)のmacroが無いのははっきりいって退化。
5)つまりデータ=コードではなくなったという事か?

発想が俺と同レベルだよ・・・MITの奴等(;´д`)
サブセットどころかサブサブサブセットぐらい?
>>600
重要なのは言語じゃないだろ
何が重要なんだろう・・・
ライブラリ
606デフォルトの名無しさん:03/05/30 17:56
ちなみにmacroを見つけた。
macros.curlというファイル。
結局リスト処理は健在だった。
607デフォルトの名無しさん:03/05/30 23:15
実はLISPの方言だという事を必死に隠してる様に大笑い
MITのやつらもたいしたことないな
>>417
逝ってきて、謎が2つ残りました。

あのみかんみたいなのは、どうやって使うんだろう。
perlの人、なにがしたかったんだろう?
LispはProgrammable Programming Languageと言われ,
問題領域に合わせた言語を作ってしまい,それを用いて問題を解くそうですが,
作った言語はLispと同じくS式で書かれているのですよね?

ライブラリとは何が違うのでしょうか?
マクロも用いて新たな構文を作ったりするとそれはもう別言語であるということ?
自分で作ってみないとわかんないなぁ….イメージしやすい簡単な事例をキボンヌ
>>609
> ライブラリとは何が違うのでしょうか?

構文が変る。

C言語でLispのインタプリタを書いた。
このLispのインタプリタはC言語のライブラリか? 新たに出来た言語処理系か?

> イメージしやすい簡単な事例をキボンヌ

TCL->Scheme
http://www.colorstudy.com/static/ianb/old/tcl-scheme/
REDUCEの記号モード
http://www.kudpc.kyoto-u.ac.jp/Service/Application/REDUCE/reduce3.7/node250.html
Gauche release 0.7
elispを読み書きできるようになりたくてlispを勉強することに
決めました。なんとなく応用がききそうなschemeをチョイスした
んですけどscheme書ければelispは簡単に理解できますかね?
common-lispとどっちにしようか迷ったんですけど。

とりあえず入門SchemeのPDFを読みつつ、rtrsjをたまに見て勉強
してます。あと日本語処理が楽そうなのでGaucheを使ってます。

リストって概念に感銘を受けました。
mapcar
WiLiKiに書き込む時に使う言葉も新たな言語と考えてOK?
616デフォルトの名無しさん:03/06/02 00:18
どなたかカレンダーの作り方を教えてください
お願いしますm(_ _)m
618デフォルトの名無しさん:03/06/02 23:24
schemeで、関数のevalを末尾に置いた場合は、
それも末尾再帰するんでしょうか?
>>618
eval の最後も末尾扱いだったはず
R5RSに書いてある
620デフォルトの名無しさん:03/06/04 17:52
ほんとだった。
隙がないなあ。
Lisp ってどんなとこで使われてるんですか? Web とかと相性良さそうだけど,
なんか具体例キボンヌ.
>>621
Yahoo Store
623デフォルトの名無しさん:03/06/07 14:04
Lispで3Dグラフィックを扱う手段ってあるのでしょうか
OpenGLインターフェイスを備えた処理系とか.
>>623
gauche
UNIX USER 発売日。
>>623
CL-SDL
shiroたんが書いたのね
>>622 それはすでに過去の話では…今は C++ なんじゃなかったっけ?
>>628
もしそれが本当だとしたら運営者の頭がおかしくなったとしか考えられない
phpに切り替えた、と効いたが
悪貨は良貨を駆逐する。
>>628
PHPのはず。
ますます頭がおかしいとしか。
phpで幸せになれたんなら、それでいいじゃない。
システムのコアと、そこにアクセスする表層部分を混同するなよ。
636フォルトの名無しさん:03/06/07 19:43
今月のUNIX USERに載ってる記事どうでしたか?
>>623
CMUCL, SBCL, GCL, Allegro, MCL 用の OpenGL インターフェースはある。
gauche用のopenglモジュールはcygwinじゃできないそうですが、
できるようにするのは結構大変なんですかね?
640デフォルトの名無しさん:03/06/07 22:46
>>639
cygwinでopengl動けばできるとおもうけど。
作りもFFIで関数呼ぶ程度でしょ。
関係ないけど、おれconfigure嫌いなんだよね。
移植しずらくない?shその他諸々動く環境前提ってのが駄目すぎる。
>>640
そういうのを吸収するのが auto〜 なんだが
それに最低限 sh はあるでしょう
sh も無い環境なら他の部分でも色々移植に問題が出てくると思うが
>>640
そうか? configure 動かない環境なんて、素の Windows くらいだろ。
そのwindowsに移植しようとしてる連中が実際困ってたみたいだが。
(shiroさんのWLikiのサイト)
configureのチェック結果をきちんと使っていないプロジェクト多すぎ
645デフォルトの名無しさん:03/06/07 23:17
configureで変化する変数とかの一覧出力ってできないの?
その一覧を元に手動で設定するとか、
そういう手段があるなら教えてくれ。
そっちの方が早い。
そうやってみんな、だいなしにしちゃうんだ!
>>643
じゃあ Windows なんか使わなきゃいいじゃん。バッカじゃないの?
>>647
おまえ、頭膿んでるだろ
>>648
はぁ?本気で言ってんのかよ?
そこまで苦労して Windows 使いたいなんて、おまえの方が頭膿んでるだろ。
で、結局バカの一言で終わりなの?
都合が悪いとバカ扱いですか。そうですか。
やーいやーい、バーカバーカ
まったり逝こうぜ
653623:03/06/08 11:06
>>624 >>626 >>637
情報ありがとうございます。
とりあえずgauche-glを試そうかと思ったらcygwinではだめだとか。
Windowsを常用しているのでcygwin+gaucheでいけるといちばんありがたかったのですが・・・。
というわけでLinuxで試してみます。
654デフォルトの名無しさん:03/06/08 14:12
>>645
config.statusでしょ。

>>640は馬鹿だと思うが
gauche-sdlからopenglつかえるかな?と思って、makeしようとしたけど、
コンパイルできませんでした。
これもgauch-glの下の制限と同じ理由からなんでしょうか?
http://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?Gauche%3aCygwin&l=jp

こんなエラーがでてきます。
gauche-sdl.c:56: initializer element is not constant
gauche-sdl.c:56: (near initialization for `Scm_SdlRectClass.cpa')
以下似たようなエラーがずらずら・・・
うーん,Lisp だった頃の Yahoo Store ってどんな感じで動いてたんでしょう?
Web サーバーまで Lisp 製?それとも Apache とかと連携してたのかなぁ?
知りません
658デフォルトの名無しさん:03/06/08 18:32
>>632
phpになったって事は、退化してるわけだよね。
考えられない。
もしかして拡張子だけで判断してるんじゃ・・?
使用スクリプト言語をYahoo独自のものからPHPに変えると発表した。
あくまでもスクリプト言語をね。
だからコアと、とインターフェースを混同すんなっつの
661デフォルトの名無しさん:03/06/10 04:18
windows2000上で日本語&GUIがあつかえるフリーなLisp scheme処理系ありませんか?
662デフォルトの名無しさん:03/06/10 18:42
cygwinのgaucheてgtk使えないの?
>>660 コアは Lisp だという事ですか?
とりあえず mod_lisp で遊んでみようっと。
>>664
おまいさんがデータベースを用いたシステムを構築するとして、
データベースシステムそのものを php で書くか?
つまり、そういうことだよ。
666入門者:03/06/12 01:37
http://www.dynamiclearningcenter.com/exercises/create-string-spec.html
にある問題の解答はこんな感じかと思うのですが、上級LISPERの方にもっと他の
書き方があるぞとかここがよくないとかご指摘いただけるとうれしいです。なんか
先生とかじゃないと解答のページへアクセスできないようなので。
formatを呼んでるところの違いがtとnilだけなのがどうにかならないかなとは
思うのですが。

(defun create-string (str1 str2 str3 &key (to 'result))
 (cond ((eq to 'result)
     (format nil "~a~a~a" str1 str2 str3))
    ((eq to 'print)
     (format t "~a~a~a" str1 str2 str3))
    (t
     (error "invalid argument to keyword :to"))))
>>666
Commno Lisp の環境がないのであてずっぽうで。

(defun create-string (str1 str2 str3 &key (to 'result))
  ((or (and (eq to 'result) identity)
       (and (eq to 'print) print)
       (error "invalid argument to keyword :to"))
   ((format nil "~a~a~a" str1 str2 str3))))

CL って値と関数の name space 別々だったっけ?
だとしたら多分駄目カモ
あ、思い出した。
apply かませばいいんだっけか?

あれ、apply は elisp だったか?いかん、混乱してきた
669デフォルトの名無しさん:03/06/12 03:15
formatの第1引数に式を埋めこむとか.

(defun create-string (str1 str2 str3 &key (to 'result))
(format (case to
('result nil)
('print t)
(otherwise (error "invalid argument to keyword :to")))
"~A~A~A" str1 str2 str3))
>>666
こんなんでどう? case 使ってみた。
(defun create-string (str1 str2 str3 &key (to 'result))
 (format (case to
      ((result) nil)
      ((print) t)
      (t (error "invalid argument to keyword :to")))
     "~a~a~a" str1 str2 str3))
671670:03/06/12 03:29
あ、かぶった、ごめん
672670:03/06/12 03:35
つうか、format よりも (concatenate 'string str1 str2 str3) のがよさげだな。
いろいろ考えるのは楽しいが、>>666が素直。
素直ではあるがスマートではない
(defun create-string (str1 str2 str3 &key (to 'result))
 (cond ((eq to 'result)
     (format nil "~a~a~a" str1 str2 str3))
    ((eq to 'print)
     (format t (create-string str1 str2 str3)))
    (t
     (error "invalid argument to keyword :to"))))
;; 漏れならこーだな.
(defun create-string (s1 s2 s3 &key (to 'result))
(let ((s (concatenate 'string s1 s2 s3)))
(case to
('result s)
('print (format t s))
(otherwise (error "invalid argument to keyword :to")))))
(create-string "~a" "~a" "~a" :to 'print)
は大丈夫なの?
しまった.(format t "~A" s) としなきゃダメですね….
display みたいなのないの?

printのときにくっつけた文字列は必要なのかな。
(for-each display (list str1 str2 str3))
みたいなのどうかな。
Common Lisp 的には (mapcar #'princ (list s1 s2 s3)) とか.
でも文字列を連結するのが題意なんでないの?
(define (puts . x)(for-each display x)(newline))
(define (display* . x)(for-each display x))
682入門者=666:03/06/12 23:04
ども、いろんな例を提示していただいてとても勉強になります。
669,670のおかげでcaseマクロの使い方なんとなくわかりました。サンキューです。
674の言うようにLISPでのスマートな記述が自然にできるようになるにはやっぱり
経験積むしかないんでしょうね。676の書き方は正直、気が付かなかったです。カコイイ。
すかさず突っ込みを入れられる677もすごいなぁと思ったです。

このスレに来てる人達が賢いのか、それとも賢くないとLISP使いこなせないのか。
僕は"Beating the averages"読んで片手間にCommon Lispの勉強始めたばかりなんで
まだまだわからないことがいっぱいです。どれくらい経験積むと不自由なくLISP使える
ようになるんですかねぇ・・・cltl2(洋書)で購入したものの、正直その分厚さに圧倒されてます。
cltl2は入門者が読むものじゃないでしょ。
ANSI Common Lispにしといたら?
>>682
Common Lisp は仕様がでかいからね。使いこなせるようになるまでに、ある程
度経験はいると思う。自分で、しこしこ作った関数が CLtL2 でもともとあっ
た、なんてのはよくこと。勉強するだけなら Scheme がいいのでは?
今なら cltl2 よりも HyperSpec のが良い。
>>684 別に Common Lisp から入ってもいいんじゃないかなぁ。漏れが
Common Lisp 派だからかもしれないけど、自作関数とかぶったら実装と
比較して勉強にもなるから無駄にはならんと思う。
schemeは勉強用であって実用には使えないですか?
実用にも使えるんじゃない?
Common Lisp も Scheme も両方使ってます。使い分けは
cmucl: OpenGL とか
gauche: 日本語とかネットワークとか
以前はcommon lisp使ってたけど、
gaucheが日本語使えるので、
すべてこっちに移行中
690デフォルトの名無しさん:03/06/13 20:48
LISPって速いな。
試しにcmucl動かしたらなんかえらい速かった。
そうそう、大したもんだよなー。simple stream とか standalone executable
生成とか開発も活発で期待アゲ。これで国際化してくれたら文句無しだが…漏れ
がへたれじゃなかったら自分でがんがるんだが。
仕事は ACL、趣味は Gauche でやってまつ。サポートとかを考えると、仕事で
Gauche 使うのはちょっと勇気がいります。
lispで仕事してるなんてうらやましいですな。
周りにlisp使える人がいないので、lispを使おうと提案しても
却下されてしまう(´Д⊂グスン
独 立 し る

俺は、もうそうせざるを得ない状況(ry
ACL以外でWindowsのGUIが使えるLispってありますか?
696デフォルトの名無しさん:03/06/14 12:25
Windows版のACLで使えるOpenGLインターフェイスを探してみたところ
http://www4.ncsu.edu/~moriedl/software/body.html
くらいしか見つかりませんでした。
現在のACLのバージョンが6.2なのにこのライブラリはバージョン5用に作ったと書いてあります.
試しにalisp.exeでサンプルプログラムを動かしてみたところ,きちんと画面は表示されたのですが,ウィンドウを閉じたあとトップレベルが入力を受け付けない状態になってしまいます.
これは仕方のないことなのでしょうか。そうだとしたらとても不便だ。
だれかこの辺の事情について何かご存知ないでしょうか。

また,他のOpenGLインターフェイスの情報があれば教えてください。
お願いします。
>>696 windows は良く知らないが、 http://cl-sdl.sourceforge.net/ とかどう?
>>695 GCL から ttp://www.japi.de/ 使えるとかいうメール
を comp.lang.lisp で見かけたような気がする。調べてみては?
ちょっとわらった。CPU time で 10 秒しかつかえんけど。
% telnet prompt.franz.com
よし、その先を目指せ
701入門者=666:03/06/15 16:39
Dynamic Learning Centerの続きです。何のヒネリもないつまらない解答しか思い浮かばない
のですが、こんなもんなんでしょうか。

(defun double-number (n)
 (typecase n
  (number (+ n n))
  (t (error "argument is not a number"))))

(defun hours-in-1999 ()
 (* 365     ; days in 1999
   24))    ; hours per day

(defun is-a-list? (arg)
 (typecase arg
  (null 'empty-list)
  (list 'list)
  (otherwise 'something-else)))

>> 683
ANSI Common LispってPaul Grahamのですよね? これも一応購入してちょっとづつですが
読んではいます。On Lispみたく製本された状態で入手できなくなるのがイヤなので気になった
本は片っ端から購入してあります(汗
Stephen SladeのObject-Oriented Common LispとかSonya E. KeeneのObject-Oriented
Programming in Common Lisp: A Programmer's Guide to CLOSとかもありますが
最初に読破すべきはやっぱりANSI Common Lispですか?
702デフォルトの名無しさん:03/06/15 17:39
ちょっと古いけどこれもいい本なんじゃないかと思われる。
http://www.amazon.co.jp/exec/obidos/ASIN/0201083191/qid%3D1055665073/249-2969182-6032346
前半が文法の説明で後半がサンプルという構成です。
サンプルがAI的なものばかりで「Lisp=人工知能用言語」という偏見に寄与しそうな気もしますが。
>>699
なにこれ?
トライアル版を公開してなんか意味があるんか。。

|WARNING: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|WARNING: Allegro CL will expire in 35 days.
|WARNING: !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
|International Allegro CL Trial Edition
|6.2 [Linux (x86)] (May 21, 2003 12:21)
|Copyright (C) 1985-2002, Franz Inc., Berkeley, CA, USA. All Rights Reserved.
|
|This development copy of Allegro CL is licensed to:
| Ahmon Dancy, Franz Inc.
|
|;; Optimization settings: safety 1, space 1, speed 1, debug 2.
|;; For a complete description of all compiler switches given the
|;; current optimization settings evaluate (EXPLAIN-COMPILER-SETTINGS).
|CL-USER(1):
>>698
Java+JNIを使ったGUIキットでつか?
705デフォルトの名無しさん:03/06/15 22:10
UU 誌の Gauche の特集で .emacs の設定例が書かれていましたが
Web 上で見られるところありませんか?
emacsにモジュール化の計画はないのかな…
>>706 elisp は使いにくいyo!
>>705
これでいんじゃないの? M-x run-scheme
(setq scheme-program-name "/usr/local/bin/gosh -i")
(autoload 'run-scheme "cmuscheme" "Run an inferior Scheme process. " t)
>>706 もうちょっと具体的に教えて。
>>709
UU 誌買えよ。
会社の乖離道にUU売ってる本屋がない
>701 まぁ、そんなもんだろうな… easy だけあって簡単だ。
Common Lisper の .emacs キボンヌ!
>>713
(add-to-list 'load-path "~/elisp/emacs-guile-0.2")
(require 'guile-scheme)
(setq initial-major-mode 'scheme-interaction-mode)
*scratch* が Scheme。あ、Common Lisp じゃないや。
715入門者=666:03/06/17 01:57
>>702
了解。amazonに速攻で発注してみました。

>>712
どもです。残る問題を順次片付けていくです。
>>701
つまらない解答っていうより問題の方がつまらない。
再帰をさせる問題の方がLispができるようになると思うんだけど。
>>713
ふつー ilisp 使うだろ。ぐぐってみれ。
718デフォルトの名無しさん:03/06/18 18:09
LISP覚えるって事は、やっぱりemacs使わないとだめなんでしょうか?
普通のエディタでやれるよ。
720718:03/06/18 18:23
使用エディタがWZでもLISP使いを名乗っていいですか?
でも、emacs の支援機能はあったほうが快適。S 式単位の編集機能、ilisp に
よる lisp 処理系との連携とか、関数にカーソル合わせて CLHS を一発で引くとか。
あるのと無いのでは大違いだと思う。
722718:03/06/18 18:56
じゃ、だめなんですね?
>>722
あなたの場合はだめです。
質問です。
Schemeの勉強がてら、Javaで書いたプログラムをGaucheに
移植しようとしているのですが、UDPによる受信のところでつまづいています。
(use gauche.net)
(define (main arg)
(let ((socket (make-socket |PF_INET| |SOCK_DGRAM|))
(address (make <sockaddr-in> :host "127.0.0.1" :port 8080)))
(socket-bind socket address)
(let ((in (socket-input-port socket)))
(display "Waiting...\n")
(let ((line (read-line in)))
(display "Received.\n")
(display line)))
(socket-close socket)))
(read-line in)のところでブロックされた後、該当ポートにパケットを
送信しても制御が帰ってきません。ちなみに送信側は次のコードです。
送信できてることは受信側をJavaで作って確かめることができました。
(use gauche.net)
(define (main arg)
(let ((socket (make-socket |PF_INET| |SOCK_DGRAM|))
(address (make <sockaddr-in> :host "127.0.0.1" :port 8080)))
(socket-connect socket address)
(let ((out (socket-output-port socket)))
(display "Sending...\n")
(display "Hello\n" out)
(display "Done.\n"))
(socket-close socket)))

どこが間違ってるんでしょうか?
環境:Windows2000,Cygwin
ttp://www.ravenbrook.com/doc/2003/05/28/contest/
2ちゃんねら〜の総力を結集して入賞を目指してみないかとか書いてみるテスト。
>>724
バッファリングされてんじゃない

と、よく読まずに(ry)
>>724
TCP ならいけるの?
本題とは関係ないが、socket-close とかは unwind-protect しとくのが無難。
Scheme なら dynamic-wind かな?
a
729724:03/06/20 09:09
(read-line in)のところを(read-block 65516 in)のように変更すると、
とりあえず、受信できました。UDPではread-lineは使えないんですかね。

>> 727
TCPだと問題ないです。
>>729
gauche.netのAPI自体良く知らないんだけど、
UDPは、当然buffering I/Oじゃないでしょ。
行単位の読み込みは、buffering I/Oとしか馴染まないもんね。

PF_INETの言葉で言えば、stream通信じゃなくてdatagram通信。
>>724>>727
gauche なら、call-with-client-socket とかの方がよいカモ
それってTCPしか使えないような...
お前らかっこつけすぎ
リストと引数が2の述語を受け取って
述語が真になるグループに分ける手続きってどう書けばいいんですかね。

> (hoge = '(1 1 1 2 2 3 3))
((1 1 1) (2 2) (3 3))

(define (hoge f a)
 (let loop ((r '()) (a a))
  (if (null? a) (reverse r)
    (loop (cons (filter (lambda (x) (f (car a) x)) a) r)
       (filter (lambda (x) (not (f (car a) x))) (cdr a))))))
これだと何度もフィルターにかけるので遅くて・・・。
仕様がよくわからんが
(hoge < '(1 3 2 4)) だったら ((1 3) (2 4)) となるのか?
((1 2 4) (3)) ってのもありな感じがするが。
736Common Lisp 見習い:03/06/24 23:47
ANSI Common Lisp を趣味で読んでる見習いです.

(defun hoge (fn lst &optional acc)
(labels ((f (x lst rest result)
(if (null lst)
(values (nreverse rest) (cons x result))
(if (funcall fn x (car lst))
(f x (cdr lst) rest (cons (car lst) result))
(f x (cdr lst) (cons (car lst) rest) result)))))
(if (null lst)
(nreverse acc)
(multiple-value-bind (rest result)
(f (car lst) (cdr lst) nil nil)
(hoge fn rest (cons result acc))))))

とか考えてみましたが,まだ Scheme では書けません….
737736:03/06/24 23:50
>>735 げぇ,そういえば.モウダメポ
738734:03/06/25 00:53
>>735
=とかequal?とかの等しいかどうかを判定する述語を想定していたので、
<とかは考えてませんでした。
汎用性ないですかね。
Scheme で複数のファイルに対して call-with-input-file する場合、

(call-with-input-file file1
 (lambda (p1)
  (call-with-input-file file2
   (lambda (p2)

みたいに書くとか、そう展開されるマクロを書くしかないですか?
リストを返すようにして、そのリストを処理する手続きをつくるとか。
(hoge (call-with-input-file file1 (lambda (p1) ...)
(call-with-input-file file2 (lambda (p2) ...))
>>739
continuation の呼びだしある場合、これではまずいかもしれない。
(define (call-with-multiple-input-file files proc)
(let ((ports '()))
(dynamic-wind
(lambda () (set! ports (map open-input-file files)))
(lambda () (apply proc ports))
(lambda () (map close-input-port ports)))))
(let ((p1 (open-input-file file1)) (p2 (open-input-file file2)))
...
(close-input-port p1) (close-input-port p2))
ttp://freesw.onshored.com/wwwdist/imho/
にあるIMHOをOpenBSD3.3/i386で使いたいと思いOpenBSDにデフォルトで
入っているApacheにmod_webappを組み込むとapachectl startで必ず
Duplicate connectionと文句を言われてApacheが起動できません。
ググってもそれらしい情報見つけ出せないで困っているんですが、どなたか
IMHOの動作に成功した方いらっしゃいます?CMUCLのリリースは18eです。
IMHO CMUCL で検索すると FreeBSD + CMUCL 18e で動かしてるって人のページ
がひっかかるのだが…
745743:03/06/26 22:53
「よろずや」って謎のタイトルのついてるページですよね? >>744
そこを見てFreeBSDでいけるんならOpenBSDでもいけるっしょ、くらいの軽いノリで
突っ込んでみたんですけどうまくいかないんですよねぇ・・・

そもそもがDebian GNU/Linux向けに開発,パッケージ化されているようなので
感触としてはOpenBSD3.3/i386のApacheとIMHOと一緒に配布されているmod_webappの
仕様の整合性が取れてないっぽいです。jakartaプロジェクトからmod_webappのソース
取って来ても似たような状況だったのでLISPの問題じゃないと思います。スレ汚しスマソ。

便乗質問になりますがCMUCLでPortable Aserve運用してる方、もしいらしたら
使用感(特にパフォーマンス)どんな感じか教えていただけますか? comp.lang.lispとか
./見てると「遅くて使いもんになら〜ん」という趣旨の投稿を見かけたので。
そのサイトに昔PortableAserve+cmucl遅いってネタがあったぞ。で mod_lisp ウマーって話だった
747734:03/06/27 17:15
734です。あのあと何度か改良をして
filterのかわりに条件を満たすものと満たさないものを
一緒にして返す手続きで置き換えたり、
=のような述語を受け取るのをやめて
リストの要素を数値化する手続きを受け取るようにして
ソートすることにしたり、
他のところを見なおして数値リスト限定でグループ分けをするようにしたりして、
最終的にはグループ分けの手続きを使わずに
ソートした数値リストを直接処理するようにしました。

C言語版と同じようになってしまい、
Lispらしさのかけらもないコードに・・・。
(defun hoge (fn lst)
(loop with acc = nil
with rest = nil
for e in (cdr lst)
if (funcall fn (car lst) e) do (push e acc)
else do (push e rest)
finally (return (value acc rest))))
Common Lisp 使ってるみなさん,loop って好きですか?自分はイマイチ….
>>748
734の問題か?
Common Lisp知らないのであれなんだが、(car lst)は入るの?
(特にloopを知らない。名前付letみたいなもん?)
(hoge '= '(1 1 1 2 2 3 3))だと
((1 1) (2 2 3 3))にならない?
そういやそうですね.お恥ずかしい.覚えたての loop が使ってみたかっただけだっ
たのです.まだ良くわかってないですが,使いドコロによっては便利な予感なのですが.
751734:03/06/27 19:33
参考までに私の改良を。
条件を満たすものと満たさないものを両方返す手続きで
2度filterにかける無駄を回避。
748さんのはこのdivideに近いと思います。
(define (divide f a)
 (let loop ((x '()) (y '()) (a a))
  (cond ((null? a) (list (reverse x) (reverse y)))
     ((f (car a)) (loop (cons (car a) x) y (cdr a)))
     (else (loop x (cons (car a) y) (cdr a))))))

(define (hoge f a)
 (let loop ((r '()) (a a))
  (if (null? a) (reverse r)
   (apply (lambda (x y) (loop (cons x r) y))
       (divide (lambda (x) (f (car a) x)) a)))))
752734:03/06/27 19:34
hogeを述語のかわりに数値化する手続きを受け取るようにして
数値順にソートすることでdivideがすぐに処理を打ち切れるようにした。
Lispの昔の本でリストを集合として扱う時に
ソートすると便利だという話を思い出したり。
(define (divide f a)
 (let loop ((x '()) (a a))
  (if (or (null? a) (not (f (car a)))) (list (reverse x) a)
    (loop (cons (car a) x) (cdr a)))))

(define (hoge f a)
 (let loop ((r '()) (a (sort a (lambda x (apply < (map f x))))))
  (if (null? a) (reverse r)
   (apply (lambda (x y) (loop (cons x r) y))
       (divide (lambda (x) (= (f (car a)) (f x))) a)))))
今見るとdivideもこのロジックだと
述語のかわりに数値化する手続きを受け取らせたほうがきれいかな。
753734:03/06/27 19:34
数値化する手続きをソートで適用しまくるのはやっぱり遅いので
プログラム全体を見直し、数値化したリストだけを処理することにして
そのあとで数値化する前のリストを処理することに。
同じ数値が一つか二つしかないことが多いので
divideを取り込んで、手続き呼び出しの無駄を省いた。
(define (hoge a)
 (let loop ((r '()) (x '()) (a (sort a <)))
  (cond ((null? a) (reverse (if (null? x) r (cons (reverse x) r))))
     ((or (null? x) (= (car a) (car x)))
      (loop r (cons (car a) x) (cdr a)))
     (else (loop (cons (reverse x) r) '() a)))))
返ってくるリストにfor-eachでlengthをあてて使ってるだけになったので
この手続き自体も使わないことにした。
なるほど,こーやって開発してくのかー.ためになります.
>>751
SRFI-1にpartitionていうのがあるよ
あらかじめソートしてあって、途中で探索を打ち切れるなら span が使える。
756デフォルトの名無しさん:03/06/28 22:43
'((a b c) (d e f) (g h i))
というリストを要素毎に組み合わせて、
=>
((a d g) (a d h) (a d i)
(a e g) (a e h) (a e i)
(a f g) (a f h) (a f i)

(b d g) (b d h) (b d i)
(b e g) (b e h) (b e i)
(b f g) (b f h) (b f i)

(c d g) (c d h) (c d i)
(c e g) (c e h) (c e i)
(c f g) (c f h) (c f i))
というパターンのリストを作りたいんですが、
どうやればいいでしょうか?
こういう所でmapという関数を使うのかな。
757デフォルトの名無しさん:03/06/28 23:08
あ、解決しました・・・。
(define (test s)
(apply append
(map
(lambda (x)
(apply append
(map
(lambda (y)
(map (lambda(z) (list x y z))
(caddr s)))
(cadr s))))
(car s))))

(test '((a b c) (d e f) (g h i)))
=>((a d g) (a d h) (a d i)
(a e g) (a e h) (a e i)
(a f g) (a f h) (a f i)
(b d g) (b d h) (b d i)
(b e g) (b e h) (b e i)
(b f g) (b f h) (b f i)
(c d g) (c d h) (c d i)
(c e g) (c e h) (c e i)
(c f g) (c f h) (c f i))
list-of マクロとかがいいかも。
(list-of (list x y z) (x in '(a b c)) (y in '(d e f)) (z in '(g h i))

scheme 版:
ttp://www.shiro.dreamhost.com/scheme/wiliki/wiliki.cgi?p=Scheme%3a%a5%de%a5%af%a5%ed%a4%ce%b8%fa%cd%d1&l=jp#9
Common Lisp 版:
ttp://www.geocities.co.jp/SiliconValley-SanJose/7474/cmuclMemo.html#0009
>>757
もうちょっと一般化して、
(define (test s)
 (let loop ((r '()) (s s))
  (if (and (pair? s) (pair? (cdr s)))
   (apply append
    (map
     (lambda (x) (loop (cons x r) (cdr s)))
     (car s)))
   (if (pair? s)
    (map (lambda(z) (reverse (cons z r))) (car s))
    s))))

>(test '((a b c ) (d e f) (g h i) (j k l)))
=>((a d g j) (a d g k) (a d g l) (a d h j) (a d h k) (a d h l) (a d i j) (a d i
k) (a d i l) (a e g j) (a e g k) (a e g l) (a e h j) (a e h k) (a e h l) (a e i
j) (a e i k) (a e i l) (a f g j) (a f g k) (a f g l) (a f h j) (a f h k) (a f h
l) (a f i j) (a f i k) (a f i l) (b d g j) (b d g k) (b d g l) (b d h j) (b d h
k) (b d h l) (b d i j) (b d i k) (b d i l) (b e g j) (b e g k) (b e g l) (b e h
j) (b e h k) (b e h l) (b e i j) (b e i k) (b e i l) (b f g j) (b f g k) (b f g
l) (b f h j) (b f h k) (b f h l) (b f i j) (b f i k) (b f i l) (c d g j) (c d g
k) (c d g l) (c d h j) (c d h k) (c d h l) (c d i j) (c d i k) (c d i l) (c e g
j) (c e g k) (c e g l) (c e h j) (c e h k) (c e h l) (c e i j) (c e i k) (c e i
l) (c f g j) (c f g k) (c f g l) (c f h j) (c f h k) (c f h l) (c f i j) (c f i
k) (c f i l))
なんてどうかな。
むむ、考えているうちに先を越された。
(define (combination ls)
(if (null? ls)
'(())
(apply append (map (lambda (y)
(map (pa$ cons y)
(combination (cdr ls))))
(car ls)))))

(print
(combination '((a b c) (d e f g) (h i j) (k l))))

-- Haskell版
combination (x:xs) = concat $ map (\y -> (map (y:) (combination xs))) x
combination _ = [[]]
うーむ、みんな頭いいな。
>>759のrは累積変数というやつだな。
データ構築は再起的でも、繰り返しの応用で記述できるのか。
759の括弧や1文字のアルファベットは蓮の穴に見える・・・
763無名λ式:03/06/29 08:45
関数型言語のZF記法だと、(>>758がLisp版)
[[x y z] | x <- [a b c], y <- [d e f], z <- [g h i]]
だな。>>760はBirdの本の奴と殆んど同じだね。
gaucheのutil.combinationsにcartesian-productってのがあったよ。
(define (test s)
 (define (f x y)
  (apply append (map (lambda (a) (map (lambda (b) (cons a b)) y)) x)))
 (fold-right f '(()) s))
emacs lisp,scheme,common lispを使いこなせるようになりたい
と思ってるんですが、勉強の順番として
scheme => elisp => clisp
で行こうと思ってます。なんか問題ありますか?
ない
ただし、綺麗好きには scheme => elisp の段階が嫌になるカモ
scheme => elisp より scheme => clisp のがいいよ。elisp は言語としては
大したことないし、参考になる綺麗なコードも少ない。ただ、一番ユーザが多い。
>>767-769
schme => clisp って流れのがいいみたいですね。
問題のelispは他の2言語が分かればすぐマスター出来るような
感じですか?今 入門schmeっていうPDFファイルで勉強してる
んですが。schemeにはdefineだけなのにelispでは def* なる
表現がいっぱいあるみたいですね。
基本をやっておけば、あとはライブラリの習得程度の違いじゃないかな。
入門schemeは文字コードを変換する2章以降はいらないと思う。
再帰やリスト処理を練習したほうがいい。
基本の手続きや構文を知ってても、組み合わせて使えないと。
入門Schemeって分りやすい?
自分はつまんなすぎて途中まで読んで嫌になった。
R5RS の方がいい。

http://www.ccs.neu.edu/home/dorai/t-y-scheme/t-y-scheme.html
個人的に好きなのはここ。
入門Schemeは分かりやすいのかよく分かりません。。
1章だけ読んでR5RSに移行する予定。

その後ピアソんから出てるプログラミングSchemeか
SICP買ってみようと思ってるんですけど、この2冊
両方やる必要ありますかね?
(define (test s)
 (let loop ((r '(())) (s (reverse s)) (t '()) (a '()) (b '()))
  (cond ((and (null? s) (null? a)) (reverse r))
     ((null? a) (loop '() (cdr s) (reverse r) (car s) (reverse r)))
     ((null? b) (loop r s t (cdr a) t))
     (else (loop (cons (cons (car a) (car b)) r) s t a (cdr b))))))
hxxp://www.swiss.ai.mit.edu/classes/6.001/abelson-sussman-lectures/
根性で全部落としてみた。現在シコシコDVDに焼きこみ中。
DivX版だけでいいかと思いきや音が吹っ飛んでてほとんど講義の内容聞き取れない部分が
あったりするのでMPEG版も必須かと。HDDもDVDも大した値段じゃないしね。管理は面倒だが・・・
>775
なにこれ?
講義の録画?
英語聞き取れねぇ・・
778デフォルトの名無しさん:03/07/01 18:41
EVERYBODY SAY IT, MASSACHUSETTS!
779775:03/07/01 23:43
>776
そ。MITでコンピュータサイエンス専攻する学生は避けて通れないあまりにも有名な
SICPの講義をHPの従業員向けに行ったときの様子だそうな。
ヨソサマのガッコの講義を回線代程度で受講できるなんていい時代になったもんです。
780デフォルトの名無しさん:03/07/02 02:11
教科書(SICP)の内容を超えた話をしてるなら見てみたいけど、
デカいね・・。
782デフォルトの名無しさん:03/07/02 06:35
>>781
93年に書かれたもののようだけど,この内容で10年前のものって
有効期限切れじゃないの?
>>782
"Worse is better"、「悪い方が良い」原則、というのは
聞いた事があるんじゃないですか。
Lisp界隈では基礎教養と言える文献だと思いまつ。
知ってて損はないかと。
日本語訳もどっかで見た事があるような気がしまつ。


784デフォルトの名無しさん:03/07/02 19:27
諸事情でschemeのコードをperlに移植したいんですが、
schemeの階層のあるリストは、perlのデータ型で表現できますか?

あと、linuxで一般的に利用されそうなscheme処理系ってなんでしょうか?
それがわかれば移植する必要は多分無いです。
libguileをプログラムに組み込んでいます。
load-extensionでDLLを読み込みたいのですが、
MinGW版のguile-1.4では該当する関数がないようなので、
今日あれこれして、guile-1.6.4をMinGWでコンパイルしました。
で、プログラムに組み込んでload-extensionすると落ちちゃいます。

何がわるいのかわかりませんが、extensions.cのload_extensionでおちるんだろうと。
何かわかる人いませんか?

guile-1.4でもDLLがよめたり、load-extensionがつかえるguileのMinGW版が
どこかにあれば問題ないのですが。

どなたかご教授ください。
>>784
umb-scheme
787デフォルトの名無しさん:03/07/02 22:19
perl-lispという微妙なものみつけたんだけど、
これ動くの?
http://search.cpan.org/src/GAAS/perl-lisp-0.05/lib/Lisp/
788デフォルトの名無しさん:03/07/02 22:21
信じれば動く
>>784 gauche がいいと思う。
790デフォルトの名無しさん:03/07/02 22:53
両方入れてみて、判りやすそうな方にします。
ありがとうございました。
umb-scheme って開発終了してるんじゃないの?
ftp.cs.umb.edu なんて名前すら引けないし
うちのLinuxにはSCM入れているけど。
自分でコンパイルしたのかな。
>>791
どっちも遅いよ。
用途によりけりだけど。
795デフォルトの名無しさん:03/07/03 19:57
DBの読み書きをするCGIを作りたいのですが、グイーラーとゴーシュとどちらが向きでしょうか?
bigloo という手もある
797デフォルトの名無しさん:03/07/03 21:04
ちっさいschemeくれ
くれ!
>>795
グイーラーって知らないのだが、ゴーシュで良いのでは?

>>797
tinyschemeは?
tinyは試したけど遅かった>797
でもlinuxのカーネルに組み込めるんだよね。
module化しないのかな。
800デフォルトの名無しさん:03/07/03 21:28
>>799
tinyCOBOLは?
COBOL知りません・・
>>797
biglooってインタプリタあるの?
グイーラー? guile? ネタ?
804デフォルトの名無しさん:03/07/03 23:36
グイーラワラタage
ゴーシュはWinで使えないみたいだなあ
コンパイルすればCygwinなら使えるのかもしれないけど
めんどくさい
それは「使えない」ではなく「使う気がない」だ。
ど根性guile
>805
バイナリ公開してほしいね。
ちなみにcygwinでも「動く」までは行くよ。
いくつかエラーとか出たけど。
使用に耐えるかどうかはわからない。
単純なコードなら問題なさそうだけど。
確かに、これのためだけにcygwin入れるのは非常に面倒だ。
configureが異常に長い。
今時windowsで動かないなんて笑っちゃうよ
cmuclも動かないけど
cygwinインストールしたらグイーラーが標準でついてくるから
こっち使えば良いか
グイーラーなんて知らん
>>802
ある
81472ではないです:03/07/04 01:20
guileがいる
日本語と一番相性のいいCommonLispってなんですか?
>>815
clisp.
カネがあるならAllegro CL.
SchemeでよければGauche.いじょ.
>>816
Winなら,clispの他にxyzzy lisp.
WinでSchemeならcygwinのグイーラー(w.いじょ.
>>817
グイーラーって言ってみたかったに100ペソ
如何に巧みにレスに「グイーラー」という単語を盛り込むことができるかを競うスレ。
Schemeってグイーラーって読むんじゃなかったの?
もうguileネタはいいよ……。
822デフォルトの名無しさん:03/07/04 23:52
さて、問題は継続なわけだが
なんだよいきなり
824デフォルトの名無しさん:03/07/05 01:02
LISPって何が面白いんですか?
ハマったきっかけを教えてくだされ。>先輩
再帰パターンを探す。
CPS
複雑なデータ構造が簡単に書ける
かっこいい
言語名がカコイイ
なんでこんなSchemeの処理系ってたくさんあるわけ?
統一してくれないと困っちゃうんだが。
作るのが簡単だから。
仕様さえ統一されてればいい。SRFIもあるし。
http://srfi.schemers.org/
自分はまた処理系作ろうとか考えてるわけです。テヘ。
現在、継続やdynamic-windの実現方法で頭を悩ませております。

ところで、実装手法について述べた文書なんてありますかね?
既存の処理系をいくつか見たんですが、内部の詳細についてはほとんど
述べられていないようです(見落としてるかもしれません)。

みなさんはセルや環境フレームの物理レイアウトには
興味・・・ないですよねぇ・・・さすがに・・・
> ところで、実装手法について述べた文書なんてありますかね?

手元にあるものから適当にひろってみたけど

- Space-Efficient Closure Representations
- Tail-recursive Stack Disciplines for an Interpreter
- Representing Control in the Presence of First-Class Continuations
- Don't Stop the BIBOP: Flexible and Efficient Storage Management for Dynamically-Typed Language

とかですか? それとももっとソースコードよりのおはなし?

> みなさんはセルや環境フレームの物理レイアウトには
> 興味・・・ないですよねぇ・・・さすがに・・・

そういうの好きな人は結構いると思いますけど。
>>834
参考にさせていただきます!

>とかですか? それとももっとソースコードよりのおはなし?

そろそろ設計に移ろうかと考えているので、
ソースコード寄りのネタがうれしいッス。
>>833
ネタ:
ループや関数呼び出しの様な、普通の制御については完全にGCレス
にできる。なるべくセルを使わずスタックで扱う様に気を使う。
小さい数値を即値で表現する様にし、関数の引数をスタック上に作る。
末尾呼び出しのフレーム除去等を管理し、環境も最初はスタック上に
構築して、クロージャや継続フレームの生成段階で初めてヒープに移す。
このとき、スタック上の環境はヒープへのリンクに変更する。

これらはインタプリタのレベルででき、セルで状態構築する処理系
(mini-schemeやtiny-schemeなど)の5倍以上のスピードが出せる。
コード量もあまり変わらない。ただし実装は気を使うので少し難しい。
ついでに、インタプリタではマクロの展開が遅い要因の1つなので、
一度展開した結果をキャッシュすれば、最低限の構文だけ組み込み、
その他は全てマクロであっても、かなりの速度差がつく。
(素直に組めば、この時点でguileよりも速くなる)

gaucheの様な、evalでVMにコンパイルする系に対しては速度でまだ
負けるが、上の実装でコンパイラとVMを用意すればgaucheを超えて速くなり、
コード量、実行ファイルサイズはgaucheの何分の1かで済む。
GCレスにすると、実行時のnativeコードへの変換も楽になる。
その処理系をグイーラーと名づけよう。
>>836
>なるべくセルを使わずスタックで扱う様に気を使う。
>小さい数値を即値で表現する様にし、関数の引数をスタック上に作る。
>末尾呼び出しのフレーム除去等を管理し、環境も最初はスタック上に
>構築して、クロージャや継続フレームの生成段階で初めてヒープに移す。
>このとき、スタック上の環境はヒープへのリンクに変更する。

gaucheもそうやってるよ。gaucheの「コンパイラ」はかなり単純。

上の方針でのボトルネックのひとつは、クロージャや継続を「生成」
する時点でヒープへのコピーが発生すること。使われ方によっては
ファーストクラスである必要のないクロージャや継続がたくさん
あるので、ヒープへ移すのはlazyである方が良い。

クロージャに関してはフロー解析をすればある程度最適化できる。
継続でコピーをlazyにやる方法は"copyless continuation"で
探せば数本の論文が見つかると思う。

gcを自分で書くのなら、Henry BakerのCheney on the MTAの方法
も使えるかもしれない。オブジェクトは全てスタックアロケート、
手続き呼び出しは全て継続渡し、スタックがいっぱいになったらgcで
生きてるオブジェクトだけheapに移動、という方法だ。
chickenが使っている。

既存の処理系のコードを読んで、適宜論文を参照するようにすると
色々勉強になる。
>>833
ネタ2:
ポインタが4バイトならconsセルは8バイト。最初のビットが奇数ならatom。
ポインタを配列のインデックスで表現すれば32bitも必要ない。
24bitもあれば十分だし、そのぶん別の状態に使う。GCで管理するヒープは
セル専用にし、vectorやstringの様な可変長オブジェクトはヘッダセル以外
は別の領域から取る。セル専用にすると速い。GCマークフラグは別テーブルに
持たせる。ただしこの設計はヒープがリニアで取れる時でしか使えない。
話はここからだ。
ポインタをインデックスで実装すれば、ヒープのリニアイメージをそのまま
ファイルに書き出せる。(実行時アドレスを保持している場合は適切な変換が必要。)
これで処理系の実行状態のsuspend/resumeが可能になる。resumeで関数呼び出し
を行ってschemeプログラムを起動できる様にもできる。
このイメージは配置を保証すれば実行環境に依存しない。
環境依存コードをschemeで書かない限りWindowsでもLinuxでも同じCPUなら動く。
作成したメモリーメージを処理系に埋め込めば、suspendはできなくなるが、
実行ファイル単体での配布が可能になる。
840ネタ@中毒者:03/07/05 14:51
>>838
確かにCPSで書かれると不利になるね。
ローカルで完結するクロージャについてをスタック上で
まかなえばいいんだろうけど、フロー解析が必須になる。
>継続でコピーをlazyにやる方法は"copyless continuation"で
このコピーレスって、mini-schemeの様にGCで回収させる事かな?
対象がセルじゃなく、スタックである分速いのかもしれないけど、
GCの起動回数とメモリ移動が増える分、どうなるかわからない気がする。
841ネタ@中毒者:03/07/05 14:57
これはどうだろう。
local-lambdaという構文を用意し、このクロージャは
定義したレキシカルスコープから外へは出ない事を
ユーザーに明示させる。スコープから出た場合の
動作は不定、じゃまずいからヒープに移動しない等の、
何らかのエラーを返す。
842ネタ@中毒者:03/07/05 15:02
↑よく考えたらクロージャの破棄タイミングがわからないから
駄目だ。スコープから抜ければ破棄されるけど、
ループなんか回されたらもう駄目。
843ネタ@中毒者:03/07/05 15:22
ネタ3:
上の実装であればGCはマーク&スイープで十分。
ヒープがセル専用なので断片化を気にする必要がないからだ。
マーク&スイープはオブジェクトの参照とマークテーブルの
書き換えだけで済む。さらにスイープは遅延できる。
コストはコピー>マーク&スイープ>マーク&遅延スイープ
ただし、所詮マーク&スイープなので生存オブジェクトが
多くなると局所性とマークのコストが問題になる。
844ネタ@中毒者:03/07/05 15:30
>>838
>gaucheもそうやってるよ。gaucheの「コンパイラ」はかなり単純。
gaucheはたしか末尾呼び出しのフレーム調整の最適化が
できてなかった。最新版だと違う?
845838:03/07/05 17:02
>>844
>末尾呼び出しのフレーム調整の最適化
って? フレームの削除を末尾呼び出し毎にやるんじゃなくて、
いくつかまとめてやるとか、そういうこと?
846ネタ@中毒者:03/07/05 18:35
↑最適化じゃなくて、ただの末尾呼び出し
こういうやつが遅い
(define (ack m n)
 (cond ((zero? m) (+ n 1))
  ((zero? n) (ack (- m 1) 1))
  (else (ack (- m 1) (ack m (- n 1))))))
847833,835:03/07/05 19:57
うおお、怒涛のような書き込み・・・
ポインタ&勉強方法等、ありがとうございます。

ひとつ質問があります。セルの中身の表現に、下位数bitを使って
その値が000ならばポインタ、001ならば・・・などというふうな
やり方をよく見かけます(というかほとんど?)。

これってメモリ効率やパフォーマンスを追求したときのの結果なんで
しょうか?それとも歴史的事情でもって「アレもああしてたから
なんとなくそうしてみた」的なノリでこうなってるんでしょうか。

メモリをジャブジャブ使える環境だったら、タイプと値を別々に
持たせていいような気もしますが・・・
単純に2倍だからさすがに無理があるか・・・
((lambda a a) 1 2 3 4)
=>(1 2 3 4)
スタックにのせてわたすとすると
こういうのは関数のほうでリストに変えるの?
>>847
セルの下位ビットをタグに使うのはNILというLisp処理系から
だったかな。それ以前は、BIBOPと言って、メモリページごとに
格納するオブジェクトを分ける方法が主流だった。メインメモリが
少ない場合、上位数ビットのみを見ればタイプがわかる。
アドレス空間が18bitとかの時代の話。

アドレス空間が大きくなると、BIBOPで最初に大きくメモリを
切り分けて置くのが難しい。次第に下位ビットタグが使われる
ようになった。

>メモリをジャブジャブ使える環境だったら、タイプと値を別々に
>持たせていいような気もしますが・・・

メモリにおかれるオブジェクトならそれでもまあいい。
ビットタグをワードに押し込む利点は、即値整数を
メモリアロケート無しでレジスタに置けることじゃないかな。

>>847
> これってメモリ効率やパフォーマンスを追求したときのの結果なんでしょうか?

RISCの即値Jump命令でも使われる普遍的なアイデアだよね。(MSBだけど…)
851ネタ@中毒者:03/07/05 21:48
>>848
rest引数はクロージャの環境フレーム生成の時にスタックからリストに変換する。
apply呼び出しの場合はコピーの生成の有無とか色々ある。
コンパイラならその場合は直接(list 1 2 3 4)に変換するかも。
LISP犬グイーラー
853名無しさん@xyzzy:03/07/05 22:29
>>824
SICPがすごい本で、その中で扱われているから。
アルゴリズムはschemeだとすごく分かりやすい。
SICP凄い本っていう割りには、アメリカのAmazonで評価良くないな。
アメリカにもDQNはいる
評価つけたやつが勘違いしていたという結論だった筈
856デフォルトの名無しさん:03/07/05 23:31
>>855
128人もレビュアーがいて、星3.5個なわけだが。
一人二人勘違いしてた所で、評価は変わらん。
レビュー読んでみりゃわかるよ…
見てくるのでリンクおながいします
これかな
Structure and Interpretation of Computer Programs - 2nd Edition (MIT Electrical Engineering and Computer Science)
http://www.amazon.com/exec/obidos/ASIN/0262011530/qid=1057416751/sr=2-1/ref=sr_2_1/104-6069702-5600745
>>856
アンチが重複書き込みしている
難しいのでクソじゃなかったの?
難しいな。特に解らない数式が出てきたりすると。
ほとんどSchemeやアルゴリズムと関係ない所だ。
864デフォルトの名無しさん:03/07/06 01:02
MMXとか使うと速くなったりする?
自分で言ってて意味がわからないけど。
レビュー読んでみりゃわかるよ…
速くなります。
867デフォルトの名無しさん:03/07/06 02:19
>>865
そのMMXがわかるようになるレビューとやらは、なんのレビューだ?
レビュー読んでみりゃわかるよ…
そのなんのレビューかわかるようになるレビューとやらは、なんのレビューだ?
グイーラーのレビュー。
やってる本人は面白いと思ってるんだろうな>ぐいーら、レビュー
実装の勉強のためにソース読むならclispよりSchemeの方が読みやすそうだな
>>833
dynamic-windよりも多値が問題だと思う
ファーストクラスじゃないから後付けできないし。
>>873
いや、実は、R5RSは多値をファーストクラスオブジェクトとして
実装することを禁止してはいない。
「call-with-valuesで作られる継続以外の継続は一つの値を取る」
とは書いてあるが、一つの値を取る継続に複数の値を渡した時の
動作は未定義。
だから、valuesは(値が一つの時以外は)特殊な「valuesオブジェクト」
に値をパックして返し、call-with-valuesはconsumerを呼ぶ時に
それをアンパックする、というアドホックな実装でも、R5RS準拠といえる。
もちろん性能は犠牲にすることになるが。

じゃあ、valuesをファーストクラスにすべく、インタフェースを考えてみる

;多値の束縛
(define x (values 4 5)) => x
x => #<values 4 5>

;多値の判定
(values? x) => #t

;普通の評価
(+ x 1) => (+ 4 1) => 5

;多値の抽出
(call-with-values x (lambda (x y) y)) => 5

こんなんでいい?
続き

;多値の変換
(values->list x) => (4 5)
(values->vector x) => #(4 5)
(list->values '(4 5)) => #<values 4 5>
(vector->values #(4 5)) => #<values 4 5>

;多値の参照/設定
(values-ref x 0) => 4
(values-set! x 0 3) => #<values 3 5>

つまりvaluesは特殊なvector型
877874:03/07/06 21:06
>>875, >>876
valuesを特殊なベクタとして実装するのはいいけど、
values?とかvalues->listなんかはその実装でしか
使えない(本当の多値を持つ処理系には移植しようがない)
からあんまり意味ないんでは。

また、valuesの戻り値がcall-with-values以外で使われる
場合の動作は完全に未定義。次のような動作は、実装しても
いいけど移植性はない。

(define x (values 4 5)) => x
(+ x 1) => (+ 4 1) => 5

あと、このようにvaluesのコンテナを用意する実装の場合、
値が一つだけの時を特別扱いするのを忘れずに。
(values 1) === 1 は常に成立しなければならない。
(values 1 2)と(values 1 3)は常に等しくないの?
879デフォルトの名無しさん:03/07/06 22:37
>>877
そういう突っ込みを待っていたのです

>移植性
これは特に考えてなく、多値をオブジェクトとするからには、
それなりに使いやすいインタフェースを用意すべきかと思ったので。
性能については、call-with-values付きで呼ばれたとか、
評価中にわかると思うから、それで最適化できるかもしれない。
SRFIにvaluesのファーストクラス昇格を提案してみるとか。

>(values 1) === 1 は常に成立しなければならない。

(= (values 1) 1) => #t
これは成り立つと思います。(>>875の多値の判定)
処理系によっては
(eq? (values 1) 1) => #t
つまり、多値オブジェクトの振る舞いは、基本的に単値オブジェクトと
同じということにする。
values関係の関数を呼んだときだけその本性を現す、とか。

あーでも、オブジェクトの参照で、かならず多値判定が必要になるから
効率悪いかも
ちなみに
(= (values 1 2 3) 1) => #t
です。

>>878
(= (values 1 2) (values 1 3)) => #t
です。

多値同士の比較は別個に用意する必要があります。
(values-equal? (values 1 2) (values 1 3)) => #f
継続といえば、コールバック関数上での振る舞いが問題になると思う。
これのおかげでマシンスタックを退避とかしないといかんし。
883まるちぽすと:03/07/06 23:28
ここはCommon LispよりSchemeな擦れだってことは知ってますが、せっかくだから聞いて下さい。
LisperのPaul Grahamが絶版になったCLについての著書On LispをPDFで配っているのですが、
そいつを勉強を兼ねて翻訳しています。
今年の始めに手を付け始め、25章の本のうちやっと7章まで終わりました。
著者の許可はとってません。勝手にやってるだけ。まずかったら引っ込めます。
まだWizard Bookも読んだことない廚ですが、サイトを覗いてやって下さい。
なんかコメントがあったらここなり私のメールアドレスなり適当に。
user.ecc.u-tokyo.ac.jp/~g340299/onlisp_j.{pdf,dvi}.bz2

# これで後にはひけなくなった...
また、かわいそうな子が・・・。
>>883
Paul Grahamにメール出してみてはいかが。
既に翻訳出版の話が進んでいるとかでない限り、
快く了承してくれると思いますよ。
886874:03/07/07 08:39
>>879, >>881
>処理系によっては
>(eq? (values 1) 1) => #t
>つまり、多値オブジェクトの振る舞いは、基本的に単値オブジェクトと
>同じということにする。

これは「処理系によっては」じゃなくて、eq?にならないとまずい。
R5RS的にはどんな手段でも(values 1)と1の結果は区別できない。
処理系独自の述語で区別するぶんには構わないけど(実装の詳細ということで)。

> (= (values 1 2 3) 1) => #t
> (= (values 1 2) (values 1 3)) => #t

CLと同じセマンティクスにするってことね。それは処理系独自の
拡張と考えられるから良いと思う。

>SRFIにvaluesのファーストクラス昇格を提案してみるとか。

それじゃ多値の意味が無いような…
(+ 1 2 3) という手続きを呼ぶ時に、[1 2 3]という
オブジェクトを + に渡しているんだ、と解釈するように
するならいいけど。

Jonathan Reesのrrrs-authorsの議論を見てみそ。
http://zurich.ai.mit.edu/pipermail/rrrs-authors/1986-October/000605.html


>>883
> 著者の許可はとってません。勝手にやってるだけ。
まず、許可とれ。
そして、出版してくれ。PDFじゃ読みたくならん。
888デフォルトの名無しさん :03/07/07 21:58
>>883
>>ここはCommon LispよりSchemeな擦れだってことは知ってますが
OnLispってマクロについて書かれた本だったような。それならschemeでも
十分役立つと思います。
翻訳 "(,,゚Д゚) ガンガレ!"
OnLispは出版物になってるから、
翻訳に関する権利関係がちゃんと画定しているかもしれないので、
確認した方がいいですよ。
OnLisp の texinfo 版は許可もらってんのかね?
犯罪というものは訴える人間がいるから成立するのだよ。
もし芳しくない返事が返ってきたとしても、どっか無料鯖にアップしとけ。
翻訳者の名誉なんか求めてないだろ?とりあえず全部訳したら俺が神認定
してやるよ。
893 :03/07/09 11:54
犯罪っつーか権利侵害な
894flatline (883):03/07/09 16:44
>>885 ある程度できたらメールしようかな、と...
実は4月以来進んでいないのです。それで動機付けにここに公開したという訳。
>>887 プリンタくらい持ってるでしょ。
>>888 >>889 どうもです。
>>890 一度絶版になって公開されている本を出版するような出版社は少ないと思ったんですが...
>>891 何ぃぃぃぃぃそんな便利なものがぁぁぁぁぁ
PDFからコピペするのがどれ程面倒だったのかと小一時間(ry
>>892 >>893 これはPaulの権利の侵害ではないと言えますよね。
そして私のような個人が翻訳して配る行為を縛る権利は本来誰にも
(現実的にはどの出版社にも)ありません。

ま、いずれはPaulにメールして承諾もらいますよ。くれるはず。
あとはShiro Kawaiさんとかはぎゃ教授とかにも教えたら喜んでくれるかも?
で、中身についての意見きぼんぬ。あんまり分かってないので間違ってるかも。
ただ、作業の続きは期末試験終わった8月位になります。すんませんね。
895891:03/07/09 16:53
…知らなかったのかYO!! 漏れも某 Lisp ページの管理人さんから
聞いて知ったんだが.非公式だからマイナーのなんかな?

On Lisp の texinfo 版
http://t2100cdt.kippona.net/linux/lisp/

texinfo で作ってくれ〜 PDF や ps はつかいにくい〜
つうか翻訳した分だけでいいからWikiで公開してくれ。
本人が放置しても作業が進む可能性を残すべし。
| >>892 >>893 これはPaulの権利の侵害ではないと言えますよね。
| そして私のような個人が翻訳して配る行為を縛る権利は本来誰にも
| (現実的にはどの出版社にも)ありません。

痛すぎる…
再版されるのか...絶対買おう。
>>898
ttp://www.hyuki.com/trans/ によると
まず、翻訳そのものには許可は不要です。
翻訳したものの頒布には著作権者の許可が必要です。
ということですよね。
ちょうど comp.lang.lisp で似たようなネタやっとるな…
902 :03/07/10 11:20
>>900
あなたが>>883であると想定して書込みます。

それはたぶん私的使用のための翻訳を言っているのだと思いますが、
WEB上に出してしまうと、
アクセス制限でもしてない限り私的使用とは言えませんよ。
いずれにせよ、絶版になったからといって、
当然に出版社側の権利が消滅するわけではないので、
ちゃんと聞いたほうがいいです。
あなたの労力は高く評価しますが、
手続は踏んでおかないと色々面倒なことになるかもしれず、
その労力が無駄になりかねませんよ。
>>900にある
>翻訳したものの頒布
=WEB公開だろ。落ち着け>>901
904902:03/07/10 15:32
>>903
それは僕に言ってるんですかね

そうだとしても、あなたの言ってることが
私の言ったこととどう矛盾しているのか分かりませんが
906flatline:03/07/10 18:49
えーーと、私は基本的にコテハンな人なのでよろしく。
で、まさか再版の方向で進んでいるとは...
それではさすがにやばそうなのでPDFおよびDVIファイルの公開を停止しました(w
>>895 Texinfoはまだ日本語を使うと微妙にDVIの見出しとかが変になるので... でも考えてみます。
>>897 Wikiとかうpローダとか使い慣れないのですいません。
>>898 おっ釣れた,,でも一匹だけかつまらん
>>900 >>902 分かってはいるのですが、どうせ絶版なら多少承諾が前後してもいいだろ、と思ったわけです。
しかしそうも言っていられない。
>>905 「ハリーポッターをドイツ人有志が独訳」
しかしハリポタは購買層が広いからそれでも売れるのでしょうが、On Lispの場合はもめるかも。

「私の翻訳は違法、出版社も揉め事を避けて邦訳を出版せず」となると日本のlisper全体に迷惑が行って
ヤヴァイので慎重に行くことにします。今英語のできる友人にメールの文章の添削を頼んでいます。
# PDF公開なんかより出版しる!という声もあった位だから購買意欲を削ぐことにはなってませんよねえ?
Oh my gosh!
908900:03/07/11 06:39
>>903
ありがとん。
絶版とか何とか言う前に、著作権違反だっつーの。
著作権のイロハを学んでこい。(w
要するに英語で連絡とる面倒さと、事後承諾拒否のリスクを秤にかけてるんだろ。どのみち迷惑だからヤメレ
このままだと釣りや煽りが出てきそうなんで話の整理

だから翻訳したものを無許可で公開するつもりですなんて
誰も言ってないっつーの
無許可公開には問題があるんじゃないかって話がでてきて
「じゃあ自分の勉強のためにただ翻訳するだけなら
著者の許可を得なくてもいいんですね」
「そうだよ。でも翻訳したものをwebに載せるのは
頒布になるから許可がいるね」
というやりとりがなされただけ。
ちょっと落ち着け>誰かさん
912911:03/07/12 13:53
つーか著者に連絡するって本人が書いてるじゃん
著作権について奇妙な理解の仕方をしてるみたいだけど
間違った行動さえとらなければこのスレ的には別にどうでもいいし
著作権についての議論やひけらかしがしたい人は別板でどうぞ
許可が取れれば問題無いと思う。
でも、今の時点では許可とってないので、問題あり。
>>911
おまいは話の発端を読み直せ。
明らかに権利侵害を行なっていたことが読み取れるから。

>>906
こういうのは「知らなかった」なんて言い訳が通用しないのは当然として、
「絶版だから大丈夫だろうと思った」なんていう勝手な決め付けは
自らのオツムが足りてないことを公言してるようなもんだよ。
判断を下すのは権利者であっておまいではない。
NGとかにもこういう話になると途端に活気づく奴がいてウザイネ
そんだけ非常識な香具師が多いってことだろ
無知とは言え、よかれと思ってやった人の行動を情け容赦なく罵倒する914。
914はさぞかし素晴らしい何かを成し遂げているのだろう。
ああ、完全無欠の914!
関係ない話は他所でおねがいします。
そんなcdrん事よりlispの話しないcar?
>>917
良かれと思ってやる犯罪者を確信犯と呼びますな。
犯罪者は確信犯だろうが、情け容赦なく罵倒するのが妥当。
ついに"犯罪者"呼ばわりでつか…
>>921
犯罪者呼ばわりしてる人などいないが。
法律のことは良く知らないが、著作権侵害をしているなら、
もしかしたら犯罪者かもな。
良スレだったのに、(・ー・)オワッタナ・・・
924デフォルトの名無しさん:03/07/12 22:49
DrSchemeで、拡張子がpltのアーカイブファイルがあるんですが、
これはどうやって解凍するんでしょうか?
よかれと思ってやっても犯罪は犯罪。
いいから、著者と連絡取れ。
公開する、しないはそれからだ。
>>911
実際のところはそれすら自明ではないんですがね。
誰か次スレ立てられる人います?
自分は規制が掛かって立てたれなかった。
一応次のテンプレ用意しましたので、どなたかお願いします。
(リンク関係は量があるので、立った後に貼ります)

↓テンプレ
--------------------------------------------------
LISP Scheme Part8

過去スレ
Part1: http://piza2.2ch.net/tech/kako/987/987169286.html
Part2: http://pc.2ch.net/test/read.cgi/tech/1002584344/
Part3: http://pc.2ch.net/test/read.cgi/tech/1008220265/
Part4: http://pc.2ch.net/test/read.cgi/tech/1016211619/
Part5: http://pc3.2ch.net/test/read.cgi/tech/1023091882/
Part6: http://pc3.2ch.net/test/read.cgi/tech/1031560687/
Part7: http://pc2.2ch.net/test/read.cgi/tech/1042167213/
関連リンクは>>2-10あたり
著作権では、私的複製は許されるけど、私的翻訳は許されなかったはず。
ほぇ?
何を今更、しかも的外れなことを
的外れ?まさに、私的翻訳をやってるように見えるし、
それがOKと勘違いしてるやつがこのスレに
いるように見受けられるが。
WEBで公開してる以上私的じゃないな。
>932
そろそろ空気読めよ。
>>928
html化してるぞ全部
かくしん-はん 【確信犯】

道徳的・宗教的・政治的な信念に基づき、自らの行為を正しいと信じてなされ
る犯罪。思想犯・政治犯・国事犯など。
(gc)
これからは英語論文も英文マニュアルも英語のまま丸暗記しますから
どうか安らかにgcされてください>932
著作権侵害とならない範囲での翻訳ならいいだろう。
脳内翻訳とかな。
>>938
英語論文に日本語訳を書き込んでセミナーに臨むのも禁止だかんな
明日は覚悟しとけよ!
厳密に言えばそれも違法だろうな。
ただ、量が少なければ著作性は認められないから良いかもしれないが。
軽犯罪といったところか。
1. まず自分で勝手に翻訳をし、
2. 翻訳ができた段階で著作権に連絡を取り許可をもらって頒布する

こういうのはよくあるんじゃないかと思うんだけど、
1. の段階で法律違反なのですか?
許可を取らないと、1. すら駄目ということですか?
>950 は次スレお願いします。

あ、テンプレに翻訳物の著作権絡みの話題禁止って書いておいて下さい。
どうしても著作権の話したけりゃ、Lispで書け!
【殺しの】ライセンス【道で拾った】
http://pc2.2ch.net/test/read.cgi/tech/1045006087/

↑これがライセンス総合スレらしいけど、放置されてるから著作権についての議論に使えば?
他の板のLispスレ

Lisp使いの数→@マ板
http://pc.2ch.net/test/read.cgi/prog/1031179059/l50
Lisp@UNIX版
http://pc.2ch.net/test/read.cgi/unix/1019926525/l50
>>938-943
ちょっとわかりにくいけど、著作権法43条によって、私的な翻訳
や、教育上の翻訳も許されます。

第30条は確かに複製だけを対象にしてるように見えますが。
S 式は英語ではなんというのですか?
>>951
高林さんの次のも見つけたけど、さっぱりわからない。
http://namazu.org/~satoru/unimag/10/
英語・日本語どちらでもいいから、もっとわかりやすい説明ないですかね?
アトムは S式である
x と y が S式ならドット対 (x . y) も S式である

これでいいと思うけど、Lispで扱うのはみんなS式だよ。
954山崎 渉:03/07/15 09:52

 __∧_∧_
 |(  ^^ )| <寝るぽ(^^)
 |\⌒⌒⌒\
 \ |⌒⌒⌒~|         山崎渉
   ~ ̄ ̄ ̄ ̄
その「Lispで扱う」の解釈がちょっと
何がわからないんだ?
957950:03/07/15 17:44
自分は lisp 使いじゃないです。
S 式を知りたくてこのスレッドにたどり着いたので。
958955:03/07/15 18:22
コードはS式として書くけど、データ型はいろいろじゃんという事が言いたかった
色んな拡張があるので(read)で読みこめれば、なんでもS式かな。
それはそうと、俺はクソプロバイダのせいで次スレ立てられない。
誰かよろしく。
961デフォルトの名無しさん:03/07/20 02:12
mada
tsukaeru
yo
n
962山崎 渉:03/08/02 02:30
(^^)
963山崎 渉:03/08/15 16:57
    (⌒V⌒)
   │ ^ ^ │<これからも僕を応援して下さいね(^^)。
  ⊂|    |つ
   (_)(_)                      山崎パン
965ぼそ...:03/09/08 02:21
Paul Graham "On Lisp" Chap. 11 (out of 25) まで翻訳完了
ttp://user.ecc.u-tokyo.ac.jp/~g340299/onlisp_j.{tex,pdf}
966デフォルトの名無しさん:03/09/11 13:15
              / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\
Λ_Λ  | 君さぁ こんなスレッド立てるから          |
( ´∀`)< 厨房って言われちゃうんだよ             |
( ΛΛ つ >―――――――――――――――――――‐<
 ( ゚Д゚) < おまえのことを必要としてる奴なんて         |
 /つつ  | いないんだからさっさと回線切って首吊れ     |
       \____________________/

(-_-) ハヤクシンデネ… (-_-) ハヤクシンデネ… (-_-) ハヤクシンデネ…
(∩∩)             (∩∩)             (∩∩)

(-_-) ハヤクシンデネ… (-_-) ハヤクシンデネ… (-_-) ハヤクシンデネ…
(∩∩)             (∩∩)             (∩∩)

(-_-) ハヤクシンデネ… (-_-) ハヤクシンデネ… (-_-) ハヤクシンデネ…
(∩∩)             (∩∩)             (∩∩)
>>965
「ambda式」 になってるのは気のせいですか?
>>965
この本面白いね
969flatline:03/09/16 17:42
>>967
訳者@帰省終了 です。
Vimの置換で\\lambdaとすべきところを\lambdaとしてしまい、\lが無視されたようです。
修正すますた。ご指摘ありがとうございますた。
AKCL(今はGNU Common Lispになっているらしいが)とCMUCLどっちが優秀?
漏れはCMUCLを使っているが、そもそも違いが分からん。
>>970 part8 でやったほうが反応が良いのでは?
というか,GCL と CMUCL のどこか同じなのかわからん.GCL は C コンパイラを使っ
てコンパイルだし,CMUCL は中間表現から自力でコンパイルで全然仕組みが違うじゃん.
どっちが優秀とか聞かれてもなぁ.
動作プラットフォームの数: GCL
ANSI Common Lisp への準拠度: CMUCL
と,観点によってかわるだろう.どーゆう優秀さが知りたいの?
新スレできてから2ヶ月以上たつのに,まだ埋まってもdat落ちもしてないのか
>>972
そういうしぶとさはLispならではってことで(ヲイ
974デフォルトの名無しさん:03/10/10 19:08
ageてみるテスト
975デフォルトの名無しさん:03/10/12 21:11
((lambda(a)(a a)) (lambda(a) (a a)))
((call/cc call/cc) (call/cc call/cc))
(λ ...)
978デフォルトの名無しさん:03/10/14 06:56
ansi commmon lispの本の、例題の解答例とか、どこかにないものですかね
test
Error in kernel::unbound-symbol-error-handler: the variable test is unbound.
[Condition of type unbound-variable]

Restarts:
0: [abort] Return to Top-Level.

Debug (type H for help)

(eval test)
Source:
; File: target:code/eval.lisp
(symbol-value exp)
0]
学生んとき研究室の教授がC大好きだった。
ある課題について俺は Lispの方が向いてると
思ったので FranzLispで書いて出したら、
顔は笑っていたが「どうしてCじゃないのか」と
しつこく聞かれたよ。
学生が勝手に選んだ言語で書いてきたらうんざりするだろうな。
言語を特定されていなかったのならいいんじゃない

そんなことはまずあり得ないだろうが
>>983

目的はプログラミングじゃなかったんじゃねーの?
要するにある課題をこなすために、プログラムの力を借りたと
985デフォルトの名無しさん:03/10/18 19:31
それでも、LISP最高だから。
986デフォルトの名無しさん:03/10/18 19:35
lispでWindowsプログラミングは出来ますか?
lispはどこにでも寄生するよ
教授とかか議論すべきなのはアルゴリズムだろ。
言語で文句言うなんて変だよな。
だからアルゴリズムを見る前に
かってな言語で書かれても困るだろ。
言語指定もされてないのに課題程度のコード量で騒ぐのもなあ。
数分の一で書けるんならなおさら。
でもなんでもかんでもsetq使いまくりとかは勘弁な。
そもそもガッコならlispなんか教養で教えるべきじゃねーの?
Cが大好きな人なんているんですね。
次スレ(↓)が500越えてんのに残ってるこのスレって一体・・・
http://pc2.2ch.net/test/read.cgi/tech/1058263391/
過疎板じゃ普通
次スレよりも後で1000行く前スレなんてのもあるんだろうか。
>>994
この調子でいけばさすがにそれはないかと(w
もうすぐだもんな。こっちが1000到達すんのは。
int a; /* int型の変数a */

と同じぐらいのキモさだな
1000取るチャンスですか?
埋めるよ
1000
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。