1 :
デフォルトの名無しさん :
04/01/30 21:12 ま、ぼちぼちやりましょうよ。
iーー- ,,-ーーーーー、-ーつ と、 , ´ ・("▼)・ ヽノ .> ,,, _フil=li=、_< ( /彡 ┃ ┃{i| ゝ(|il(_, ''' ヮ''丿| 〆(⌒)-ーー-(⌒)>2ゲッシ! ( i⌒ヽ, i⌒ヽ, ヽゝ、__ノー-ーゝ、__ノ
3 :
デフォルトの名無しさん :04/01/30 21:43
スレの目的としては、 本家スレは高度過ぎて質問しずらい。 LISPやりけど、何していいかわからん。 他いろいろ。 な、初級LISPスレにしていきたいなぁ。
4 :
デフォルトの名無しさん :04/01/30 21:47
処理系ってどこにあるの?
5 :
デフォルトの名無しさん :04/01/30 21:55
Hello world教えて
CommonLispは仕事の効率を良くしてくれますか?
maximaをもっと使いこなせるようになりたいです。
初級 Scheme はどこれかたればいいのれすか?
>>8 WiLiKi に逝くとか何事も無かったのようにここで語るとか。
11 :
デフォルトの名無しさん :04/01/31 01:57
CommonLispのチュートリアル、Web上になんかいいのないかな
俺も仲間に入れてくれ。とりあえずGCL入れたぞ。 ドキュメントが激しく読みにくいんだが・・・。
13 :
デフォルトの名無しさん :04/01/31 02:17
CLISPやXYYZYとかでもいいのか? っつーかその程度しか環境しらん。
漏れはcmucl入れたぜ!maximaも動くぜ! M-x run-lispでインタラクテチブだぜ!
微妙に期待してみる。おまいら、充実したスレに育ててね。
>(write-line "Hello World") Hello World "Hello World" 何で二回出力されるんだ!わからん!もういい寝る!
>>17 write-lineと式の評価の二つ実行されるからじゃないか?
Perl print $a=sub{$_[0]*2}->(3); CommonLisp ((lambda (x) (* x 2) 3) Lispの方が(・∀・)イイ!!
21 :
デフォルトの名無しさん :04/01/31 07:22
scheme初心者もいれてください comon lispって処理系をいれられないっす んっと、gclは「成功です」ってメッセージだけで トップレベルにならない。 schemeは、インストールの失敗しないけど解説も CommonLispより更に少ないんですよね
scheme初心者まで入ってきたら本家スレとの区別がなきに等しくなりますよ。 どうせ住人はかぶるんだし、このスレはcommon lisp中心でいきませんか。
CommonLispとSchemeって何が違うの? defunとdefineしか分らん。。。
nilがなくて (eq? #f ()) => #f だとか set! が戻り値がなかったりとかが ちょっとや〜ねえ、というところ。〉scheme
新しい言語覚えるのってなんか新鮮でいいね。 インタプリタに打ち込みまくり。Emacsを最近覚えたから 少しは楽になったけど。
CommonLispって動くの? 嘘だといって欲しいよ。 xyzzy使えばいいのかなぁ win98からfedoraに移行したんだけどなんか 戻りたくないんですが。
>>27 CommonLispはclisp,cmucl,gcl,aclの四つが有名なんじゃないかな。
aclはお試しばんがインターネッツ上に公開されてまつ。
$telnet prompt.franz.com
これだけでOK。WindowsだろうとMacだろうと問題なし。
Linuxだったらどれでも普通に使える予感.
SBCL
>>29 >>28 はwindows系なんでしょ。UNIX系だったら
cmucl,sbcl,clisp...みたいになるかもしれないけどさ
Windowsで使えるエディタで、Common Lispからいくつか機能を削った言語をマクロ言語として 採用しているものにxyzzyがある。 同じくWindowsを含め幅広いOSで使えるエディタで、Common Lispに良く似たEmacs Lispという 言語をマクロ言語として採用しているEmacsもある。EmacsのWindowsへの移植で有名なのは Meadow2がある。 Common Lispにこだわる必要が無くて、なんとなくLisp的なものの感触を掴みたい人はこれらの エディタで、自分の欲しい機能を書いてみるというのが実践的な身に付け方としておすすめ。
34 :
デフォルトの名無しさん :04/01/31 13:39
WindowsでClispをやろうとしている人への助言。 Meadow2 + ilisp + CLISP + HyperSpec + Common Lisp the Language 2ed(CLtL2) という環境がおすすめ。調べたい関数や変数を説明した、HyperSpecやCLtL2の該当 ページを、補完機能つきで指定して、表示させるコマンドがilispにはあります。 CLISPが異常に重いと感じたら、Cygwin版のものを使うと軽くなるかも。 Cygwinのネットインストーラーのメニューに探せばCLISPがあるので簡単です。
ツッコミを入れておくか. SBCL の売りは Linux + SBCL だとネイティブスレッドが使える事〜. GCL が無視され気味なのは単純に ANSI CL に準拠してないからだろう. # Mac 用の CMUCL はもうスクリーンショットが出回ってるね.もうすぐかなー?
>>35 Mac 界隈では SBCL より OpenMCL の方が人気あるっぽいよ。
スレッドも使えるし、Cocoa へのインターフェイスもあるし。
Kyoto Common Lisp familyの歴史的経緯をすこし。 現在の米国規格協会(American National Standards Institute 略称ANSI) が規定している、ANSI Common Lispが制定される途中の段階で、規格制定 委員会に参加しているGuy L. Steele Jr.という人が "Common Lisp the Language"(CLtL1)という中間報告的な本を出版しました。 Kyoto Common LispはこのCLtL1に準拠するべく湯浅 太一、萩谷 昌己さんたち によって書かれた処理系です。したがって、現在の規格とは微妙に動作が違っ たり、必要な機能が欠けていたりします。 Kyoto Common Lispの目立った特徴は、独自のコンパイラは持たず、システムに 備わった既存のCコンパイラを使う点です。もちろん開発中、動的にある一つの 関数だけをコンパイルすることもできます。 Kyoto Common Lispはその後いろいろあって、GNU Common Lisp(GCL)や Embedable Common Lisp (ECL)へと受け継がれ、今にいたります。 私が昔触った感じでは、ECLの方がより規格に準拠しているように感じました。
ポールグラハムは一流のエッセイストですね。
おぅ、初心者らしき質問があるじゃねーか。ネタ初心者かもしれんが。 Common Lisp と Scheme の違い * T, NIL と #t, #f ←これの所為で互換性大幅ダウン * 規格にパッケージシステムやオブジェクトシステムがあるかどうか 少々気にいらなくてもどこでも使えるタフなのが欲しいか, 処理系依存の気配がしても自分のお気に入りのがいいか * 関数と変数の名前空間が分かれてるかいないか Scheme は分かれてないから ((if pred? x y) 100) とか書ける CL は分かれてるから (funcall (if pred? x y) 100) となる そんかわり Scheme で大規模なものつくるときは名前にちょっと注意い * 末尾再帰の最適化が Scheme は規格で決まってる CL は処理系のマニュアルを読まなきゃ(実装でどうするか決まってる) ↑(これをやる最適化オプションとか決めたいよね〜とかいう話もあった) * (規格レベルで)コンパイラを意識しているか CL : かなり Scheme : あんまり
なんか段々と話がむこうのスレに近付いて来てないか? むこうのスレの奴が話をまとめに来てるだけだったりして。 #俺もそのうちの一人だけど
(defun make-add (n) #'(lambda (x) (+ x n))) ・・・(a) ;(defun make-add (n) ; (lambda (x) (+ x n))) ・・・(b) (setq add2 (make-add 2)) ;add2にはラムダ関数のリファレンス? (funcall add2 3) aとbどちらでも同じ結果が得られます。#'というのは関数への リファレンスを取得するようなイメージを持っているのですが、 これは勘違いでしょうか。cmucl-18を使っています。 またfuncallとはPerlでいうろとこのデリファレンス(して関数呼び出し) のように思っていたのですが、これもやっぱり見当違いかな。 #'の有無に関わらず(add2 3)の形式では呼び出せません。
sub make-add{ my $n return sub{$_[0]+$n}; } $add2 = make-add(2); print $add2->(3); Perlだとこんな風になるのかな。当然関数本体を 変数に格納することはできないので$add2には関数の リファレンスしか入りません。
HyperSpec macro としての lambda の説明
http://www.lispworks.com/reference/HyperSpec/Body/m_lambda.htm > (lambda lambda-list [[declaration* | documentation]] form*)
> == (function (lambda lambda-list [[declaration* | documentation]] form*))
> == #'(lambda lambda-list [[declaration* | documentation]] form*)
つまり、#'(lambda () (foo))と(lambda () (foo))では同じ結果となります。
まず、Common Lispでは、シンボルのValue cellとFunction cellが分かれています。
> funcallとはPerlでいうろとこのデリファレンス(して関数呼び出し)
Value cellをデリファレンスして関数オブジェクトを取得したのちに
関数呼出しということでいいと思います。
(add2 3)の形式で呼び出せないのは、(add2 3)などのfunction formをeval
するときは、先頭(この場合add2)がシンボルのときは、そのfunction cell
をデリファレンスすると決められているからです。
(setf (symbol-function add2) (make-add 2))としてやれば、(add2 3)が
うまくいくでしょう。
>>43 質問キター
Common Lisp では一つのシンボルは変数としての値と関数名としての値
の二つを持つ.(それぞれ symbol-value と symbol-function でアクセス可能)
(setq add2 (make-add 2))
だとシンボル add2 の値(symbol-value で取り出すほう)に (lambda ...) が
入るわけ.で,
(add2 3)
ってやると add2 は関数だからシンボル add2 の symbol-function を
取り出そうとするわけだが,当然空なのでエラー.どうすりゃいいかっつーと
(funcall add2 3) ←こいつは add2 の symbol-value を使うので平気なわけ.
で,たとえば (funcall car '(1 2)) とかしたとき,シンボル car の
symbol-value は(普通)空っぽなんでダメポ.そこで function のほう,
と指定するために #' をつけるわけだ.
(funcall (symbol-function car) '(1 2))
なども可能ではあるがカコワル.
(funcall (funcion car) '(1 2))
の省略系として
(funcall #'car '(1 2))
なわけ.
CLHS によれば function (つまり #' ね)は "function name => function" で
名前が symbol だったら symbol と対応した関数を,lambda 式だったら
レキシカルクロージャを返すわけだ.
更新してなかったんで 45 と被った〜鬱
>>47 いや、多角的な説明になってかえっていいんじゃない?
今なら、親切な講師陣が懇切丁寧にCommon Lispを説明します。>all
でも質問があまりないじゃないか。 ネタ初心者として自作自演に走らないと盛りあがらないかも。
>>45 さっそくのド素人な質問におつきあいどうもありがとうございます。
>Common Lispでは、シンボルのValue cellとFunction cellが分かれています
>>41 さんも書いていてくれましたね。よく読まないとだめですね。
add2という自由"変数"だからfuncallが必要のですね。関数はdefunで作られた
名前だけということになるのかな。
>(add2 3)などのfunction formをevalするときは、>先頭(この場合add2)がシンボルのときは、
>そのfunction cellをデリファレンスすると決められているからです。
その位置によってLISPが探すシンボルテーブルが異なるわけですね。
先頭だけがFunction Cellをみて、残りはすべてValue Cellになるのかな。
>>45-46 さん
symbol-value,symble-functionについてはよく読んで勉強させてもらいます。
あと44に書いたPerlはめちゃくちゃでした。これが正しいかもしれません。
print sub{my $n=$_[0]; sub{$_[0]+$n}}->(2)->(3);
細かいけど一つのシンボルが複数の値をもってるんだ.シンボルテーブルが関数用と 変数用に分かれてるんじゃなくて,シンボルが関数用と変数用の値を持ってるわけ. シンボルに value cell と function cell があると理解して,アクセス方法もわかれば defun 相当を作るのは簡単だ. (setf (symbol-function 'hoge) (lambda (x y z) (+ x y z))) でいいわけだからな.で hoge が名前(name)引数リスト(args) が (x y z) で 定義本体(body) が (+ x y z) だと見て,マクロを使えば (defmacro my-defun (name args &body body) `(setf (symbol-function ',name) (lambda ,args ,@body))) (my-defun hoge (x y) (+ x y)) (hoge 1 2) => 3 で俺 defun の完成ってわけ. # 本当の defun はもーちょいいろいろやるけど学習向けね
スコープはどう扱うの?
>シンボルが関数用と変数用の値を持ってる うわー、分ってる人の説明は分り易いです。 目から鱗です。OnLispをまだろくに読んでないのに こんなに親切丁寧に、、申し訳ないです。。。
>>50 Lispのsymbolを普通の言語における"変数"として理解しようとすると、ハマるかも。
むしろ、Perlでいうなら、名前がついたハッシュ値として解釈したほうが良いかも。
$my-symbol = \{ 'value' => nil, 'function' => sub{$_[0]+$n}, 'plist' => (),}
みたいにね。(Perlはもう忘れかけれるからmock perlね)
あと、Lispでは値はすべてリファレンス値として考えていいと思います。
だから明示的に演算子でデリファレンスすることはありません。
>>52 スコープは、ダイナミックスコープとレキシカルスコープがある点でPerlと
同じです。っていうか、スコープの何が知りたいの?
>>53 OnLisp は入門者が読む本ではないが….最初は
ANSI Common Lisp, Paradigms of Artificial Intelligence Programming (PAIP)
ウィンストンさんの Lisp 3 版(日本語版は訳が…)
あたりがオススメ.PAIP は AI の本としては古いけど Lisp の勉強用なら全然問題ない.
後半は高度な話題もあって楽しいよ.
>>52 質問の意味がよーわからんなぁ.修行が足りないのか?
Common Lisp ではダイナミックスコープとレキシカルスコープがサポートされてます.
本当はスコープとエクステント(変数の寿命)は別なんですが
ダイナミックスコープ : いわゆるグローバル変数
レキシカルスコープ : いわゆるローカル変数
という理解で最初はいいんじゃないでしょうか.
シンボルが関数用と変数用の値を持ってるなら レキシカルスコープはどうやってやるの?
>>56 に補足して。英語でいいのならCommon Lispの入門書はネットで無料で読め
るものがたくさんあります。これらをまとめたウェブページがあればリンクを
張りたいところだけど、分からないや。気がむいたらまとめます。
>>57 レキシカルスコープをやるやりかたは、普通の言語と同じです。
Lispがレキシカルスコープを実装する方法が知りたいのかな?
それとも使い方かな? あなたが現状で堪能なプログラミング言語が
あればそれを書いてくれると、説明しやすいです。
どう?というのがイマイチ… (defun lexical2 () (labels ((f () (print "I'm f"))) ;; (print f) ←変数 f は未定義 (f) (labels ((f () (print "I'm f..:-)"))) ;; (print f) ←変数 f は未定義 (print (symbol-value 'f)) ;; unbound ←この辺が疑問? (print (symbol-function 'f)) ;; function は入ってる (f)) (let ((f 10)) (print f) ;; それともこの辺? (f)))) # というかこーゆうのは初心者の質問なのだろうか?
実装する方法です。
CL を実装というなら初心者スレじゃなくて本スレのほうが…
>>60 レスがハヤッ!
レキシカルスコープの実装はC, C++などの変数と同じです。
たしかに初心者スレから逸脱しそうな雰囲気なので、
これ以上の議論をするときは本スレへ移動しましょう。
レキシカルスコープよりダイナミックスコープのほうが C/C++の経験者には新しい概念だと思います。
>>60 は #<unbound> でも代入しとくように.で,スレの目的の初心者質問マダー?
括弧の対応がわからなくなるんですがどうすればいいですか?
どうぞ Python をお使い下さい。
emacsの(show-paren-mode)を使う。
お使いのエディタで対応を強調する方法を調べてください. vi なら % キーで GNU Emacs なら show-paren-mode とか. あんま気にしないでインデントがそろうまで括弧入れるとか. 最初のうちはだれでもうまく行かないもんです. (a (b c) ((d e) (f g) (h i))) ↑のツリーが理解できるくらいまで cons を理解できるように なれば自然と見え方がかわるんじゃないかな.漏れは師匠に最初に cons セルを手書きさせられたもんです.これも学習法としては オススメ.
質問ばかり待つといきなり寂れそうなので積極的に解説もしてみよう.
初心者向け cons セルドリル(こんなの→
http://perez.cs.vt.edu/usna.navy.mil/HW3P1.gif )
1. (a b c)
2. (a (b c))
3. (a ((b c)))
4. ((a b) (c d))
5. (+ a b)
6. (* (+ a b c) (+ (/ d e) f g))
7. (defun foo () (bar))
8. (let ((x 10) (y 20)) (+ x y))
全部できたら Lisp の構文木を脳内イメージできるようにしましょう.
マクロが構文木へのパターンマッチであるという事が理解できるれば
面白くなってくる筈です.きっと.
# どうしても駄目なら Python でもどーぞ.
>>22 GCL は今は ANSI CL 準拠へ向けてがんがってるところだから
初心者にはお勧めできない。環境がわからんのでとりあえず
CLISP のバイナリパッケージをお勧めする。
(defparameter *data* '((1 3 4) (3 4 5) (1 1 1) (1 0 1) (4 5 5) (4 1 0) (3 2 3) (4 5 4) (4 2 1) (4 9 0) (0 0 1) (0 9 1) (0 8 1) (3 4 5))) (my-sort *data*) => ((0 0 1) (0 8 1) (0 9 1) (1 0 1) (1 1 1) (1 3 4) (3 2 3) (3 4 5) (3 4 5) (4 1 0) (4 2 1) (4 5 5) (4 5 4) (4 9 0)) こんな感じで1番目の要素と2番目の要素でソートしたいんですが、 どうすればいいの?
比較関数を用意してソート関数(sortやmerge)に 渡せばいいかと。
オライリーの薄いハンディタイプのリファレンス本あるじゃん。 あのLisp版て無いの?
をを、めちゃ盛況ですな。 環境依存な質問です。 xyyzzyで、任意のディレクトリ名を指定して、そのディレクトリ内に 存在するファイル名を取得する方法って何がありますかね?
>>70 ありがとうございます
CMUCLとCLISP入れてみました
なんとなくCLISPの方が無難な感じですね
(sort *data* #'(lambda (x y) (if (= (car x) (car y)) (< (cadr x) (cadr y)) (< (car x) (car y)))))
>>75 確かに初心者向けと銘打ってはいるが、質問の初心者は…。Windows 板に
xyzzy スレってなかったか?でも親切がモットーのスレなので答えておこう。
(directory "ディレクトリ名")
だ。c:\ の一覧が欲しいなら (directory "c:\\") ね。
>>76 cmucl も入れたのか?ならそっちのほうが性能いいけどな。
でも clisp は起動も速いから性能に不満がでるまで clisp でもいいかもな。
開発環境のセットアップは大丈夫か?Emacs + ilisp がないとマンドクサだぞ。
慣れてきたら Emacs + SLIME がお勧め。
SLIME はドキュメントがないので素人にはおすすめできない。
>>74 今のところありません。Lisp 人気が急上昇でもしない限り今後もでないでしょう。
開発時に参照するなら Emacs から HyperSpec を引くのがコマンド一発
なわけですが。ハンディリファレンスの Lisp 版があったらどう嬉しい
ですか?
>>78 car, cadr のかわりに first, second を使うスタイルもありだね。
あと sort は破壊的な関数なので引数で渡されたリストが壊れるって事
に注意。
(setf *data2* (sort *data* (lambda (x y) ....)))
*data2*
=> ウマー
*data*
=> アレ?ナニコレ?マズー
となっちゃう。*data* が壊れるのが嫌な場合は
(setf *data2* (sort (copy-list *data*) (lambda (x y) ....)))
とかしてやれば ok。まぁ、
(setf *data* (sort *data* (lambda (x y) ...)))
みたいに *data* を更新に使う用途ならいいんだけど。
>>78 >>81 おぉ、ありがとうございます。昇順降順の切り替えもこれなら楽ですね!
>>80 >ハンディリファレンスの Lisp 版があったらどう嬉しいですか?
寝る前に布団の中で暗記したりとか・・・。
全体像を掴むのに要点だけかいつまんである紙があるといいじゃん?
あとコマンド名が思い出せない時とか。
>>83 寝る前に覗いてみれば…生活時間帯がかぶってるのかね。
なるほど布団の中で暗記ね。我々小市民がオライリーに頼んでも
無駄でしょうから自作しますか。 PDF でよければ。
どっかの Lisper に頼めば Web スペースを借りるくらいできるでしょう。
では欲しい要点と忘れやすいコマンド名(関数の事?)をどーぞ。
>>83 CLtL2 とか CLHS, CMUCL User's Manual がそれに当たるのかなぁ。
> 全体像を掴むのに要点だけかいつまんである紙があるといいじゃん?
だからそれらは全部却下だろう。要点ねぇ。まぁ、
>>835 の欲しい要点を
聞こうじゃないか。
漏れはハンディリファレンスとやらの類は読んだ事無いが、
構文とかエラーチェックとかリスト処理とかカテゴリ別に重要なやつだけ
ちょこちょこ解説があればいいのかな?
>>79 >開発環境のセットアップは大丈夫か?Emacs + ilisp がないとマンドクサだぞ。
ilisp拾って来て解凍した後が訳分りません
/usr/share/emacs/21.3/site-lisp
あたりに突っ込むのやら、.emacsに何か書くのか、
他になにか設定ファイルか必要なのか全くダメです。
レベルが低くて申し訳ないのですが教えて頂けないでしょうか?
88 :
デフォルトの名無しさん :04/02/01 07:53
>>87 .emacsに自分の使っているインタプリタのフルパスを
(setq lisp-program-name "/usr/bin/lisp")
と一行入れるだけで、あとは
M-x run-lisp
として、Emacsバッファ内でインタラクティブにLispが使えるようになるよ。
CommonLispの日本語リファレンスマニュアル本としてこんなのはどうでしょうか?
http://www.amazon.co.jp/exec/obidos/ASIN/4320025881/ 英語のは持っていますが、翻訳がいいなら買おうかと思います。
Lispは数学のように用語がしっかり統一されているイメージがあるので
なるべくちゃんとしたリファレンスを用意しておくべきかなと思ってます。
>>87 ふむ。環境は重要だからな。一応ロードパス通ってるところに
置けたってことは Emacs は少しは使えるってことなのかな。とりあえず
1. ilisp ディレクトリで make してバイトコンパイル
2. ↓のを .emacs に追加。
(require 'completer)
(require 'ilisp)
(load "completion")
(initialize-completions)
(setq clisp-hs-program "clisp -I") ;; clisp のパスね。-I は ilisp 用で起動ってこと。
(set-default 'auto-mode-alist
(append '(("\\.lisp$" . lisp-mode)
("\\.lsp$" . lisp-mode)
("\\.cl$" . lisp-mode))
auto-mode-alist))
(add-hook 'lisp-mode-hook (lambda () (require 'ilisp)))
(load-library "cl-indent")
(add-hook 'ilisp-load-hook
(lambda ()
(setq lisp-indent-function 'common-lisp-indent-function)
(setf ilisp-*prefix* "\C-c"
lisp-no-popper t
ilisp-*arglist-message-lisp-space-p* t)))
くらいでどーだ?後は M-x ilisp-mode とかやると ilisp が起動すると思うのだが。
これが出来たら次は HyperSpec と CLtL2 が ilisp からコマンド一発で参照できるように
するわけだが、まずは(スペースの都合でね)これくらいから。どう?
わけ、わかんざき
conses : cons の複数形 ... conses are the fundamental building blocks of lists. ;-)
おまいら朝から元気ですね
ilisp使ってるとキー一発でHyperSpec引けるので、心配しなくても そのうち本は見なくなりますよ。
96 :
デフォルトの名無しさん :04/02/01 10:33
Lispは人工知能の研究専用の言語だと言っている人がいました。 本当ですか?
97 :
デフォルトの名無しさん :04/02/01 10:39
>>92 日本語風に発音すると、「コンスィズ」だと思う。
>>88 thxです。
(setq lisp-program-name "/usr/bin/clisp")
で、
M-x run-lisp
だとcmuclが起動しました。こっちでもいいんですけど、
(/usr/local/bin/lispでcmucl起動します)
(exit)も(quit)も効きませんね。
>>89 .emacsに入れてみました。一度は打ち込んだんですが括弧の対応を
間違えましたのでコピペして、clispのpathの所だけ変えました。
(write-line "hello world")とだけ書いたhello.clというファイルを
開いた状態で
M-x ilisp-mode
とするとミニバッファに
Dialect:
と表示されて入力待ちのなるようです。Dialectは方言って意味みたいなので
clispと入れると、画面が二分割されて下半分にILISPモードの*clisp-hs*バッファが
開きました。
>>96 > Lispは人工知能の研究専用の言語だと言っている人がいました。
人工知能の研究くらい難しいことにも柔軟に対応できる能力がある言語と
いうことで、汎用の言語として使う事もできます。
他の言語では、複雑すぎて実現できそうもないことが出来たりするので
大きくて複雑なアプリケーションを書く事にも向いているし、
また例えばGNU CLISPなどの比較的軽い処理系を使えば、Perl, Python,
Rubyなどのスクリプト言語と同じような使い方もできるのではないか
という議論もあります。
>>96 残念ながら汎用目的の言語です。歴史的に Lisp (または Lisp を採用)
したプロジェクトで有名なものは一般向けでは
- エディタ(Emacs 系列とか)
- CAD(AutoCAD とかね)
- コンパイラ(パーサーの後の構文木から先の辺とか)
- 数式処理ソフト(Maxima)
と人工知能に関連しそうなものはありません。最近のプロジェクトとしては
NASA の宇宙開発関連(
http://ic.arc.nasa.gov/projects/remote-agent/ )
とかが比較的人工知能っぽいかもしれません。まぁ、Lisp の開発者が
人工知能の偉い人だったので当然そっち方面で使われたという歴史も
ありますが。
PVSもCommonLispらしいですよ。 あとMaximaと被ってるけど、代数システムとしてAXIOMとか。 どっちにしても「計算」っていう言葉を連想させる分野が 多いですね。
1. まずは HyperSpec をダウンロード
ftp://ftp.xanalys.com/pub/software_tools/reference/HyperSpec-6-0.tar.gz 2. .emacs で
(setq common-lisp-hyperspec-root "file:///home/someone/doc/HyperSpec/"
common-lisp-hyperspec-symbol-table "/home/someone/doc/HyperSpec/Data/Map_Sym.txt")
と HyperSpec のディレクトリを指定してやればいい。後は M-x hyperspec-lookup でカーソル
位置のシンボルを HyperSpec から引いてくれる(ブラウザが起動する)。キーは自分ですきなところに割り当ててくれ。
漏れはブラウザに w3m を指定してるな。これは ilisp とは関係なくて browse-url 関連の設定なわけだが。
>>99 スクリプティング向けのパッケージでも用意すれば話は別だけど現状
CommonLisp でスクリプティングは無理だろう。それ向けの処理系
がない、識別子が長い、等々色々あるが、スクリプティング目的の人に
CommonLisp を勧めるのはどうだろう。Gauche とかが良いのでは。
comp.lang.lispは未だに必読?
>>102 はい
そちらのサイトはよく検索でhitするんですが、開発環境自体を
の意味を良く理解してないので見てもいまひとつ分りませんでした。
呑み込みが良くないかもしれませんが堪忍してください。
とりあえず必須の3つは了解です。
>>105 そんなことないと思うけど…。昔は必読だったの?
>>104 > スクリプティング向けのパッケージでも用意すれば話は別だけど現状
> CommonLisp でスクリプティングは無理だろう。
最初にスクリプティングという目的があって、Perlなんかと同レベルの
サポートを求められると、現状では無理があるだろうけど、Common Lispを
習得するという目的が最初にあるのなら、スクリプティング環境が整って
いないのを逆手にとって、自分でXMLパーサを書いてみたりとか、やるべき
ことがたくさんあってかえって面白いんじゃない?
まぁ、ライブラリを書かなくても、CSVファイルの処理をちょっとCLで書いて
みるとか。日々の雑用をちょっと書いてみるという感覚ね。
現在の状況ではGuacheがLisp系でスクリプティングに向いているというのは
賛成だけど。Common Lispがスクリプティングに向いていないということは
ないと思う。
>>109 意外だったのか!? Lisp といえばグラフィックスでは先駆者な
はずだが…。そもそも Lisp マシンとかってグラフィックス装備
のシステムとしては最先端だったのだが。
> そもそも Lisp マシンとかってグラフィックス装備のシステムとしては最先端だったのだが。 でも昔だとLispって遅そうなんだもん。そんでグラフィックスというと速さが命みたいな イメージが俺にはあんだよね。アセンブラでレイトレーサを書くとか、古いかな。 とはいうものの、LispマシンってハードレベルでLispに最適化してあるから、 汎用マシンに比べてなかなか速いって話は聞いた事あります。 P.S. ilispインストールした人、元気にLispしてますか? ここらへんは無駄口ですから、気にせず質問があったらしてくださいね。
ilispというのはEmacs用のアプリケーションだったんですね。 /usr/portage/dev-lisp/*にないから、Gentooは 対応してないのかと思ってました。
文字列に文字を追加したいのですが、どのようにすればいいのでしょうか? こんな感じのを書きたいのですが。 (concatenate 'string "hell" #\o)
(concatenate 'string "hell" (string #\o))
文字列の連結ってよくやる処理のような気がします。 (concatenate 'string "hell" (string #\o)) はちょっと冗長な気がするのですが、こういうときは、 積極的に(str-cat "hell" #\o) => "hello"みたいな関数をみなさん 定義しているのですか?
しない。
>>115 慣れの部分もあるけど、冗長だと感じるのならstr-catって分かりやすい
名前だと思うし、よく使うのなら定義してもいいと思うよ。string-concatenate
じゃあほぼ同じ長さだし。ただ、Common Lispでは表記レベルでプログラムを
短くするという努力はしていないので、multiple-value-bindとか長い名前が
よくあるね。
しませんねぇ。大抵補完で済んじゃうので。本当に多用するなら考えるかもしれないけど。 出力時は format で結構いけるし、文字列構築とかも with-output-to-string があるしなぁ。
>>103 browser.elの設定に時間が掛かりました。
(setq browse-url-browser-function 'browse-url-netscape)
(setq browse-url-netscape-program "mozillafirebird")
(global-set-key [S-mouse-2] 'browse-url-at-mouse)
(global-set-key "\C-c\C-z" 'browse-url-at-point)
fedoraの設定をいじってない状態のw3m(KDE, Konsoleの中で)だと、
Opening socket...
という表示で待たされる間が6秒程あってなかなかきびきびした
動作ができません、なのでmozillaで起動するようにしました。
お蔭でilisp-modeの中の、 M-x hyperspec-lookupでヘルプが
立ち上がりました。そもそもこんなものがあるのも知らなかったです。
ありがとうございました。
>>113 なんでローカルのファイル開くのに Socket 開くんだろう?
まぁ、とりあえず使えるならいいか。Happy Hacking!!
122 :
デフォルトの名無しさん :04/02/01 15:02
ilispってmeadow2ではつかえますか?
とりあえず、ilisp解凍後meadow2/site-lispに中身をいれて、
Makefileの
Emacs = /path-to-meadow/Meadow.exe
とかして、コンパイルはできたのですが、
>>89 を.emacs.elに書き込み、ilisp-mode起動、clispを選択後に、
Copyright (c) Bruno Haible, Sam Steingold 1999-2003
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
[1]>
[2]> ;;; Loading f:/Meadow2/site-lisp/ilisp-pkg.lisp
*** - LOAD: A file with name /f/Meadow2/site-lisp/ilisp-pkg.lisp does not exist
Break 1 [6]> ;;; Loading f:/Meadow2/site-lisp/cl-ilisp.lisp
*** - LOAD: A file with name /f/Meadow2/site-lisp/cl-ilisp.lisp does not exist
Break 1 [8]> ;;; Loading f:/Meadow2/site-lisp/cl-chs-init.lisp
*** - LOAD: A file with name /f/Meadow2/site-lisp/cl-chs-init.lisp does not exist
Break 1 [10]>
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
ってのと、新しいウィンドウに
*** - LOAD: A file with name /f/Meadow2/site-lisp/cl-chs-init.lisp does not exist
とでてきます。
INSTALLATIONファイルに
You should add the directory where all of the ILISP Emacs Lisp files reside
to your load-path. There is an example of this in `ilisp.emacs'.
とありますが、全部のファイルの頭でload-pathを設定する必要があるのでしょうか?
>>122 えーとね、とりあえず、Windows9x + Meadow2 + ilisp + clisp で
動いてます。詳しい事はまた書くね。
あなたが使っているCLISPはCygwin環境でコンパイルされたものだと思います。 ここで、問題となっているのは、Windows形式とCygwin形式のファイルネーム の変換問題です。私は以下のようなことをしてとりあえずうまく動いています。 ムリヤリな感じがするので、もっといい解決方法があればどなたか教えてください。 (add-hook 'clisp-hs-hook '(lambda () (defun file-name-hack (file-name) "change Windows filename to cygwin filename, needed on Meadow2 + cygwin clisp." (concat "/cygdrive/" (subseq file-name 0 1) (subseq file-name 2)))))
忘れた。上記のコードを.ilispファイルに書き加えてください。
>>124 うまくいったようです。ありがとうございます。
環境はWin2k+Meadow2+ilisp+clisp(cygwin)です。
とりあえず、ESC C-xでS式の実行を確認できました。
他はまだ調べてないですが、次にヘルプが出せるようにしようと思います。
.emacsが読めるようになってきたからって、そっちばっかりいじってるな。。。
>>127 emacs-lisp は lisp としては古いという事を頭の片隅に置いといて
いただければ結構ですよ。いや、たまに
「Lisp は駄目だ。私は Lisp の経験があるがあれはまったく時代遅れの酷い代物だ。」
と言ってる人に詳しく聞いてみると経験は emacs-lisp のみだったりする事があるので…。
そういやハンディリファレンス欲しいとか言ってた人はどうした? やっぱ PDF とかじゃ要らないのかね。
130 :
デフォルトの名無しさん :04/02/01 20:15
スレ違いではありますが、ご存知の方が入ればよろしくお願いします。
GentooLinuxにおいてclisp,ilisp-cvs(ilispではtetexを入れる必要があったので
変わりにCVS版をひとまず入れました)を入れて、
>>89 さんのilisp用の設定を
.emacsに書き込み、EmacsからM-x ilisp-modeとしてclispを起動しました。
そのときに表示されたエラーが以下のものです。
[1]>
[2]> ;;; Loading /usr/share/emacs/site-lisp/ilisp-cvs/ilisp-pkg.lisp
*** - LOAD: A file with name /usr/share/emacs/site-lisp/ilisp-cvs/ilisp-pkg.lisp does not exist
Break 1 [6]> ;;; Loading /usr/share/emacs/site-lisp/ilisp-cvs/cl-ilisp.lisp
*** - LOAD: A file with name /usr/share/emacs/site-lisp/ilisp-cvs/cl-ilisp.lisp does not exist
Break 1 [8]> ;;; Loading /usr/share/emacs/site-lisp/ilisp-cvs/cl-chs-init.lisp
*** - LOAD: A file with name /usr/share/emacs/site-lisp/ilisp-cvs/cl-chs-init.lisp does not exist
Break 1 [10]>
ilisp-pkg.lispというファイルがないと表示されていますが、
このファイルは /usr/share/common-lisp/source/ilisp/ の下にあります。
上記のエラーメッセージが0)Emacs,1)clisp,2)ilispのどれが表示させて
いるのかすら分りません(Emacsの可能性は低いかな)。どなたかよろしくお願いします。
;; Loading file /home/tomato/.clisprc.lisp ... ;; Loading file /usr/share/common-lisp/source/ilisp/ilisp-pkg.lisp ... ;; Loaded file /usr/share/common-lisp/source/ilisp/ilisp-pkg.lisp ;; Loaded file /home/tomato/.clisprc.lisp [1]> [2]> ;;; Loading /usr/share/emacs/site-lisp/ilisp-cvs/ilisp-pkg.lisp *** - LOAD: A file with name /usr/share/emacs/site-lisp/ilisp-cvs/ilisp-pkg.lisp does not exist Break 1 [6]> ;;; Loading /usr/share/emacs/site-lisp/ilisp-cvs/cl-ilisp.lisp *** - LOAD: A file with name /usr/share/emacs/site-lisp/ilisp-cvs/cl-ilisp.lisp does not exist Break 1 [8]> ;;; Loading /usr/share/emacs/site-lisp/ilisp-cvs/cl-chs-init.lisp *** - LOAD: A file with name /usr/share/emacs/site-lisp/ilisp-cvs/cl-chs-init.lisp does not exist Break 1 [10]> ${HOME}/.clisprc.lisp に(load "/usr/share/emacs/site-lisp/ilisp-cvs/ilisp-pkg.lisp") なんて書いてもダメぽでした。今日はもうねまつ。。
力になりたいけどダメぽ おやつみ
(sleep 'zzz)
CVS版がいけないっぽいので、明日の夜はTeXの巨大なパッケージと一緒に app-emacs/ilispを入れてみてから、もう一回試してみるぽ。 っていうか、仕組みが分っていれば解決できそうなもんだけど Emacsにも慣れてないとかなり難しいぽ。
ELISPで*scratch*バッファに式書いてC-jで手軽に評価するようなことが CommonLispでもできればいいなあ。そうしたらもう最強だろうな。
FranzのELIパッケージみたいなことがしたいのか? ILISP/SLIMEと本質的には同じだと思うってかLisperなら普通に暮らしてる環境なんだが。 135が何をしたいのか誰か解説してくれ。
>>130 > スレ違いではありますが、ご存知の方が入ればよろしくお願いします。
このスレでもいいと思いますよ。
> ilisp-pkg.lispというファイルがないと表示されていますが、
> このファイルは /usr/share/common-lisp/source/ilisp/ の下にあります。
> 上記のエラーメッセージが0)Emacs,1)clisp,2)ilispのどれが表示させて
> いるのかすら分りません(Emacsの可能性は低いかな)。どなたかよろしくお願いします。
このエラーメッセージを出しているのはclispだと思います。ilispに含まれるファイル群で
ファイル名に.lispが付いているのは、Common Lisp処理系が解釈するはずのファイルです。
> [2]> ;;; Loading /usr/share/emacs/site-lisp/ilisp-cvs/ilisp-pkg.lisp
> *** - LOAD: A file with name /usr/share/emacs/site-lisp/ilisp-cvs/ilisp-pkg.lisp does not exist
> Break 1 [6]> ;;; Loading /usr/share/emacs/site-lisp/ilisp-cvs/cl-ilisp.lisp
...
> ilisp-pkg.lispというファイルがないと表示されていますが、
> このファイルは /usr/share/common-lisp/source/ilisp/ の下にあります。
clispがilisp-pkg.lispを探しているディレクトリは、
/usr/share/emacs/site-lisp/ilisp-cvs/ilisp-pkg.lisp
なので、
/usr/share/common-lisp/source/ilisp/
を探すように、clispを諭すのが正道でしょう。
しかし、とりあえず、動けばいいやと言うレベルの解決策は...
/usr/share/common-lisp/source/ilisp/以下の各ファイルへ
/usr/share/emacs/site-lisp/ilisp-cvs/からシンボリックリンクを張るなんて
どうでしょうか。
>>128 > 「Lisp は駄目だ。私は Lisp の経験があるがあれはまったく時代遅れの酷い代物だ。」
> と言ってる人に詳しく聞いてみると経験は emacs-lisp のみだったりする事があるので…。
最初にemacs-lispを触ったのはc, c++, perl5を経験したあとでしたが、それでも言語の柔軟性に感銘を受けました。
実際問題、フリーのLispで開発環境が一番ととのっているのは、emacs-lispだったりして。
>>138 朝のお忙しい中、ありがとうございます。
not existのエラーが出ていた三つのファイルに対して、
/usr/share/emacs/site-lisp/ilisp-cvs/の下にシンボリックリンクを貼り
M-x ilisp-compile-inits としてコンパイルしたら以下のファイルが
リンクを作成したディレクトリに新たに出来ました。
-rw-r--r-- 1 root root 1171 Feb 2 08:24 ilisp-pkg.fas
-rw-r--r-- 1 root root 669 Feb 2 08:24 ilisp-pkg.lib
-rw-r--r-- 1 root root 37767 Feb 2 08:24 cl-ilisp.fas
-rw-r--r-- 1 root root 12939 Feb 2 08:24 cl-ilisp.lib
-rw-r--r-- 1 root root 2916 Feb 2 08:24 cl-chs-init.fas
-rw-r--r-- 1 root root 281 Feb 2 08:24 cl-chs-init.lib
これで全てうまく逝きました。どうもありがとうございました。
インストール時に解決する方法は、もう少しelispとCommonlispに慣れてから
調べたいと思います。
clispを使っている人へディレクトリの変更の仕方は(ext:cd "/cygdrive/c/src/lisp")です。
144 :
デフォルトの名無しさん :04/02/02 12:48
下がりすぎ
>>139 実はそうでもない。Scheme や Common Lisp の環境も実は結構良い。
Scheme/CommonLisp が Emacs Lisp よりで優れている点として開発環境で思いつくのは
Scheme - PLT Scheme のエディタは変数や関数の関連を線で表示してくれたりする。
関数定義んとこで関数名を書き換えると,他のところで使われる部分も修正されたりとか。
Common Lisp - SLIME はエラーやワーニング等をソース上で下線を引いて教えてくれる
デバッガもバックトレースやスタック内のインスペクト等は充実。
あたりかね。ただ SLIME はドキュメント類が未整備なので Emacs や Lisp にある程度
慣れてないとエラーやトラブル時に困るのでオススメしにくいんだよね。セットアップは
簡単なんだが。
SLIMEって期待できそう。CLISPに対応していればナー。Windowsで使えるのに。 有料、無料を問わずCommon Lispの開発環境でソースレベルデバッガが付いているものはありますか?
147 :
デフォルトの名無しさん :04/02/02 15:08
148 :
デフォルトの名無しさん :04/02/02 15:11
結論。 Lispを使うのは、 リスキーです。
Lispを使う人は、 リスパーです。
Lisper真須美
コラッ!
152 :
デフォルトの名無しさん :04/02/02 17:29
SLIME は CLISP にも対応してるよ.Cygwin で動かしてる人も居るみたい. Windows ユーザーの言うソースレベルデバッガってのは VisualStudio みたいに一行一行 実行していくスタイルのデバッガって事だよね?フリーでは見た事ないな.貧乏 Lisper なので商用は知らないけど. で,それだけだとダメポって感じなんだけど,実は Lisp ではあんまり一行一行実行って必要ないよ. 漏れは元々 C 使い(今もだけど)で VisualStudio とかから入ったクチだけど lisp でのデバッグは スタイルが違う(最初は戸惑ったけど).デバッグビルドして〜デバッガ起動して〜とかそーゆうのじゃねぇわけ. 1. エラーで止まる(ここでいきなりデバッガが起動してる) 2. バックトレース(いきなり取れる) 3. スタック上の変数を調べる(大抵これでウマー) 4. もし原因がみつからないならスタックを一つ辿る 5. 3-4 の繰返し ってのがほとんど.バックトレース時の表示でソースのどの辺かもわかるし,CMUCL なら :vsource ってコマンドでその場所周辺のソースが表示できるしね.あとは関数をトレース するとか.フォーム一個実行する step とかあるけど,ほとんど使った事ない.
しまった age ちゃった.ゴメンなさい….
LispやSchemeってどのくらいの期間でマスター出来ますか?
んー。。。 誰か、例題出してくれませんか? はじめて3日ですけど、自分で何とかできそうな奴。
[問1] リスト処理関数 reverse, append, length, mapcar 等を作成せよ。(20点)
>>155 はじめて3日という情報だけでは、他の言語でプログラミング経験があるのか
どうかとか、使える関数とかその辺が伝わってこないので難しいな。cons って
なに?とかいうレベルなら
>>69 の手書きとかいいと思うが。マクロの理解には
リストの理解が必須だからね。
でも、とりあえず例題を出しておくか。
[問2] '(1 2 3 4 5 6 7 8 9 10) のような数字のリストを引数として取り、
1. ぜーんぶ足した総和を求める関数 : (f1 '(1 2 3)) => 6
2. それぞれの数を二乗したものの和を求める関数 (f2 '(1 2 3)) => 14
を作成せよ。簡単だ〜って場合はできるかぎりいろんな方法で実装してみてください。
>>156 155じゃないけど、mapcar以外は出来た。
mapcarができない。
リストを作り直してそれぞれにapplyでやれば出来そうだけど、
リストを作り直すのが上手くいかない。
ヒントください。
>>160 おそらく複数のリストを引数としてとるちゃんとした mapcar を作ろうとして
ますね?リストを作り直すだけでは、どうやろうとしたのかイメージがつかめないけど。
関数を二つつくって、一個は N 引数を、一個はリスト一つだけ、と分割して考えれば
どうでしょう。かなり推測に頼ってるので的外れなヒントになる可能性も高いですが…。
>>160 問1のヒント
(define (identity obj) obj)
(define (for-each-list f g n lst) ; not末尾再帰版
(if (null? lst) n
(g (f (car lst)) (for-each-list f g n (cdr lst)))))
(define (my-copy-list lst)
(for-each-list identity cons '() lst))
(define (my-map-1 f lst)
(for-each-list f cons '() lst))
(define (my-map-n lsts)
...)
(define (my-map f lst1 . lsts)
(if (null? lsts) (my-map-1 f lst1)
(my-map-n f (cons lst1 lsts)))
この for-each-list を使って、reverse, append, length も書ける。
やっと出来たよ。
もう眠いよ。あひゃひゃ。
全部で5個も関数作ってるから、多分「なんじゃこりゃ」と言われそう。
>>161-162 もう頭回らないので、明日じっくり読もうと思います。サンクス。
>>162 つーかここでヒント出すならCommonLISPで書こうや
>>165 それじゃヒントつーか解答になっちゃうじゃん.
それより激しく Schemey なヒントだな.CL 初心者を Scheme に引き込も
うとしてるんじゃねーの?
まぁ,とりあえず
>>160 は自分書いたやつを晒せと.
「できました」じゃ良いのか悪いのか採点しようがないじゃん.
とりあえずANSI common lispを進めてたときの記録を (defun $reverse (lst) (reduce #'(lambda (a b) (cons b a)) lst :initial-value nil)) (defun $length (lst) (if (null lst) 0 (+ ($length (cdr lst)) 1)))
なんだか微妙にちぐはぐだな。かたや高階関数を使いこなしているかと思いきゃ $length は 末尾再帰でもなんでもない再帰だし。末尾再帰を使わないのに reduce とか使いこなすって, どーゆう段階でそんなんなるんだろ。ちょっと興味あるね。↓みたいのならわかるんだが。 (defun $reverse (lst) (if (null lst) nil (append ($reverse (cdr lst)) (list (car lst))))) (defun $length (lst) (if (null lst) 0 (+ 1 ($length (cdr lst)))))
reduceを使ったreverseカコイイ。
>>168 記録からの抜き書きなので同じ時期にやったわけじゃないです。
>>170 なるほど納得。
>>163 MacOS って逝ってんだから勧めるなら OpenMCL とか MCL じゃないの?
でも初心者の数は予想通り少ないねぇ。開発環境整えるだけでも結構敷居が
高いのからなぁ。でも開発環境無しだとシンボル補完もキー一発のマニュアルも
無いわけで厳しいだろうしな。Emacs + ilisp + CLISP パッケージとか作ったら
需要はあるだろうか?
ただいま〜今日は1日中眠かったよ… 解答うpしますね。 ちなみに環境はxyzzyです。 (defun _reverse (x &optional (y nil)) (if (null x) y (_reverse (rest x) (cons (first x) y)))) (defun _append (x y) (if (null x) y (cons (first x) (_append (rest x) y)))) (defun _length (x &optional (y 0)) (if (null x) y (_length (rest x) (+ y 1))))
(defun mc1 (x) (if (null x) nil (cons (list (first x)) (mc1 (rest x))))) (defun mc2 (x y) (if (null x) nil (cons (cons (first x) (first y)) (mc2 (rest x) (rest y))))) (defun mc3 (x) (if (null (rest x)) (b (first x)) (mc2 (first x) (mc3 (rest x)) ))) (defun mc4 (x y) (if (null y) nil (cons (apply x (first y)) (mc4 x (rest y))))) (defun _mapcar (x &rest y) (mc4 x (mc3 y))) こんな感じ。
あ、mc1使ってないや。
すみません。173じゃなくて、こっちで。 もう寝ます。 (defun mc1 (x) (if (null x) nil (cons (list (first x)) (mc1 (rest x))))) (defun mc2 (x y) (if (null x) nil (cons (cons (first x) (first y)) (mc2 (rest x) (rest y))))) (defun mc3 (x) (if (null (rest x)) (mc1 (first x)) (mc2 (first x) (mc3 (rest x)) ))) (defun mc4 (x y) (if (null y) nil (cons (apply x (first y)) (mc4 x (rest y))))) (defun _mapcar (x &rest y) (mc4 x (mc3 y)))
>開発環境整えるだけでも結構敷居が高いのからなぁ。 シェルに向かってコマンドを打てない奴がLispのプロンプトに向かってS式を打てるわけがない。
>>176 Windows ユーザーの事が頭にあったんだが…。いや漏れは ~/site-lisp 以下は
Windows なマシンと同期するために定期的に tar 玉にまとめてるんだが、これに
Emacs と CLISP つっこんで clisp のパスを決め打ちにするとかして
Emacs + site-lisp (ilisp込み) + CLISP
としたら Windows ユーザーに良いかな〜と。インスコが展開 + .emacs のコピー
だけで済むのは楽じゃん。と思ったがこれでは MS-IME が使えない罠。
スレ違いっぽいけど
>>177 と似たような話なので言うけど、
Windowsユーザーのことを本気で考えるなら.emacsにいきなり
elispで書かせる風習を*いいかげんに*なんとかしてほしいもんだ。
.emacsの修正スキル取得は最初の鬼門であるからして。
より具体的にはセットアップウィザードみたいなめにゅー形式で
機能の追加削除をロギングマクロみたいに*自動更新*とか
までやっちゃってほしいもんだ。
あと現状のWindows版て、Windows標準UIのことを*完全無視*
してくれちゃってる辺りも本当になんとかしてほしいもんだ。
ほんとはあの変態キーバインドもなんとかしてほしいんだけど、
そこまで言っちゃうと、変態に慣れきったお兄様方がら
*じゃあ、使うなよ!*とか文句言われておしまいなので
これ以上言いません。
>>178 それはMeadowの人たちに対してだよね?
Emacsもう、なくなるまで変わらんよ。。。
>>179 香ばしいねぇ。これが 2ch 名物アレか。しっかし空気読めてない香具師だな…。
>178 黙ってxyzzy使ってろ
Emacsってメニューから,オプションを変更するためのボタンの並んだ (テキスト)画面に進めませんでしたっけ? あれが和訳されるといいのかなぁ. まあelisp好きじゃないからemacsいじったことないけど. Elispだって柔軟さについては大抵の言語にひけを取らないわけで, elispマクロによるUIの向上はいくらでも余地がありますよね. あと,何かGatesの名を冠したelispを読ませるとC-sでセーブとかできるんじゃなかったっけ. Emacsの良さはC-c C-sにあるんじゃないよね.(キー違うかも)
初心者スレたるもの、マターリが基本。煽らず、煽られず。 ところで問1とか解答とか解説しちまっていいんかね? 他にやってる香具師いるの?
>>184 すいません。平日は言語の勉強もなかなか厳しいです;;
>>184 そういやそうだな。酒のんだ勢いでネタバレしちまうところだった。
んじゃ週末まで待つよ。
つーかね、CommonLispでGUI仕様があれば、LISPも使われるんじゃないのかな? で、ここでその仕様について語ってみようよ。 JAVAが標準な世の中だぜ? LISPだって標準なフレームワークや仕様があれば現場で採用されるかも・・・。
初心者スレで語られても困る
本スレ逝け。
>>177 WindowsではEmacsじゃなくてMeadow2の方がいいとおもう。
Meadow2 + .emacs + ilisp + .ilisp + GNU CLISP + HyperSpec
のインストーラか、圧縮ファイルを配れば便利かも。
ACL体験版のほうが楽か。
ACL 体験版ってヒープ制限と 60 日毎のライセンス更新だっけ?どーもなぁ。 確かに Meadow2 の方が良いだろうとは思うのだが。漏れは UNIX : Win 比率が 9:1 くらいなんで Windows 専用機能はあんま要らないというかよくわかないんだよね。 Meadow だとインストールとか設定は NetInstaller とかでなんとかなったりする?
初心者スレのつもりが、 本スレから出て来た奴らがLisp人口を増やすための方策を論ずるスレになっちまったな。
御免なさい。今後気をつけます。
>>156 Scheme 初心者です。append と mapcar(map?) は難しすぎて無理でした...
(define (my-reverse list)
(if (list? list)
(let loop ((list list)
(result '()))
(if (null? list)
result
(loop (cdr list) (cons (car list) result))))
list))
(my-reverse) ; => err
(my-reverse '1) ;; => 1
(my-reverse '1 '2) ;; => err
(my-reverse '(1 2 3))
(my-reverse '(1 2 (3 4)))
(define (my-length list)
(let loop ((list list)
(result 0))
(if (null? list)
result
(loop (cdr list) (+ result 1)))))
(my-length) ;; => err
(my-length '(1 2 3 4))
195 :
デフォルトの名無しさん :04/02/04 22:26
>187 CLISPを単体で使ってみたLISP初心者です。 LISPはいい言語だと思うのですが(煩わしい作業が乏しい) なんではやらないんでしょうね? 速度もjavaとそれほど変わらないぐらいらしいのに。 インタラクティブに開発ができるのだから、javaよりは開発効率 は宵と思うけどなぁ。
何故 Scheme 使いが?まぁ、いいか。
評価:
非常にノーマルな Scheme です。ちゃんと末尾再帰してるし。
半分解けてるので 10 点。なんで append ができないのかが謎。
>>168 に出ている最悪の reverse 実装をみてもうちょっと
マシな reverse を実装してみましょう。何で 168 のが悪いのか
理由も含めて 1 レス以内にまとめる事。できれば Common Lisp で!
しまった意味不明なレスをしてしまった。できてないのは append だよな。ワリィワリィ。忘れてくれ。
Scheme ならば list と云う変数名を使うのはマズヒ。
ただいま〜 _| ̄|○ 漏れのカキコミは皆スルーか…
>>199 落ち込むなYO。別にスルーしたわけじゃなくて、マダやってる香具師が
いるから解答しないだけだ。全部末尾再帰だし特にツッコミどころが無い
からな… mapcar 以外は。
初心者スレだけに list の変数名は list にと覚えたらマズーかも。 Scheme だと変数名に list を使っちゃうと関数の list が使えなくなるんだYO!! …と Common Lisp スレで言うのもなんとなく意味無いような気もする。
>>203 がイイこと言った。
Common Lisp では反復的な操作は反復で。再帰的な操作は再帰でが基本です。
>>199 まず、関数名/変数名に気をつかおう。変数 x がリストなのか関数なのかコー
ドを読まないとわからないのはつらい。それと mc1, mc2, ... という名前で
は何をしている関数なのかさっぱりわかりません。
Common Lisp では長い関数名/変数名が好まれます(というか長くなっても許される?)。
無名関数を引数として受け渡すときに、#' のをよく見かけるのですが、 これはないとあかんもんなんですか? なくても期待通りの動作をする ので違いがいまいち掴めてません。 あるときとないときで挙動が違う身近な例を教えていただけると 理解が早くて嬉しいです。処理系は CLISP を使っています。 下は HyperSpec にあった例であってもなくても同じ挙動をします。 (defun adder (x) (lambda (y) (+ x y))) (setq add3 (adder 3)) (funcall add3 4) => 7 (defun adder (x) #'(lambda (y) (+ x y))) ;; (defun adder (x) (function (lambda (y) (+ x y)))) (setq add3 (adder 3)) (funcall add3 4) => 7
>>45 より HyperSpecにある、macroとしてのlambdaの説明
http://www.lispworks.com/reference/HyperSpec/Body/m_lambda.htm > (lambda lambda-list [[declaration* | documentation]] form*)
> == (function (lambda lambda-list [[declaration* | documentation]] form*))
> == #'(lambda lambda-list [[declaration* | documentation]] form*)
つまり無名関数に#'をつけてもつけなくても挙動は常に同じになるように規定されています。
違う挙動になる例は存在しません。
じゃあ、いつ#'を使うかといえば、(reduce #'- '(1 2 3 4)) => -8 なんていうシンボルに
対してでしょうか。(reduce - '(1 2 3 4)) とやると、-のvalue cellが参照されてしまい
ます。じゃあ'をつけて(reduce '- '(1 2 3 4))なら同じかというと、違います。
(結果として同じになることもありますが、動作原理は違います。)
(progn
(defun foo (x y) (+ x y))
(flet ((foo (x y) (* x y)))
(values (reduce 'foo '(1 2 3 4))
(reduce #'foo '(1 2 3 4)))))
=> 10
24
一般に関数名が求められている場所で、#'fooをつかうとその場所でのレキシカルな環境
でfooという関数をさがします。'fooをつかうとグローバルな環境でfooという関数を
さがします。glossaryでfunction designatorを調べるといいかもしれません。
ちなみに#'というのはリーダーマクロといって、
#'(lambda () (foo))と(function (lambda () (foo)))はreadによって文字列から
Lispオブジェクト(この場合はリスト)に変換されたあとは、区別できません。
(tree-equal (read-from-string "#'(lambda () (foo))")
(read-from-string "(function (lambda () (foo)))"))
>>207-208 おお。さっそくありがとうございます。分かりました。
ときに、なくても同じなのに #' を付ける慣習があるのは、
気分の問題(あるいは、シンボル時との見た目の整合性をはかるため)
でしょうか?
ついでにシンボルの持つふたつのセルについても学べました。
つまり、こんなこともできちゃうのですね。
(setf (symbol-value 'test) 0)
;; (setq 'test 0)
(setf (symbol-function 'test) (lambda () (incf test)))
test => 0
(test)
test => 1
俺も習慣で無名関数にも#'を付けるけど、理由はわからん。 Emacs Lispだと理由があったような気もするな。
>>210 Emacs Lisp でも lambda に #' を付ける意味はないぞ。むしろ付けないほうが効率が良い。
>>211 効率に影響するってことは意味があるのでは・・・?
common lispだと大体みんなつけるけどね。
"ANSI common lisp"によると #'(lambda (x y) (+ x y))の"lambda"は初期のLispで関数とリストが 同じ表現で扱われていて区別出来なかったため、最初に"lambda"が来るか否かによって 区別したそうな。で、common lispではその心配はなくなってlambdaに意味はなくなり #'((x y) (+ x y))で無名関数を表すようにしても問題はないのだが、 lambdaをつけるのが習慣であったため残したのだと。 lambdaってのは"無名関数ですよ"と宣言するのが目的なわけだから、 漏れは普通の関数と整合性を保つために#'を付ける方がいいような気がする。
(lambda (x y) (+ x y)) #'(lambda (x y) (+ x y)) #'((x y) (+ x y)) つまりこの3種類が可能ということですか。 初心者はこれらを構文糖と考えてしまっていいんですね。
> #'((x y) (+ x y))で無名関数を表すようにしても問題はないのだが、
> lambdaをつけるのが習慣であったため残したのだと。
この
>>215 の記述が原因だな.初心者さんよ,これは #'((x y) (+ x y)) が可能と言ってる
んじゃないんだよ.というわけで #'((x y) (+ x y)) は不可能.ダメっす.
lambdaって単語にどうしてこれほど拘るんだろ。 アメリカじゃChurchは論理学の分野で神的存在なんですかね。
functionなどというキーワードを使うにしても,結局
「ああこれはλ関数に使うのね」などと覚えることになるのではないか.
それと
>>218 よ,Churchが神なのではない.神が誰かは知らない.
しかし少なくともLispは真理を説いた経典だ.
誤解を招く言い方にはなっていないような気もするが、現に誤解を招いてしまったので
>>216 よ。#'((X Y) (+ X Y))は使えないぞ。
>>215 期待しちまったじゃないか…
ホントにそう書けたらいいのに.
>>223 Lispってそこまでカスタマイズできたのか!
てっきり、括弧しか使えないものかと思っていた・・・
>>224 でもそーゆう激しいカスタマイズは基本をおさえて一人前になってからだぞ。
精進汁。ちなみに前置記法がダメポの人のための #${ 1 + 2 * f(x) + g(x, y) }
みたいなものすらある。要するに S 式に変換できりゃいいわけだからな。
…でも reader macro の話は初心者スレ向きの話題なのか?
>>223 まぁ、モチベーションの維持のためには良かったのかもしれないが。
ilisp の使い方でお聞きしたいことがあるのですが、、、
>> 89さんの設定を利用し ilisp で clisp を起動しています。
引数を調べたいと思って (dotimes のところで arglist-lisp
を実行すると、
dotimes (Macro): (???)
のような表示になってしまい、引数リストうまく表示されません。
なにか注意すべき点はありますか。
~/.emacs に書いたことは、
>>89 と同一です。
hyperspec-lookup, cltl2-lookup はうまく引けています。
(環境は Debian sid で emacs, ilisp, ilisp-doc, clisp 等
すべて最新版)
初心者とそうでない人との境界線は?
「初心者です」と書くか、名前が初心者なら、初心者。
>>226 私もclispでは同じようになってうまく表示されません。cmuclでは、うまくいきました。
clispではマクロは全滅みたいですね。
でもclispの引数の命名方法がいいかげんだから、表示されてもあまり手助けに
はならないんだよね。
REDUCE: (arg0 arg1 &key from-end start end key initial-value) ;; clisp
REDUCE: (function sequence &key key from-end (start 0) end (initial-value nil ivp)) ;;cmucl
調べたらclispの(arglist symbol)が返す情報が使われているみたい。
>>225 >
>>224 > でもそーゆう激しいカスタマイズは基本をおさえて一人前になってからだぞ。
一人前になった頃には、前置記法マンセイな人に変貌していましたとさ、というオチに
なりそうな気がする。
Emacsでプログラミングしている初心者の人へ、長いシンボル名を入力するときに、
自分ですべて入力していたら、スペルミスとか、面倒だとかいやなことがイパーイある
ので、M-/ {dabbrev-expand} や ESC TAB {complete-lisp} を積極的に利用して楽を
しましょう。
(mul<ESC TAB> -> (multiple-value-p<ESC TAB> -> (multiple-value-prog1
(mul<ESC TAB> -> (multiple-value- (multiple-value-p<ESC TAB> -> (multiple-value-prog1
ilispの使い方を教えて下さい しかし丁寧に教えられても理解できないので こんなもーんって程度でいいです
使い方?かつこんなもーん?でいいのか。 コピペですまんが Emacs の機能がこんなもーん ;; Emacs C-SPC : S 式を一個選択 ESC C-k : kill-sexp : カーソル位置から始まる S 式を kill する ESC C-a : beginning-of-defun : defun の先頭へ移動 ESC C-t : transpose-sexps : ポイント位置前後の S 式を入れ換える ESC C-e : end-of-defun : defun の末尾へ移動 ESC C-f : forward-sexp : カーソル位置から始まる S 式の末尾に移動 ESC C-b : backward-sexp : カーソル位置より一つ後の S 式の先頭に移動 ESC C-d : down-list : 1 レベル内側の S 式へ移動 ESC C-u : backward-up-list : 1 レベル外側の S 式へ移動 ESC C-n: forward-list : 括弧のグループを超えて前方へ移動 ESC C-p: backward-list : 括弧のグループを超えて後方移動 ESC C-h : mark-defun : defun 全体をマークする C-x n d : narrow-to-defun : defun の範囲に narrow する C-x n w: widen : narrow-to-defun を解除 こんな機能があって ILISP を使うとさらに ;; ILISP C-c L cltl2-lookup CLtL2 を引く C-c H hyperspec-lookup HyperSpec を引く C-c k compile-file-lisp ファイルをコンパイル C-c l load-file-lisp ファイルをロード C-c t trace-defun-lisp 関数のトレース ON/OFF C-c ) find-unbalanced-lisp 括弧の不一致を見つける C-c ; comment-region-lisp リージョンをコメントアウト こんなもーん、が追加されまつ。
キー一覧みせられて納得するような昆虫がどこの世界に居るというのか。
トノサマバッタならそれくらいやってのけるよ。
バカ殿様バッタはできなかったって言ってるよ?
ヘタバッタ
バッタ━━━━━━(゚∀゚)━━━━━━ !!!!!
昨日初めて Scheme の仕様書を読んだ。 delay と force に感動した。
……で?それを CL の、しかも初心者スレで語ってどうしようというのだ? 初心者への説明: delay と force ってのは遅延評価(呼ばれたときにすぐ実行され ずに計算をサボる事だとでも思ってください)を行うためのオペ レータです。↓みたいなもんだと思ってください。 (defmacro delay (&rest form) `(lambda () ,@form)) (defmacro force (form) `(funcall ,form)) で、コレを使うと評価するタイミングを遅らせることができます。 > (setf x (delay (expt 2 1000))) #<CLOSURE :LAMBDA NIL (EXPT 2 1000)> ↑この段階ではまだ (expt 2 1000) は実行されない。 > (force x) 10715086071862... (ry ↑force してやっと評価されます。 これでなにが嬉しいかは、興味のある人がいたらまた後日。
delay/forceのもう一つの重要な点は、中身の評価は「一度きり」しかされないということ
>>200 mapcarのやり方、楽しみにしてます。
>>205 ご指摘ありがとうございます。
んで、明日は休みなので、
>>162 さんのfor-each-listで
reverse,append,lengthをやってみた。
とりあえずlambdaというのもつかってみた。
イマイチよく分かってない。
(defun _reverse (lst)
(for-each-list #'list #'(lambda (x y) (append y x)) nil lst))
(defun _append (lst1 lst2)
(for-each-list #'identity #'cons lst2 lst1))
(defun _length (lst)
(for-each-list #'(lambda (x) 1) #'+ 0 lst))
246 :
デフォルトの名無しさん :04/02/07 06:09
局所変数なるものがありますが、局所関数というものはないのですか? lambdaでなくて、letの中で定義してletの中でしか名前が有効でないものです。 ないすかね??
>>245 >>172 をよーく見てると、同じパターンが何度も出てくるので抽象化できそう
な気がしてこない? その辺をうまく高階関数やマクロで抽象化できるように
なると Lisp 中級者かな。
n 個の引数をとる append はこうなる。
(defun _append-n (&rest lsts)
(cond ((null lsts) lsts)
((null (cdr lsts)) (car lsts))
(t (_append (car lsts) (apply #'_append-n (cdr lsts))))))
(let ((temp 0)) (defun func()(print temp)) ) と、書いたのですが、このfuncが使用しているtempはletに属しているのに なんで外部から使用可能なfuncでも0と表示されるのか分かりません。 どなたかおわかりになられますか??
>>246 局所関数は flet と labels を使う。flet では再帰が使えないが、labels は
再帰できる。
(defun test ()
(flet ((square (x)
(* x x)))
(print (square 5)))
(labels ((fact (n)
(if (<= n 1) 1
(* n (fact (1- n))))))
(print (fact 5))))
それと、macrolet というのもある。
>>248 クロージャの説明クル━━━━━━(・∀・)━━━━━━ !!!!!
以前、ilisp の使い方を聞いたものです(
>>226 )。
>>229 さん、調べてくださってありがとう!
そうですか。clisp ではダメなのか〜。
今度、cmucl の方で試してみます。
Emacs の describe-function と同じような
インターフェースで、Common Lisp の関数が
引けると便利かも。
>>251 Common Lisp の標準関数なら HyperSpec とか CLtL2 引くほうが例も載ってて
ウマーだぞ。describe したいだけならコレ(ILISP info)。89 氏の設定だと C-c i だな。
`<C-z> i (describe-lisp)'
Describe the previous sexp (it is evaluated). If there is no
previous sexp and if called from inside an ILISP buffer, the
previous result will be described.
>>248 Q1. スコープ外なのに見えるのはなんで? という疑問な場合
A1. それは func 自体は let の内側にあるからです.外部からはどうやっても temp の値を
操作する事はでませんが,func を通じて見る事だけはできます.
というレベルなのか
Q2. let が終った瞬間に temp って消えちゃうんじゃないの?(← C 的思考)
A2. Lisp では変数のスコープ(見える範囲)とエクステント(生存期間)はそれぞれ独立した概念です.
let の範囲内(lexical)でしか temp は参照できませんが temp そのものは生存期間は func と同じ
です.この例だと func の定義が上書きされてこの func の定義が不要になったときに temp は GC に
回収されるでしょう.
もちろん C のようにスタック上に変数領域を確保してスコープの終了と同時に自動的に消えるという変数も
コンパイラに指定する事はできます.ただしフリーの実装でこの機能(dynamic-extent)を安定して使える
コンパイラは少ないですので初心者にはお勧めできません.(CMUCL にはおそらく次のリリースで載ります
がまだ危険です! デフォルトで off になってます)
なのか解説者の力量不足でわかりません.どっちでしょう?
どちらの説明もしておいて正解。
で、問題は解答しちゃって良いのか?もうやってる香具師は居ないのか?
「質問Xのネタバレ見るな」とか先頭に入れとけばいいのでは?
そろそろ解説 plz
258 :
デフォルトの名無しさん :04/02/07 21:22
>>253 おお、なるほどそういうことですか。
すっかりCで考えてました。寿命とスコープが違うんですね。
今はlambdaだけで再帰が出来るかどうか考え中です。
このマジでいいスレだな〜 そのまんま入門者用のFAQができあがりそうだ。
局所変数はスコープが異なるだけで、参照されている限りは 寿命が尽きないならば、 (let ((temp 0)) (defun func() (print temp) (setq temp(+ temp 1))) みたいな関数を定義したときこのFUNCは呼ばれるたびにtempの 値が変わると・・・lengthみたいなものを作ってるんですが、 二回目に関数を呼ぶと前の値に足されてしまう・・・。 やっぱり、関数の最後で局所変数を初期化するんですかね。 それとも、変数を解放(deleteみたいなもの?)する命令が あるんでしょうか?
何か勘違いしてるんだと思う。
勘違いしてました。 こうだと思います。 (defun func(lst) (let ((temp 0)) (labels ((foo(x) (if(null x)temp (progn (setq temp(+ temp 1)) (foo (cdr x)))))) (foo lst))))
何が云いたいのか全くわかりません。
>>261 一日中格闘するくらいの気慨がある初心者なら十分理解できるよ。
ちょっとがんばればlispの実装のソースを読むくらいできたりする(俺の場合はclやり始めて一ヶ月くらいでcmuclのコードが少しは読めるようになったし)
>>264 foo(x)の代わりにfoo(x temp)ってして
(foo lst 0)ってすると思う。
一応確認させてね。262さんの疑問は、264の自己レスで解決したんだよね?
>>261 引数に関数とリストを一つ取る、という風に制限した mapcar のほうが良かったかもね。
そうすりゃ dolist でリストの各要素に関数を適用して結果を push してく、とか素直な
解答が出たのかも。
引数のリストはひとつだけ(関数が引数ひとつを許容する場合)というのを考えてみました。 (defun my-mapcar (fn list) (if (not list) nil (cons (funcall fn (car list)) (my-mapcar fn (cdr list))))) (my-mapcar #'1+ '(1)) => (2) (my-mapcar #'1+ '(1 2 3)) => (2 3 4) &rest を使った引数リスト数が任意のときでも、この考え方の延長線上でできますか? ちょっと試してみたのですが、こんがらがってきたのでギブアップしてしまいました。 具体的には、&rest で得られたリストの cdr のリストを第2引数の list の cdr とともに 再帰の my-mapcar に引き渡す方法を見つけられませんでした。
そうそう。初心者はそこで引っかかると思ったわけ。 よーするに car と cdr に分離したいわけだよね? せっかく作った my-mapcar を利用してみてはどうでしょう。 ↓こんなんでヒントになるかな? (my-mapcar #'car '((1 2 3) (a b c) (x y z))) => (1 a x) (my-mapcar #'cdr '((1 2 3) (a b c) (x y z))) => ((2 3) (b c) (y z)) # 皆さん再帰好きですね〜。do や loop は全然出てこないなぁ。
CLの場合再帰の方がやりやすいような言語仕様になってるからじゃないのかなw loopは直接的には単純だけど、かなり複雑な仕様があるし、doを使うよりは再帰の方が考えやすいような。
そーゆうもんですか。今は Paul Graham 本が入門書としてはメジャーだから loop は知らない使えないって人が居るのはなんとなくわかるんだけどね。漏れなんかむし ろ do のほうが複雑な気がするんだけどなー。 CL が再帰やりやすい仕様になってるというのは、末尾再帰の最適化が仕様に入って ないあたりとかですか?インタプリタだと大抵末尾再帰の最適化が行なわれないので デバッグ時に再帰が見えてウマー。
>>272 ありがとうございます。ただ、問題はそこではなくて、そうして得られた
((2 3) (b c) (y z)) をどうやって再帰呼び出しの my-mapcar の引数に
与えてやるか、というところで行き詰まっています。
>>272-273 動作機序を考える必要さえなければ、記述としては再帰のほうがシンプルだし
数学的にもそちらのほうが自然ですよね。
apply
あー、そっちか。そういや再帰したいんだっけか。私の浅慮でした。 別に関数を準備するか apply とか使うか、かな。 (defun foo (lst &rest lsts) ...) という関数なら↓のようにすれば (apply #'foo '(b c) '((x y) (2 3))) == (foo '(b c) '(x y) '(2 3)) で lst = (b c), lsts = ((x y) (2 3)) となります。 > 動作機序を考える必要さえなければ、記述としては再帰のほうがシンプルだし > 数学的にもそちらのほうが自然ですよね。 再帰で書いてシンプルになるならもちろんそれで何の問題もありませんが。 反復は特殊な再帰なわけですから反復で書こうと再帰で書こうと違いなどないのです。 だから短くて簡潔なほうを選ぶべきかと…。
mapcarの終了条件はどうするの?
1. リストが一つなら要素全部 2. 複数のリストなら一番短いやつの要素数 じゃないのか?
>>276-277 おお。できました。ありがとうございます。
(defun my-mapcar (fn list &rest lists)
(if (not list)
nil
(cons (apply fn (car list) (my-mapcar #'car lists))
(apply #'my-mapcar fn (cdr list) (my-mapcar #'cdr lists)))))
(my-mapcar #'1+ '(1 2 3)) => (2 3 4)
(my-mapcar #'+ '(1 2 3) '(4 5 6)) => (5 7 9)
(my-mapcar #'+ '(1 2 3) '(4 5 6) '(7 8 9)) => (12 15 18)
(mapcar #'+ '(1 2 3) '(4 5 6) '(7 8 9)) => (12 15 18)
* (my-mapcar #'list '(1 2 3) '(4 5) '(7 8 9)) ((1 4 7) (2 5 8) (3 NIL 9)) * (mapcar #'list '(1 2 3) '(4 5) '(7 8 9)) ((1 4 7) (2 5 8))
うーん。考える力が養われるなあ、、、 正直、ぬるま湯につかりっぱなしなので、とても勉強になる。
ぬるぽ湯
∬ ∬ 。。 ・・ 。。 ・。。。 o0o゚゚ ∧⊇∧ ゚゚Oアッタマルネ 。oO ,,ヘヘヘヘ,, ((( ・ω・ )∩ O0o (~~)ヽミ,, ・ω・ ミ ::.:::.: (´^ヽO, (⌒ヽ ::.:::.: (⌒)(゙゙゙)~ /~゙゙ヾ⌒`ゝ-(~´`(⌒(⌒~ヽ~ ~~ ゝー ′ '" ``" ソウダナモー
再帰な解答マダー?
>>280 (not list) ==> (some #'null (cons list lists))
>>285 一般的な再帰な解答は既に出尽くしてない?
すみません、append の解答例も是非お願いします
(defun my-append-1 (lst1 lst2) (if (null lst1) lst2 (cons (car lst1) (my-append-1 (cdr lst1) lst2)))) (defun my-append (&rest lsts) (cond ((null lsts) lsts) ((null (cdr lsts)) (car lsts)) (t (my-append-1 (car lsts) (apply #'my-append (cdr lsts)))))) my-append-1 を末尾再帰にして reverse を使うという手もある。
>>290 ああ、そこで apply なんですね。そーかー... どうもありがとうございます。
自力で解けないのが悔しい。
(defun foldr (kons knil lists) (if (null lists) knil (funcall kons (car lists) (foldr kons knil (cdr lists))))) (defun my-append (&rest lists) (foldr #'my-append-1 nil lists))
(defun my-append (&rest lists) (reduce #'my-append-1 lists))
まあ、こまかいことなんだけど、
(append) => nil
(append 1) => 1
なので
>>292 (292-my-append 1) => Error: Attempt to take the car of 1 which is not listp.
>>293 (293-my-append) => Error: MY-APPEND-1 got 0 args, wanted 2 args.
ベタベタに反復な append です.でもきっとビルトインの append はこんな
動きをするハズです.速度と効率しか見てません.
>>294 さんの指摘でさらに長くなりました….
(defun my-append (&rest lsts)
;; 頭の nil をとばす
(do ((l lsts (cdr l)))
((or (null lsts) (not (null (car l)))) (setq lsts l)))
;; 先頭が atom のみだったらそれを返す
(when (atom (car lsts))
(if (null (cdr lsts))
(return-from my-append (car lsts))
(error "~S is not a list." (car lsts))))
;; 先頭となる result と cons したセルを指す ptr を準備
(let* ((result (cons (caar lsts) nil))
(ptr result))
;; 先頭のリストを cons する.このとき ptr はリストの末尾のセルを指す
(do ((p (cdar lsts) (cdr p)))
((null p))
(setq ptr (setf (cdr ptr) (cons (car p) nil))))
;; 末尾のリスト以外をコピー(末尾のリストは ptr で指すだけ)
(do ((l (cdr lsts) (cdr l)))
((null (cdr l))
(setq ptr (setf (cdr ptr) (car l)))
result)
;; 個々の lst の複製リスト
(do ((p (car l) (cdr p)))
((null p))
(setq ptr (setf (cdr ptr) (cons (car p) nil)))))))
>>295 append ってこんなにややこしかったっけ?
;;; dolist 版
(defun my-append-1 (lst1 lst2)
(let ((result lst2))
(dolist (item (reverse lst1) result)
(push item result))))
(defun my-append (&rest lsts)
(cond ((null lsts) lsts)
((null (cdr lsts)) (car lsts))
(t (let ((result nil))
(dolist (item lsts result)
(setq result (my-append-1 result item)))))))
reverseでconsセルができるのを嫌がってるのだろう。
lisp でも効率を意識したプログラムが書けるんだぞという事で.cons しつつポイン
タを書換えていくあたりがナカナカ.まぁほとんどの人には気に入らないでしょうけど.
皆さん再帰ばっかりなのでちょっとひねくれてみました.
;; でも CLISP だと reverse が組み込みでしょうから do でループするこっちのより
;;
>>296 さんのやつのほうがはやいかもしれませんね…
あと無理矢理理屈をつけると nconc に発展させやすいとか?
(defun do-nreverse (x y) (if (null x) y (let ((temp (cdr x))) (setf (cdr x) y) (do-nreverse temp x)))) (defun do-reverse (x y) (if (null x) y (do-reverse (cdr x) (cons (car x) y)))) (defun my-append (&rest lsts) (if (null lsts) lsts (do ((lsts lsts (cdr lsts)) (r '() (do-reverse (car lsts) r))) ((null (cdr lsts)) (do-nreverse r (car lsts))))))
ビルド通りました。EasyPackage でインスコした iconv が原因でした。 端末上の文字が化ける件は変わらずですが。 一応ご報告。
なんか初心者のレベルを越えだしてるような…
>>300 こ,これは簡潔かつ高性能ですね.目から鱗です.いやぁ勉強になるなぁ.
>>302 初心者が書くようなコードじゃないもんな。まぁハカーが寄ってくるのは良いスレの証。
[初心者向けじゃないかも] くらい書いといてもらえば良いのではなかろうかと。いっちょ
解説してやるかと思ったが俺が勉強になっちまったZe。
>>297 これで cons の数は同じくらいになる?
(defun my-nconc-1 (lst1 lst2)
(cond ((null lst1) lst2)
(t (setf (cdr (last lst1)) lst2)
lst1)))
(defun my-append (&rest lsts)
(cond ((null lsts) lsts)
((null (cdr lsts)) (car lsts))
(t (let ((result nil))
(dolist (item lsts result)
(setq result (my-nconc-1 result (copy-list item))))))))
[初心者向けじゃないかも]
>>305 おまえらよくやりますね…手元の cmucl で測ったら cons は 295 == 300 でほ
んのちょっと 305 のほうが cons が多いね。なんだろう?どこだろう?誤差かなぁ?
>>306 305 は lsts の一番最後のリストまでコピーしてるから、その分多いはず。
295 は末尾リストはコピーから除外してる。
【初心者:LISP時間==五時間】 これだ・・・ (defun func(lst) (dotimes(x (length lst) y) (setq y(+ y (car lst))) (setq lst (cdr lst))))
>>308 Error in KERNEL::UNBOUND-SYMBOL-ERROR-HANDLER: the variable Y is unbound.
5時間目のエラーですか。
マヂすか・・・手元のXYZZYでは動いたんだが・・・と思ったが 同じ事言われてた。ナゼ?
こうですか? (defun func(lst) (let ((temp 0)) (dotimes(x (length lst)temp) (setq temp(+ temp (car lst))) (setq lst (cdr lst)))))
(defun func (lst) (let ((y 0)) (dolist (x lst y) (setq y (+ y x))))) (defun func (lst) (apply #'+ lst))
なんだかよくわからないけど私も (defun func (lst &aux (tmp 0)) (dolist (x lst tmp) (incf tmp x)))
(defun func (lst &aux (tmp 0)) (if (null lst) tmp (func (cdr lst) (+ tmp (car lst)))))
(defun func (lst) (loop for e in lst sum e))
>>314 一つ忠告してやろう……
>>314 っ お主 &aux と &optional を間違えておるぞっ
&aux は 312 の上のやつと 313 のときのように let の代りになるだけで引数としては渡せんのじゃ
[問2] を解いてみますた。 (defun q2-1 (lst) (if (null lst) 0 (+ (car lst) (q2-1 (cdr lst))))) (defun q2-2 (lst) (if (null lst) 0 (+ (* (car lst) (car lst)) (q2-2 (cdr lst)))))
(defun q2-2 (lst) (apply #'+ (mapcar #'* lst lst)))
(defun list-sum (lst) (reduce #'+ lst)) (defun list-square (lst) (reduce #'(lambda (a b) (+ a (* b b))) lst :initial-value 0))
(defun sum (lst) (apply #'+ lst)) (defun square (n) (* n n)) (defun sum-square (lst) (sum (mapcar #'square lst)))
321 :
デフォルトの名無しさん :04/02/10 20:05
|○| |☆| < 良い初心者の諸君! 問 2 の解答の中で拡張性が当ってイイと思うのはどれだと思う!!
じゃあ再帰だな。
reduceは使い所が限られるな。
四次元殺法コンビキターーー
とりあえず再帰と答えた香具師、
>>323 貴様だ、貴様。
貴様はとりあえずリストの要素に関数を適用する部分を抽象化して
($sum (lambda (x) (* x x)) '(1 2 3)) == 14
みたいな $sum を作ってこい!もちろん
>>320 で apply つかった実装は
既出なのでそれ以外の方法でな。
つまり問 2 を
(defun A-1 (lst) ($sum #'identity lst))
(defun A-2 (lst) ($sum #'(lambda (x) (* x x)) lst))
みたいに書けるようにするわけだ。どうウマーなのか説明できるとなお良し。
| O| |☆| < さりげなく
>>324 が正論吐いてるな < 気にするな
>>325 dotimes
dolist
末尾再帰
loop
再帰
reduce
do
fold
どれがお好みだ?
r ‐、
| (| r‐‐、
_,;ト - イ、 ∧l☆│∧
>>327 って初心者だと思う?
(⌒` ⌒ヽ /,、,,ト.-イ/,、 l
|ヽ ~~⌒γ⌒) r'⌒ `!´ `⌒) そうは思えんな。CL は初心者とか言うんじゃネーノ?
│ ヽー―'^ー-' ( ⌒γ⌒~~ /|
│ 〉 |│ |`ー^ー― r' |
│ /───| | |/ | l ト、 |
| irー-、 ー ,} | / i
| / `X´ ヽ / 入 |
323も初心者じゃないと思う。
問2-2 のポイントは、リストを1回だけ舐めるようにして、かつ簡潔に書くこ
とだな。そうすると、reduce か loop が一番簡潔な気がする。リストを2回舐
めてもいいなら
>>320 でよいと思う。
新しい問題をください
(defun sum$ (fn lst) (reduce #'(lambda (x y) (+ x (funcall fn y))) lst :initial-value 0))
[新しい問題] ディレクトリ内のファイルのサイズの平均を求める関数を作れ。
ディレクトリとかファイルサイズとかわかる関数あるのか? つーかそれおまいの宿題じゃないのか?別にいいが。
子ディレクトリ以下のファイルを含まないものと全部含むもの両方ね。
>>333 の問題のどこがどうこのスレに不適切なのかを答えよ。[20点]
ファイルサイズ関係だと、クラスタサイズで欲しい場合もあるな。
出題者としてどうかとおもうぞ。処理系依存話をいきなり持ち込む上
に定義も不十分だし。
>>333 はとりあえずどっか逝け。ファイルシス
テムみてーに機種毎にバラバラな仕様のブツをこの段階で出すか。普通。
非初心者向けの問題だから。
じゃあ、ディレクトリツリーをただのリストの木で置き換えればよいかと。 【問3】consセルのcarに数値が入ったリスト木の 合計と平均を求める関数を作れ。 (average-tree '((123 (764) 234) 345 456 3 2)) => 275.286 (sum-tree '((123 (764) 234) 345 456 3 2)) => 1927 簡単杉?
つーか問3ってもうあるね。問4にしとく? あと、簡単な様だったらリストの探索でflattenみたいな リストの再構成は禁止しとく?
flatten もまだ出てないから気にする事ないと思われ。
(defun sum-average-tree (lst) (defun tree (lst &optional (sum 0) (count 0)) (if (null lst) (values sum count) (if (listp (first lst)) (progn (multiple-value-setq (sum count) (tree (first lst) sum count)) (multiple-value-setq (sum count) (tree (rest lst) sum count)) (values sum count)) (progn (multiple-value-setq (sum count) (tree (rest lst) (+ sum (first lst)) (+ count 1))) (values sum count))))) (multiple-value-bind (sum count) (tree lst 0 0) (values sum (float (/ sum count)))))
>>340 (labels ((walk (x f &optional (y 0))
(cond ((numberp x) (+ (funcall f x) y))
((endp x) y)
(t (walk (rest x) f (walk (first x) f y))))))
(defun sum-tree (x)
(walk x #'identity))
(defun average-tree (x)
(float (/ (sum-tree x) (walk x #'(lambda (x) 1))) .0)))
(defun traverse-tree (f g tree) (if (listp tree) (apply g (mapcar #'(lambda (item) (traverse-tree f g item)) tree)) (funcall f tree))) (defun sum-tree (tree) (traverse-tree #'identity #'+ tree)) (defun count-tree (tree) (traverse-tree #'(lambda (dummy) 1) #'+ tree)) (defun average-tree (tree) ;; これだと tree を 2 回トラバースしてしまう (float (/ (sum-tree tree) (count-tree tree)))) (defun average-tree (tree) ;; 副作用があってちょっと汚いけどこれならトラバースは 1 回 (let* ((count 0) (sum (traverse-tree #'(lambda (item) (incf count) item) #'+ tree))) (float (/ sum count))))
(defun sum-average-tree (lst) (defun sum-average-tree (lst sum count) (if (null lst) (list sum count) (apply #'tree (rest lst) (if (listp (first lst)) (tree (first lst) sum count) (list (+ sum (first lst)) (+ count 1)))))) (apply (lambda (sum count) (values sum (float (/ sum count)))) (tree lst 0 0)))
(defun average-tree (lst) (float (apply #'/ (traverse-tree (lambda (item) (list item 1)) (lambda (&rest x) (apply #'mapcar #'+ x)) lst))))
(defun tree-fold (tree fn knil) (cond ((null tree) knil) ((atom tree) (funcall fn tree knil)) (t (tree-fold (car tree) fn (tree-fold (cdr tree) fn knil))))) (defun tree-sum (tree) (let* ((sum+cnt (tree-fold tree #'(lambda (tr knil) (cons (+ (car knil) tr) (1+ (cdr knil)))) '(0 . 0)))) (float (/ (car sum+cnt) (cdr sum+cnt)))))
349 :
デフォルトの名無しさん :04/02/12 12:46
時也葉を辞書に登録した。
351 :
デフォルトの名無しさん :04/02/12 15:17
苫米地さん、言ってることは正しいと思うんだけど、 50年使える技術でスレッド云々はちょっと夢のない 話ではないですかね^^;
>>352 おー、すると今後 50 年にはどんな技術が夢があるんでしょう?
Lisp はじめたばかりなんですが、スレッドすげーというレベルなんで
上級者の将来の技術も是非聞いてみたいっす。
>352 何の話だ?
で、10万スレッドくらい立ち上げて何すんの?
5万スレッドvs5万スレッドでバスケットボールだよ。
Solarisじゃ10万スレッドあがらんの?
10万ものカーネルスレッドを実現するのは難しいだろうな。 スケジューリング自体が重くなるし他のプロセスもCPUを奪われて悪影響が出るだろう。 実質Web server1プロセスだけ走ればいいとかいうならできるだろうが。
Javaで全てのインスタンスにスレッド割り当てて、 有機的プログラミングとかw
(defun flatten-tree (tree) (traverse-tree #'list #'nconc tree)) (defun average-tree (tree) ;; トラバースは 3 回 (let ((lst (flatten-tree tree))) (float (/ (apply #'+ lst) (length lst)))))
>>349 JAVAよりLISPを選択した理由には説得力があるな。
俺はJAVAのPGだが、ここでLISPを知って思ったのだが、
JAVAってめんどくさいんだわ。C++よりはマシって同僚
はいうのだが、私的には似たようなもんではないかと。
(っーよりは、LISPが優れすぎている所為かもしれんな・・・)
マクロもいいし、型がないのがいいし、対話的にプログラミングが
できる(これだな、これが最高に優れている)のもいい。
速度も遅いといわれているが、ピュアJAVAに比べればどっこいどっこい
のような気がするし・・・何故LISPは流行らんのだ??
とぶつぶつ呟いていたらLISPの案件が来た。
・・・マヂかよ・・・。
>>362 なんだか型にはまりすぎていて釣りの予感もするがけど、あえて突撃しよう。
1. 遅くない。どこでガセネタつかまされたか知らんが、まともなコンパイラはネイティブ
コンパイルするので Java とどっこいどっこいって事ぁないはず。コンパイラが良くてか
つ計算用途なら C と競っちゃうくらい。
2. あと型も一応ある。性能や型チェックが必要な時だけ指定するオプショナルな型システムが。
流行らない理由はいろいろ考えられるが、まぁ括弧だろうな。でも名無しさんたちが
2ch で初心者スレなんぞをたてて地道に普及をはかっているのだ。日本 Lisp ユーザー
会みたいなのはなんだか敷居が高い上にあんま活動してなさそうだし、2ch が日本最
大の Lisp コミュニティかもしれないなぁ。
ひろゆきにLISP板を提案しておこう。 LISP/CS板でもいいかな。
>>355 のリンクの人、話しはいい、どんどん言ってくれ、おもしろい。
おもしろいのだが。
あの髪型。あの髪型なのにスーツ。男のポニーテール。これが生理的にイヤーン。
とまべっちみたいなAV男優いるよね。最初とまべっち、 男優もやってるのかと思ってびびった。
すべての言語はLISPを目指す、だったっけかな? この際、LISPはライブラリとか仕様とかいった問題ではJAVAを目指すべきだ。 DB接続の定型化、ネットワーク処理の定型化・・・ これらを実現するためのネイティブなライブラリ、 その上にのっかるフレームワーク(ここをCLOSで書く) 実現したらいいなぁ。 言うだけでは意味ないんですこしずつ書いてくよ。
(defun average-tree (tree) (let ((f (lambda (x y) (if (listp x) (cons (cons x (car y)) (cdr y)) (cons (car y) (mapcar #'+ (list x 1) (cdr y))))))) (do ((x (fold f tree '(() 0 0)) (fold f (apply #'append (car x)) (cons '() (cdr x))))) ((null (car x)) (float (apply #'/ (cdr x))))))) (defun do-average-tree (tree lst sum count) (cond ((and (null tree) (null lst)) (float (/ sum count))) ((null tree) (do-average-tree (apply #'append lst) '() sum count)) ((listp (car tree)) (do-average-tree (cdr tree) (cons (car tree) lst) sum count)) (t (do-average-tree (cdr tree) lst (+ sum (car tree)) (+ count 1))))) (defun average-tree (tree) (do-average-tree tree '() 0 0))
そろそろ、スレに出てきた解説とかコードをまとめたほうがいいかな? どないでしょ?
で、形式はナニがいい?漏れは HTML か TeX くらいしか使えないので 選択肢は HTML か TeX か PDF くらいしかできんが。その辺でよければ 暇を見つけてちょこちょこやるぞ。Texinfo とかは知らん。コードは コテハン名かレス番乗せてアリガトンくらいでいいのかな?
>>368 LISPからJAVAのライブラリを使うのじゃ駄目なのか?
lispdocみたいなのないの?
common lisp ってプロセスが動いているままパッチ当てたりできるんですか? バグがあるシステムが自分自身を更新って論理学的にどうなんでしょうか。 それ言ったら極論バイナリしか扱えなくなる気もしますが。 OSからlispで書いたらマシン止めなくてもよくなるのかなあ。
ライブラリの交換は止めなくてもできるでしょ。
>>377 分かりやすく言い換えると、ドメインに該当する
古いS式のコードを、新しいS式で上書きする
ってことじゃないの?
稼動中でもシンボルの参照先変わるだけだから、
普段インタプリタ上で行う作業と同じ。
古いコードは単にGCされる。
>>377 パッチというか関数単位でコンパイルするので正しい定義をロードしてコンパイルす
るだけです.論理学云々は通常はあまり関係無いような気がします.そのへんはコン
パイラをいじるとか自分の足場をいじるという特殊なケースでは注意が必要というく
らいに思っとけばいいんじゃないでしょうか.
>>379 それは evalある言語ならできますよねえ。tomcatもできたような。
でも common lisp自身にバグがあったら困りますよね。そういう話ではない?
>>381 処理系のバグがあったら困るのはどんな言語でもそうじゃないの?それを気にしたら
言語とか関係ないような.
ただの eval ってのは評価だけでしょ.Lisp ではコンパイルできるから.Perl とか
Python とかスクリプト系言語で eval するってのと Lisp でインクリメンタルにコ
ンパイルするってのは随分違うと思うのだが.
Cでも動的リンク使えばプロセス止めずに更新できるんですかね。型は変えられないでしょうけど。
>>383 評価とかコンパイルとかよくわからないんですけど349に書いてある、
JAVAだと止めないといけなくて ANSI CommonLispだと止めなくてもいい状況
っていうのがよく分からないんです。
このスレ、全然本スレと差別化されてなくないか?
スキーマがいないだけマシかと。
ココロのスキーマをお埋めします
>Cでも動的リンク使えばプロセス止めずに更新できるんですかね。型は変えられないでしょうけど。 できませんですた。すみません。
まあ、少し前からCL使いに変なのが混ざってる感じだな
このスレ Scheme 使いも多いだろ。解答者側とか。おなじ Lisp 系だしマターリ仲良くいこうぜ。
>>383 Java って動かしてるシステム上で一部分コンパイルし直しとかできるの?できるな
ら Java でも止めなくてもいいなんじゃないかな。漏れが昔さわった時は実行時にコ
ンパイルなんて機能はなくて javac でコンパイル→実行→修正してコンパイル→実行
という流れだったんだけど。
>>385 差別化って言われてもなー。
SchemeとCommonLISPについて言えば、コーティングスタイルが
かなり違ってくるから、スレを分ける意味はあったと思うけど、
実際立ったのは「初心者」スレだからねえ。
どのレベルで住み分けすりゃ落ち着くかね。
とりあえず誘導してかないと分けた意味ないよね。
今までの流れ的には
LISP初心者が練習コードを書き散らす&質問スレ
で良い気がするけど。
>>391 JavaもC#もコンパイラ前提なんで、実行時差し替えは無理。
インタラクティブな環境作るとしたら
開発環境まるごと持ちまわる必要があるんじゃないかと。
>>393 Javaも.NETもクラスライブラリにコンパイラ含まれてなかったっけ?
で、クラスファイルの動的ロードも可能と。
これをファイルに一度も落とさずに済ませることはできるのかな。
つーか、本スレから分ける必要があったのかどうかが疑問。 最近のレスを見てると、レスが二分されてるだけのような。
>>392 そういう初心者のためのスレだと助かります。
Tomcat なら〜という話が出ていますが、クラスファイルを更新すると 勝手にアプリケーションをリロードしてくれる == Tomcat は止めなくていい くらいの認識だったりしません?たとえば起動処理に非常に時間のかかる アプリケーションを想像してください。で、データ構造はいじらないけど ちょっと見た目を変更したいと。表示部分だけちょこっと更新できたらウマー じゃありませんか? # 最近 java は触ってないので外しているかもしれませんが。
表示部分だけちょこっと更新ならjspファイル書きかえればウマーかもしれない。 あんま java 知らないので外してるかもしれないけど。
くだらない質問ですが、プログラミング経験1年未満のひとで、 lispをシェル代わりに使用されてる方はいますでしょうか? いらっしゃられたらどの辺が便利か教えて下さい。 elispもシェルスクリプトもここに書き込まれてる問題なども 読んでも見るだけで終わってしまうので、formatとかreadとか 使ったお子様大喜びな、でもってファイル管理とかの実用性が ちょっぴりあったり、ウケ狙いな面白さのある【問n】や解答が 見たいです。その余地があればですけど。 我がままいいスマソです…。 スレに付いて行けるようにかんばりまふ。
そもそも Lisp をシェル代わりに使っている人なんてほとんどいないのに... おれは Lisper だが、シェルスクリプトの類いは sh か Perl で書いてる。
そうですか。質問は流して下さい。 馬鹿なことを聞きました。
Lispって誰?
CLOSって、メソッドがクラスに含まれないらしいじゃん。 メソッドのないクラスなんて、ただの構造体じゃね? なんでそんなのがオブジェクト指向とかいえる訳?
>>401 Common Lispの人に尋くからだよ。
きっと誰かがこう答えてくれたよ。「Scheme をshell scriptがわりに使って
いる人は結構いる。scsh (Scheme Shell) はそれが目的の実装。他には guile、
Gauche、stklos がそういう目的で使える。日本語でMLに質問できて、日本語
のinfoがあるのはGauche。」
>Scheme をshell scriptがわりに使っている人は結構いる。 その"結構"のレベルがperlなどとは比較にならない程度な訳で。
Perlのシェルってないの? まああってもperl -e ''とやる手間を省略できるぐらいしか 意味がないけど。
403 は、インスタンスベースの言語なら、クラスがないからオブジェクト指向じゃない とか言い出しかねないね。 とりあえず、もうちょっとまともなオブジェクト指向入門書を探して読んでから出直してこい。
>>407 プロトタイプベースだって、特定のオブジェクトにメソッドが属するだろうが。
どうせ自分だって
>>403 を説明できないくせにコイてんじゃねーっつの。
あんまり喧嘩腰なのもどうかと……。メソッドが「クラスに含まれて」いないだけで ちゃんとクラスに対応したメソッドがあるのでただの構造体とは違います。というあ たりで納得していただけます? それとも (declass foo () ()) ;; クラス foo (defmethod bar ((self foo)) ...) ;; クラス foo のメソッド はオブジュクト指向じゃなくて (defclass* foo () () ;; この例は実際には動作しません!! マクロで作ることは可能ですが… (:method bar (self) ...)) のようにクラスの中にメソッドが入ってればオブジェクト指向という表記上の 話ですか?
>>403 >CLOSって、メソッドがクラスに含まれないらしいじゃん。
あるメソッドがある単一のクラスに「含まれる」とはいわないかもね。
いや、言ってもいいんだよ。例えばあるクラスのオブジェクトを1つだけ
引数としてとるメソッドなんかは、そのクラスに含まれると考えても問題
ないかもね。
あるメソッド呼び出しにおいて、
(foo-method object-of-bar-class object-of-baz-class)
なんてのは、fooメソッドがbarクラスに属すのかbazクラスに属すのかCLOSでは決めてないってだけ。
>メソッドのないクラスなんて、ただの構造体じゃね?
メソッドはあるよ。
乱暴にいってみれば、構造体みたいなの + その構造体みたいなのを引数として取るメソッド群かな。
ちなみにCLの構造体は単一継承をサポートしています。
「含む」「含まない」という区別が、単にソースコード上での話なのか、
それとももっと深い考えがあるのかな?
>なんでそんなのがオブジェクト指向とかいえる訳?
オブジェクト指向という概念が現在は拡散してしまっているという点がある。
・データ隠蔽の機能はCLOSでは提供されていないから、メンバフィールドはおっぴろげで触りたいほうだい。
・メソッドはある。
・多重継承はある。
あとは、...何が欲しい?
いや多角的な説明になって良いんじゃないか? ……昔漏れが言われた台詞だが。
抽象型(内部を覗けないユーザー定義の型) + 型チェックがあればOOはできるというだけかと。。。
>>413 たしかに俺のOOに対する理解もそこらへんを基盤としているな。
けど、最近はパターンがどうのと、だんだん遠いところへ逝ってしまった気がする。>>OO
>>409 >>410 Wでサンクス子。
そうか、データ隠蔽が潜在意識にあったから、メソッドが外、というのが変に見えたのか。
たしかにこれは必須じゃないね。でも、
> クラスに対応したメソッドがある
といってもこれじゃ、「クラス」というより「ユーザ定義型」と変わりなく、
「メソッド」じゃなくて「関数」のような。。。
そうか。型チェックといってしまうと語弊があるけど、 継承によるオブジェクトの多態ができるのがミソか。 しかし、オブジェクトの組み合わせで1態(?)ってのは大変そうだなぁ。。 なんか拡散するオブジェクト指向の境界レベルみたいね。
>>409 ほっとけ。ほっとけ。
基本を欠いている自分を棚にあげてのっけから挑発的な書き方をする時点でまともな
コミュニケーションやインフォームドコンセントを求めるには期待薄だし、そもそも
ものを教わろうとする態度じゃない。
どうやらその辺が誤解の元のようですね。クラスに対応したメソッドを起動するのは システムがやってくれるんですよ?そのクラスに対応したメソッドが定義されていな ければ継承をたどって親クラスのほうへ探してくれるわけで。普通の関数だと (defclass foo () ()) (defmethod bar ((self foo)) ...) (defclass baz () ()) (defmethod bar ((self baz)) ...) というのができないでしょう。 見た目の問題ならひょっとして (call object method arg0 ...) みたいな形式でメソッドを起動するラッパーマクロでも準備したら納得していただけますか? ;; 良く考えたら CLOS 以外でも C++ でもインライン定義以外は ;; class { int bar(); }; /* クラス定義 */ ;; int foo::bar(int x, int y) { .... } /* メソッド定義 */ ;; みたいに表記上はメソッド定義とクラス定義は生き別れですわな……。
>>415 > > クラスに対応したメソッドがある
> といってもこれじゃ、「クラス」というより「ユーザ定義型」と変わりなく、
> 「メソッド」じゃなくて「関数」のような。。。
色々なクラスのオブジェクトを引数として取る同一名のメソッドがたくさんあつまって、
Generic Function (GF)と呼ばれる、その名前の関数1つを構成するんだよね。
つまり、あるメソッドを呼び出すときは、本当はGFにオブジェクトを
引数として与えて呼び出すんだよね。GFは内部で、オブジェクトのクラス
を調べて、それに対応したメソッドを捜し出して、そのメソッドを呼び出すと。
いかにも遅そうでしょ? かぶってもしーらないっ!
あれだ、オブジェクト指向と自分の意識がどうのという 403 には Ruby を勧める。 あれは「純粋オブジェクト指向」でいいぞ。無理に馴染まないもんに手をつける事 はないよ。
いや、その前にCLOSのStandard Method Combinationを勉強してみてくれ、感動するから。
>>418-420 どもです。
>>416 って感じでよいみたいですね。
> いかにも遅そうでしょ?
動的検索呼び出しは商用界でシェアの高いJavaでもやってるんで大丈夫なのかな?
ただ、それをやるのが専用の解釈器かその上で動くプログラムかという問題はありますが。。。
大丈夫メソッドコンビネーションなら、次期 Ruby に装備される予定だ。 # いきなり喧嘩腰で煽りはじめる香具師が居るとスレの雰囲気が悪くなるので # 嫌なんだが。特に OO 話は不毛な議論になる確率が高いし。
>>424 >大丈夫メソッドコンビネーションなら、次期 Ruby に装備される予定だ。
ほぅ。情報ありがとう。
初心者向けじゃないような…
>>426 もういいだろ。
本スレと議論を分散してるだけなんだよ、このスレは。
何をもって初心者というのかその区別が難しいよね。 Common Lispの初心者といっても、プログラミング歴がゼロなのか、他の言語を 知っているのか、Cだけ知っているより、Rubyも知っているほうがクロージャとか バインディングとかLisp的な概念をすでに把握しているだろうし。 今回の話題も明らかにCLOS初心者向きだよね? 初心者が質問しやすい雰囲気を作るというのも大切だろうけど、実際に質問が 来たときに、どれだけ有益なレスをつけられるかというのが勝負所だと 個人的には思う。本家スレとの区別はあんまり気にしなくてもいいんじゃない?
>>429 Common Lispの構造体って
× * カプセル化
○ * 継承
○ * ポリモルフィズム
だよね?
>>430 継承、ポリモルフィズムもないぞ。
クラスには全部あるけど。
>>429 そもそもこの三つの項目もオブジェクト指向一般論としてふさわしいかについても
疑問を呈する余地はあるんじゃない? だいたい、これを言い出したのは C++ の
ストラウストラップだから、429 は自身の矛盾に気づいてない。
>>427 まぁ勘弁してくれよ。なるべく質問に答えるとか親切丁寧を目指してがんがってるんだって。
>>428 そうだよな〜初心者だけじゃなぁ。Scheme やった後 CL に来ても本人がそう思えば
CL 初心者だしな。
>>431 > 継承、ポリモルフィズムもないぞ。
継承は、defstructの:includeオプションで指定できるのでは?
ポリモーフィズムもジェネリック関数でできませんか?
> クラスには全部あるけど。
カプセル化って言語仕様で直接サポートされていますか?
>>433 >疑問を呈する余地はあるんじゃない?
もちろん余地はあるし、ないなんて言った覚えはない。疑問があるなら余地云々を言うんじゃなくてここに書けば?
>だいたい、これを言い出したのは C++ のストラウストラップだから、429 は自身の矛盾に気づいてない。
誰がこの文面を書いたかはこの議論にまったく関係ない。文面の内容だけが関係ある。
よって矛盾はない。
ところでtypecaseってポリモルフィズムなのか? 何がカプセル化,継承,ポリモルフィズムなのかも人によって理解が違うし、考え出すと分からなくなってくるな。
>>439 >人によって理解が違うし、考え出すと分からなくなってくるな。
人によって違うが正解なんじゃないかな(だから言葉の定義に関する議論は不毛な
議論になりがち)。
多態ってオブジェクト指向だけじゃなく抽象データ型でも使われているし。
>>438 CLOSオブジェクトでカプセル化がサポートされているとした場合、
Structでもサポートされていると言えるような気がします。
俺の理解ではクラスのメンバフィールドに誰もが読み書きできる状態は、
カプセル化がサポートされているとは言えないと思っていました。
ジェネリックファンクションの名前を工夫して、実際には存在しない
メンバがあたかも存在するように演出することはできますよね。
(defmethod person-age ((person person))
(- (this-year) (person-year-of-birth person)))
みたいに。
OOを勉強しなおそうかな…
>>436 >継承は、defstructの:includeオプションで指定できるのでは?
:includeで継承に近いことはできると思うけど、親構造体のタイプと子構造体のタイプを
(defstruct a (z nil) (x nil))
(defstruct (b (:include a)) (c nil))
とした時にbは、aを引き数にとる総称関数に呼ばれないような。
あ、でも、これが「継承」の必須条件かどうかってのも議論になるかな。
いっそのことこのスレ本スレにするかw
(defclass abcd () ;public (a b ;private c d)) でもいいようなw これだとCの構造体とかもカプセル化になっちまうな
>>442 > とした時にbは、aを引き数にとる総称関数に呼ばれないような。
呼ばれている気がするけど外してる?
(progn
(defstruct parent
(foo))
(defstruct (child (:include parent))
(bar))
(defmethod my-method ((object parent)) (parent-foo object))
(setq child (make-child :foo 'foo :bar 'bar))
(my-method child))
=> FOO
>>444 あくまでも俺的 OO の定義ですよん。外部表現では使い分けてます。
>>435 どんなやつ? SICP にそんな魅力的な OO システム出てきたっけ?
漏れも Scheme 勉強したてのころはいちいち感動してたけど、正直
CLOS はイイと思う。
まあ、関数が内部にあるとか外部にあるとか、対して重要なことじゃあないな。
>>449 >SICP にそんな魅力的な OO システム出てきたっけ?
魅力的って書かれると言い辛いですが、3 章に出てきたみたいなプリミティブなのを
実装出来る自由があれば私には十分です。
>>451 それで満足する香具師ってどっちかというと Schemer の中でも少数派じゃないか?
大抵の Scheme 処理系はオブジェクト指向向けに拡張しちゃってるし……。まぁいろ
いろあるのは良いところだ。たしかにシンプルで良いとは思う。昔 CL でもインスタ
ンスベースに走った連中が居たしなぁ。
今、以下のように、倍精度浮動小数点数を 16 進文字列にしたり、 16 進文字列を倍精度浮動小数点数にしたりするような2通りの関数を作りたいと思ってるのですが、 Lisp でどのように作っていいのかがわかりません。 ヒントだけでも教えていただけないでしょうか? (convert-hex-double #x40091eb851eb851f) => 3.14d0 (little endian で) (convert-double-hex 3.14d0) => #x40091eb851eb851f (little endian で) ------------ 同じことを C では出来ているのですが、どうしても Lisp で実装したいのです。 ちなみに、C で little endian での convert-hex-double は以下のように実装できます。 1.8バイト分の unsigned char 配列を用意。 2.16 文字ある 16 進表記文字列を後ろから 2 文字づつとっていって、 その2文字を 16 進数と見立てて unsigned int に変換。 そのまま1.での unsigned char 配列に、前から詰めていく。 3.その配列を (double) にてキャスト
あ、すみません。↑の 「unsigned int に変換」は間違いで、 「unsigned char」に変換でした。
Cの関数を組み込めばいいんでないの?
有り難うございます。
>>455 確かにそうですね。別に全部 Lisp で実装する必要もないですし。
自作の C の関数についてリンクの仕方を勉強しないと。。
>>456 ちょっと難しそうです。。
いろいろ調べてはいるのですが、
倍精度実数の変数の中身について、
直接にビットパターンをイジれる方法が見つからないっす。。
8 バイトの配列を 8 バイトの double に変換するとか、
そういった C に洗脳された頭を変更する必要があるのでしょうけど。。
おれは詳しく知らんが、convert-double-hex のほうは format あたりで何と かならんの?
>>453 とりあえず片方だけ。
(defun convert-hex-double (integer)
(let ((sign (logand (ash integer -63) 1))
(exponent (- (logand (ash integer -52) #xffff) 1023))
(mantissa (logior #x10000000000000 (logand integer #xfffffffffffff))))
(* (if (zerop sign) mantissa (- mantissa)) (float (expt 2 (- exponent 52)) 0d0))))
>>459 忘れてた。仮数部が0のときは特別扱いしてくれ。
それから、逆方向はinteger-decode-floatで整数にバラしてから
くっ付ければできるはず。
>>462 それじゃ 453 の望みとは違うと思われ。たしかにそれでも
(format nil "#x~X" (double->bits 3.14d0)) => #x40091eb851eb851f
とかできるけど、そもそも C ではそれは出来てるわけだし。
有り難うございます。
>>458 いろいろやってみたのですが、format を騙すような感じで
なんとかするっていうのは、無理っぽいです。
>>459 正攻法ですね。有り難うございます。上手くいきました。
>>460 今、integer-decode-float を使って逆変換してるのですが、簡単でないです。
どうも仮数部,、指数部、符号をそれぞれ 53, 10, 1 ビットづつにしているようなのですが。。
(integer-decode-float 3.14d0) は、
2567051787601183, 1, 1 となって欲しいところなのですが、
7070651414971679, -51, 1 となってしまいます。。なんか勘違いしてるのかな。。
>>461 そうですね C での話は完全に忘れる事にしました。
正攻法で攻めるのが正しいみたいです。
そのサイトは逆変換が出来てから落ち着いて勉強してみます。
>>462 できました。C ライブラリのリンクの仕方がおおまかに分かりました。
とっても助かりました。。
>>463 変換自身を主目的にしてるのではなくて、
lisp のプログラムの中で変換作業をできれば、一応は仕事上それでいいんです。
でも、ついでにいろいろ勉強できるともっと嬉しいです。
今、仕事でカスタムプロセッサー設計に対する検証をしてるのですが、 あるプログラムについてプロセッサーシミュレーターにかけて計算させた後、 メモリ上に残った生のデータを吸い上げてそのプログラムの期待値と実際の計算値とが 一致しているか?の比較をしています。 その時にメモリ上のデータは設計者の都合により 16 進表記のみの取得が可能で、 上のプログラムの出番になります。 決まった番地のデーターをただ吸い上げてデータを見るのは C のプログラムでいいのですが、 何回も何回もインタラクティブに行う必要があり、時間も少し余ってるし、 勉強中の lisp でやっちゃえ〜。って思ったわけです。。
マターリいいスレだ。-51 とかは scale-float で significand を戻すときに 53 ビット補正しなきゃいけないからだよ。HyperSpec の scale-float んとこ に載ってる例を参照の事。
S 式を読み易くする為、[] を使う事ってありますか? リストや lambda, if, cond, begin 辺りでネストが多くなるとコードが追い辛くなる ので、[] で括るのはありかなと思うのですが。
普通インデントのパターンで構造を把握するんじゃない?
emacsとかエディタの補助が無い時は使うよ
まさか等幅でないフォントで lisp コードを見てる人なんていないよね? >> 470 S 式単位で移動できないエディタでは書くのがつらいです. それでも書かなければならないこともあるんですね.
flet とかで分割すればいいんじゃないとか思いつつ。 ↓とかだとちょっとなぁ… (defun foo (let ((a 1) (b 1) (c 1)) (+ a b c))) (defun foo (let [(a 1) (b 1) (c 1)] (+ a b c))) (defun foo [let ((a 1) (b 1) (c 1)) (+ a b c)]) [defun foo (let ((a 1) (b 1) (c 1)) (+ a b c))] コードが追い辛くなる例と [] で括ってウマーな例を 示してくれれば改宗するかもしれないけど。 ;; それとも ] は [ に対応するまで閉じちゃうという ;; スーパー括弧の話?あれは不評だったような
(let ((a 1) (b 1) (c 1)) (+ a b c)) において、((a 1) (b 1) (c 1))の部分の背景色が微妙に薄かったら見やすいかも。 あ〜、Emacsで実験してみたくなった。
正直インデントだけでいい。
色もいらないの?
定期的にこの話題が出てくるな これは、宿命だな?
初心者には無駄に括弧だらけに見えるものです。括弧の意味を考えるのも良い勉強だ。 括弧が嫌いな内に拡張 loop を覚えちゃうのも一つの手だな。昔なら拡張 loop は 無理に覚えなくてもいいと言い切れたが Edi Weitz 氏とかがバリバリ使ってるからなぁ……。
括弧で区切って見ることもある。 loopは括弧が少なすぎる。
(defclass nullpo ()
((´∀` :accessor (´∀` )
:initform
>>1 :initarg ´∀` )))
--以下、個人的な嗜好-- loop大っ嫌い。氏ね。 --以上終了--
再会
>>482 cl-ppcre に喧嘩を売ってますか?まぁ使わないのは勝手ですがね
本スレにカエレ! そう叫びたいのは漏れだけですか・・・
>>484 ん? cl-ppcre使うときにloopを使う必要あるの?
>>485 誰に言ってるんだ?
わかりますわかります LOOPの存在はLISPを冒涜しています
で、carとfirst、cdrとrest等はどっち使えばいいんだ?
>>488 結果は同じでも、意味が違うんじゃない?
notとnullみたいな。
漏れは
再帰処理するときはcar,cdrで
純粋に1,2,3...番目の要素を取り出す時はfirst,second...かな
だから、restの出番はあまりない。
first... restの存在はLISPを冒涜しています 意味も存在価値も全くありません 余計なシンボル増やしてメモリ圧迫するだけです
head & tail
次の問題は?
>>490 シンボルって全部メモリ上にロードされているんですか?
私の持っている10年前に出版されたCommonLispの入門書には、 car,first、cdr,restは全く同じもの。 car,cdrはやや時代遅れ。理由の無い限りfirst,restを使ったほうが良い。 と書いてあります。
>>493 仮想記憶のアドレスは割り当てられるかもしれないけど、実際に参照しなければ実メモリは喰わない気がする。
>>494 > car,cdrはやや時代遅れ。理由の無い限りfirst,restを使ったほうが良い。
職場で、car, cdrを使ってコーディングしたら同僚から失笑をかったと言っている人が
いました。深い意味はわからんけど。
俺は慣れでcar, cdrを使うな。firstは second, third,..と一緒の場所でなら使うかも。
cdrより多分、restのほうが分かりやすいとは思う。
>>495 > 仮想記憶のアドレスは割り当てられるかもしれないけど、実際に参照しなければ実メモリは喰わない気がする。
GCでさわられちゃわないのかな?
>>494 対話による〜ってやつでしょ。
car,cdrを使ってる本の方が多いし、異質なんじゃないの。
>car,cdrはやや時代遅れ。理由の無い限りfirst,restを使ったほうが良い。 おいおい、 じゃあfirst,rest使う理由はなんだよ? それこそ失笑モノだな first以下はLISP史の汚点の一つだよ
cadrとかcddrなんかはLispにはないの?
普通に考えて、初心者にはfirst,restの方が分かりやすいからじゃないの? caadrとかcdaarといった類のものも、確かに便利だけど、頭悪そうにも見えるし。
なんだとー!
ANSI CL 以降の入門書では first, rest を勧めている本もある。 Winstone の Lisp なんかは first, rest 派じゃなかったかな。 最近だと Paul Graham の本が car, cdr を押しているけどね。 first, second, third, .... car, cadr, caddr, .... nth 0, nth 1, nth 2, .... あたりは全部覚えて置いたほうが良いんじゃないの。 car 派でも first 派でもあんまり狂信的だと、どっちも有害。 心は広くもちましょう。
car と cdr がそれぞれ first と rest に意味的に一致するとは限らない。
503> 俺たちはとんでもない思い違いをしていたようだ…
HyperSpec の記述、
(first list) == (car list)
Notes:
first is functionally equivalent to car,
second is functionally equivalent to cadr,
third is functionally equivalent to caddr,
and fourth is functionally equivalent to cadddr.
は car, cdr と first, rest の意味的一致を示すものではなかったんだ!
その他> な、なんだってー(以下略
どーゆうことなんだ?
>>503
おれは コンスの左側 => car, 右側 => cdr リストの 1 番目 => first, 2 番目 => second, ..., リストの 1 番目以外 => rest と使い分けている。統一せよと言っている人は教条的だな。 あと first, rest はインデントがそろわないのが気にいらない。 (defun copy-list (lst) (if (null lst) lst (cons (car lst) (cdr lst)))) (defun copy-list (lst) (if (null lst) lst (cons (first lst) (rest lst)))) ; 気持ち悪い
>>497 そうです。
最近古本で買ったんですけど、それなりに分かりやすいので、
ちょっと(ほんとにちょっと)はLispが使えるようになったと思う。
でももうすぐ読み終わりそう。
なんかオススメのLispの本ってありますか?
英語読めないので、日本語の本で。
>>507 日本語だと
1. Paul Graham の ANSI Common Lisp
2. ウィンストンの LISP (I), (II)
あたりかなぁ。ただ、2. は内容は良いんだが、翻訳と誤植がひどい
のでちょっと覚悟がいるかも。CONS が COSN とかなっててもキニシナイ
>>508 どうもです。
明日あたり本屋回ってみます。
でもちょっと前に軽く探したんですけど、地方だからかLispの本って
全然置いてないんですよね〜
中身見てから買いたいけど、無かったらアマゾンで買うか。
>>509 確かに少ないですね。見つかったらなんでも即買いでいいほどかも。
他のおすすめ。アマゾンで手に入ります。本屋さんには無いかも。
1.下地貞夫(著)、 「数式処理」基礎情報工学シリーズ、森北出版
2.湯浅太一、荻谷昌己(著)、「Common Lisp 入門」、 岩波書店
1の用に、言語それ自身の本じゃなくて、
主目的が別にある本に分かりすくて有益な Lisp コードが書かれている本って
実は結構ありそう。人工知能分野とか。
こんなときはどっち? * alist の key.car か,first か. * では alist から key を取った残りは? 残りだから rest でしょうか? しかし dotted pair では残りとは言えません.
Paul Grahamの"ANSI Common Lisp"の訳本はリファレンスが訳されてないからかなり不便になってるな。
>>508 あれって(plus 4 5)とか書いてあったりして隔世の感があるよな。
リファレンス訳してないんだ。価値半減。
Paul Grahamの"ANSI Common Lisp"の訳本にのっている問題をここで解いていくのはどう?
悪いとは言わんが、ずっと前から本スレで散発的にやってるので まずはその過去ログ嫁。
そのうちうpするよ、たぶん。
>>511 なんで?(key . value) で value は「残り」じゃそんなにまずいの?
まぁ、そう思う 511 は間違いなく car/cdr 派だから car/cdr を使ったほうが
いいんじゃないかな。
>>513 そんなのあったっけ?今手元にないんだが、クロージャ、ジェネレータ、
マーク&スウィープ GC、CLOS、遷移木のコンパイルと一通りそろった
入門書だった記憶があるが。とにかく訳と誤植がひどかった思い出がある。
>>518 alist の場合は普通「keyとvalueのペア」として扱うだろうから、「残り」じゃ変でしょ
2つの組から、一つとったものを「残り」と捕らえるのがそんなに変か? 俺は残り云々よりどうしても cons セルの car cdr が浮かぶので cdr 使うけどな。別に rest 使う奴にオマエは変だ! cdr にしろ!と言うほど 強いこだわりは無い。
二つしかなくて、それぞれ同等なのに、 first と rest に分けるのは変。 first は一つで、 rest は不特定多数っぽいもん。 他人がどれ使っててもいいっていうのは同意だけど。
CommonLispが出来ると何かメリットあるの? 就職に有利になるとか?
>>522 じわじわ効いてくる感じ.
ところで質問です.CLHS の position 関数のところにこんな記述が.
Notes:
The :test-not argument is deprecated.
The function position-if-not is deprecated.
これは,not で使うなら述語に含めて下さいという意味ですか?
CLHS は関数の説明に Application note があったらいいなぁ.
:start に nil が来たらいけないくせに,見つからないときは
nil しか返せない.(or (position ...) (length str)) じゃあなぁ...
do ループはいまいち使いずらいし,labels をループに使うのは
気の利かない処理系で慘めになりますYO!
>>523 > これは,not で使うなら述語に含めて下さいという意味ですか?
うん。
たとえば、:test-not #'foo ではなく :test (complement #'foo) にしろってことです。
>>522 はっきり言って就職の役に立つ事はほとんどありません.
面接官が Lisp == 時代送れ と思い込んでる可能性もありますし.
就職のためになる言語を学びたいなら C++/Java あたりをオススメしまつ.
うちの会社ならおれが面接するので Lisp と書いておくとちょっと有利になる。 Lisp というより関数型言語の知識があると役に立つ場面がある。
Lispできると言語ヲタのイメージがある
>>526 いい会社だな。漏れなんて
「学生時代は何で開発を?」
「主に Common Lisp 使ってました」
「ウチはオブジェクト指向を重視してるんですよ?」←いきなり表情が険しくなる
「え、いや、その……申し訳ありません」
というのを経験して以来、Lisp の名を出さないように気をつけていた。
>>527 みたいなイメージもありそうだしな。実名じゃ Lisp 好きなんて言えねー
>>528 逆に、そういう会社に間違って入らないための指針にもなるなw
久しぶりに問題でも出してみるか。 [問題] 階乗 x^n を普通に計算すると (defun my-expt (x n) (if (= n 0) 1 (* x (my-expt x (1- n))))) となりこの計算回数は n に比例する。これを工夫して log(n) の オーダーの計算回数で計算するように修正せよ。 また n が 10000 程度のときどれくらい計算回数に差がでるだろうか?
(defun my-expt (x n) (hoge #'* x n)) なhogeを作った方が使いまわしできるな。
(defun my-expt (b n) (labels ((square (x) (* x x))) (cond ((zerop n) 1) ((evenp n) (square (my-expt b (/ n 2)))) (t (* b (my-expt b (- n 1)))))))
>>528 >「ウチはオブジェクト指向を重視してるんですよ?」←いきなり表情が険しくなる
ってところで、CLOS を持ち出したりすると、
どうせその面接官は知らんだろうから自尊心が傷つけられちゃって、
さらに心証を悪くすることになるんだろうな。
>>530 > また n が 10000 程度のときどれくらい計算回数に差がでるだろうか?
532の場合。
10000回 vs (log 10000 2) * m = 13.29 * m回
>>528 >「ウチはオブジェクト指向を重視してるんですよ?」←いきなり表情が険しくなる
笑った。わけわかんない言語で変なクセがついているのを警戒しているのかな?
>>527 >Lispできると言語ヲタのイメージがある
ほめことばだよね。
>「ウチはオブジェクト指向を重視してるんですよ?」←いきなり表情が険しくなる ここでキレて 諸君 私はLispが好きだ。 括弧が好きだ。リストが好きだ。 再帰が好きだ。lambdaが好きだ。高階関数が好きだ。 パッケージが好きだ。クロージャが好きだ。マクロが好きだ。 ... と演説カマしてみたらどうなるだろう。
その演説につきあって、なぜ、...が好きなのか丁寧に訊いてきたらみどころあるね。
無職なんだけどlisp必要でしょか?
必要、不必要を判断するのは、状況をかなり限定しなくては不可能でしょう。 無職という点を生かしてlispにはまってみるのも面白いかも。
>「ウチはオブジェクト指向を重視してるんですよ?」 それは、オブジェクト指向といいたいだけなので 素直に「うちは、C++とJavaしか使いません」と面接官いえないんでしょ
顧問栗鼠( ´,_ゝ`)プッ
うーむつまらない問題を出してしまったかな。無理矢理別解。 (defun my-expt (x n) (do* ((n n (ash n -1)) (r 1 (if (= (logand n 1) 1) (* r x) r)) (x (* x x) (* x x))) ((= n 0) r)))
無職だからこそlisp
二進展開するときって Cだと &1 とか
>>1 とか使っていい感じになって
こういう計算はコンピュータに向いてるなあと感じるんですけど、
CommonLisp とか Scheme とかだとそれがあまり感じられないのですが
当り前の様に最適化されているのでしょうか。
ash, logandはintegerを引数として取るので、 * fixnum, bignumの型チェックがある。 * fixnumと確定したあとも、タグビットの操作がある。 したがって、型宣言、インライン宣言するなどコンパイラの手助けをしなければ、 Cに処理速度で負けることはある。 逆にCと同じだけの型宣言などをすれば、理論上は同じ処理速度を得られる 可能性はある。あとはコンパイラの出来しだい。 別の観点から考えると、普通に書いた関数でも、 (my-expt 2 100) => 1267650600228229401496703205376 と正しい結果が得られて、コーディング中にオーバーフローの心配は消滅する。
つまり、CとCommonLisp, Schemeでは、最適化のポイントが違うんだよね。 Cは機械寄り、Lisp系は抽象概念寄り。
>>531 (defun hoge (f x n z)
(cond ((zerop n) z)
((evenp n)
(let ((y (hoge f x (/ n 2) z)))
(funcall f y y)))
(t (funcall f x (hoge f x (1- n) z)))))
(defun my-expt (x n)
(hoge #'* x n 1))
(defun my-mult (x y)
(if (< x y) (hoge #'+ y x 0)
(hoge #'+ x y 0)))
他の使いまわし方が思いつかん。
>>533 面接官に Lisp って言うより、CLOS と言っておいて、
「CLOS とはどういったモノですか?」
「動的オブジェクト指向言語です」
と言えば何かすごそうに聞こえるよ。(Franz の手法)
clocc のインストールが マンドクサ。。。('A`) load とか require だけじゃ高度なライブラリは作れないのでしょうか. 目下,google で「AA マンドクサ」を検索すると本スレ part9 が...
>>549 (defun hoge (f x n z)
(cond ((zerop n) z)
((evenp n) (hoge f (funcall f x x) (/ n 2) z))
(t (hoge f x (1- n) (funcall f x z)))))
>>551 マニュアルが素早く斜め読み出来る英語圏の人にとっては何でもないのかな。
それとも、やっぱり苦戦するのかな。
とりあえず、sbclには最初からasdfがインストールされてるので漏れは最近(cmuclから)
こっちに浮気中。
(t (hoge f (funcall f x x) (/ (1- n) 2) (funcall f x z)))))
>>553 素早く斜め読みしてみました.
* Using GNU Make ... と
* Lisp-only が目に着きました.
おお! Lisp コードだけでもインストールできるじゃないか.
英語に馴れたフリをすることで気付けました.ありがとうございます.
しかし,
(load "/home/foo/.../clocc/clocc")
=>
...
*** - EVAL: the function WITHOUT-PACKAGE-LOCK is undefined
...
うちの Debian woody のパッケージ, clisp 2.27 は古いと仰せられました.
処理系には依存しないが,ディストリビュージョンの
パッケージには依存するという盲点です.
古い clocc を探してみるも,clocc.sourceforge.net -> Project home には
よく分からない 5 つのパッケージが.そのうちの CLX を
落としてきましたが,,,なんてインストールが簡単なんだ!
これで cllib をバリバリ使えるんですか?ちょっといろいろやってみます.
CMUCLでインストールしたときの(シェルオンリーの)メモ。 $ export LISPTYPE=cmucl $ cd /path/to/clocc $ make clocc-top この後 clocc/src/以下のディレクトリ(port/とかcllib/とか)の 使いたいライブラリのある場所に行って $ make system とやれば、ビルド開始。 で、cmuclの初期設定ファイルに $ cat >>~/.cmucl-init.lisp (setf *clocc-root* "/path/to/clocc/") (load (concatenate 'string *clocc-root* "clocc")) ;; ↓ロードしたいものを御自由に指定してください。 (load (translate-logical-pathname "clocc:src;cllib;base")) (load (translate-logical-pathname "clocc:src;port;sys")) Ctl-D #'save-lispなどでcoreに含めてしまうのも良し。
>>552 なるほど、おれの頭には
x^n == (x^(n/2))^2
しかなかったけど、こっちでもいいのか。
x^n == (x^2)^(n/2)
>>544 そのアルゴリズムって岩波の「基本的算法」かなんかで見た気がするな。
Commonlispで書かれたZopeみたいなアプリケーションサーバーがあったら 最強じゃない?
ZopeをCommonLispから使える様にしたらどうか。 Zopeの何も判ってない奴の意見だが。
python とか ruby にある toeuc みたいなやつはありますか? 無いと非常に困ります.
無いと困るなら作れ
>>563 shell に nkf コマンドを渡すからイラネーヨ w
しかし clisp で ext:shell するとプログラムの終了ステータスしか返されず,
出力は標準出力に垂れ流してしまう.
一時的なファイルに入れておけと?
>>559 ZopeくらいのことはCL-HTTPで十分だったりしない?
Allegro Webactions
>>565 > ZopeくらいのことはCL-HTTPで十分だったりしない?
CL-HTTPはウェブサーバで、Zopeはウェブサーバにもう一層、アプリケーション層
の仕組みが加わって、いるのでは? ユーザ認証から始まって、Zopeオブジェクト
をデータベースに保存できるとか、色々便利そうな機能があるのではないのかな、
Content management systemとしての機能もあるかな?
>>564 GNU CLISPなら、普通にEUC-JPを扱えないのかな?
詳しいことわすれたけど、CLISPでなら日本語の文字コード変換フィルタ
プログラムって:external-encoding(だっけ?)を読み書きのときに指定
するだけなのでは?
> CL-HTTPはウェブサーバで、はたして、そうかな。ページだと思ってみていたものが、実はCLOSオブジェクトだったということもあるのでは、ないかな。
>> 564 clisp なら convert-string-from-bytes と convert-string-to-bytes で変換かな
CLISPはlibiconvのフロントエンドとして重宝するよね。
>>567 ,
>>569 わー.すみません.内心,最初から諦めていたのか
impnotes.html を読んでいませんでした.
すごいです.欲しかったものがたくさんありました.
ただ,URL エンコードされたものについて色々やってみましたが,
iso-2022-jp の場合は「% に続く 2 文字を整数にしてベクトルへ格納」という
やり方ではできないようです.$ が入っていたので (w3m にて).
>>570 活用しているんですね.いいなぁ.
EclipseでLISPの開発ってできないかなぁ。 使い勝手のいいUDEでLISPが開発できればいいのに。
製作中のプラグインがいくつかありますが、現状ではハイライトができる 程度ですね。まぁ、Eclipse を自分でいじれるクラスの人なら好きなように できるでしょう。でも主な Lisper は Lisp ベースのエディタ(Emacs とか) 使ってる人が大多数なので…。 ちなみにどの辺が使い勝手が良いですか? >Eclipse ソースレベルデバッガとかリファクタリング周りは羨ましいけど 結局 Lisp の開発だと Emacs の方が快適なんで Eclipse は Java でしか 使ってないんですが。
ECLIPSEが使い勝手がいいかどうかは漏れもJAVAでしか使ったこと がないから知らんが、一般に普及しているECLIPSEでLISP開発が できたら認知度のUPにつながるかも知れない。 >573 リファクタリングは便利。 packageの移動字に名前を自動で参照しなおしてくれるのもいい。
じゃあ誰か作ってくれ て、EllipseのプラグインってもしかしてJava? ・・Javaわかんねえよなおまいら つーかEllipse入れるってことはJavaランタイムも入れなきゃだめか
>>573 が
> 製作中のプラグインがいくつかありますが、現状ではハイライトができる
> 程度ですね。
と書いているのだが…。
で、Java入れたくねえとか言い出すんだろ? わかってるって!
なんか他のネタキボンヌ。
Java入れなくねえ
LispでEclipseプラグインを開発できるような、Eclipseプラグインを つくればいいんじゃないのばかども。
s/Took/Tool/ ハァ… 疲れてるな。
CommonLisp規格は、なぜアメリカ(ANSI)どまりで、ISOの国際規格にならなかったのですか?
別に誰も困らなかったから。 ;; スレ違い気味だがそういや ISLISP ってのがありましたなぁ
ヨーロッパの人達はCommonLispに反対してるとか。ドイツは別として。
まぁ、なんだかんだいっても ANSI CL が出来ちゃったからな。ISLISP の処理系は OpenLisp と国産のが2つくらい?どれも普及するようなもんじゃないよなぁ…。 CL よりコンパクトっても CL より高性能の処理系がなきゃぁ使う気がおきないよ。 仕様がコンパクトなだけなら別に Scheme でもいいし。
やっぱ価値観としては高性能だよね あとCLの場合は互換性かな 実行ファイルも作れるとなおいいんだけど
>>586 情報アリガト。
>>587 CL より高性能の処理系がなきゃぁ使う気がおきないよ。
俺がCLが好きなのはプログラミング上で問題になりそうなことの解決策が
仕様としてすでに用意してあることなんだよね。その解決策がSchemeが求めるような
たったひとつの冴えたやりかたではないにしても。
卑近な例では、キーワードパラメータとか、コンパイラマクロとか、色々ね。
ここらへんは、規格制定時に各Lisp陣営から知恵をあつめた成果だと思うけど。
いきなりな話ですみません。 最近Lisp/Schemeの面白さに目覚め、できればこれで飯食って行きたいと本気で考えてるんですが、 どの会社の業務内容を見ても使用言語はC/C++かJava、良くてPerlとしか書いてありません。 富士通やNTTでは研究が行われていた(それも昔の話?)ようですが、 現在のところどうなんでしょう? もちろん言語は手段の一つに過ぎないことはわかってるのですが、 どうせ仕事するなら好きな言語でとどうしても考えてしまいます。 俺は仕事でLisp/Scheme使ってるよって方いますか?
使ってるという話は良く聞くけど、具体的にどこで使ってるのかは知らんw 誰か教えて。
とまべちの会社に入れば? あとは言語処理系扱ってる会社なら可能性あるかも。
高機能かどうかは実装依存 規格が約束するのは高機能
まちがえた 正: 高性能かどうかは実装依存
でも、規格が、その時点での技術を使って高性能な実装を許すかという事はあるよね。 Cの例でいうと、変数へのポインタ経由での自由な参照(aliasing)をゆるしている仕様 のせいで、コンパイラが、なかなかFortranに勝てる最適化ができないという課題が あったよね。 この点は、C99規格で対処したような気がしたけど。 CLなら、CLOSの実装かな…
規格がシンプルでも実装がでてこないものもあるからな。ISLISP とか。 そうゆう意味では CL は比較的恵まれている。CLOS もリファレンス実装 だった PCL にもメソッドキャッシュがあったりしてそこそこがんがって たよね。
というか、PCLによってloopsの仕様が心配されていた程遅くならないことが分かって、 loopsよりになったんだよな。 bit別冊 Common Lisp オブジェクトシステム 共立出版 (絶版) にそこらへんの事情が説明されてた。
>>598 へぇx3
loopsとかflavorsとか聞くけど、実際はどんな感じのモノだったのかな。
昔話キボウ!
初心者スレじゃなくなってきたー
初心者スレじゃない攻撃! ヒーッ!
だからこのスレは本スレと議論を(意味もなく)分散させてるだけなんだってばw
>>591 >>592 >>593 ありがとうございます。
実は既に大学の研究室に在籍してます。動画像や音声の実時間処理が
中心なのでほとんどCを使わなければいけない感じですけど。
Lispは研究とは関係なく、ほとんど趣味でやってます。
いじってるだけで楽しいのでよっぽど向いてるのかもしれません。
(Lisp関連の論文なんかも落として読んでいるんですが、
直接研究に繋がらないのがツラいです。)
そもそもLispに興味を持ったきっかけはEmacsとSawfishなんですけど、
完璧にハマったのがポール&川合さんのサイトが原因です。
起業も・・・してみたいんですけど、どうしてもノウハウが。
いくつか会社説明会をまわってるんですが、
企業によっては問題を解決するのにエンジニア側が好きな言語を選択できる
場合もあるそうなので(サーバサイドのシステムなんかはそうらしいです)、
そこらへんを中心に探していくしかないですかね。
あと前から気になってたんですが、とまべちさんってどういう方なんでしょうか?
Lispacheなんかで有名ですが、洗脳とか催眠とかアブナそうな
キーワードが・・・。
じゃあ、問題でも出してみるか。 初心者以外の人が解答を書く場合、別のところに書いてリンク貼ってね。 [問題] member, assoc を実装せよ。なお、:test キーワードのみサポートすればよい。
>>602 CL 中心という事と初心者向けという事で目的が違うじゃん。住人が
かぶってるんだからしょうがないだろ。いちいち指摘しなくてもいいんじゃネーノ。
LISPで実行ファイル作れるコンパイラってあります? XXX.exeに憧れる・・・。
>>608 前から気になってたんですが、シェルスクリプト風に書く場合
1行目って、gclなら
#!/usr/bin/gcl.exe -f
clispなら
#!/usr/bin/clisp
でできるんですけど、cmuclの場合はどうしたらいいんでしょうか?
CLISP使ってるんですけど・・・その「バッチファイル」とわ 一体なんですか? どうやって使うんですか?
>>609 #!/bin/bash
lisp <<EOF
(format t "Hello,world!")
EOF
みたいな感じで良いのでは。
# #!/usr/bin/lispが使えないことに気付いて必死のフォローw
>>610 「バッチファイル」ってUNIXでいうところのシェルスクリプトのことです。
やって欲しい処理をDOSコマンドで書いておくと、上から順番に実行してくれると。
>>613 たぶん cmucl の使い方を間違えていると思われ。スクリプト実行する
たびに起動するには cmucl はでかすぎる。そーゆう用途なら CLISP で
やったほうがいいと思うよ。
>612 例文を〜〜・・・ 立ち上げまではうまくいけたけど、それ以降がわからない・・・。
>>615 えっとバッチファイルのほうですか?
それともclispのスクリプトのほう?
clispのスクリプトであれば、上のほうにあるように
------------------------------
#!/usr/bin/clisp
;;↓なんか適当にLispプログラム書いて下さい
(defun ave (args)
(float
(/
(apply #'+ args)
(length args))))
(let ((numlist '(342 123 646 6464 4 423)))
(format t "average = ~A~%" (ave numlist)))
------------------------------
こんな感じで書いて、適当な名前(ここでは"hoge"にしときます)で保存して
実行権限付けて、あとはターミナル上で
% ./hoge
ってやれば
average = 1333.6666
こんな風に結果が得られます。
ってこんな感じでいいんでしょうか?
>>604 >[問題] member, assoc を実装せよ。なお、:test キーワードのみサポートすればよい。
Loopを使う人は少なそうなので、あえてLoopを使ってassocを実装してみました。
destructuring機能も使ってみました。loopだからっていじめないでね。
(defun my-assoc (item alist &key (test #'eql))
(loop for entry in alist
for (key . value) = entry
when (funcall test item key)
return entry))
と思ったら、valueで受ける必要はなかったので、destructuringもあんまり意味無いな。 return valueだと思って書き始めたのが敗因です。 (defun my-assoc (item alist &key (test #'eql)) (loop for entry in alist when (funcall test item (first entry)) return entry))
memberにはmaplを使って、assocはmember + key指定。 (defun my-member (item list &key (key #'identity) (test #'eql)) (block nil (mapl #'(lambda (list) (when (funcall test item (funcall key (car list))) (return list))) list) nil)) (defun my-assoc (item alist &key (test #'eql)) (car (my-member item alist :key #'car :test test))) (defun my-member (item list &key (key #'identity) (test #'eql)) (block nil (mapl #'(lambda (list) (when (funcall test item (funcall key (car list))) (return list))) list) nil)) (defun my-assoc (item alist &key (test #'eql)) (car (my-member item alist :key #'car :test test)))
ニ、ニ、ニカイ、コピペシテシマッタ。
落ち着け
(defun my-assoc (item alist &key (test #'eql)) (declare (inline remove)) (check-type alist list) (car (remove item alist :test-not test :key #'car)))
623 :
デフォルトの名無しさん :04/03/05 15:08
>>616 clispでいわゆるgetoptみたいに、コマンドライン引数のスイッチ処理を
するための関数はありますか? どこかで見たような気がするのですが忘れてしまいました。
>>624 調べずに聞いてごめんなさい。cl-getoptというパッケージがdebianに
用意されていました。教えていただいたのと同じものだと思います。
clispでも使えるようです。
さぁ、これでスクリプティングにclispを使わない理由が無くなってきたな>俺
>>616 をを、その方法で出来るのですか。
ちなみにWINDOUWSでできますか?
できるわけねーだろ>626 cygwin上でしか動かないだろうな。 それとさ、UNIX厨は黙れよ。 最初に.exeって書いてあるんだからWindowsの話だろ。
きびしい御言葉... 俺のイタコのバアちゃんに聞いたら、LispWorks, Allegro CLなど有料の処理系ではWindowsでexe吐かせることができると思うと 言ってました。
売り物はむしろできて当然でいて欲しい・・
exe って言っても処理系丸ごとラッピングしてるだけじゃないの?
ソースをリソースとして持ってるだけっだったりして
それでもいいよ できないよりはいい
>>630 > exe って言っても処理系丸ごとラッピングしてるだけじゃないの?
現在のコンピューティング一般の傾向として、「それで何がいけないの?」という意見も
ありえる。exeがデカくなりすぎるという批判かな? 組み込み用途などを除いて、デカさ
は今どき、みんなスルーする話題なのでは?
たぶんExe + Common Lispランタイムdllという構成でだいたい満足できるのではないかな.
配布ファイルのデカさの解決策として、Common Lisp界隈では、tree shakingという技術が
発達しています。つまり、配布用の実行ファイルという木にケリを入れて、いらなそうな機能
という葉をふるい落すというイメージです。実際のところは知らんけど、デバッガ、コンパイラ、
など普通にいらなそうな機能からはじまって、CLOSとかもうまくやれば、理論上はまるごと削れる
よね。
ただそれでも、「やっぱり空のmain()の方が小さいよ」とかいう事を言う人もいるでしょう。
以前 Lisp のイメージ + 処理系という方式は Windows ユーザーには受けないよねっ
て話がでていたがまさしくその通りだな……。Lisp の動的さを生かすためにはフル
機能をユーザーに解放していて欲しいわけで機能削ってまで実行ファイル単体にまと
めるのもなー。まぁ商用の LispWorks や Corman はできるわけだが。
>>633 処理系丸ごとラッピングとかで配布されると使い回しに問題が。できればソースが欲
しい。Lisp 使ってる人は大抵自分のイメージファイルがあるわけで、プログラムを
取り込んで使いたいって人が多いんじゃないかな。
「read-eval-print loop」という言葉に代表される Common Lispのインタラクティブな環境としての特性と, int main(int argc, char *argv[]) を特別扱いするC系コンパイラの特性とは, まったく反対な気がする. C系コンパイラは,そもそもが実行ファイル組み立て装置なわけで. それに対しCommon Lispの(ネイティブ)コンパイルは,最適化のための手段でしかないのでは. むしろPHPとか鯖サイドJavaとかに近い. Allegroとかのスタンドアロンアプリ生成機能は,ぶっちゃけLispらしくないと思うけど, みんなもそう思わない? アプリに組み込んだらどうなる,とかまた別の話になっちゃうけど.
できないより できたほうがうれしい
実行ファイル組み立て装置な Lisp 処理系欲すぃ。
>>634 > 処理系丸ごとラッピングとかで配布されると使い回しに問題が。できればソースが欲しい。
ん? ソースを配布するかは、技術的に難しいとか簡単とかの問題ではなくて、単に配るか
配らないかという問題だよね?
> Lisp 使ってる人は大抵自分のイメージファイルがあるわけで、プログラムを
> 取り込んで使いたいって人が多いんじゃないかな。
それは、Lispを使う上では常識だけど、今は、exeが欲しいという人がいたので
あえて書いたんでしょう、たぶん。
>>635 つまり、Lispは、「OS」というと語弊があるから、「(開発)環境」なんだよね。
そんで、普通のLisp処理系には、Cの開発環境でいうところの C compiler +
C interpreter + Debugger + ...
という機能がつまっていると。 あと、make、profilerなんかもCの開発環境よりも
はるかに、継目が目立たないように統合できると。
> Allegroとかのスタンドアロンアプリ生成機能は,ぶっちゃけLispらしくないと思うけど,
> みんなもそう思わない?
アプリケーションのユーザーにrepループが開放されていないのなら、実質、どんな言語で
書かれていようが気にならないのでは?
>> 637
> 実行ファイル組み立て装置な Lisp 処理系欲すぃ。
どういう意味で言っているのか、いまいち理解できているかわからんけど、
ECL(Embeddable Common-Lisp)を見てみる事を、お薦めします。
つまり、Lispで書いたアプリケーションのマクロ言語としてLispが使えるようにしないのは損だね。 だから、LispでWeb browserを書いたら、JavaScriptはサポートしなきゃならないけど、おまけで、 Lispも使えるようにする人が多いでしょう、多分。 これが、Cだと普通、アプリのマクロ言語としてC言語をサポートをするのはまれだよね。
>>634 >機能削ってまで実行ファイル単体にまとめるのもなー
exeにするってことは既に用途が決まってるわけで、
いらない機能なら削る事は特に問題ない。
必要になるなら別バージョンのexeを作ればいいし、
なんでもかんでも動的にしとけばいいってものでもない。
それよりアプリケーション側で下手にeval開放するとなると
セキュリティとかの問題が出てくるわけだが。
>>639 >これが、Cだと普通、アプリのマクロ言語としてC言語をサポートをするのはまれだよね。
アドインモジュールのABIがCコンパイラに依存してる(まあ当たり前だけど)のは
ある意味Cをサポートしてるのと同じじゃないかな。
>>638 いやコンパイル済みのやつは互換性を保つのが難しいくらいの意味っす。
普通はプラットフォーム間の移動もムリポだし。CLISP なんかはがんばってるけどね。
>>640 Windows な初心者なら アプリケーションを配布する == EXE を配布 だと思っている
可能性もあるのかと思ってさ。たしかに「要らない機能」が明確なそうかもしれない。
でもユーザーによる拡張を認める場合はフル機能が要るわけだしさー。Windows 界隈
でも「プラグインで拡張可能」とか拡張性は売りになる場合が多いみたいだし。
eval 云々は解放しなければいいだけだと思われ。そーゆう用途ならカスタマイズし
た機能制限インタプリタ or コンパイラを作るのが普通じゃないの?
>>642 なにを前提に「普通」と言ってるのかがわからないが。
拡張にもいろいろあるわけだし。
DLLを作成する様なプラグイン形式なら
LISPインターフェースを残す必要すらない。
拡張云々は
>>640 前半へのレスで
「(セキュリティを気にしつつ eval が要るような場合は)
制限付きインタプリタやコンパイラを作るのが普通じゃないの?」
というのは
>>640 後半の
> それよりアプリケーション側で下手にeval開放するとなると
> セキュリティとかの問題が出てくるわけだが。
への返事っす。
プログラマに配るのならいいけど、そうでない人に使ってもらう場合は、 Windowsでアプリケーションを配布する、といえば配布物のみで大体動く必要あり perl や ruby 用のスクリプトをソース配布するのと変わらん そりゃ、Windowsでも実行環境ある人はあるけどさーってこと
VBやC#やらと同様、ランタイムも一緒に配ればいいのよ。 setupでついでにインストールしちゃえばエンドユーザーは意識しないっしょ。
>>645 Windows の話だと、
- 商用:ACL, LispWorks, Corman は exe 出力可能
- フリー: CLISP なら処理系ごと配布可能
ただし ACL はランタイムライセンスが高価なのでダメポ。
でも Windows 用 CLISP は GDI インターフェースもまだ無いし、
実質 GUI が使えないので受けないだろうね。
CommonLispの実行環境は今のところxyzzyしかないのですが, これでCGIを描くこと出来ますか?
遠い書き込みにレスつけてみる。 優秀な研究者であることに間違いはないと思うよ。 ただ企業家(起業家でもいい)としての能力/適正/本気度は疑問。 っていうより例の会社の状況見ればどんなもんかは想像つくと思うけど。 興味があるなら自分で確認してみるのが一番じゃない?
ですが、書くことは可能ですが、はっきりいってオススメはしません。 CGI はエディタの拡張としては方向性が違いすぎます。リクエスト毎に 起動するには xyzzy でも十分軽いとは言えないでしょうし、Web サーバー からのリクエストを xyzzy に渡すプログラムを書くのも初心者にはハードル が高いような気がします。 Lisp 慣れしていないならライブラリの充実度からいって Perl や Python や Ruby を使ったほうが CGI には向いている のではないでしょうか。それでも Lisp に興味があるならこの手の 用途には GNU CLISP がオススメです。というか Windows だと 実質的にこれしか選択肢がありません。
schemeだけどgaucheならWinでCGIできるよ
Cygwin が必要なんじゃなかったっけ?普通の Windows ユーザーには CLISP 以上に敷居が高そうだけど…。
「Lisp系でCGIをWindowsでやりたい人」という括りで考えたとき、 CLISPよりGaucheのほうが有利な点ってどんなところかな? 日本語処理という点では、WindowsでもCLISPのiconvライブラリへのインターフェイス が生きているとしたら、ほぼ同じようなもんだよね。 俺のロートルマシンでもCLISPは起動が速いし(一瞬)。 ライブラリ的なものの数とかかな?
日本語正規表現とか?
CLISPは、文字の内部表現がUnicode(たぶん)で、組み込みの正規表現ライブラリがあるし、 Perl互換のCL-PPCREもあるしね(たぶん文字型に作用するという抽象化された書き方だから、 Unicodeもサポートされていると思う。)... ただキャラクタクラス指定で使う順番がUnicodeだろうから[亜-熙]で漢字一文字ねという わけにはいかないかもしれんけど。 CLISP、Gaucheの両方とも、S式によって表現したHTMLファイルみたいなライブラリはあるよね。
CGIライブラリって、どっちもある?
>>655 CLISP + CL-PPCRE は激しく遅いというのを以前見かけたような…。
PCRE モジュールを使うほうが良いような気もするが、Windows だと
モジュールの作成もマンドクサなのかな?Win ではコンパイラが無いのが
普通だと聞くので Windows 向け標準配布物に PCRE があるかどうかだな。
まぁぶっちゃけ Cygwin が平気なら Gauche のほうが CGI に向いて
そうだが。CLISP で Web 系のプログラム作ってる人って居るの?
>>657 > CLISP + CL-PPCRE は激しく遅いというのを以前見かけたような…。
CLISP + 組み込み済みの正規表現ライブラリ VS CLISP + CL-PPCRE
では、あまり動作速度は変わらないとCL-PPCREの作者さんが言っていました。
> Win ではコンパイラが無いのが
> 普通だと聞くので Windows 向け標準配布物に PCRE があるかどうかだな。
え? とりあえず、CLISPの話だと想定します。CLISPのバイトコードコンパイラは
OSを問わずに動きます。現在、CLISPにネイティブコードコンパイラは存在しません。
> Cygwin が平気なら Gauche のほうが CGI に向いて
> そうだが。CLISP で Web 系のプログラム作ってる人って居るの?
具体的に、Gaucheの方が向いている点をあげてみていただけますか?
CLISPでウェブログツールを開発して、配っている日本人の方(か日本語が堪能な人)が
いらっしゃいます。
http://lambda.s55.xrea.com/
実際 CLISP + CL-PPCRE の ppcre:regex-replace-all とか遅いけど。漏れの言って るコンパイラってのは C コンパイラで PCRE ってのはCLISP に附属のモジュールの 話。こっちなら速度的には十分のハズなんだがWindows ユーザーにコンパイルしてねっ て言うのもねぇ。標準で付いてないと辛いよねって話。 > 具体的に、Gaucheの方が向いている点をあげてみていただけますか? Builtin な正規表現とか標準ライブラリ rfc.uri, text.html-lite, www.cgi とか
>>659 レスありがとうございます。
> 実際 CLISP + CL-PPCRE の ppcre:regex-replace-all とか遅いけど。
なるほど。あとは、実用上それがどのくらい問題かですね。
> Builtin な正規表現とか標準ライブラリ rfc.uri, text.html-lite, www.cgi とか
web関連のライブラリが標準で付いているということですか。
clispでも探せばありそうな気もしますが、統一感には欠けますね。
めちゃ盛り上がってるなぁ。 ところで、「バッチファイル」でCLISPを動かすには どうすれば・・・調べたがわからない。 つーか、「コマンドライン」て何なんだろう? さすがにWIN+CLISP一週間ではきついよ・・・。 かえるか。
以前Lispの勉強がてらclispでCGIを書いてみたことがあったんですが
うまく行きませんでした。
まずhtmlを生成するプログラムを書き、
(format t "Content-type: text/html; charset=EUC-JP~%~%")
を頭につけてコマンドライン上で実行してみたところ、
きちんと標準出力に結果がはきだされました。
で、いざサーバ上に置いてアクセスすると、何故かサーバエラーが起こってしまいます。
いろいろ原因を調べたところ、どうやら日本語を使うとエラーが出るようです。
Webサーバのエラーログを見たら
"invalid byte #x94 in CHARSET:ASCII conversion"
となっていました(#x94の部分は使った日本語の文字によって違う結果になりました)。
clispのFAQ("
ttp://clisp.cons.org/faq.html#enc-err ")に同様
の質問があったのですが、スクリプト単体では正常に動いているので
微妙に違うような気がします。
CGIって標準出力にはきだされた文字列をそのままブラウザに渡すだけじゃないんでしょうか?
あきらめて処理系だけgclに切り替えたらうまくいったんですが、
個人的にclispのほうが好きなので未だに解決方法を模索中です…
>> 658 このサイトはよろずやの人かな。 Lisp Resource KitとかはKNOPPIX通り越してMovitzベースに移行するとかイケる ところまで逝っちゃって欲しい。面白そうだし。 それはそうとどなたかCMUCL+SLIMEで開発していてデバッグしているところの過程を ムービーみたいのでデモしているのとか持ってないですか(ttyrecみたいな感じで)。 上級LISPERの作業過程を見て勉強したいと思っても、周囲にLISPで遊んでいる奴すら いないから、自分のやり方がいいのか悪いのかも判断できないんですよね・・・
>>664 > それはそうとどなたかCMUCL+SLIMEで開発していてデバッグしているところの過程を
> ムービーみたいのでデモしているのとか持ってないですか(ttyrecみたいな感じで)。
賛成。上級Lisperじゃなくてもいいから、俺はSLIMEのデモとしても見てみたい。
>>663 > "invalid byte #x94 in CHARSET:ASCII conversion"
> となっていました(#x94の部分は使った日本語の文字によって違う結果になりました)。
これは、CLISPが吐いているエラーメッセージですよね。そんで、出力用のエンコーディング指定
がASCIIなのに、日本語文字を構成する8bit目が立った1バイトを渡されて怒っていると、たぶん、
LANGやLC_ALLなどの環境変数が、スクリプト単体で実行している時と、サーバから起動されている
ときと違うのではないでしょうか。あくまで、これは俺の憶測です。
LANG=ja_JP.eucJPなどという環境設定をしてからWebサーバを立ち上げるか、
CLISPのスクリプト内で、出力ストリームのエンコーディングを明示的に、eucJPにするとかどうで
しょう...
>>663 >>666 たぶん、出力時に問題になっているのではなくて、スクリプトファイルを読み込むとき
にスクリプトに含まれる日本語が問題になっていると思う。サーバがLANG=Cやen_US.ASCII
など7bitの文字指定で、シェルがたぶんLANG=en_US.ISO-8859-1など8bitを通す指定なんでしょう。
ウェブサーバをLANG=en_US.ISO-8859-1 apache2などとして起動したほうが良い気がする。
いまさらlispでつか?プッ
そうでつよ! ピッ
そういうことで!ポッ
>669 は恥ずかしい奴
ぼちぼちLISPだな。
674 :
デフォルトの名無しさん :04/03/10 15:10
ただのリンク集になってるなぁ まとめるとか言い始めた本スレのヤシは何やってるんだ
676 :
デフォルトの名無しさん :04/03/10 16:36
たぶん本スレのいいだしっぺの人は、「(誰か)まとめてくれ」と言いたかったんでしょう。 ま、俺はリンク集でもいいと思うけど。
さげね、サゲ、SAGE、サゲ、sage
>>666 ttyrec で試しに録画してみました。
emacs -nw だと ALT が効かなくて作業しにくい…
ttp://lambda.s55.xrea.com/files/slime_demo.tar.gz kterm, xterm あたりなら再生できると思います。
デバッグはネタが考えつかなかったのでとりあえずパス。
- hello-world
- hyperspec-lookup
- 定番のフィボナッチ数列
- time マクロの出力を cl-ppcre を使って加工
です。やっぱ ttyrec だと見た目がイマイチですね。
X 版の Emacs + SLIME だともっとカラフルなんですが。
>>678 サンクスコ。いまttyplayが手元にないんで、データだけいただいておいて明日
仕事中に(ぉぃ)拝見させていただきます。
>>678 ありがとう。slimeは、lisp listenerとのやりとりから賢いことをやるみたいですね。
あと、slime起動時のascii animationみたいなのが面白い。こういう視覚効果を集めたemacsパッケージないかな。
俺はまだ、ilispなんですが、ilispって開発が止まっているみたいですよね。これからはSLIMEかな。
(
>>678 を見ながらいろいろ実験中に...)
CMUCL-18e@FreeBSD でバグって無限に再帰する fib (非末尾再帰)をコンパイ
ル後実行したら Ctrl-C でも kill -9 でも止まってくれなくて困った。マシ
ンがキリキリ言ってるし他のアプリは激遅になるし。
最後 core 吐いて死んだ。コンパイルしていないものは Ctrl-C で止まった。
何で止まってくれないの?うちだけ?
;; SBCL では CONTROL-STACK-EXHAUSTED で一瞬で止まった。
CMUCL-18e@Linuxでは、(defun f () (f))でコンパイル後、 3A: L0: JMP L0 と末尾再帰が無限ループになるため、実行しても何もおこりません。Ctrl-Cで普通に停止。 (defun f () (f) (print "Never reach here"))は、コンパイル後、実行したら セグメンテーション違反でcmuclが殺されました。
>>681 試してみますのでコードみせてください。
うちでは
>>682 の両方とも普通に停止できるみたいです。
環境: FreeBSD 5.2.1 + CMUCL CVS 2003-12-03
Linux 2.6.0 + CMUCL 18e (defun f () (declare (optimize safety (speed 0))) (f) (print "Never reach here")) コンパイルせずに(f)をしたらしばらくしてcmuclが「強制終了」で終了。 コンパイルして(f)をしたらしばらくしてcmuclが「セグメンテーション違反です」で終了。 スタックを見張るスイッチか何かがありそうな気がする。 sbclは両方とも、以下のメッセージでデバッガに入った。宣言は関係なし。 debugger invoked on a SB-KERNEL::CONTROL-STACK-EXHAUSTED in thread 1986:
>>683 (defun fib (x)
(if (<= x 1) 1
;;(+ (fib (- x 1)) (fib (- x 2)))))
(+ (fib (+ x 1)) (fib (+ x 2)))))
そのマシンは家にあるもので今手元にないため再現するか確かめて
はいないのですが、上のようなコードだったように記憶しています。
>>682 さんの 2つ目のコードで大丈夫なら上のコードも多分問題は
ないように思うのですが。ということはうちの環境に問題ありそう
ですね。
環境について補足。
FreeBSD-4.9 STABLE + (portsの) CMUCL-18e
それと (defun f () (f)) のような末尾再帰版はうちでも Ctrl-C
で普通に止まりました。
;; うちのプロバイダはアクセス規制になっていたので結果の報告
;; など遅くなるかもしれません。
>>685 coredump 中は ^C や kill が効かないけど、それじゃない?
FreeBSD 4.x のデフォルトでは resource limit の datasize がかなり大きい
ので、オンメモリで動かせる程度に制限してやればいいかと。
キセイチュウ
>>687 ビンゴでした。
% limit coredumpsize 0
等して core のサイズを適当に制限すればよいようです。マシンが重くなるの
は 1G(!) の core を dump 中だったからのようです。
皆様ありがとうございました。
% ll lisp.core
-rw------- 1 name name 1329483776 Mar 11 19:55 lisp.core
% ll -h lisp.core
-rw------- 1 name name 1G Mar 11 19:55 lisp.core
>>684 19a には x86/sparc くらい限定ですが Stack overflow checking や Heap Overflow checking
が入ります。SBCL にはそーゆうのが既に入ってるのかな。
- (defun f () (f))
- (defun f2 () (f) (print "..."))
- バグ入り fib 無限ループ
を止める(stack check で止まる)シーンを slime_demo.tar.gz に追加しました。
独自ビルドの CVS 版なんで *features* も表示してます。以下 release-19a.txt の
Feature enhancements から抜粋。
- Stack overflow checking added for FreeBSD/x86, Linux/x86 and
Solaris. Code that makes the control stack overflow (for
example due to unbounded recursion) will lead to a
STORAGE-ERROR being signaled, instead of making CMUCL crash.
...
- Heap overflow checking for x86 and solaris with gencgc. When
the heap is close to overflowing, a heap-overflow condition is
signaled. If an overflow happens again while debugging the
condition, the user is returned to top-level without warning.
Use lisp::*reserved-heap-pages* to set the number of pages to
reserve.
キーワードパラメータがあると、何がいいのですか? 関数呼び出しが遅くなるだけのような気がします。
VBの名前つき引数みたいなもんだよ
そんな説明じゃイヤ! keywordに関して、SchemerはCommon Lisperを羨ましく思いますか?
>>693 schemeだからできないってわけじゃないんだが
>>694 R5RSにはなかったよね?「Cだからできないってわけじゃないんだが」と同レベル?
>>691 呼び出すときに引数を名前で指定できてウマーじゃん。
順序だけより人間に優しいじゃん。性能的にマイナスなのは
そうだけど。その場合も「つかわない」という選択肢も関数
作成者には与えられているので無問題では。
引数に nil nil nil nil t とか連続してたら嫌.
CommonLispってヴィジュアルな環境ないのですか? VCちっくなものが欲しい・・・
visual 【形】 視覚{しかく}の、視力{しりょく}の、目に見える slimeだな。
>>698 Allegro Common LispかLispWorksの体験版をみてみましょう。
>>691 foo(
0, /* object id */
NULL, /* docstring */
10, /* value */
this /* subject */
);
というようにCでは引数が多くなって分かりづらくなると、個々の引数が何を表すのかコメントを
つける事がよくあるけど、各引数に付けるコメントを、言語処理系からただ無視されるだけの
存在から、言語の構成要素にまで昇格させたのがキーワードパラメータです。
(foo :object-id 0 :docstring nil :value 10 :subject this)
>>695 独自拡張で使える奴がある。OO用にCLOSもどき付けてるのは大体そう。
R5RS だと :keyword も シンボルなんで不定長の引数をとるようにして自前で
処理。
>>701 ありがとうございます。Cよりはましなサポートがあるんですね。 スレ違いなのでこのへんで消えます…
>>678 の他に作業風景見せてくれる人居ないかなー。
括弧って最後にまとめて閉じるのが普通なの?
C とかでは先に対応する {} を書いちゃってから
中身を書いていってたんだけど。
とりあえず、置いておきますね。 , - 、, - 、 , - 、i'・e・ ヽ,,・ァ, - 、 4 ・ ゝ - 、i'e・ ヽ、・ァ ゝ i e・ ヽ、 ,,.-''´| |`"''-,,_i ,,.-''´ | | "'''i" ,,.-'" `"''-,,_. | ,,.-''" "'''--'''"
>>705 おまえ、uzuraか?
捨て子はよくないぞ
先人のお知恵を拝借したく。 CLikiでXMLを検索するといくつかライブラリが見付かるのですが、Lisp&XMLの初心者でも 手っ取り早く扱えるのってどれですか? XML文書は普通どんな感じで処理されるのかとかいまいち 理解できてないのですが、やりたいことはOAI-PMHのクライアントを作ることです。 レスポンスが全部XMLで返ってくるのでこいつの扱い方を修得しなきゃいけないなぁ、と思って 全然真剣に取り組んでなかったXMLについて入門レベルから勉強しているところ。
昔の人に訊いてるんですか?
nil
(昔の人に訊いてるp)
XMLの処理用ライブラリで処理方法による、おおまかな違いといえば、 あるXML elementを認識するたびに、プログラマが登録しておいたコールバック関数を 呼び出して逐次的に処理するというもの。次は、W3CのDOMみたいに、一度、 プログラム言語がサポートしているデータ型のデータ構造としてXML文書をメモリ内に 作ってしまうもの。他にもう1つくらいあったけど忘れた。 XMLとS式との親和性の良さから、DOMみたいに、一度、メモリ内にXML文書の データ構造を作ると、いろいろ、変形とか処理を加えるのは楽そう。 ただし、XML文書の大きさが百メガとかだと、苦しいこともあるかも。 すでにあるCommon Lisp用XMLライブラリの紹介できるひとプリーズ。
>>666 >>667 >>668 レス遅れましたが、無事解決しました!
本当にありがとうございました。
原因はやはりサーバ側のロケールにあったようで、
色々調べたあげく、cgiを置いてあるディレクトリの
.htaccessファイルにLANG=ja_JP.eucJPと指定して試したところ
うまくいきました。
-Eオプションも試してみたのですが、*default-file-encoding*が
EUC-JPになっているのにも関わらず、なぜか以前と同じエラーが出てしまいました。
Practical Common Lisp (public review)
>This page, and the pages linked to by it, contains the work-in-progress
> of Practical Common Lisp which will be published by Apress some time
> this year (2004).
http://www.gigamonkeys.com/book/ 最近、Lisp関連の本がまた出版されるようになったと思う。
たしか、Successful Lispも出版されると聞いたし、
Paul GrahamのLispワショーイエッセイ集も発売されるとか。
復活
716 名前:デフォルトの名無しさん[sage] 投稿日:04/03/25(木) 15:25 時代がLispに追いついた 717 名前:デフォルトの名無しさん[sage] 投稿日:04/03/25(木) 16:41 Paul Grahamさんからエッセイ集の推薦文をたのまれたと、 Rubyのまつもとさんの日記にあったな。
718 名前:デフォルトの名無しさん[sage] 投稿日:04/03/25(木) 16:44
>>715 ぜんぶオンラインで読めてしまうところが、時代を感じるな。
みなさん お元気?
schemeじゃなくてCommonLispを使う利点て何よ?
ライブラリが幾分かマシ
本スレじゃなくて初心者スレを使う利点て何よ?
初歩的な質問をしたときの煽りが幾分かマシ
本スレだけだった頃は煽りなんて無かった気がするが
(a b c)を返すcons式を3通り示せ >(cons 'a '(b c)) (a b c) >(cons 'a (cons 'b (cons 'c nil))) (a b c) もう一つは何ですか?
726 :
デフォルトの名無しさん :04/03/30 01:06
(cons 'a (cons 'b '(c))) ?
すげー 頭いいね
今SBCLのuser manualを読んでいるのですが、 make-alienしたオブジェクトは、GCで回収されるのでしょうか? 明示的にfree-alienする必要がありますか?
manualに書いてないのか
FFIの章を一通り読んだのですが、はっきり書いてないんですよね。読み落としたのかもしれないのですが。 付属のモジュール(sb-bsd-sockets/malloc.lisp)を見るとfinalizationでfree-alienするmallocという関数が定義してありました。 やはり手動でfreeしないといけないみたいですね。 で、このmalloc関数を使うとGCと同時に解放されるということみたいです。 (in-package :sb-bsd-sockets-internal)なんてケチなこと言わなくていいのに。ぶつぶつ。
Clispをエディタから操作するにはどんなエディタなら可能ですか? XYZZYみたいにエディタ上からコンパイルしたいのですが。
emacs+ilisp or slime?
emacs + inferior-lisp-mode C-x RETlisp-macroexpand-sexp C-x C-elisp-eval-last-sexp C-c C-vlisp-show-variable-documentation C-c C-flisp-show-function-documentation C-c C-dlisp-describe-sym C-c C-alisp-show-arglist C-c C-klisp-compile-file C-c C-llisp-load-file C-c C-clisp-compile-defun C-c C-rlisp-eval-region C-c C-elisp-eval-defun C-c C-zswitch-to-lisp
proclaimとdeclaimの違いについて教えてください。 前者が関数、後者がマクロで、前者は実行時のみ、後者はコンパイル時にも効果を持つということみたいですが (eval-when (:execute :compile-toplevel :load-toplevel) (proclaim '(special *x*))) が (declaim (special *x*)) と同等と考えていいんでしょうか。 コンパイラにとっては実行時のproclaimは意味なしに思えるのですが合ってますか?
731です。
>>732 SLIMEを調べてみました。使いやすそうな雰囲気ですが
これってLINUXとかしか使えんのでわ?
737 :
デフォルトの名無しさん :04/04/02 09:23
>>734 >コンパイラにとっては実行時のproclaimは意味なしに思えるのですが合ってますか?
たぶん合っていると思います。
compile-fileやcompileの処理対象であるコードの中に出てくるproclaimの効力は、
その場では発揮されません。コンパイルされたコードがloadやevalされたときに効果を発揮します。
そうでもなかったか。スマソ。
本スレに張ったほうがよかったかな…… と思って久しぶりに見てみたら貼られてますな。3回。
初めて一週間の初心者です。 XLISPでlistの中のatomの数を数えたいんです。 下のようにlistの中のatomだけを抜き出してリストにすることはできました。 (DEFUN F1(L) (COND((NULL L) NIL) ((LISTP(CAR L))(F1(CDR L))) (T (CONS (CAR L)(F1(CDR L)))) ) ) このコードを実行すると次のようになります。 (F1 '((A B) C D (E F) G)) (C D G) 後はこれをlengthで数えるだけだと思うのですがそのやり方が分かりません。 それとももしかしてSETQで変数を設定して Tのところで値を1つずつ足していって数えるのでしょうか? お分かりの方、どうか教えて下さい。
(+ 1 (length (cdr l)))
ありがとうございます。 ああやって数を数えるんですね。 お答えを基にして修正してみました。 (defun f1(l) (cond((null l) nil) ((atom(car l))(+ 1 (length(cdr l)))) (t (f1(cdr l))) ) ) そして実行… > (f1 '((a b) c d (e f) g)) 4 CとDとGの三つなので"3"が返ってくると思ったのですが なぜ4なのでしょう? うーむ…。
コードが変質してしまっているよ。
>>744 は、「最初のatomが出たら残りのリストの長さを返せ」になってしまっているから、こうなる:
(f1 '(a (b 1))) => 1
(f1 '(a (b 1) (c 2))) => 2
(f1 '(a (b 1) (c 2) (d 3))) => 3
>>742 のf1を使ってatomの数を数えるのは二通り考えられる。
a. f1の戻り値のリストの長さを数えるf2を作る。
b. f1にそれまで出てきたatomの数を表す引数を増やす。f1を最初に呼ぶときには0を入れることになる(そういうf2を作る)。
>>745 ありがとうございます。いろいろ考えた末
(defun f1(l)
(setq ct 0)
(cond((null l) nil)
((atom(car l))(+ 1 (length(cdr l))))
(t (f1(cdr l)))))
…とかやろうと思ったのですが、これ以上浮かびませんでした。
それと今回はf1だけで処理しないといけないのです。
Common LISPの本をめくってみるとこういうのがありました:
> (defun f1(ls)
(cond ((null ls) 0)
((atom ls) 1)
(t (+ (f1 (car ls))
(f1 (cdr ls))))))
f1
これだと低いレベルのリストの中のatomまで全部数えてしまいます。よって
> (f1 '((a b) c d (e f) g))
7
となります。低レベルのリストを無視するにはどうすればよいのでしょうか?
(質問しながら僕もやってみます。)
(defun hoge (l) (length (delq nil (mapcar #'atom l)))) (hoge '(a b (c d) e)) => 3
(defun f1(l) (cond((null l) 0) ((atom(car l))(+ 1 (f1 (cdr l)))) (t (f1(cdr l)))))
…と言っていたら三分でできました。(~o~) > (defun f1(ls) (cond ((null ls) 0) ((atom ls) 1) ((listp (car ls))(f1 (cdr ls))) (t (+ (f1 (car ls)) (f1 (cdr ls)))))) F1 > (f1 '((a b) c d (e f) g)) 3 > (f1 '((a b) c d (e f) g (h i))) 3 > (f1 '((a b) c d (e f) g (h i) j k)) 5 > (f1 '((a b))) 0 > (f1 '(a b)) 2 > (f1 '(a)) 1 > (f1 '()) 0 僕ももっと賢くなりたいです… ご協力ありがとうございました!!!
>>747 delqって二つ以上を消してくれるの?
あ、僕が投稿する前にもうレスをいただいてたんですね。
>>747 すみません、XLISPを使っているもんですからdelqが使えませんでした。
> (defun hoge (l)
(length (delq nil (mapcar #'atom l))))
HOGE
> (hoge '((a b) c d (e f) g))
error: unbound function - DELQ
>>748 僕のヴァージョンよりも短くてかつ同じ動作をしますね。
そちらの方がより正統派っぽいです。
そちらを採用させてください。m(__)m
>>742 今さらかもしれませんが・・・
(defun f5 (l)
(reduce #'(lambda (x y) (if (atom y) (incf x) x)) l :initial-value 0))
すみません、XLISPを使っているのでincfが使えませんでした。
> (defun f5 (l)
(reduce #'(lambda (x y) (if (atom y) (incf x) x)) l :initial-value 0))
F5
> (f5 '((a b) c d (e f) g))
error: unbound function - INCF
>
今回はXLISPと指定されているんです。
ここはCommon LISPスレだと知っていたのですが
他にLISPのスレが見つからなかったので質問しました。
ありがとうございました。
>>715 Paul Grahamって誰だろ?と思っていたら先週借りてきた本の著者でした。
ANSI Common Lisp (1996)
そんな有名な人の本だったのか。まだ読んでませんが。
突っ込まれそうなので先に断り書きしておくと、宿題じゃありません。 PAIPのExercise 1.4[m]で小一時間悩んだ挙句に解答を覗き見しても納得がいかないので どなたかに解説をお願いしたいのですが、お題にあるように`expression'と表現されたら consは含まないのが定説ですか? (count-anywhere '(a) '(a ((a) b) a)) とかするとcdr再帰のケツの方で余計なカウントアップが入るので正しい結果が得られないの ですが。
755 :
デフォルトの名無しさん :04/04/05 08:42
問題と答えを書いてくれたら解説できると思う。
悪い、間違ってあげちゃったよ
757 :
デフォルトの名無しさん :04/04/05 12:50
「lisp入門」ってどうなのよ。
入門って書いてあるんだから、 入門に向いてるんじゃないかな。
PAIP pp.31 Exercise 1.4[m] Write a function that counts the number of times an expression occurs anywhere within another expression. Example: (count-anywhere 'a '(a ((a) b) a)) => 3 Answer 1.4 (defun count-anywhere (item tree) "Count the times item appears anywhere within tree." (cond ((eql item tree) 1) ((atom tree) 0) (t (+ (count-anywhere item (first tree)) (count-anywhere item (rest tree)))))) typoしてないといいんですが。itemにリストが渡されたとき正しい結果にならないのではと 考え中。まだ自分で納得行く解答を導き出せてませんです。ハイ。
treeとして見てるんだから、それでいいんじゃないの?
>>754 >consは含まないのが定説ですか?
結論から言うと定説なんてない。
真実は書いた著者にしかわからないだろ。
> 755, 760, 761 レスどうもです。 それではこの問題はすっ飛ばして(consを考慮しないなら話は簡単)先を急ぐとします。 Chapter 2を読み終わったところなんですが、すごく楽しいです。この本。
あのさ、今更こんな事聞くの恥ずかしいんだけど、括弧()を入力するのに Shift+8/9で入力するのだるくない? キーバインド変えたりしてる?
キーバインドは変えてない。もう慣れたけど、言われてみれば、 シフト無しで入力できる[]とかと最初からキー配置の設定が入れ替わって いれば、少しは、楽だったかも。でもそうすると、小指を使うからそれほど楽じゃないか…
C とかで {} 打つのもダルいんで、Smalltalk とか [] なのは結構良いのかもと 思ったり思わなかったり。まぁ Lisp とは括弧の量が違うけど。
一時期キーバインド変えてたよ。 @ -> ( [ -> ) 1ヶ月で戻したが。
JIS配列のマシンとASCII配列のマシンと行ったり来たりしてると()をタイプするのに89の上だったり90の上だったりで 時々ミスするんだよなぁ(w なんか変な記号がタイプされてて鬱になる瞬間
CLISPをIEから呼ぶことはできますか?
CL-HTTPのWINDOWS版がダウソできない・・・
やっぱり落とせない。 FTPが応答不能になっている。 ・・・・・・・何故に(泣) lispでHPが作ってみたいのにぃ・・・
>>LISPでHP cgiをLISPで書くってこと? LISPが使えるサーバーを自分で立てたの?
きっとLispでhttpサーバとcgiサーバ建てたんだよ。
単純にtomcatのようにクライアントサーバとして使いたいだけなんです。 でも落とせないです。なんでなんだろう。
FTPに繋げないのは、どうやら接続許可がないかららしい。 では許可を取ればいいわけだ。 どうやってよ・・・・・・・・?
777 :
デフォルトの名無しさん :04/04/11 01:03
>>776 まず徳を積むことだ。
というわけで恵まれない俺に5万円寄付してくれ。
>>773 そういえばLispachなんてものも…
>>775 は
>>770 に>
lispでHPが作ってみたいのにぃ・・・
と書いてあるのを気付いていない罠
780 :
デフォルトの名無しさん :04/04/12 00:52
あの、殺伐としているところ申し訳ないのですが、今までWindowsで xyzzyをつかっていたのですが、Linux上で使いたいと思ったのですが、 KNOPPIXってLISP処理系もってますか?
emacs?それとも釣り?
すいません。いつも学校でvimつかうので思いつきませんでした。 CLISPとかを指したつもりでした。
Lispの開発スタイルについて解説したページはないでしょうか? コンパイルして、あやしげなところの手前でブレークポイントで止めて、値を見つつステップ実行させて……というのと何だか違いそうなので、 普通Lisperはどのようにしているものなのか知りたいのです。
>>783 私は完全にボトムアップですね。
一気に書き下してからデバッガでちまちまやるなんてことは無いです。
S式を一つ書いては実行して、一つ書いては実行して、塊に出来そうなら名前をつけて固めて、の繰り返し。
その作業の間はインデントめちゃくちゃ。
一通り出来上がったらインデントをズバッとキメて完成。
>>783-785 おれもボトムアップだな。関数を書いて関数単位でコンパイルして(Emacsのキー
バインドで)、テストコードを(関数のコメント部分に)書いて、その S 式にカー
ソルをあわせて評価(これも Emacs のキーバインドで)。で、エラーがあれば
デバッガが起動するのでスタックやローカル変数を見て関数を修正、そしてま
た関数をコンパイル... の繰り返し。リスナはあんまり使わずに、ソースコー
ド上でほぼ作業してる。
で、ほとんど完成したあとでバグがみつかった場合に trace や step をたま
に使ったりもする。
あとは、十分テストした後に、プロファイラの結果を見ながら必要に応じて
declare やら the などを埋めこんでく。
あ、作業中もインデントは常にちゃんとしてる、インデントしてないとコード
読めない人なので。
岩波コンピュータサイエンスのCommonLISPの本の付録にデバッグの 例が出てたよ。 自分はまだblockあたりでうろうろしてるから読んでもわからない…
>>784-787 みなさんありがとうございます。
ボトムアップでちょっとずつ確かめながら書く人が多いようですね。
>>784 > compile, break, step, eval, inspectあたりを使えば、それに近いことができます。
stepやbreakは使ってみたのですが、修行が足りてなくてまだうまく使えません。
SBCLだとstepできないし……。CLISPはバイトコードなインタプリタだからか、stepなどは使いやすかったです。
ブレークポイントはデバッガでかけるよりもソースに(break)を埋め込んで評価し直させるという感じなのでしょうか。
>>786 リスナって何ですか?
ぐぐってみてもよくわからなかったのですが別のポートに開けておく作業用REPLコンソールみたいなものかと思ったのですが。
>>787 ありがとうございます。近くの本屋にあるかな……探してみてみます。
>リスナって何ですか? listenerと綴って、いわゆるREPループのことです。
>>784 面白そうですね。早速DLしてみます。(ISDNなんで2日がかり)
アレグロが入っているようなんですが、これって新日鉄のなんでしょうか?
そう来たか。確かに日本では新日鉄のバカタレがぼってるけどAllegro CLって Franz Inc.のもんでしょ。で実際にACL入ってるよ>Lisp Resource Kit. 漏れはいろんなドキュメントがまとめられてるのが嬉しかったな。
>>791 >日本では新日鉄のバカタレがぼってるけど
ぼられてたのか…
いや、地元だし、高炉の制御に人工知能とか使ってるらしいので、
なんとなく安心感のようなものが…(社員じゃありませんよ)
間に立ってマージン取ってるだけだろ。
>>792 うーん、それだけではよくわかりませんが、CLISP 2.33 使ってます?
UTF-8 が〜ってエラーの場合は
lisp.exe -E ISO-8859-1 -M lispinit.mem
みたいに起動時にエンコーディング指定すればなんとかならないでしょうか。
>>788 私は step はほとんど使いませんね。trace やバックトレース時にフレームに残った
情報を参考にデバッグします。私もそうでしたが、C/C++, Java 等から Lisp に入る
人はまず lispy な開発プロセスに慣れるとよいと思います。
一関数はなるべく短く(できれば一画面以内)、長い場合は flet や labels で内部的に
分割して考えるのでデバッグも楽です。とりあえず動かしてからデバッグ、ではなく動く部品
(関数)を組み合わせてプログラムしてゆく感じです。ほとんどの作成単位は小さく、Lisp の
単純な計算モデルの効果もあってステップ実行する必要は(今は)感じません。
;; 昔は step の使えなさに愕然として、 Lisp のデバッガなんて駄目じゃん!と思ってました。
>>796 おれも関数短い。で必然的に関数が多くなってしまって、関数の名前を考
える時間が長い。うまい関数名が思いつかないような関数は、大抵、おか
しな部分があって、再考する必要があるという法則(?)を発見しました。
サンマルコ・リスプ探検隊ってまだあるのかな? ところで、誰かLISPマシンの事話せるスレとか知らない?
前者は知らん。後者は本スレでいいんじゃない。
Lispマシンをさわったことないので、Lispマシンのすごさを誰か紹介してくれないかなぁ。 step的な機能(emacsのedebug)は、俺の場合、他人が書いたコードを手っ取り早く理解するときに 便利に使っています。まさに、処理の「動き」が目に見えるので、理解が速いです。
>>798 今でもLISPマシンってあるの?
なんかミニコン時代の物のような印象なのだけれど。
>>800 メモリ空間が広いとかバスがどうとか。
青山学院大で作ってたらしい。
今のPCでLISPつかってて実行に支障が出たことってある?
ピアソンの奴って練習問題の答えどこにもないんですか?
Emacs Lispスレに追いやられそうな気がするけど勇気を出してここでお願いしてみます。 どなたかEmacsのlisp-indent-function (or common-lisp-indent-function)の 解説をしていただけませんか。CMUCL+SLIMEでコード書いてますが、でっちあげたマクロの インデントを調整したいのです。
(put 'マクロ名 'lisp-indent-function ; or 'common-lisp-indent-function '設定) info の (emacs)Lisp Indent を参照。
>> 801 > 今でもLISPマシンってあるの? > なんかミニコン時代の物のような印象なのだけれど。 現在、開発が進行している売り物としてのマシンは俺の知る限りないと 思います。昔のマシンを販売している人(会社?)はあるみたいです。 > メモリ空間が広いとかバスがどうとか。 > 青山学院大で作ってたらしい。 > 今のPCでLISPつかってて実行に支障が出たことってある? ハード的なすごさもあるのだろうけど、ソフトウェア開発環境としてのすごさが 知りたいです。Lisp OSの凄さかな。ハードの話で言えば、ちょっと前、昔のLispマシンと Pentium PCマシンでベンチマークをしたら、Pentiumマシンが勝ったけど(クロックが10^n倍違うはず)、 思った程Lispマシンは遅くなかった(専用ハード恐るべし)という事を話している人が いました。 スレ違いぎみでごめん。
Lispだったらメモリで差がでるんじゃない? 素のPentiumはメモリとのやりとりは33MHzかな? それをCPUでは5倍にしてると166MHzになる。 仮にLispマシンがバス幅を倍にして、10MHzくらいの回路を組んでるとしたら 一見すると16倍の性能差がついてるんだけど、 33:20=1.6倍にしかならないから、あんまり遅くみえないみたいな。
>>807 とりあえずその本の感想。
まず最初に、私は
・Lispに関しては完全にド素人、Lisp=括弧言語という程度の認識
・Prologはいちおーガッコで勉強させられたけど馴染まなかった
・C/C++はメインで使っていて読み書きできる
という人です。
LispというとなまじCのような手続き型言語を知っているとどうも馴染みにくい
という感じだったのですが、そんな私でも一応「Lispとはなんぞや」というのが
分かったような気がします。
Lispとはどういう仕組みで動いているのか、ということが割と丁寧に書いてあるので
「ほー、Lispってこんななんだ」という納得はしました。
ただ、もっともそれでじゃあLispでなんかプログラム書いてみれ、といわれても
さすがにそこまでは…あくまで「Lispとはなんぞや」という程度で
具体的にプログラムが書けるようになるというところまでは難しそうですね。
有名なマクロなる機能に関する説明もまったくありませんし。
まあ、とりあえずLispとはなんぞやという第一歩を踏み出すには悪くない本だと思います。
ただし、あくまでそこまでですね。実際にLisp使って何かやるとなると、
もう一段上の「入門書」が欲しいところかなと思いました。
>>809 立ち読みしかしてないけど
400ページ以上も読んで何も作れないってのは
結構悲しいな。
もっと薄くてよい本があると思った。
俺も対話による〜しか読破してない初心者だけど。
現在グレアムの本を読書中。
>805 そこを参照してもわけわからん状態なので助けて欲しいわけで。 plistのlisp-indent-functionにシンボル設定すると引数5個で呼び出されるので 付属のドキュメントは信用してないです。ほんで暇を見ては.elをedebugで追いかけて いるんですが・・・くじけるな。これは。
>>811 とりあえず、(get '適当な関数かマクロ名 'lisp-indent-function)
とかやって設定引っ張ってくればいいんじゃないかと。
なんかコンピュータ書籍というと共立か岩波くらいしか思いつかないのは頭が固まってるのだろうか。
>>811 付属のドキュメントは信用してないです。
lisp-indent-functionは、lisp-mode.elで定義されていて、"(emacs)Lisp Indent"に
説明があると。common-lisp-indent-functionはcl-indent.elで定義されていて、説明はないと。
泥臭いけど、自作マクロと似たようなインデントになる標準マクロを探して、
設定を盗んでくるとか。あんまり力になれないな。
>812, 815 レスありがとん。 何だかイバラの道を進もうとしているような予感がしますが動くコードが手元にあるんで やれるだけ頑張ってみますわ。折角気分がノッてきたときに妙なインデントされてテンポ 乱されるのもういやなんで。 板違いだけどMacOSXのターミナルも気分がノッてくると妙な「もっさり感」が気になって げんなりするんだよなぁ・・・。デスクトップは非常に綺麗なんで好きなんだけど。
>>816 Terminalスレ@マク板あたりで聞くといいんじゃないかな?
iTermとか使う手も有りかもしれないし。
がんがってくらはい
MacでLispうらやましい。MCLは、MacOSXの最新API(cocoa?)にもう対応したのかな?
>>818 CocoaじゃなくてCarbon対応ってことでOSX対応版は出ている。
お値段は相変わらず(w
細かい値段の表示があるだけ、分かりやすい。Franzも表示すればいいのに。ってこれは既出ネタか。
>>814 学校でLISPの本を探していてそんな記述を見つけたのですが。
なんでもLISPの使い方を教えてくれるCAIソフトらしいのですが。
卒研でアソシアトロンをやることに。Cで書かされそうなんですが、
LISPでも書けますかね?教官を説得できる材料がない…
卒論くらいなら「好きだから」で構わんだろ。
教官がLispを読めるかどうかだな。
まがりなりにも卒論で教官がプログラムを読む必要はないだろ。 普通は理論が主でプログラミングは検証手段なんだから、 用があるのは出てきた結果(計算結果であれ、ソフトウェア自体の機能などであれ)だろ。
グレアム本の2章の練習問題にある、リストの中にある a を数える の再帰verをやってみたんですがこんな感じでよいでしょうか? (defun numA (lst &optional (rtn 0)) (if (null lst) rtn (progn (if (eql 'a (car lst)) (incf rtn)) (numA (cdr lst) rtn)))) opitin 引数部分は、補助関数にしたほうがいいのかな?
incf いらないよね (numA (cdr lst) (if (eq 'a (car lst)) (+ rtn 1) rtn))
レスどうもです。 確かに、引数代入時に分岐させれば 必要ありませんね! eq は、アドレスを比較して一致を調べる ものと認識しているのですが こういう場合にも使えるのでしょうか? 関数の中で直書きされた a のアドレス??
>eq は、アドレスを比較して一致を調べる >ものと認識しているのですが たぶんその認識で問題ないと思います。 >関数の中で直書きされた a のアドレス?? 最終的にCPUが認識するのは、そうだけど(シンボルaの実体のアドレス)、 私の場合、コードを理解するときは、Lispの世界内だけで考え、 read後の状態、その次にそれをevalした後の状態という順番で考えます。 つまり、脳内インタプリタを作ってあるんですね。 (eq 'a (car lst))において、aのアドレスは、この式のread時に、 aがすでにinternされて(存在して)いれば、そのアドレスを持って来て、 未internならシンボルaが生成されて、それが使われます。 的外れな説明じゃないと、いいけど…
>>829 さんの説明をもう少し冗長に書いてみると。
Lispのプログラムがインタプリタに読み込まれるときは、
まず最初にリテラルのリストに変換される。これをやっている関数は read
次にそのリストを関数やマクロ呼び出しのフォームとして評価する。
これをやってる関数は eval
そして呼び出された関数の返す値を印字する。これは print
このサイクルを REPL (read-eval-print-loop)という。
関数の中に直書きされた a のアドレスというよりは
'(eql 'a (car lst))
というリストの二番目の要素であるシンボルオブジェクトの
アドレスというほうが正しい。
'(eql 'a (car lst)) という表記はかなり変だったけど堪忍して下さい。
LISPってJAVAのように無名クラスってつくれますか?
↑餌
>>832 lispをなめるな。
#'lambda-classでできるわ!!
>>823-825 回答どうもありがとうございます。
なんかN88で書くことになりました…。
あと、LISPのフロッピーを探したらLISP/80しかありませんでした。
どうやら私はこのスレに居てはいけないようです…
>>832 おいしそうな餌だな。
無名クラスという概念はCommon LispのオブジェクトシステムであるCLOSに存在します。
ただ、無名関数のやりとりだけでだいたい用が足りてしまう気もします。
>>835 N88って98に付いてるBASICかな? 98用ならxlispというものがあったような。
まじで、closのanonymous classってどんな作り方するんだっけ? CLHSのglossaryとclass-nameに記述が少しあるだけで分からん。
無名クラス? そんなものあったのか・・・。 どうやって作るの?
なんでそんなもん作りたいのかがわからん。動作をカスタマイズしたけりゃ インスタンス向けに eql でメソッドを定義すりゃいいじゃん。
無名クラスは便利だよ。Javaで実感。
>>840 はlambdaの便利さから類推する頭を持っていないのだろうか。
それともlambdaの便利さを理解していないのだろうか。
let+lambda*複数でもいいんだけど、ちょっとプリミティブすぎて。
意味的まとまりを与えられる無名クラスはけっこういい。
とりあえず、Common LispとJavaの無名クラスは使われ方が違うとおもう。
Common Lispの無名クラスは積極的に使うものではなくて、どちらかというと
そういう物ができてしまうこともあるという話だったような。defclassでは
定義できないし、make-instanceでのクラス定義の方法は処理系依存の部分があり
そうだし。
一度、Common LispだとJavaの無名クラスの機能をどうやって書くかなと考えた
ことがあるんだけど、結果は「同じようなことはCommon Lispなりの書き方で
綺麗にかける」だったと思ったけど、その過程の理屈をすっかり忘れちまったよ。
だれか、Javaの無名クラスを使ったコード片をここに書いてみてくれない?
>>841 > let+lambda*複数でもいいんだけど、ちょっとプリミティブすぎて。
> 意味的まとまりを与えられる無名クラスはけっこういい。
この書き方だと、たしかに抽象度が低いかも。
いわゆる「lambdaでオブジェクト指向の機能」を実装する話ね。
The Essence of OOP using Java, Anonymous Classes
http://www.developer.com/java/other/article.php/3300881 を読んでみた感じでは、
* instanceのmemberに対して設けられたアクセス規制をすりぬけるために使う。
例えば、あんまり関係の無いクラスAとBがあって、外部からのアクセスが規制
されているBのmemberを参照するようなAのメソッドを書きたい場合などに、Bの
定義内にAを継承する無名クラスを定義し、メソッドをその場でoverrideするとか。
CLOSでは、アクセス規制が非常にゆるいのと、slot-valueで全てのslotを
読み書きできてしまうので、あまり問題にならない。
* 特定のinstanceに固有の振舞いをするメソッドを定義したいときに使用。
>>840 さんの言うように、Common Lispでは、eql specializerを使ったメソッドを
定義することで対応できる。
(method-for-foo (let ((instance (make-instance 'foo :slot1 slot1-form)))
(defmethod bar ((foo (eql instance)))
(something-specific-to-instance foo))
instance))
let以下をdefinstanceなんてマクロにするとか。
> let以下をdefinstanceなんてマクロにするとか。 それ欲しいでつ。
SLIMEでM-.したとき、defmethodで同名のものが複数あるとエラーになっちゃうんですが、うちだけ?
(defclass CA()()) (setq obj(make-instance 'CA)) (defclass CB(obj)()) こんなふうにインスタンスから型を取り出して継承とかってできますか?
IMHOとApacheをmod_lispで連携させる方法の詳細をレクチャーして欲しい。 mod_webapp使ってるけど妙なエラーが出て安定稼動できない・・・ プラットホームはDebian sidです。PortableAserve+WebActions使った方がいいのかな。
>>848 全然関係ないところですまんけど、
IMHO って in my humble opinion の abbrev 以外に、何かの固有名詞なの?
Internet Meta Humble Object at hxxp://alpha.onshored.com/lisp-software/ よろずやさんトコの開発途中のLisp Learning Centerのコード貰ってきて遊んでいるだけど mod_webappがエラー吐いたり吐かなかったりで挙動不審なのでどうにかならんかなぁ・・・と。 PortableAserve+WebActionsの方が安定して稼働してるんだけど、規模が大きくなるにつれて 面倒になってきた。CLOSのオブジェクトどかどか並べてHTMLをレンダリングさせる方が個人的には 扱いが楽かなと思う。
>>847 できます。
(defmacro defclass-from-objects (name direct-superobjects direct-slots
&rest options)
`(eval (list* 'defclass ',name
(mapcar #'class-of ',direct-superobjects)
',direct-slots
',options)))
本当は、closureが正しく処理されるように、evalを使わずに、ensure-classに展開するようにしたほうがよいでしょう。
ただそれだと、ポータブルに書けるかな?
(defmacro defclass-from-objects (name direct-superobjects direct-slots
&rest options)
`(ensure-class
',name
:direct-superclasses (mapcar #'class-of ',direct-superobjects)
:direct-slots (list ,@(canonicalize-defclass-direct-slots direct-slots))
,@(canonicalize-defclass-options options)))
こんな感じ。
個人的メモ(スレ汚しすまん) Matthew DanishがTue, 7 May 2002 23:50:59 -0400にポストした[Lispweb] IMHO + mod_lispの 内容でIMHOにパッチ当てるとmod_lispで動作し始めた。でもそのスレッドは完結してないからまだ 問題は本質的には解決してないと思われ。 そのためかMacOSXのSafariからだと問題なく動作するけどWin2kProのOperaからだと ウェブメソッドがほとんど機能しない、と。クライアントMacOSXで開発続けるかな。
自己レス。cvs updateしなおしたらできた。
日本語処理しやすくするために日本語も分かち書きにしようよ。
× 日本語処理しやすくするために日本語も分かち書きにしようよ。 ○ 日本語処理しやすくするために日本語も S式にしようよ。
うわw それ日本語じゃねえ 斎藤某『声に出して読むS式』
vimが染み付いてるんですが、lispをやっても良いでしょうか? あと処理系が色々多いんですが、Mac、Win、Unixで共通の コードで動きますか?処理系に依存する部分がどれくらい あるのか気になります。
>>857 emacsenでしかlispやっちゃいかん、っていう規則はないからいいんでない?
実際高機能なvi cloneがどの程度のものか知らないけどSLIMEとか慣れれば快適だよ。
Escape+Meta+Alt+Ctrl+Shiftが生理的に受け入れられないってのなら無理に勧めないけど。
Mac,Win,Unixで共通のコードで動くかってのはどこまでシステム寄りのコードを書くかに
依存するから言及は避けとく。CLISPとかAllegroCLのトライアルで実際試してみるのが一番かと。
SBCLもぼちぼちWinで動き出してるらしいけどもちょっと先の話みたい。
Winで書いたコードをUnixで動かしたり、Macで動かしたり したいので、互換性は譲れませぬ。うーむ残念・・・。
>>860 何を残念がってるのか知らんけど、とりあえずLispWorksでも試してみれば?
Unixって言ってるのが具体的に何なのかわからんのでLinux決め打ちですまんが。
>>859 OpenMCLってそんなにいい?MacOSXではCMUCLかACLしか使ったことないから使用感とか興味あり。
Uncommon Webで遊ぶのに導入しよっかな。
VIMを良く知らないので、EmacsでのLisp開発に用意されている便利な機能を 思い付くままに。 * 括弧の対応を教えてくれる。 * 括弧を基本とした編集、カーソル移動コマンド。 * 自動的なインデント。 * 構文を元にした、コードの色付け。 * CLHS(Common Lisp HyperSpec、つまり規格)のシンボル名での辞書引き。 * Lispと対話的なやりとりができる、listener。 * 現在、書いている関数が取る引数の個数や名前を自動表示。 * 関数名、変数名などシンボル名の補完機能。 ...
>>860 > Winで書いたコードをUnixで動かしたり、Macで動かしたり
> したいので、互換性は譲れませぬ。うーむ残念・・・。
具体的にどんなコードを書きたいのかを言わないと、互換性については、言いにくいです。
グラフィックス、数値計算、入門書の練習問題、Web関連、スクリプティング、2chブラウザなど特定のアプリとか。
互換性を考える上での基準は、
・ANSI Common Lisp規格で定められている。
・コミュニティー規格やポータブルな実装がある。(MOP, CLIM, ...)
・特定の処理系が独自にサポートしている。(LispWorksのCAPIや、スレッド機能、...)
・自分でやるしかない。
などかな。
LISPでかかれたゲームって結構多いような。CUIのさめがめとか。 変な医者とか。
vi でも = で括弧のインデントしてくれるのか。知らなかった。
LISPの勉強をしようと思ったら、友人からいまどきS式じゃなくてXMLだろ、 などといわれたのですが、なんでS式の比較対象にXMLがくるのか わかりません。XMLってセマンティックwebとかじゃないのでしょうか?
>>863 そういう考え方の他に、Windows, Linux(Unix), Macをサポートしている
単一ベンダの処理系をとことんあてにするという考え方もあるね。
3つのOSをサポートしている処理系はLispWorksとAllegro Common Lispかな。
>>866 S式もXMLも木構造を表すためのデータフォーマットと考えることができます。
あなたの友人はそういうレベルでの比較をしたのでしょう。
そういう意味において、S式でプログラムを表現するLispの比較相手を探すとしたら、
XMLでソースファイルを記述する言語が(もしあれば)それにあたるでしょう。
XHTML(HTMLの基盤はSGML)は、Webブラウザで表示するための要素を決めたXMLの
応用例(アプリケーション)の一つです。
プログラミング言語でXMLを扱うときに、XMLのベタテキストから、言語の内部で
扱いやすいデータ構造にまず変換する事が多いです。Lispでは木構造を表すためには
S式をほぼまちがいなく使うことになります。実際、XML<->S式の変換を行うライブラリも
(いくつも)存在すると思います。このとき、LispにはS式を操作するための関数群が豊富に
揃っており、Lispプログラマならそれらに習熟しているため、XMLデータの扱いはLispの
得意分野と言ってもよいでしょう。
セマンティックWebは私が現状を追っていないので、パス。
Lisp方言で書くと XSLT に翻訳してくれるようなトランスレータないですかXSLT 書くのが苦痛で。
LispでXMLを扱うとしたら、DOMとかXSLTとか全部パスできないのかな。XSLTってすでに無視できない存在?
「Scheme は美しい」とよく言われるのだけど、それが何を指しているのか、
分からなかった。今日、その分からなかった理由に気付いた。
Common LISP を知らなかったからだ。
Scheme の美しさというのは、Common LISP に比べてのことだったんだ。
今、ここの
http://user.ecc.u-tokyo.ac.jp/~g340299/ 『on Lisp』を読みはじめたのだけど、Common LISP で書かれた例文を
Scheme で試している。うちには Scheme の処理系しかないもので。
どの例文も Scheme で書くと、素人目にも美しくなる。素晴らしい!
ということで、どうせなら Common LISP, Scheme の両方を学ぶことをおすすめします。
もちろん、Common LISP は Scheme より実用的なわけで、どちらがすぐれているとか
言うつもりはないです。
俺は両方知っているけど、全般的に言って、どちらのほうが美しいとかあんまり感じた事は無いです。 Common Lispのコード例とそれを美しく書いたSchemeのコード例を見せてくれませんか? 煽りじゃないよ。純粋に興味があるだけ。
では 『on Lisp』16ページから Common Lisp (defun our-remove-if (fn lst) (if (null lst) nil (if (funcall fn (car lst)) (our-remove-if fn (cdr lst)) (cons (car lst) (our-remove-if fn (cdr lst)))))) Scheme (define (our-remove-if func lst) (if (null? lst) '() (if (func (car lst)) (our-remove-if func (cdr lst)) (cons (car lst) (our-remove-if func (cdr lst)))))) ・defun と違って、define は、呼び出しの形と実行の形が同じ ・条件式には全て「?」がつくので分かりやすい ・nil より () が分かりやすい あと、この例には出てこないけど、Scheme だと #' が要らない、などなど。
Common Lisp (mapcar #’+ '(1 2 3) '(10 100 1000)) Scheme (map + '(1 2 3) '(10 100 1000)) --------------------------------------- Common Lisp (sort '(1 4 2 8 5 7) #'<) Scheme (sort + '(1 4 2 8 5 7)) ・先にも書いたけど、Scheme は #' が要らない ・引数のリストが、Scheme は どちらも関数が cadr に来るよう揃えられている 過去互換性を無視して、文法が首尾一貫するよう再構成したのが Scheme なのだなあ、と。 とりあえず、自分が感じたのは、こんなところです。
ありがとう。 変数と関数の名前空間を分けるか統一するかは、意見がいろいろだね。 分ける側の言い分を一つあげると、Schemeで、変数名としてlistなど 明解な名前が、すでに標準関数の名前に取られてしまっているという 点があるね。 俺は慣れたけど、いちいち(funcall f arg)と書くより(f arg)の方が 美しいとは思う。 >・条件式には全て「?」がつくので分かりやすい あとは、破壊的な操作名の末尾に!を付けるとかか。 Common Lispにもpやnを付ける慣習はあるけど徹底してはいないかな。 >nil より () が分かりやすい これは、Common Lispでもnilと()は表記上の違いだけで、同一物です。
>>876 ありがとうございます。
funcall について、私は書き忘れてましたね。
nil を廃して () のみにしたのが、Scheme の良い点の一つと思います。
cadddr といった表記の便利さがなければ、 car, cdr も別の名にしたんじゃないかな。
list については、正直、やっぱり Scheme は不便ですねえ。
名前空間の統一は、空間の混雑とも言えるわけで。
著者のポール・グレアム自身は、名前空間が同一の方がいいと考えているようです。
『on Lisp 』 P15
だから「Common Lisp には変数と関数に異なった名前空間がある.」と言える.foo と
いう変数とfoo という関数を両方持つことができ,それらは別々である必要もない.
この状況はややこしく,コードがかなり格好悪くなってしまうことにつながるが,
これはCommon Lisp プログラマが付き合っていかなければならないことだ.
普通なら、関数名は動詞、変数名は名詞なので、同一の名前空間であまり困らないような 気もするけど、listみたいに動詞と名詞の両方としての働きを持つ単語の数は多いのかな。
Common Lispは、関数、変数の他にも、パッケージ名、クラス名などの名前空間もあるよね。 Schemeを拡張していったときに、どこまで同一の名前空間でやっていけるかな。
Scheme と同じ問題を抱えているのが、多くのスクリプト言語です。
特に、JavaScript は
・関数と変数の名前空間が同一
・既存の変数(関数)名を上書き再定義しても、エラーにならない。
・静的スコープのクロージャが使える
など、事情が Scheme に良く似ています。
JavaScript では、Ver2.0 から package が導入されることになっています。
反対の声も多いのですが。
Scheme にはパッケージは導入されるでしょうか?
なんでもありの Guile にもないぐらいだから、やっぱりありえないのかな?
http://www.kt.rim.or.jp/~kbk/guile/guile_toc.html 個人的には、Javaのいちばんありがたい点の一つが パッケージ だったりするので、
正直、非常に迷いますね。
Schemeはモジュールで名前空間を導入する流れじゃないかね。 既に主流のScheme実装は大抵モジュールシステムを備えてるし(互換性ないけど) R6RSにはモジュールシステムが入るという噂。 あ、ちなみに CommonLispの「パッケージ」は外部表記からシンボルへのマッピング、 Schemeの「モジュール」はシンボルから値へのマッピング。 CommonLispみたいに名前で検索することが多いと、名前そのものを パッケージで分けるのが便利。Schemeはなんでも無名オブジェクトだから、 名前が何を指してるかをモジュールで分けるのが便利。
つまり、おまいらは初心者じゃないな? なんかパッケージとかわからんです。 バインドと代入の違いとか。 おすすめの入門書おすえて
>>872 さん、あるいは他の詳しい方にお聞きしたいのですが、
lispをschemeに書き換えるとき、意図的に変数捕捉をさせるマクロは
どう書き変えればいいのでしょうか?
例えば on lispの11.2で紹介されている with-open-file は
ファイルをオープンし、そのハンドルを与えられたシンボルにboudするマクロで
(with-open-file (s "dump" :direction :output)
(princ 99 s))
のように使います。
with-open-fileをschemeで書くとどうなりますか?
Schemeの標準関数だと入力と出力で関数が違うから、一発では書きにくいな。 (define-syntax with-open-file (syntax-rules ((with-open-file (var filename . options) . body) (call-with-open-file (lambda (var) . body) . options)))) としておいて、手続きcall-with-open-fileの中でdirectionオプションを 処理をするのが順当かな。 Schemeのsyntax-rulesで出来ないのは、マクロの呼び出し側で陽に与えていない 変数を捕捉するようなマクロね。On Lispのaifとか。 with-open-fileの場合は変数名sが与えられるので問題ない。
>>882 遅くなってすみません。
私の方は正真正銘の初心者です。
Web 上で入手できる資料しか読んでいませんし、とても何かを薦める
立場じゃないです。
一応、私のメインはこれ。
「入門Scheme」
http://www4.ocn.ne.jp/~inukai/scheme_primer_j.html パッケージは、複数の名前空間を共存させる仕組みのことです。
私の本業である Java で知った概念です。
バインドと代入は…、質問の意図がわからないんだけど、
メモリ上に領域を取って、何かの値を収めますよね。
それに具体的な変数名を結びつけるのがバインド。
代入は、これはもっと一般的なプログラミングの概念で、
変数の指す値を、指定した値に変える操作にはいろいろあるけれど、
それらをひっくるめて代入と呼ぶ、と言えばよいのかしら。
>>881 とても興味深い話、ありがとうございました。
>>875 自己訂正
Scheme
× (sort + '(1 4 2 8 5 7))
○ (sort < '(1 4 2 8 5 7))
一応 CL スレなので CL をヨイショするぞ。 >・条件式には全て「?」がつくので分かりやすい >あとは、破壊的な操作名の末尾に!を付けるとかか。 >Common Lispにもpやnを付ける慣習はあるけど徹底してはいないかな。 ! とか ? より p や n のほうが発音しやすいというメリットがある。 > 過去互換性を無視して、文法が首尾一貫するよう再構成したのが Scheme なのだなあ、と。 ハカー文化が生き残っているのが Common Lisp だ!ちょっぴり委員会がガチガチにしちゃったけど、 hogehoge-p がカコイイ。確かに泥臭いところもあるかもしれん。だが、それがいい。 効率とか OO も大事だよ。やっぱ。
>>884 ありがとうございます。
頭悪いんでそのコードを完璧には理解できていないんですが、
可能だと分かっただけで大収穫です。あとは自分で勉強します。
On Lispのaifみたいに(itでしたっけ?)陽に与えない変数を束縛してしまう
マクロには便利さを感じてないので、十分です。
間違い。filenameを忘れてた。 (define-syntax with-open-file (syntax-rules ((with-open-file (var filename . options) . body) (call-with-open-file filename (lambda (var) . body) . options)))) ついでにcall-with-open-fileの定義。Gaucheだとこんなんかな。 動かしてないからどっか間違ってるかもしれん。 (define (call-with-open-file filename proc . options) (let ((dir (get-keyword :direction options :input))) (case dir ((:output) (call-with-output-file filename proc)) ((:input) (call-with-input-file filename proc)) (else (error "bad direction" dir)))))
slimeでコードを書いているとき、-!-をポイント位置を表すマークとして、 (defun foo ()-!- ここでリターンを押すと、 (defun foo () -!- となり、インデントをするにはタブを押す必要があります。 リターンを押しただけでイッキに、 (defun foo () -!- と改行とインデントをしてくれるようにしたいのですが、良い方法があったら 教えてください。 ちなみに、ilispでは、lispプロセスを立ち上げているときは、リターンで 改行+インデントがされます。
C-m に newline-and-indent をバインド。
892 :
デフォルトの名無しさん :04/05/14 20:51
#'とかは別になくても良いよな。 funcallいらねーと思わねえ? スロット2つあるなんてデメリットの方が大きいよな。
変数名と関数名の名前空間を分けることの是非。 悪い点。 ・変数参照になってしまう所を関数参照にする手間。 e.g. × (mapcar #'foo list), ○ (map foo list) ・関数参照になってしまう所を変数参照にする手間。 e.g. × (funcall foo list), ○ (foo list) 良い点。 ・変数名と関数名に同じ名前を使える。 e.g. × (list item lst), ○ (list item list) 動詞と名詞の両方の働きを持つ単語ほど、たとえ数はすくないとしても、 使用頻度の高い言葉が多い。listなど。(他は?) この他の良い点、悪い点があったら教えてください。 Common Lispで名前空間を統一するとしたら、 (foo arg1)で、fooの変数スロットがunboundでなければそれを使うようにevaluatorを変更。 defunをdepricatedにして、変数スロットを設定するdefineを定義する。 なんて感じかな。混乱するだけのような気もする。
俺には良い点の方が圧倒的に少ないように感じてしまうなあ。 でも、Lisperにとっては違うのだろうか。 order: 順序、注文 or 順序づける、注文する ってのがあるね。
car (動詞)コンスセルの最初の要素を返す (名詞)車
cdr (動詞)コンスセルの(ry (名詞) CD-R
LISP(Scheme) についてはずっと、あこがれるだけでぜんぜん分からずにいたんだけど、 数日間、集中して構文を勉強したら、急に分かるようになってきた。 Shiro さんのところの「なんでも(or λ 再帰 継続)」シリーズの内容が、読んで理解できたよ。 継続についてのアリスの話も、大体は分かるよ。ものすごくうれしい。 私と同じく、周りに誰も LISP (Scheme) を知る人がいない人のために一言。 cdr は「クダー」って読むんだぞ。「しーでぃーあーる」じゃないぞ。知らなかっただろ? まあ、発音する機会なんてないんだけど。
変数、関数名が比較的自由に決められるメリットよりも表記の簡潔さ、 単一名前空間を望むなら Scheme を使いたまえ。人は短くて簡潔な方 を好む傾向があるが、それらの性質は必ずしも必要ではない。気をつ けろ!その行き着く先は極度のミニマリズムだ。
例えば「バインディング」については、 「Scheme の識別子(変数)はすべて、アドレスを保持するのみで、値を保持しない。 つまり、Scheme 中で使われる値は、整数も含めて全てオブジェクトだと言うことができる。 識別子(変数)への代入は全てアドレス渡しである。識別子にオブジェクトのアドレスを 代入することを『識別子を値にバインドする』と言う」 こういった感じで、自分が納得できるようになるまで読み砕いていった。間違った解釈は あるんだろうけど、とりあえずその場で納得することを優先した。あとで R5RS を読んで 修正しようと思っている。 特にリストとペア(ドット対)については徹底的にやった。これまであいまいにしてきた 点が多かったから、紙に適当にリストを書いては、それをペアに分解したり、さらにそれを 二分木の樹形図に書き直したり、中学生に戻ったつもりで紙に書きまくった。 これはとても効果があった。それまで 「car (a b) は a なのに、なんで cdr (a b) は b じゃなくて (b) なの?」 というレベルだったのが、(((a b c d) a b c d) a b c d) というリストを見て 「ああ、同じ長さ、同じ値を持つ3本のリストが、頭のあたりでくっついてるんだな」と すぐに分かるようになった。
また、それまで理由の分からなかった表記法が、考えてみたら当然のものだということが わかってきた。たとえば、((lambda (a b . c) (...)) 1 2 3 4 5) で、なんで c に (3 4 5) が割り当てられるのか、とか。 意外な副作用として、カッコの対応が分かりやすくなって、S式を読むのがだいぶ楽になった。 S式を読む能力は、頭の良し悪しより、自転車の運転のような、訓練で身につく技能ではないかと思う。 こういうことをやっているうちに、頭の中でいろいろなことがつながってきた。 「入門 Scheme」でさらりと述べられていることが、実はとても深い意味を持つことが分かって、 読みながらしばしば感動した。まだ第1章の文法のところしか読んでいないのだけど。 もっと要領の良いやり方もあるのだろうとは思う。また、他の教材を知らないから、 「入門 Scheme」が良い本かどうかは分からない。だけど頭の悪い私にとって、この本を こういうやり方で読んだことは良いことだったと思っています。 他の皆さんは、どうやって LISP を身に付けたのでしょうか。興味があります。
>>899 Scheme があまり普及しなかった理由の一つは、標準のライブラリの整備を、
その種の「悪しきミニマリズム」が阻んだからではないかという気がします。
まだ事情を知らないので、憶測で言っているだけですけれど。
また Guy Steele みたいな天才が現れるのを待つしかないのでしょうか?
……一応 Common Lisp スレなんだし Scheme ネタなら本スレでやったら? あと、憶測でものを言う前に自分でいろいろ調べた方がいいよ。
>>905 > なにしろ、いちばん学びやすいのは Scheme だと思うし、いちばん書く機会が多いのは
> Emacs Lisp だろう?
何を根拠にそんな決め付けを?
>>906 リンク先は読んだか?
> ユーザの多さでいうと、多い順に Emacs Lisp、Common Lisp、Schemeとなる。
これが、いちばん書く機会が多いのは Emacs Lisp だとした根拠だ。
ユーザもコードベースも一番少ないに関わらず、Scheme は MIT を始め、多くの
教育機関でコンピュータの初等教育に使われている。また日本語で読める
チュートリアルも多い。
これが Scheme が学びやすいと考えられる根拠だ。
しかし、そんなことは、はっきり言ってどうでもいい。俺が聞いているのは、
初心者様は本当に Common Lisp だけに限定したスレッドを望んでいらっしゃいますか、
つうことだ。
このスレはもうすぐ終わる。俺は正直、次スレが LISP 全般の質問・雑談スレになることを
希望しているんだが、他の皆さんはどうか?
次スレいらんだろ。本スレと合流でいいんじゃないか?
自分の意図を、もっと正確に書いてみる。 このスレがこれだけ伸びたのは、「初心者」需要が多かったからだと考えている。 本スレだとちょっと間抜けなことを言っただけで叩かれそうだから。 Common Lisp 専用スレの需要があったせいだとは思えないのだ。 しかし、このスレも後半ぐらいから、Common Lisp 専用スレの雰囲気が強くなり、 間抜けな質問も叩かれやすくなったと感じている。 今後のスレッド運営をどうするか? 1.本スレを一般向け、このスレを初心者向けの Lisp 全般スレにする。 2.本スレを Scheme、このスレを Common Lisp の専用スレにする。 3.このスレを廃し、本スレに統一する。 俺個人は 1. か 3.を支持したいんだが。 あと、 4. Scheme 専用スレを新規で立てる。 こういう意見があるとしたら、俺は反対だ。人が分散して全体が寂れることが、 ほぼ確定だと思う。
>「初心者」需要が多かったからだと考えている。 に賛成。 >3.このスレを廃し、本スレに統一する。 これに賛成。初心者に気を使うとしたら、「【初心者歓迎】Lisp & Scheme Part11」 などとしてみるとか。 まぁ、本当はどの場所でも、実際に初心者が「マヌケ」なことを言ったときに、 それを嘲笑しない雰囲気が大切だろうと思う。
序盤からできる範囲で答えていたが、別に叩きはあんまりないような。 どの辺を叩きっていってるの?次は統合でいいんじゃないかなー。本 スレの最近のカキコからも敷居の高さはうかがえないし。
次スレは立てないという方向でいいのかな?
>>911 では、叩きという言葉は取り消そう。俺が過敏だったのかもしれない。
このスレ見てきて、初心者スレは別個にあってもいいと思ったけど、 わざわざCommonLispに限定する必要はないと感じたよ。 結局読むの同じ人だし。 分けるとしたら ・本スレ(LISP統合スレ) ・初心者スレ ・特化した話題を扱うスレをいくつか(例えばCommonLispのコアな部分とか) て感じが良いと思う。 まあEmacsLispスレは独立して立ってるし、専用のスレ立てたいCommonLisperの 気持ちわからんでもない。でもただの限定スレ、ってだけじゃ本スレと 話かぶりまくるし、今後はその辺を気をつけて立てようよ。 例えば初心者スレに特化するなら注意書きテンプレ考えて>1に貼っとくとか。 このスレの>1の中身じゃなんだかわかんねーし。 要は、住み分けがちゃんとできればなんでもいい。
漏れには一連の流れがスキーマーの破壊的リスト操作にみえてならない。
>>914 両方の利点を知りたいです。
そもそもwindows環境では、xyzzyに頼る以外にclispもインストールできない
人が多いと思います。Chez Schemeは認知度低そうですが簡単に
インストールが出来ました。
linuxや*BSDの環境でも初心者にはSchemeの方が簡単に手に入りそうです。
macはどうなのか知りませんが、手に入れた環境で手探りでlispに触れていく
んでしょう。
日常で使える便利なスクリプトがどれでも(os)、どちらでも(2つのlisp
)作れるようになれればいいな、などと思ってます。
916 :
デフォルトの名無しさん :04/05/20 01:04
>>909 、907
最初の頃に質問させてもらいましたが調べる能力が
足りてないのも実感しました。質問以前に初心者ですらなかったのかもしれません。mapcarなんて基本的な関数すら知りませんでしたし、
今はもう質問に頼るようなことは諦めてます。
市場で農作物を抱えて運んだり台車で引っ張ったりと
いう単調で、そして人手が少ないのもあってかへとへとになる毎日です。
プログラムなんて興味があっても縁遠い人間です。
理解できてないのにtech板を定期的に見てしまうのは、"読み書きそろばん"
と呼ばれるような基礎的知識として、pcに簡単な処理をさせることはとても
重要だと思うからです。
じゃなぜ情報の少ないlispなんかに関心を持ったかというとスレの進行が
丁寧なのと、emacsの影響が大きいです。あと少ない労力で開発が
可能らしい…、という点でしょうか。
とりあえず初心者スレは存続して欲しいに一票です。 雑談スレになっても、またさほど高度ではない技術で こんな面白いことができるという紹介のスレでも、lisperから 仕掛ける釣りのスレでも結構です。その時はageちゃえばいいんです。 きっと、何か聞きたいことが発生しても本スレだけでは スレッドを汚したくない気持ちが強くて遠慮してしまいます。
改行制限に引っかかったので分けました。 915、916、917です。
うーん、謙虚をとおりこして卑屈になってないかい。 本スレが簡単な質問もできないほど流れが速いのならまだしも、 平気で数日間レスが無かったりする状況だから、初心者の質問が 「スレ汚し」なんてことはないと思うよ。 質問に対する回答を見てても、本スレか初心者スレかをあまり気に してないみたいだし。
基礎的な質問はこっちに寄せて欲しい気もします。 そして、開発者やlisperの語る商売になる話、あるいは時代に一撃 喰らわせる程の熱い話があちらで飛び出して欲しいんですが、 やっぱり勘違いしてるでしょうか?
>>920 両方が混ざって混乱するほどレス数が無い
俺自身は必要をあまり感じないけど、初心者でこの手の初心者スレを 必要だと感じる人がいるのなら、次スレを立ててくれれば、俺は今まで 通り出来る範囲でレスをつけます。 このスレも一応、成功したうちに入るでしょ?
私も初心者スレの次スレがあった方がいいと思います。 ついでにいうとCommonLisp限定の方がいいと思うんですけど、なぜそう思うか 自分でも言語化できていないので強くは主張しません。
Scheme初心者はどうすれば良いんだい?
漢なら「Scheme初心者スレ」を立てて、最初の20レスくらいで、質問と回答の パターンを示して、育ててみるのも一興よのう。
Lisp系全体で、本スレと初心者スレに分ければいいだけじゃネーノ?
>>926 同じく賛成。
だいたい Scheme は上級で Common Lisp は完全に初心者とか
その逆の人とか少なくないか? 分ける意味無い気がする。
だってスチームは方言だらk(`Д´)
アホか
>>926 の意図が一瞬つかめなかった…。
つまり懐の深い本スレと初心者スレで、
Common lispもSchemeもありってことでいいんでしょうか。
>>925 な感じでぐいぐいひっぱってくれればついていくかも知れないけど、
>>926 なのでできればお勧めは前者ですよーな感じ?
あなたが、reverseを次にように書いたところ、同僚から、listの長さだけ 無名関数の呼び出しが発生するので、遅いだろうと文句を言われました。 それでも、あなたはreduceを使った、この簡潔な定義が気に入っています。 次の一手は? (defun reverse (list) (reduce #'(lambda (a b) (cons b a)) list :initial-value nil))
reduceを使わない。
どれくらいの遅さか調べてみる。
(defun rev (list) (declare (inline reduce)) (reduce #'(lambda (a b) (cons b a)) list :initial-value nil)) これで、reduceを展開してくれるコンパイラはない? cmucl18e, clisp2.33, lispworks4.3.6は展開してくれない。
(declaim (inline ore-reduce)) (defun ore-reduce ...) する。
>>936 その手があるのは、同意するけど…。俺はてっきり標準関数でも
お願いすれば、インライン展開してくれるコンパイラが主流だと誤解していたよ。
lex のような字句解析プログラムはありませんか? それとも標準のストリームなどから容易に実装できるのでしょうか?
>> 939 有り難うございます。助かりました。使ってみます。 read, read-char, read-line などは標準であるのに、、、 token 毎に読んだり字句解析まで出来る read なんかも 標準に入ってて、いつでも気軽に使えるといいな〜。 と思ってるのは私だけ?
>>940 >字句解析まで出来る read
字句解析がどういうものを求めているのか
よくわからないけど、set-macro-characterを駆使して、
自分でマクロ文字を定義してやれば、ある程度は可能かも。
って、そういう問題ではない?
>>941 >>939 のリンク先にあった lexer と同程度のこと、または
Unix の lex プログラムと同程度の事ができるものです。
恥ずかしながら read macro のいじり方が良く分からないんです。
以前、どこかのサイト(2ch?)または文献で 「y2k の問題を解決するために COBOL のプログラムの 解析プログラムをLISP により作成し次々と問題のプログラムを 修正していった。 LISP だとこのような強力なことが割合容易に可能となる」 みたいなのをどっかで読んだ記憶があります。 でも、LISP にそれを直接サポートする関数はあんまりないし、 Scheme でもいいのですが、 「LISP で簡単実装、擬 C コンパイラ」 みたいな文献やサイトも見た事ないです。 一度構文解析までできて構文木リストまでにプログラムを 持っていけるとあとは楽しそうなのですが、 それ以前でつまづいてしまってふがいないというか、 やるせないというか、悶々としてしまってます。 皆さん clawk と lalr を使っているのでしょうか? それとも他言語コンパイラ向き LISP があるのでしょうか? それとも標準的機能で簡単にある程度の事はできるのでしょうか?
たしかに、いろんな言語をパースできるライブラリがあったら便利そう。 しかも、y2kの話はかなりの売り文句になると思う。今まで知らなかったけど。
943が言ってるのはトマベッチがどっかに書いてた内容かな。あの人フリッツと仲良しさんで フリッツは国の仕事よく請け負ってるからそんな表にでてこないネタいっぱい知ってると思われ。 ライブラリの件はzebuだっけ?何か有名なのあったよね。 使おうとしてたら上級Lisperの人に遅くて使い物にならんよ、って止められた記憶がある。
>>943 CommonLispのread系の関数は、lispのプログラムを読むために用意されているので、
マクロ文字の処理関数を書いてもCなどのソースを字句解析するのは厳しいでしょう。
Lexerには正規表現をよく使うけど、Common Lispの規格には規定されて
いないから、汎用的なlexerをCLの標準装備で簡単に定義するのは難しいかも。
まぁ、Cの字句解析なら手書きでread-charから書いてもそれほど手間じゃないと思うけど。
したがってlexerやlalrを使うことになると思います。Cなら文法定義もどっかにあるのでは?
Cの文法クラスって、recursive descent parserじゃパースできなかったっけ?
無理っぽいよね。
え、余裕だと思いますが・・
じゃ、lalrを使わずに自分でコーディングしてもいいね。
ネタが無いんだったら次スレは 「Scheme初心者スレ」でよろ。
>>949 「Scheme初心者スレ」で単独スレを立てればいいではないか。
何もこのスレの後継にすることはないと思う。
ちなみに「Commonlisp初心者スレ」のスレタイで立てたのは、
内容をCommonlispで統一したいから。
Schemeとlispは別言語であり、別言語を混ぜると混乱する。
ここは「Commonlisp初心者」対応のスレであり、初心者が混乱することは
できる限り避けたいと思うしだい。
如何でしょ?
>>949 「Scheme初心者スレ」で単独スレを立てればいいではないか。
何もこのスレの後継にすることはないと思う。
ちなみに「Commonlisp初心者スレ」のスレタイで立てたのは、
内容をCommonlispで統一したいから。
Schemeとlispは別言語であり、別言語を混ぜると混乱する。
ここは「Commonlisp初心者」対応のスレであり、初心者が混乱することは
できる限り避けたいと思うしだい。
如何でしょ?
CommonLisp初心者スレ(いるんだったら)と 本スレ=CommonLisp+Scheme+Scheme初心者 でいいんじゃない。
953 :
デフォルトの名無しさん :04/05/30 13:33
Special variableは、初期値を設定せずに、(symbol-value foo)として、 いきなり参照すると、unbound-variableエラーになりますが、 この動作に、歴史的な経緯や、理屈はあるのでしょうか。 エラーにせずに、(car 'nil) => nil みたいにとりあえずnilを返す仕様の方が 便利な気がします。
びみょうやね
>>953 初期値を設定せずに参照するって発想は間違ってるから、
それでいい。
歴史的経緯とか関係なく、プログラム組む上での常識。
エラーにせずに、すべての変数の初期値をnilにしてはどうでしょうという発想でしょう。 わざわざ値を設定しなくては、参照できない変数ってすこし面倒。 なんでもいいから値が最初から入っている事にしてほしいのでは?
デバッグ大変なのがわからんか。 ま、わからんからそういう発想が自然と出てきてしまうんだな。 納得。
dynamic variableの初期値がnilと決まっているくらいで、それほどデバッグが大変になるの? 他の型であることが前提のコーディングをしていれば、そこで簡単にエラーとなるでしょ? 関数のキーワードパラメータのデフォルトの初期値はnilだよね。
昔、Schemeの処理系を作っていたとき、最初
>>956 の言う様な、
初出変数を自動宣言できるという仕様にしていた。
だけど、Schemeでライブラリを書いていくうちに、それが大きな
間違いだった事に気づいた。
原因不明な実行時エラーという形で問題が表面化したからだ。
変数に使うシンボル名にゴミが付いただけで、それが何のエラーも
出ずに通ってしまっていたのだ。
エラーが出た時点で、名前にゴミが付いたという原因は判るはずもなく、
あてのないデバッグ作業が続いた。
ロジックは全てあっているし、トリッキーなこともしていない。
あげく、自分の書いたコードに不信感を抱き、このコードには
呪いでも掛かっているのでは?
と、オカルト的な思考をしてしまう程追い詰められた。
そして原因がわかった時、その恐怖は想像を絶した。
・・これは、Lispに限らない話。
今は、変数名を手打ちしている人は多いの? 俺は、emacsの自動展開機能を使っているので、 変数名の打ち間違いはここ数年ないと思う。 でも危険性はあいかわらず存在するから、どうしても初期値をnilにしたいっていうなら、 最初に参照した時点で、warningを発するようにするとかするかな。
打ち間違い以外にも、編集で誤って改ざんということはよくある気がするが。
コンパイルかけて身に覚えのないエラーが出たとき良く見ると"xo"とかいう二文字が混じってる ことがよくある。誤って改ざんってわけじゃないけどバッファの移動に失敗してゴミ残すパターンが 多いみたい。CTRLキーをもっと確実に押せるようにキネシスでも買おうか思案中。高いけど。
Ctrl 押しわすれて p とか n とかいつのまにか入っちゃってることはたまにある
>>959 俺はunbound-variableエラーに賛成派だけど、
同じホラーストーリーは、plistやhash-tableなんかでも発生する可能性があるよね。
一箇所だけ、(setf (getf plist 'zpeed) 100)なんてね。
shなんかのシェル変数は、宣言無しで参照するとヌル文字列が返されるよね。 lispもトップレベルで色々、思考錯誤しているときに、 > (dolist (it some-list) (pushnew it a))なんて打ってから、 チッ! aを設定してネーゼなんてこともあるから、トップレベルに与える フォーム中に未定義変数が含まれている時は、警告と共にnilに初期化 するというのは、アリだと思う。
ホラーストーリーやfailure modeと呼ばれるようなもので、最近、私が経験したのは、 (let ((foo (bar (list 'a 'b)))) ;; do something ) のつもりで、 (let (foo (bar (list 'a 'b))) ;; do something ) と書いたときでした。私も呪われているのかと思いました。
構文上は正しいのに、実はバグが入っているという例は他にはないですか?
Controlキーって何指で押している? 俺は親指。
>>968 キネシスですか。いいですね。小指で押してますがやはり辛いです。
いや、普通のキーボードで設定を変えているだけ。 小指でコントロールを押すなら、oxとかp,nがたまに入るのは、ありえるかなと思った。