1 :
デフォルトの名無しさん :
03/01/10 11:53
2 :
デフォルトの名無しさん :03/01/10 11:55
3 :
デフォルトの名無しさん :03/01/10 11:55
4 :
デフォルトの名無しさん :03/01/10 11:55
5 :
デフォルトの名無しさん :03/01/10 11:55
6 :
デフォルトの名無しさん :03/01/10 11:56
7 :
デフォルトの名無しさん :03/01/10 11:56
スレ立て乙
>>1 "ANSI Common Lisp" 買ったsage。
わたしは買ってない…。でも読んだ。
ANSI Common Lisp買った!
(display '関係無い話は余所でやってください)
ANSI Common Lisp いいでつね。
やっとcons.orgが復活したみたい。
?
18 :
LISPスレ住人その1 :03/01/12 21:17
レス削除依頼完了。 最近人いないなあ・・・
大抵の Linux ディストリビューションには usb-scheme っていう scheme 処理系が 入ってるみたいなんだけど、これの歴史的な理由を御存じの方います? 何か MLD に も入ってるみたいでびびった。
(^^)
22 :
デフォルトの名無しさん :03/01/13 19:09
それ翻訳者の和田先生が来るらしいね。 一度いってみたいなあと思ってます。 その時はよろしこ(藁
ふぁーすと せかんど さーど ふぉんど ふぁいぶんど
>>47 資料を見てみると、だいぶしまいの方まで来てるぞ。
行く前に終わってるんじゃないか。(W
姉妹?終い? たしかに漏れは終わっている部類の人間だが、 そんなことは関係なし。先生に会いに行くのだ(藁
もう来た回は終わってるのでは?
なるほど、そういうことね。失礼しました。
cl.el使えばEmacs LispもCommon Lispにレベルアップですか?
30 :
デフォルトの名無しさん :03/01/15 12:39
>>22 申し込んだけどまだ2章。だめぽ.....。
(^^)
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の概念ってあるの?
どうも$つけて変数ってしてるみたいだから 必要ないんじゃないだろうか。
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 購読者な神よ、ウプキボンヌ!
(^^)
年末辺りからカキコ少ないなあ。 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 キーワードもシンボルなのだが、それはそれとして、
キーワードを使用するのは極めて一般的です。
>>48 なんかそういうことが起こりそうだなあという気はするのですが、
今日は色々試していたのですが残念ながら中々そういう事態をうま
く作りだせませんでした。
お心あたりがありましたら、例を頂けると有難いです。
それとは別に、試行錯誤しているうちに一つ発見したのは、
読み込む側のシンボルテーブルを汚染してシンボルを作ってしまう
ために、useしようとしたパッケージがたまたま重なった名前を
exportしていると、シンボルが衝突してしまうということですね。
52 :
デフォルトの名無しさん :03/01/28 23:36
正直 AI に興味ないのだが、Lisp を読みたくて Paradigms of Artifical Intelligence Programming を買ちゃった age
"ANSI Common Lisp" 読み終えたので記念にあげます。 あー面白かった。 ちょっと悔しいのが、型宣言をうまく使えなかったことで、高速化 を扱った9章の練習問題にて(例に出てきた)レイトレーサのプログ ラムに型宣言を追加せよ、というのがあったのですが、これに型宣 言を追加するとかえって遅くなってしまいました。その前のCLOSの 章の練習問題にてdefstructをクラスにしたものをベースに、あち こちにsingle-floatの宣言を入れてついでに多く使われてるものは inlineも指定したんですが、型宣言を入れる前には追い付けずじまい。 どうするのがいいのやら。
ああしまった、あげてなかったので今度こそあげます。すまそ。
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読むの諦めて
図書館で日本語訳借りてきた俺にはだめぽ
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))))))))))
間違ってsageちゃいました。
どうでしょうか、って何が?
65 :
デフォルトの名無しさん :03/02/12 15:44
>>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))
lisp は Emacs Lisp を使っている程度です。 最近卒論でちょっとしたシミュレータを作っていまして、 そのシミュレーションシナリオの記述言語として lisp を採用してみたいと思っています。 一般的に C/C++ に lisp インタープリタとしての機能を付け加えたいとき、 なにかおすすめのライブラリなどはありますでしょうか? Scheme でも OK なのですが、 libguile はちょっと敷居が高いと感じていまして。
>>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/
>>66 ,68
どうもありがとうございます
そうかlambdaを使えばnをインクリメントさせて加算できるのか・・・
>>67 私はそれ作るのに50行以上かかりました(鬱
>>72 詳しいレスありがとうございます。
GC 周りでは気をつけなければならないことが多そうですね。
注意深くやりたいと思います。
もう少し借用させて頂けそうな lisp / scheme の実装を
探してみたいと思います。
問題の本質とは関係ありませんが、
お偉方は Windows しか使えないので最終的には Win32 な
バイナリを吐く必要があるのも、困難な点の一つです。
Gauche / Guile は cygwin 環境下で動いているようです。
さすがに Native Win32 環境下では難しそうですね。
自分のマシンは Linux (Debian GNU/Linux 3.0r1) と IBM AIX 5L です。
AIX は借り物ですけど。
あ、libguileもconservativeだった。スマソ
>>69 libguile か librep がいいんじゃない。
この2つははじめから組み込みを意識して作られていますから。
C への組み込み方法がドキュメントに載ってるよ。
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)))))
「計算機プログラムの構造と解釈 」 この本に関して質問です。 原書と翻訳版とでページ数がかなり異なりますが、何か理由があるのでしょうか? (どこかのしょうが削られているとか、、、) それと、日本語訳はうわさどおり、読みにくいものなのでしょうか?
たいてい翻訳の方が分量が多くなるんだけど、 SICP第2版は翻訳版の方が紙がだいぶ大きい。 (版形っていうんだっけ?)
88 :
デフォルトの名無しさん :03/02/26 20:22
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
肛門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
禿げしくガイシュツ
xyzzyのlispソースってバイトコードにする方法ってあります?
>>119 byte-compile-file
ってこれくらい調べりゃ簡単にわかるだろが。
問題なんて勝手に解釈して解けばいいとも思いますが... ANSI Common Lisp の 5 章の問題 4 「svref の代わりに case を使え.」 case でどうやってベクタを読むの?
>>121 テーブルルックアップをcase文のハードコーディングで置き換えろってことだろ。
急にLISPがつかえる電卓がほしくなった〜〜〜〜 以下の仕様でどこか作ってくれ 1:ANSI Common lisp 対応 2:HotSyncでPCからマクロや関数を自動追加可能 3:3万以下 (・∀・)イイ!
入力が禿げしくめんどうだと思われる
関数電卓でのsin,cosみたいに特定のボタンを押すと 入力補助をしてくれる機能があれば(・∀・)イイ! もちろんボタンと文字列の組み合わせは (setf f10 "(hogehoge ") のように外部から変更可にすれば(゚д゚) ウマー
lispなOSを載せたPDAみたい
電卓って、ハードの電卓か。 LISPのポケコンは昔あった気がするけど、今更な機能なんだろうね。 PDA向けの処理系探してきて、カスタマイズするしかない。
>>122 どうもありがとう.そこも変えるやり方しかないんですね.
;; ほかにも,4 章の問題 1 で array-dimensions を自分で設計するのかと勘違いし,
;; aref だけでベクタの大きさを知る方法があるのかと悩んでしまいました.
ところで,
* どうして scheme の map は Common Lisp の mapcar のように
要素を取り出す順番を保証しないのでしょうか.
わざと不便なことをしているのでしょうか.
これでは高尚な「写像」中に汚い破壊的操作ができません.
* Common Lisp では末尾再帰を必ず最適化するわけではないそうですが,
せっかくできる最適化をしない処理系なんてあるのですか?
なんか欲しいぞ>>LISPなポケコン >PDA向けの処理系探してきて、カスタマイズするしかない。 向けのLISPってあったっけ?探してみよう。
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というのがある。
>>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でも動かないの?
>>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は順序が必要なデータ構造、 例えば構文解析用のスタックとして良く使う。
>>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まんせー
177 :
dynamic-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には移らない。 トップレベルをシーケンスとみなさない処理系なら、 この動作になると思う。
179 :
dynamic-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))
>179 before区間では継続をまだ取り出してないので、こういう動作になる。 結局この辺は実装を見た方が早い。 call/ccを上書きするdynamic-windのポータブルな実装がWeb上の どっかにあったと思う。 R5RSにはhogeまで到達した時のbefore/afterの呼び出しタイミング についてしか言及されてない筈。 tiny-schemeの不具合について昔調べた限りでは、組み込みの リスト処理関数全般と、内部定義(define)の適用順序がおかしかった。 実装者はセルのポインタ付け替えに慣れてない気がする。 全体的に結構いいかげんな作りなので、もし手を加えていくなら、 元のmini-schemeからの拡張部分は全て疑った方がいいかも。
>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を最適化していけば、それなりの速度にはなるはず。
184 :
dynamic-winder :03/03/11 01:37
おせわになってます。 すいません、へたれものでSECDR-Schemeへのポインタが分かりません。 もしよろしければ、SECDR-Schemeへのポインタをしめしてください。 tinyschemeをもそうとう直しているので、 (conitnuation,dynamic-wind,list*,apply,,,,,などなど) このままいくか、それとも? でも、小さい実装系のソース元すべてが、 モリワキさんであることは、ちょっと驚き。 日本人は、Lisp/Scheme系が得意なのか?
186 :
dynamic-winder :03/03/11 03:05
有り難うございました。 内部は、相当おもしろそうですね。 研究してみます。 そもそもなぜこのようなことをしているかというと、 現在、bourne-shellにschemeを組み込もうとしているからです。 (シェルでプログラムをしていて、速度的、機構的限界を感じたため)
188 :
dynamic-winder :03/03/11 04:25
>187 私は、サイズに制限があるために、そのようなことをしていますが、 schemeをshellとして使うなら、scshがありますよ。 EPF,SREなど優れた機構もあります。
189 :
dynamic-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))) という代物です。
190 :
dynamic-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)))))))
191 :
dynamic-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))))))))
192 :
dynamic-winder :03/03/11 15:40
なぜ美しいインデントが消える?
醜いから
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 +) こんなん出るんですが・・・
>195 clos.lispに > ;; 3. Apply method combination: > ;; Only STANDARD method-combination is implemented. って、書いてあるよ。
>196 ありがとうございます clos.lispなんて一回も目を通していませんでした>反省しる!オレ
xyzzyでGUIって作れる?
作れるよ
>>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)
なんだそりゃ・・
こっちの方がいいか。 (defmacro func (x &rest rst) `(,f ,@rst))
ごめん、名前欄間違えた
訂正↓ (defmacro (f &rest rst) `(,f ,@rst))
229 :
デフォルトの名無しさん :03/03/15 13:18
goshとかguileって有理数使えるんですか? 最近schemeの勉強し始めたばかりなんですが、 有理数を使える処理系を教えてください。
少なくとも kawa Scheme MIT Scheme (Petite)Chez Scheme は使えるよ。>有理数
231 :
append の はなし :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
括弧ばかり(嘲笑激藁
233 :
append の はなし :03/03/15 19:55
私がいいたいのは、 appendの引数を、最低1つにするという まあ、内部構造からすると自然なことをどうしてしないのか? 過去との互換性で、そのようになっているのだとすれば、 どのようなときに重要になってくるのか、 これがあるから外せないという場面、 を知りたいなとおもいまして、、、、
234 :
デフォルトの名無しさん :03/03/15 20:22
>>233 論理構造としてそうあるべきだから。
それが嫌なら、(+) => 0。(*) => 1、(and)=>#t、(or)=>#f
もダメだよね。
235 :
append の はなし :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 となります。分かっているとおもいますが、、
236 :
append の はなし :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
>>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 . ())
ですよね,,,
>>246 まずね、
ちゃんと読め。
>>235 の、
>(+ a b c NIL) => (+ a (+ b c NIL)) => (+ a (+ b (+ c NIL))) => (+ a (+ b (+ c (+ NIL))))
>したがって(+ NIL) => 0 となります。分かっているとおもいますが、、
これは、ドット対のつもりだったのか?
ちなみにschemeではNILと書いてもただのシンボルであって、
defineされてなければエラーになる。
この前提さえ間違ってるから、既に話がかみ合ってない。
続き。
>>246 >(append '()) なのか (append . '()) なのか 書いてください。
(append) もしくは (append . ())
ね。
所で、
>>240 の話は無視ですか?
>>246 >(length) -> ?
>つまり、(length . '()) -> ?
これは単にエラーにすべき。
なぜならlengthは1引数を取る関数と定義されているので。
で、気になったのは、
君は固定引数の関数についてさえ、引数足りてなかったら、
定義と無関係に、勝手に#fを返す様にしたいのか?
それを仮に踏まえたとすると、
例えばこれはどうなるの?
((lambda(x) x))
エラーとせずに、#fを返すの?
>>248 >もしかして
>'(a b c d e) => '(a b c d e ())
>とおもっていませんか?
おもっていません。
もしかしてバカにされてるのかなあ。
模式てきなものでわかるかなとおもいまして、 NIL == . '() とすれば、あっているでしょうが、 NILのときは、きばってかきませんでしたが、 どうしてもというので246にきばってかいています。 それをよんでいないのは、あなたでしょう。 (そのようなことは、いわれずともわかっています。 処理系も複数個よんでいます。) ところで、あなたが、238で不明瞭だった点を明かしていません。 >appendの'()を否定するって事は、 (append '()) ですか? (append . '())ですか?
252 の記事は、時間がずれておりました。 もうしわけありません。なかったことにしてください。 #fを返すのいみがわかっていただけてないようです。 つまり、appendが無引数でよばれるような状態つまり、 (append . '())はエラーでもかまわないのではないかといっているのです。
251の記事について、 申し訳ありません。 記事そのものにも書いておきましたが。 でも、じっさいあなたの書いた >238 の記事には、(しかも、すべて)そうありましたが、、、、 簡略のためにかいたというのでしたら、指摘の行き過ぎでした、 申し訳ありません。
もしかして、ここが誤解のはじまりなのか? appendは、 r5rsにのってある関数で、標準関数として登録されています。 それは、無引数のappendを受けつけるようになっています。 そこで、 私の疑問は、そのわりに、どうしてこのようになっているのか 知りたいというものでした。
>>252 >(append '()) ですか? (append . '())ですか?
それは
>>250 で書いたので読み返してね。
>>253 >つまり、appendが無引数でよばれるような状態つまり、
>(append . '())はエラーでもかまわないのではないかといっているのです。
appendは可変個の引数、つまり
「0(または1)個以上の引数を取る」
とは考えられないのかな。
それが嫌なら
>>240 の様に引数の個数を強制しろって
事を言いたかったんだけど、伝わってないみたいね。
>>255 今R5RSを見た限りでは、
(append list ...)
と書いてあるから、(listと...を別個に解釈して、)
1個以上の引数を取る様にも見えるなあ。
まあどっちでもいいけど。
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)
が動作するのはその為だ。
結局のところ「大人ってズルイ」ってことかもね。
ごめん . が抜けてた 「(append . ())と(append)の内部表現が同じ」だった^^;
>>253 >(append . '())はエラーでもかまわないのではないかといっているのです。
ちなみに、これは普通の実装なら立派なシンタックスエラーとなる。
なぜなら(append quote ())と同じ内部表現となるからだ。
若者よ、精進じゃ!
ところで . の右側に引数を書くのってあり?と思う者もいるかもしれないので、念のため 「ありじゃ」 (list . (1 2)) -> (1 2) 年寄りは小便の切れが悪くてすまん m(_ _)m
誰か教えてよ。
265 :
デフォルトの名無しさん :03/03/18 06:06
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 してしまえば問題ないわけですが、それだと名前がよごれるのでこれはどうする のがふつうなんでしょうか。
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だった。
CLISPをWin98SEで使っていると,スタンバイができなくなったり, ランチャから新しいプロセスを開始できなかったりする. (bye) すると急にスタンバイしたり新しいアプリが始まる. これはWin98が悪いのか?CLISPが悪いのか?漏れのマシンの低スペックが悪いのか? 別にいいんだけどさ. あと誰かCLISPのForeign Function InterfaceのWindozeにおける可能性と使い方を 解説してるサイト見つけたら教えて.
277 :
デフォルトの名無しさん :03/03/24 23:41
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 処理系がありましたら教えて下さい。
すみません。 正規表現の最短マッチというのはないのでしょうか?
285 :
デフォルトの名無しさん :03/03/26 15:32
>>281 LispWorksというところの処理系が教育用にフリーで(制限付きだが)開放されていた.
それはたしかGUIが開けたはず.
>>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 使え。
(=゚Д゚=)) 調べてなかったすいません 逝ってきます
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 もインストール されているので、可搬性が高いかなと思ってます。
良いとこ取り = どっちつかずで言語としては・・・ ということが多い気がする
303 :
デフォルトの名無しさん :03/03/31 15:32
質問です 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)に分かれちゃうなあ。
>>314 いや、こういう場合はreaderを完全に手作りにした方が結局早いです。
内緒ですが、うちではML風構文を読める様にしてます。
S式でいいやん
あ、直リンしちゃったので、各自で削ってください。
やっぱり M式。
>317 > 開発効率が全然違います。 という根拠は? 「見た目」が多少違うぐらいで変わるとは思えないが
>>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式を凌駕するような特徴には思えないんだが >ある意味で判るが、明確な根拠は? データとプログラムの表現が同じであるということ。 それ以外は 「見た目が多少違う」 程度だし。 あなたのいう 「ある意味」 とは?
喧嘩するなや
で,このスレの方々は ML を便利に使っているってことなの? それとも,そういうのが専門の人だけ?
S 式をやめると、簡単なマクロしかかけなくなりそうな気がするけど、どうなんでしょうか? 分野にもよるけど、マクロがまともに使えないと開発効率は下がる気がする。
>>313 いいなあ. すごくいいなあ. 公開してくれないの?
今でも一番愛する言語は scheme だけど,
a.foo(x).bar(y).baz(z)[i]
の味を覚えてしまって,
(list-ref (baz (bar (foo a x) y) z) i)
が正直ちょっとつらく…
>>330 別に S 式をやめるわけじゃないんでしょ?書きやすいように
見た目を変換してるだけで。
>>327 >つまり、エディタが面倒なとこは補助してくれる、ってこと
いや、だから。つまり313=323さんは、S式を快適に使うには
エディタの補助が必要という点が、欠点だと言ってるのでしょ?
それを327さんは反論?としてエディタの補助が有れば良いというのが
それでは313=323さんの発言を認めているんじゃ・・・・ということです。
それとも私が勘違いしている?
>>332 「S 式は開発効率が高いか否か」という話をしているのでは?
エディタの補助についての議論は、正直どうでもいいんですけど、
S 式を採用している Lisp が他の言語と比べて開発効率が高い理由の 1 つは、
マクロを使って、ユーザが新しい構文を作ったり、対象としている問題に
適した言語を作ったりできることだと思うので、
S 式をやめて ML 風の記法を採用することによって、
>>327 の言う
> データとプログラムの表現が同じであるということ。
が失われてしまうと、マクロによる利点がなくなってしまい、
得るものより、失うもののほうが大きいのではないかと思います。
もちろん、対象とする問題によっては ML 風の記法のほうが開発効率
が高いことはあるでしょうが。
色々と誤解がある様ですが・・ 自分としてはデータ表現のS式は有効だと感じてますが、 コードにまでそれを強制する必要はないと思ってます。 S式を捨てるというわけではないです。 (というか、S式にかなりの部分依存してます。) それと、S式の出力が欲しい時はいつでもexpandできるので、 逆変換してもcondとか以外は元通りになります。 繰り返しますが、エディタの補助がいらないのは十分なメリットです。 いつでもemacsなどを使える状況とは限らないし、 メモ帳しか知らない人でも楽に記述できます。 S式と比べて、記述したり修正する時間はだいたい半分以下です。
>>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とか
使いまくるとめちゃくちゃ効率が良くてもう戻れない。
>>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式を説明してみろ
M式の処理系紹介しる
>>356 そのリンクの内容じゃ説明になってないだろ。
そもそもM式をそこで使う意味がわからん。
>>356 うん、もちろん強さは同じだから、見た目とか書きやすさの問題として。
defun とか cond とかは楽しいんだけど…
セミコロンも、 S式の括弧みたいに、慣れれば気にならなくなるのかな…
M 式だとマクロはどうなるの?
つーかM式が何に使う物なのかわかんないんだけど。 M式言ってる人は、使ったことあるの?
最近は M式を勉強しないのか?
昔の教科書はかならずM式も書いてあったね。 でもウィンストンの本がはやってS式だけになった。 結局理論より実用優先。
364 :
デフォルトの名無しさん :03/04/09 08:16
M式な処理系? MLとかHaskellってM式じゃなかった? Lispとは大分ちがうけど
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で渡された継続を関数形式で呼び出すと、
いつでもその継続を取得した直後に制御が移る、
でいいんじゃないかな。
いままで過去ログ読んでましたが、 このスレ的にはschemeというのが優性っぽいですね。 違いがまだちょっとわからないですけど。
>>373 簡単に言えばスレッドみたいなもんだ。
(call/ccの実装でスレッドを使っているものが多いし)
call/ccでスレッドを停止し、そのスレッドを返す。
もちろん受け取ったスレッドは、何時でも(元の環境下で)再開できる。
>376 > 簡単に言えばスレッドみたいなもんだ。 違うし 継続は継続であってスレッドではない 継続を用いてスレッド (というかコルーチン) を実現することは可能だが、 それは本質ではない。 このあたりはちゃんと理解しておいた方がよい。たとえあまり使わないとしても。
昔のWindowsやMacの協調型マルチタスクと同じ様な事ができる。
>>377 >違うし
そのとおり。
>継続は継続であってスレッドではない
名前が違うし。(藁
判らん人に理解を促そうとしてるのに、変なツッコミ入れるね。
数学屋なの?
>>379 s/理解/誤解/ であろ。
人にものを説明するスキルがないと思われ。
>379-380 たんに指摘しただけで一切説明はしようとしていないし
指摘だけして自己満足するオナニーならよそでやってちょ
嘘つきさん一所懸命ですね。
話がこんがらがっているように思えてならないのだが
具体的にどこまでわかってどこがわからんか言わないと
>>373 以上のレスは出ないような。
>>382 =377
>>379-380 >たんに指摘しただけで一切説明はしようとしていないし
で、何を指摘したかったの? 0文字以上1文字未満で答えよ。
>>380 >s/理解/誤解/ であろ。
Lisperがperl使うなー。
>人にものを説明するスキルがないと思われ。
そかも。消えます。
388 :
デフォルトの名無しさん :03/04/10 18:56
結局継続とは?
あ、それと、 その時点でのスタックの中身
>>387 >>s/理解/誤解/ であろ。
>Lisperがperl使うなー。
これが perl?
379は知らんくせにいらん事書きすぎ 突っ込まれたいとしか思えない
スルーされた・・・? ヒットした 16 件を全部読んだら継続について理解出来るはず。 それでも駄目だったら gauche-devel-jp の過去ログを見れば幸せになれるよ。
(+ 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の返り値になる。
続き。 (let ((x (call/cc (lambda (k) k)))) (x (lambda (ignore) "hi"))) ⇒"hi" …わかりません。 どうやら、xに継続?が入るらしいのですが・・・。 (((call/cc (lambda (k) k)) (lambda (x) x)) "HEY!") ⇒"HEY!" …謎。 こんな感じですが、よきアドバイス期待しております。
(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
>405 どうも。助かりました。
407 :
デフォルトの名無しさん :03/04/14 03:17
で結局、継続の話はどうなった? 例外以外に使えるネタは無いのか? 良いイディオムは無いのか? 誰か教えて。
ケント デイヴィグの本に継続を使ったマルチタスクのサンプルが出てたよ。
ところで、schemer はアプリを配付したい時どうしてるの? まずは処理系をインスコしてね だと、場合によっては面倒だよね。
ネイティブコードにコンパイルする処理系なら、大抵スタンドアロンバイナリが作れるんじゃない? BiglooとかStalinとか。
>>407 継続という概念が登場してきた歴史を勉強してくらさい
そうすれば、その存在理由もわかりまっす
>>409 Scheme48系はイメージを作って配布できるっぽい。
イメージとコアの2ファイルがいる。
CPSで副作用レスプログラミング
>>411 馬鹿なので判りません。
出来れば教えてください。
>415 コルーチンの例が set! 使っててイヤン
417 :
デフォルトの名無しさん :03/04/16 12:21
5月頃に行われるCommon Lisp, CLOSの最新動向に関するセミナーの 情報キボンヌ 書類どっかにいった…
lispってデバッグやりにくいなぁ
追跡の仕方が下手なだけじゃないのか?
>418 どこらへんが? トレースとかのデバッグ機能が普通はあるはずだが。 関数単位のテストが簡単にできたりとかもするし。
>>420 どの処理系使うかでぜんぜん違うでしょ。
普通なんていう言葉は、正確には定義できないので
使わないようにしましょう。
>421 だからこそ「普通は」といってるわけで
アンケートです。うざかったら無視して下さい。 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に分けるべきか、 どっちが正しいんでしょうか?
(^^)
427 :
デフォルトの名無しさん :03/04/17 18:20
LispWorks のIDEのリスナーでは、#\あ => #\あ と評価されるんだけど、 ILISP では #\あ => Error: Wrong character name: あ. とエラーになる。 どうしてだろう?
429 :
デフォルトの名無しさん :03/04/19 16:31
>428 日本語に対応してないってだけでわ?
∧_∧ ( ^^ )< ぬるぽ(^^)
∧_∧ ( ^^ )< ぬるぽ(^^)
>> 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
qscheme は indirect threaded code だっけ。 でもちょっと実装がアレだった記憶が…
451 :
デフォルトの名無しさん :03/04/28 01:36
そうなんだ。 もったいないね。 たぶんPetiteとタメ張れるインタプリタってこれぐらいじゃない?
実装がアレってなーに??
/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 (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))))
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)))))
これはどうだろう。(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
どう、って何が? ちなみにそれも末尾呼び出しになってない。
再帰パターン探してたら出たんだけど、本当に正しいか解らないから誰か証明してよ ってぐらいの意味だったんですけどね。 最近は末尾再帰でなくてもいいや、動けばいいやって感じです。 (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
そうですか。
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にしても特別扱いしなきゃならない問題。
ライブラリが言語仕様に含まれるか否か?
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 文法には含まれないけど、仕様には一部のライブラリが含まれると思う。
ありゃ、ここ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 スクリプトを書いて、 スクリプトの一行目にインタプリタのパスを書いて、 パーミッションを与えて、 実行すると、 実行できる。 日本語もバリバリ。 ができるスキームってどれですか?
cygwinってパーミッションあるんだ。 Gaucheはどうなの?
>スクリプトの一行目にインタプリタのパスを書いて、 >パーミッションを与えて、 >実行すると、 >実行できる。 どれでもできる。
513 :
デフォルトの名無しさん :03/05/09 04:06
519 :
bloom :03/05/09 11:13
(defun a)であきらめた。
そうですcar
ウゼエ
(cdr ねえ)
それは「くだらねえ」って読むんですか? それは「くだらねえ」って読むんですか? それは「くだらねえ」って読むんですか? それは「くだらねえ」って読むんですか? それは「くだらねえ」って読むんですか? それは「くだらねえ」って読むんですか? それは「くだらねえ」って読むんですか? それは「くだらねえ」って読むんですか? それは「くだらねえ」って読むんですか? それは「くだらねえ」って読むんですか? それは「くだらねえ」って読むんですか? それは「くだらねえ」って読むんですか?
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
540 :
デフォルトの名無しさん :03/05/14 01:59
1700万じゃなかったかな。 小俣ちゃんから送られてきたメール会社で確認してみるよ。
541 :
デフォルトの名無しさん :03/05/14 13:07
ネイティブコードに変換したLISP ちょー速い。
>>541 なになにそんなに凄いの?もちっと具体的に自慢汁!
訂正:サイトライセンスで1600万円也でした。 CLIMとかAllegroStore永久ラインセンスとか追加してくと2000万くらいには軽く手が届きますな。
あぼーん
545 :
デフォルトの名無しさん :03/05/15 21:37
なかなかですな
1600万円とはびっくり。
547 :
デフォルトの名無しさん :03/05/17 00:12
1600万円かぁ。うへぇ。いくら速いとはいえ… Allegro ODBC使うだけの方がいいかぁ。 これだとEnterpriseかぁ。 これも高いのかなぁ?
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万ぐらいに負からんか?アレグロさんよー。
新日鉄がぼったくってんじゃないのかという気がしないこともない。 米国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
Guileかと思ったらGaucheかー! 河合さん本人の記事かな?
よ〜し、父ちゃんUNIX USER買うぞ〜
ちょっと疑問に思ったんですけど、 apply という手続きを apply を使わずに定義することはできるのでしょうか。 自分自身を使わずに定義できない手続き(及び構文)をプリミティブというのでしょうか?
584 :
デフォルトの名無しさん :03/05/25 17:06
>>583 できるけどさあ
>自分自身を使わずに定義できない手続き(及び構文)をプリミティブというのでしょうか?
自分自身を使わずって、
もうちょっと質問の仕方考えろよー
>>580 文法はなんとなくわかったけど、使い道がよくわかってないので、
とても楽しみ。
>>584 過去ログに car と cdr を他のプリミティブ手続きで定義したものが
あったのですが、プリミティブかどうかは定義できるできないに関わらず
仕様で決っているという解釈でよいですか?
apply については調べたら eval との相互再帰だと分りました。すいません。
なんにせよかなり原始的な手続きだということが分かって安心しました。
>>587 Gauche の河合さんのインタビュー。
次の友達の輪は ポール・グラハムになりそうだな。
∧_∧ ピュ.ー ( ^^ ) <これからも僕を応援して下さいね(^^)。 =〔~∪ ̄ ̄〕 = ◎――◎ 山崎渉
591 :
デフォルトの名無しさん :03/05/28 17:48
qschemeがビルドできない configureでlibgmpのテストがエラーになってしまう
OSとバージョンぐらい書けよ
なにかと思ったらカールか。 予想通り全然ブレイクする気配なし。
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の奴等(;´д`)
サブセットどころかサブサブサブセットぐらい?
何が重要なんだろう・・・
ライブラリ
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式で書かれているのですよね? ライブラリとは何が違うのでしょうか? マクロも用いて新たな構文を作ったりするとそれはもう別言語であるということ? 自分で作ってみないとわかんないなぁ….イメージしやすい簡単な事例をキボンヌ
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 とかと相性良さそうだけど, なんか具体例キボンヌ.
623 :
デフォルトの名無しさん :03/06/07 14:04
Lispで3Dグラフィックを扱う手段ってあるのでしょうか OpenGLインターフェイスを備えた処理系とか.
UNIX USER 発売日。
shiroたんが書いたのね
>>622 それはすでに過去の話では…今は C++ なんじゃなかったっけ?
>>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 なんか使わなきゃいいじゃん。バッカじゃないの?
>>648 はぁ?本気で言ってんのかよ?
そこまで苦労して Windows 使いたいなんて、おまえの方が頭膿んでるだろ。
で、結局バカの一言で終わりなの? 都合が悪いとバカ扱いですか。そうですか。
やーいやーい、バーカバーカ
まったり逝こうぜ
>>624 >>626 >>637 情報ありがとうございます。
とりあえずgauche-glを試そうかと思ったらcygwinではだめだとか。
Windowsを常用しているのでcygwin+gaucheでいけるといちばんありがたかったのですが・・・。
というわけでLinuxで試してみます。
654 :
デフォルトの名無しさん :03/06/08 14:12
うーん,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 で書くか?
つまり、そういうことだよ。
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))
あ、かぶった、ごめん
つうか、format よりも (concatenate 'string str1 str2 str3) のがよさげだな。
素直ではあるがスマートではない
(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))
ども、いろんな例を提示していただいてとても勉強になります。 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インターフェイスの情報があれば教えてください。
お願いします。
ちょっとわらった。CPU time で 10 秒しかつかえんけど。 % telnet prompt.franz.com
よし、その先を目指せ
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
>>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にモジュール化の計画はないのかな…
>>705 これでいんじゃないの? M-x run-scheme
(setq scheme-program-name "/usr/local/bin/gosh -i")
(autoload 'run-scheme "cmuscheme" "Run an inferior Scheme process. " t)
会社の乖離道に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 じゃないや。
>>702 了解。amazonに速攻で発注してみました。
>>712 どもです。残る問題を順次片付けていくです。
>>701 つまらない解答っていうより問題の方がつまらない。
再帰をさせる問題の方がLispができるようになると思うんだけど。
>>713 ふつー ilisp 使うだろ。ぐぐってみれ。
718 :
デフォルトの名無しさん :03/06/18 18:09
LISP覚えるって事は、やっぱりemacs使わないとだめなんでしょうか?
普通のエディタでやれるよ。
使用エディタがWZでもLISP使いを名乗っていいですか?
でも、emacs の支援機能はあったほうが快適。S 式単位の編集機能、ilisp に よる lisp 処理系との連携とか、関数にカーソル合わせて CLHS を一発で引くとか。 あるのと無いのでは大違いだと思う。
じゃ、だめなんですね?
質問です。 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
>>724 バッファリングされてんじゃない
と、よく読まずに(ry)
>>724 TCP ならいけるの?
本題とは関係ないが、socket-close とかは unwind-protect しとくのが無難。
Scheme なら dynamic-wind かな?
a
(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)) ってのもありな感じがするが。
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 では書けません….
>>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 で動かしてるって人のページ がひっかかるのだが…
「よろずや」って謎のタイトルのついてるページですよね?
>>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 ウマーって話だった
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 が使ってみたかっただけだっ たのです.まだ良くわかってないですが,使いドコロによっては便利な予感なのですが.
参考までに私の改良を。 条件を満たすものと満たさないものを両方返す手続きで 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)))))
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もこのロジックだと 述語のかわりに数値化する手続きを受け取らせたほうがきれいかな。
数値化する手続きをソートで適用しまくるのはやっぱり遅いので プログラム全体を見直し、数値化したリストだけを処理することにして そのあとで数値化する前のリストを処理することに。 同じ数値が一つか二つしかないことが多いので 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))
>>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文字のアルファベットは蓮の穴に見える・・・
関数型言語の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は分かりやすいのかよく分かりません。。 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!
>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版が どこかにあれば問題ないのですが。 どなたかご教授ください。
787 :
デフォルトの名無しさん :03/07/02 22:19
788 :
デフォルトの名無しさん :03/07/02 22:21
信じれば動く
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
COBOL知りません・・
グイーラー? guile? ネタ?
804 :
デフォルトの名無しさん :03/07/03 23:36
グイーラワラタage
ゴーシュはWinで使えないみたいだなあ コンパイルすればCygwinなら使えるのかもしれないけど めんどくさい
それは「使えない」ではなく「使う気がない」だ。
ど根性guile
>805 バイナリ公開してほしいね。 ちなみにcygwinでも「動く」までは行くよ。 いくつかエラーとか出たけど。 使用に耐えるかどうかはわからない。 単純なコードなら問題なさそうだけど。 確かに、これのためだけにcygwin入れるのは非常に面倒だ。
configureが異常に長い。
今時windowsで動かないなんて笑っちゃうよ cmuclも動かないけど
cygwinインストールしたらグイーラーが標準でついてくるから こっち使えば良いか
グイーラーなんて知らん
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の処理系ってたくさんあるわけ? 統一してくれないと困っちゃうんだが。
作るのが簡単だから。
自分はまた処理系作ろうとか考えてるわけです。テヘ。 現在、継続や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はできなくなるが、
実行ファイル単体での配布が可能になる。
>>838 確かにCPSで書かれると不利になるね。
ローカルで完結するクロージャについてをスタック上で
まかなえばいいんだろうけど、フロー解析が必須になる。
>継続でコピーをlazyにやる方法は"copyless continuation"で
このコピーレスって、mini-schemeの様にGCで回収させる事かな?
対象がセルじゃなく、スタックである分速いのかもしれないけど、
GCの起動回数とメモリ移動が増える分、どうなるかわからない気がする。
これはどうだろう。 local-lambdaという構文を用意し、このクロージャは 定義したレキシカルスコープから外へは出ない事を ユーザーに明示させる。スコープから出た場合の 動作は不定、じゃまずいからヒープに移動しない等の、 何らかのエラーを返す。
↑よく考えたらクロージャの破棄タイミングがわからないから 駄目だ。スコープから抜ければ破棄されるけど、 ループなんか回されたらもう駄目。
ネタ3: 上の実装であればGCはマーク&スイープで十分。 ヒープがセル専用なので断片化を気にする必要がないからだ。 マーク&スイープはオブジェクトの参照とマークテーブルの 書き換えだけで済む。さらにスイープは遅延できる。 コストはコピー>マーク&スイープ>マーク&遅延スイープ ただし、所詮マーク&スイープなので生存オブジェクトが 多くなると局所性とマークのコストが問題になる。
>>838 >gaucheもそうやってるよ。gaucheの「コンパイラ」はかなり単純。
gaucheはたしか末尾呼び出しのフレーム調整の最適化が
できてなかった。最新版だと違う?
>>844 >末尾呼び出しのフレーム調整の最適化
って? フレームの削除を末尾呼び出し毎にやるんじゃなくて、
いくつかまとめてやるとか、そういうこと?
↑最適化じゃなくて、ただの末尾呼び出し こういうやつが遅い (define (ack m n) (cond ((zero? m) (+ n 1)) ((zero? n) (ack (- m 1) 1)) (else (ack (- m 1) (ack m (- n 1))))))
うおお、怒涛のような書き込み・・・ ポインタ&勉強方法等、ありがとうございます。 ひとつ質問があります。セルの中身の表現に、下位数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だけど…)
>>848 rest引数はクロージャの環境フレーム生成の時にスタックからリストに変換する。
apply呼び出しの場合はコピーの生成の有無とか色々ある。
コンパイラならその場合は直接(list 1 2 3 4)に変換するかも。
LISP犬グイーラー
>>824 SICPがすごい本で、その中で扱われているから。
アルゴリズムはschemeだとすごく分かりやすい。
SICP凄い本っていう割りには、アメリカのAmazonで評価良くないな。
アメリカにもDQNはいる 評価つけたやつが勘違いしていたという結論だった筈
856 :
デフォルトの名無しさん :03/07/05 23:31
>>855 128人もレビュアーがいて、星3.5個なわけだが。
一人二人勘違いしてた所で、評価は変わらん。
レビュー読んでみりゃわかるよ…
見てくるのでリンクおながいします
難しいのでクソじゃなかったの?
難しいな。特に解らない数式が出てきたりすると。 ほとんど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型
>>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
継続といえば、コールバック関数上での振る舞いが問題になると思う。 これのおかげでマシンスタックを退避とかしないといかんし。
ここは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にメール出してみてはいかが。
既に翻訳出版の話が進んでいるとかでない限り、
快く了承してくれると思いますよ。
>>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 版は許可もらってんのかね?
犯罪というものは訴える人間がいるから成立するのだよ。 もし芳しくない返事が返ってきたとしても、どっか無料鯖にアップしとけ。 翻訳者の名誉なんか求めてないだろ?とりあえず全部訳したら俺が神認定 してやるよ。
犯罪っつーか権利侵害な
>>885 ある程度できたらメールしようかな、と...
実は4月以来進んでいないのです。それで動機付けにここに公開したという訳。
>>887 プリンタくらい持ってるでしょ。
>>888 >>889 どうもです。
>>890 一度絶版になって公開されている本を出版するような出版社は少ないと思ったんですが...
>>891 何ぃぃぃぃぃそんな便利なものがぁぁぁぁぁ
PDFからコピペするのがどれ程面倒だったのかと小一時間(ry
>>892 >>893 これはPaulの権利の侵害ではないと言えますよね。
そして私のような個人が翻訳して配る行為を縛る権利は本来誰にも
(現実的にはどの出版社にも)ありません。
ま、いずれはPaulにメールして承諾もらいますよ。くれるはず。
あとはShiro Kawaiさんとかはぎゃ教授とかにも教えたら喜んでくれるかも?
で、中身についての意見きぼんぬ。あんまり分かってないので間違ってるかも。
ただ、作業の続きは期末試験終わった8月位になります。すんませんね。
つうか翻訳した分だけでいいからWikiで公開してくれ。 本人が放置しても作業が進む可能性を残すべし。
|
>>892 >>893 これはPaulの権利の侵害ではないと言えますよね。
| そして私のような個人が翻訳して配る行為を縛る権利は本来誰にも
| (現実的にはどの出版社にも)ありません。
痛すぎる…
再版されるのか...絶対買おう。
ちょうど comp.lang.lisp で似たようなネタやっとるな…
>>900 あなたが
>>883 であると想定して書込みます。
それはたぶん私的使用のための翻訳を言っているのだと思いますが、
WEB上に出してしまうと、
アクセス制限でもしてない限り私的使用とは言えませんよ。
いずれにせよ、絶版になったからといって、
当然に出版社側の権利が消滅するわけではないので、
ちゃんと聞いたほうがいいです。
あなたの労力は高く評価しますが、
手続は踏んでおかないと色々面倒なことになるかもしれず、
その労力が無駄になりかねませんよ。
>>903 それは僕に言ってるんですかね
そうだとしても、あなたの言ってることが
私の言ったこととどう矛盾しているのか分かりませんが
えーーと、私は基本的にコテハンな人なのでよろしく。
で、まさか再版の方向で進んでいるとは...
それではさすがにやばそうなのでPDFおよびDVIファイルの公開を停止しました(w
>>895 Texinfoはまだ日本語を使うと微妙にDVIの見出しとかが変になるので... でも考えてみます。
>>897 Wikiとかうpローダとか使い慣れないのですいません。
>>898 おっ釣れた,,でも一匹だけかつまらん
>>900 >>902 分かってはいるのですが、どうせ絶版なら多少承諾が前後してもいいだろ、と思ったわけです。
しかしそうも言っていられない。
>>905 「ハリーポッターをドイツ人有志が独訳」
しかしハリポタは購買層が広いからそれでも売れるのでしょうが、On Lispの場合はもめるかも。
「私の翻訳は違法、出版社も揉め事を避けて邦訳を出版せず」となると日本のlisper全体に迷惑が行って
ヤヴァイので慎重に行くことにします。今英語のできる友人にメールの文章の添削を頼んでいます。
# PDF公開なんかより出版しる!という声もあった位だから購買意欲を削ぐことにはなってませんよねえ?
Oh my gosh!
絶版とか何とか言う前に、著作権違反だっつーの。 著作権のイロハを学んでこい。(w
要するに英語で連絡とる面倒さと、事後承諾拒否のリスクを秤にかけてるんだろ。どのみち迷惑だからヤメレ
このままだと釣りや煽りが出てきそうなんで話の整理 だから翻訳したものを無許可で公開するつもりですなんて 誰も言ってないっつーの 無許可公開には問題があるんじゃないかって話がでてきて 「じゃあ自分の勉強のためにただ翻訳するだけなら 著者の許可を得なくてもいいんですね」 「そうだよ。でも翻訳したものをwebに載せるのは 頒布になるから許可がいるね」 というやりとりがなされただけ。 ちょっと落ち着け>誰かさん
つーか著者に連絡するって本人が書いてるじゃん 著作権について奇妙な理解の仕方をしてるみたいだけど 間違った行動さえとらなければこのスレ的には別にどうでもいいし 著作権についての議論やひけらかしがしたい人は別板でどうぞ
許可が取れれば問題無いと思う。 でも、今の時点では許可とってないので、問題あり。
>>911 おまいは話の発端を読み直せ。
明らかに権利侵害を行なっていたことが読み取れるから。
>>906 こういうのは「知らなかった」なんて言い訳が通用しないのは当然として、
「絶版だから大丈夫だろうと思った」なんていう勝手な決め付けは
自らのオツムが足りてないことを公言してるようなもんだよ。
判断を下すのは権利者であっておまいではない。
NGとかにもこういう話になると途端に活気づく奴がいてウザイネ
そんだけ非常識な香具師が多いってことだろ
無知とは言え、よかれと思ってやった人の行動を情け容赦なく罵倒する914。 914はさぞかし素晴らしい何かを成し遂げているのだろう。 ああ、完全無欠の914!
関係ない話は他所でおねがいします。
そんなcdrん事よりlispの話しないcar?
>>917 良かれと思ってやる犯罪者を確信犯と呼びますな。
犯罪者は確信犯だろうが、情け容赦なく罵倒するのが妥当。
ついに"犯罪者"呼ばわりでつか…
>>921 犯罪者呼ばわりしてる人などいないが。
法律のことは良く知らないが、著作権侵害をしているなら、
もしかしたら犯罪者かもな。
良スレだったのに、(・ー・)オワッタナ・・・
924 :
デフォルトの名無しさん :03/07/12 22:49
DrSchemeで、拡張子がpltのアーカイブファイルがあるんですが、 これはどうやって解凍するんでしょうか?
よかれと思ってやっても犯罪は犯罪。
いいから、著者と連絡取れ。 公開する、しないはそれからだ。
>>911 実際のところはそれすら自明ではないんですがね。
著作権では、私的複製は許されるけど、私的翻訳は許されなかったはず。
ほぇ?
何を今更、しかも的外れなことを
的外れ?まさに、私的翻訳をやってるように見えるし、 それがOKと勘違いしてるやつがこのスレに いるように見受けられるが。
WEBで公開してる以上私的じゃないな。
>932 そろそろ空気読めよ。
かくしん-はん 【確信犯】 道徳的・宗教的・政治的な信念に基づき、自らの行為を正しいと信じてなされ る犯罪。思想犯・政治犯・国事犯など。
(gc)
これからは英語論文も英文マニュアルも英語のまま丸暗記しますから どうか安らかにgcされてください>932
著作権侵害とならない範囲での翻訳ならいいだろう。 脳内翻訳とかな。
>>938 英語論文に日本語訳を書き込んでセミナーに臨むのも禁止だかんな
明日は覚悟しとけよ!
厳密に言えばそれも違法だろうな。 ただ、量が少なければ著作性は認められないから良いかもしれないが。
軽犯罪といったところか。
1. まず自分で勝手に翻訳をし、 2. 翻訳ができた段階で著作権に連絡を取り許可をもらって頒布する こういうのはよくあるんじゃないかと思うんだけど、 1. の段階で法律違反なのですか? 許可を取らないと、1. すら駄目ということですか?
>950 は次スレお願いします。 あ、テンプレに翻訳物の著作権絡みの話題禁止って書いておいて下さい。
どうしても著作権の話したけりゃ、Lispで書け!
>>938-943 ちょっとわかりにくいけど、著作権法43条によって、私的な翻訳
や、教育上の翻訳も許されます。
第30条は確かに複製だけを対象にしてるように見えますが。
S 式は英語ではなんというのですか?
アトムは S式である x と y が S式ならドット対 (x . y) も S式である これでいいと思うけど、Lispで扱うのはみんなS式だよ。
__∧_∧_ |( ^^ )| <寝るぽ(^^) |\⌒⌒⌒\ \ |⌒⌒⌒~| 山崎渉 ~ ̄ ̄ ̄ ̄
その「Lispで扱う」の解釈がちょっと
何がわからないんだ?
自分は lisp 使いじゃないです。 S 式を知りたくてこのスレッドにたどり着いたので。
コードはS式として書くけど、データ型はいろいろじゃんという事が言いたかった
色んな拡張があるので(read)で読みこめれば、なんでもS式かな。 それはそうと、俺はクソプロバイダのせいで次スレ立てられない。 誰かよろしく。
961 :
デフォルトの名無しさん :03/07/20 02:12
mada tsukaeru yo n
(^^)
(⌒V⌒) │ ^ ^ │<これからも僕を応援して下さいね(^^)。 ⊂| |つ (_)(_) 山崎パン
966 :
デフォルトの名無しさん :03/09/11 13:15
/ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄\ Λ_Λ | 君さぁ こんなスレッド立てるから | ( ´∀`)< 厨房って言われちゃうんだよ | ( ΛΛ つ >―――――――――――――――――――‐< ( ゚Д゚) < おまえのことを必要としてる奴なんて | /つつ | いないんだからさっさと回線切って首吊れ | \____________________/ (-_-) ハヤクシンデネ… (-_-) ハヤクシンデネ… (-_-) ハヤクシンデネ… (∩∩) (∩∩) (∩∩) (-_-) ハヤクシンデネ… (-_-) ハヤクシンデネ… (-_-) ハヤクシンデネ… (∩∩) (∩∩) (∩∩) (-_-) ハヤクシンデネ… (-_-) ハヤクシンデネ… (-_-) ハヤクシンデネ… (∩∩) (∩∩) (∩∩)
>>965 「ambda式」 になってるのは気のせいですか?
>>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が大好きな人なんているんですね。
過疎板じゃ普通
次スレよりも後で1000行く前スレなんてのもあるんだろうか。
>>994 この調子でいけばさすがにそれはないかと(w
もうすぐだもんな。こっちが1000到達すんのは。
int a; /* int型の変数a */ と同じぐらいのキモさだな
1000取るチャンスですか?
埋めるよ
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。