>>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がたまに入るのは、ありえるかなと思った。