1おつ
>>11 > □Shibuya.lisp
> 東京地区、特に渋谷周辺半径2万キロのLisp系プログラマによる非営利団体。
> 第3回テクニカルトークは2009年7月4日開催予定です。
>
ttp://shibuya.lisp-users.org/ これ、参加しようかな
場所は、東京だよね?
料金は無料なんだね
>2/1日 21:00時より募集を開始した60名枠の観覧募集ですが、予想以上に速いペースで約2時間後の23時前に定員に達しました!
の状況をみると、財務処理とか大変になるかもだけど、資料代と称して1,000円ぐらいお金をとって欲しい感じだな
>>1 ('-')乙 これは1乙じゃなくていちもつなんだからね!
16 :
デフォルトの名無しさん :2009/04/24(金) 23:42:33
17 :
デフォルトの名無しさん :2009/04/24(金) 23:45:02
CL-USER> (eval
>>1 )
乙
CL-USER>
18 :
デフォルトの名無しさん :2009/04/24(金) 23:52:59
前スレのつづき 落ちそうなのでこっちで(もう話も終わると思うけど) ここのスレはLispとSchemeの合同スレであり、派生したいヤツは勝手に派生してくれって話なのかな?
もてたいためのリスプハッカー あなた動機が不純なんだわ フムフムヌクヌクアプアア いつも手にして歩いてる R6にはケチつけて スーパーハカーを気取っているけど 何かが違うわ かっこ かっこ かっこ かっこ かっこ かっこ かっこばかり 先ばしり リスプハッカー・ウィドウ リスプハッカー・ウィドウ いい加減にして schemeあなたの物じゃない
人目気にするリスプハッカー 言語仕様をANSIにしてる 再帰するのがエクスタシー 呼べばnilまで帰らない もしも誰かに聞かれたら SICPはとうに読み終えました いい本でした かっこ かっこ かっこ かっこ かっこ かっこ かっこつけて 泣きたいわ リスプハッカー・ウィドウ リスプハッカー・ウィドウ いい加減にして lispはcommon一つじゃない
ロックンロールウィドウって解説つけなくてもわかるオッサンばかりのスレ
おっさんですがわかりません><
>>26 このころ、二十歳なんだって
すごいね
copperpony (7 か月前) 表示 非表示 +12 スパムとしてマーク 返信
20歳でこの凄みは21世紀の日本でも完全に大スターになれる。
こんなに迫力があるロック歌手が今いない
舞台映えするし美人で宝塚でも大スターになれそう
ひとつ賢くなった
山口百恵だったんだ、「カッコ、カッコ…」の所だけは聞いたことがあった。
アン・ルイスの曲だから、本人も歌ってるよ。
6変数関数の3,5番目の変数だけ束縛したカリー化がしたい metabangに入ってるかと思ったらなかった 違うテクニックを使うのが普通なんでしょうか
cut?
Internet(YouTube, Web browsing, mail, etc)レベルの利用のコンピュータに関心のある人が初めてプログラミング言語を習うとして Schemeは挫折せずにこなせるレベルだよね? 初学言語がC, Pythonと比較するとどうなんだろうなあ。 学習時間(20時間、200時間、2000時間、20000時間)にみるプログラミング自体のおもしろさの度合いの推移 懼20時間以降は他の言語に浮気してもかまわない。むしろ推奨する。また浮気言語も含めた学習時間とする。 だから、何?と聞かれても特にないけど
うほっ、文字化けした Internet(YouTube, Web browsing, mail, etc)レベルの利用のコンピュータに関心のある人が初めてプログラミング言語を習うとして Schemeは挫折せずにこなせるレベルだよね? 初学言語がC, Pythonと比較するとどうなんだろうなあ。 学習時間(20時間、200時間、2000時間、20000時間)にみるプログラミング自体のおもしろさの度合いの推移 ・20時間以降は他の言語に浮気してもかまわない。むしろ推奨する。また浮気言語も含めた学習時間とする。 だから、何?と聞かれても特にないけど
>>31 let f a b c d e f = b f a c d eみたいなのを一瞬考えたが
Lispにカリー化はないので、マクロで引数の順序かえたらいい
>>34 最初につまづくのは再帰によるループと、かっこの扱い(car,cdr,cons,list関連)
それがクリア出来そうならschemeが一番おすすめ。覚えることも他言語より少ない
ただ、これらは結構序盤にある山なのでそこが問題
個人的な経験からいえば
簡単に結果がわかる&ループがある言語から
入った方が初心者には優しいんじゃ無かろうか
その中だとCとPythonだが、Cはすすめにくい
Cはポインタ関連のわかりにくさと
副作用が多いプログラミングスタイルなので
例えばクイックソートなんかのアルゴリズム系は
関数型言語に比べてかなり理解しにくい
ただ、情報量は多い
PythonはLLなので
初心者にもさわりやすいとは思う
あと、わりとlispに近いと聞く
ただ、情報量はまだそれほど多くないかな?
しかし、Google効果で広まりつつあるようには思う
慣れてしまえば、プログラミング自体の楽しさは
Cに比べれば圧倒的にschemeかな
あと、世の中にあるコードは良質なものが多いし
いいプログラミングスタイルが身につく(ハッカーが多いので)
pythonはやったことないんでわからん
>ただ、情報量はまだそれほど多くないかな? そうでもなさそうだった 俺のおすすめルートは やる気ある -> scheme そうでない -> python または python -> scheme
宝石が好き -> 金、銀、perl
Ruby
perlは好きだけど 初心者にすすめるならrubyかな perlは変なスタイルのプログラムが非常に多いから。 同じことがrubyにも言えるかもしれないが perlよりはマシだろう、多分
>>35 「初心者」というのは才能に関しても、興味の強さに関しても、
もちろんその他いろいろな特性(我慢強さとかね)に関しても
非常に広いスペクトルを持った集合だと思う。
なので、大雑把に「初心者」でくくるのでなく、もっと細かく
カテゴリー分けしないと、初学に最適な言語をアサインするのは難しいと思う。
最初のアサインに失敗するとプログラミング自体が嫌いになってしまうしね。
>>34 >Internet(YouTube, Web browsing, mail, etc)レベルの利用のコンピュータに関心のある人
同上。
最近は入門言語がオブジェクト指向なんだよね。 みんな偉いなあ。 おいら、最初にオブジェクト指向(といっても C++ ですがw)を知ったとき、 大喜びしたのはいいけど、どうでもいいことでもクラス設計からはじめるから、 とても効率悪かったなぁ。 (その後、テンプレートを知り、以下同文。) 最近の入門者はそういう罠(?)にははまらないんだろうか。 はじめっからオブジェクト指向だと、大喜びも何もないだろうから、 そんなくだらんことはしないのかな。
>はじめっからオブジェクト指向 便利さがあって当たり前の世代はまだ出会ったこととが無いけど、 たぶんニュータイプでしょう
そういう意味では、アセンブラ何それ?おいしいの?って世代は多いでしょ
話をlispっぽく戻すと(?) pythonの__hoge__系関数はCLOSの総称関数的だよね。
perl、 rubyは大体同じようなもの。 javaもまあ、大差ない。Cほど簡単ではないが。 しかしPythonはちょっと難しい。明らかにワンランク上。 Schemeとなったら、さらにもうワンランク上の難しさだね。 読み方が。
Lisp/Schemeって日本で一番流行ったのっていつ? 人工知能で注目された時代? それともずっとマイナー?
単純なメモ帳ではプログラミングの開始もできないのはごくわずかでもない初心者に敬遠させてるよね
確かに。 最初から gauche を正しく読めた人は少ないかも知れん。
>>35 > 最初につまづくのは再帰によるループと、かっこの扱い(car,cdr,cons,list関連)
> それがクリア出来そうならschemeが一番おすすめ。覚えることも他言語より少ない
> ただ、これらは結構序盤にある山なのでそこが問題
いわゆるループはC的(手続き型言語的)考えた方なのかなと個人的に思うんだけどなあ
初学言語がSchemeだったら違う見え方になるのかなと思うし
> PythonはLLなので
> 初心者にもさわりやすいとは思う
> あと、わりとlispに近いと聞く
> ただ、情報量はまだそれほど多くないかな?
Webドキュメントはみやすいと思う
訳書は少ないかな
最近、入門書のクズ本が増えてきたみたいだけど
まあ、メジャーや注目度の証なのかなもしれないけど
vimとかの選択肢も多少あるけど、半強制的にemacsを触ることになるのがすごく良い気もするんだけどなあ
どうなんだろう
学習コストが高いからこそ最初がいいと思うんだよなあ
"難しいんではなく学習コストがある"というのは明確に伝えるべきだけど
コンピュータに関心のある10代の子は、どのくらい忍耐力がないんだろうなあ
>>49 初学者だとしても単純なメモ帳でプログラミングする感覚はよくわからないけど
ダウンロードして、ダブルクリックするだけですぐ使える環境は、さすがにあるんじゃないの?
開発環境として主流でないだけで
>>49 メモ帳でも書けるじゃない。Emacsやviを使うともっと楽に書けるってだけで。
他の言語に比べて、メモ帳で書きづらいのは確かだけどさ。
でも、Emacsやviを使ってると、括弧のお陰で移動が凄い楽だから、
トントンってところな気がする。
ループは言う程簡単じゃない 小学生のときN88のFor Nextを理解するのに恐しいぐらい時間かけた気がする さらに正確に書こうと思ったらホーア論理の初歩を知っておかないと 慣れるまでまともに動作するコードが書けないから
>>55 恐ろしいくらいベーマガのソースコードを打ち込んだんですね。
わかります。
男ならEdwin
>>55 ネットない時代だと悲惨だよね
なんの言語でもいいけど、入門書なんてなかった気がする
現行PCが30万〜40万する時代だからなあ
東京の人は別なのかもしれないが
ダウンサイジングってあるけど、これが超緩やかで2109年ぐらいが今のPC・ソフトの価格だったらどうだったんだろうなあ
お金儲けに走りすぎて、その副作用がすご過ぎる気がするなあ
大量生産・大量消費は人を幸せにしてきたか?
>>55 俺はBASIC→機械語(Z80)→PASCALつまみ食い→LISP…てな順にやってきたけど
FOR NEXTやIF THEN (GOTO)でループには苦労しなかったな。
PASCALで初めて再帰を知ったときはちょっと感動した。
当時のBASICじゃローカル変数なんて当然無いから配列で擬似的にスタックを作ったりしたけど
GOSUBやFOR NEXTのネスティングは16重までだったから再帰なんて無謀だったなw
C int i;for(i=0;i<10;++i){printf("hello");} scheme (let loop ((s 0)) (if (< s 10) (begin (print "hello") (loop (+ 1 s))))) python for i in range(10):print("hello") pythonは今インストールして0から勉強して30分ぐらいで上の式を作った (他言語の前提知識がなければもっと時間かかると思う) どうやらこれはpython3.0系という新しい非互換のバージョンらしく 新しいバージョンの情報は検索であまりヒットしなくて苦労した 初心者はこっちには手を出さない方が良さそうに思う
Haskell replicateM_ 10 $ print "hello" しかしモナドとかあるから論外ですね
Ocaml for i=0 to 9 do (print_string "hello";) done;; でもOcamlも初心者向きじゃないかな
JavaScript for(var i = 0; i < 10; i++){alert("hello");} ほとんどCと同じだな。 文法はシンプルだしブラウザ上で動くから入門向けにはいいんじゃないかな this周りに若干癖があるけど
Ruby 10.times { puts "hello" }
こうして見比べるとやっぱり Ruby は入門用としてはよろしくないような 気がしてきた。 Ruby で入門した後、他の言語を勉強する時に、多分、苦労するぞ。 プログラミング言語は一個できたらそれで十分、 というのだったら、Ruby でも良いとは思うんだけど。 (もっとも、そういう人が Ruby を使えるようになるかについては、 これまた、疑問なんだけど。)
perl print "hello" for (0..9);
>>64 >10.times
なにそれ
コンピュータの常識や他の言語を意識して、言語仕様を決めるべきだと思うけど
その言語の性格上、現在の記述法が妥当であって統一感があればいいと思うけどなあ
Perlが流行ったのって正規表現が強力だったから?
広告宣伝に莫大なお金が投じられたわけでもないんだよね?
Perl for ($i=0;$i<10);$i++) {print "hello";} foreach $i (0..9) {print "hello";} とか for i in Array.new(10) print"hello" end Rubyならまぁこれでもいいけど統一感がないよな 初心者にはまったくお勧めできない
Ruby 1.upto(10) {puts "hello"} 10.downto(1) {puts "hello"} まぁ,いろいろあるね.
ちなみに
10.times {|i| puts i} => 0 1 2 3 4 5 6 7 8 9
1.upto(10) {|i| puts i} => 1 2 3 4 5 6 7 8 9 10
10.downto(1) {|i| puts i} => 10 9 8 7 6 5 4 3 2 1
(改行略)
境界でどうなるか悩まないんだろうか.
つまり 10.times の時に i は 0 から始まるのであって,
1 からはじまるわけではない.
1.upto(10) のときは i は 1 から 10 まで動く.
10.downto(1) のときは i は 10 から 1 まで.
意味考えたらわかるから,悩まないか.
>>70 知らね.Ruby あんまり使わないし.
む、いかんいかん。乗り遅れる所じゃった。 Smalltalk 1 to:10 do:[ :i | Transcript show:'hello']
そうそう,Ruby だとこれもあるね. 1.step(10, 1) {puts "hello"} これは 1.step(10, 1) {|i| puts i} => 1 2 3 4 5 6 7 8 9 10 この意味合いは 1 から増分 1 で 10 まで数える. (例えば増分を 2 にしたければ 1.step(10, 2) {|i| puts i} => 1 3 5 7 9 とすれば良い.)
pforthで 10 0 do ." hello" loop factorで 10 [ "hello" print ] each
Scheme (let loop ((s 0)) (if (< s 10) (begin (print "hello") (loop (+ 1 s))))) ;>60 (for-each (lambda (i) (print "hello")) (iota 10)) (dotimes (i 10) (print "hello")) どれが標準的?
もっとHENTAIにいこうZE ((lambda (f) (f f 10)) (lambda (g n) (cond ((< 0 n) (print "hello") (g g (- n 1))))))
何故,みんな「素直」に do を使わないんだw (do ((i 0 (+ i 1))) ((= i 10)) (print "hello"))
そろそろAPLがやってくる予感・・・!
CommonLispで
(loop repeat 10 do (print "hello"))
>>75 たぶんGauche使ってるんだろうが標準のschemeにはdotimesはないぞ
CommonLispからの移植な
あとprintじゃなくてdisplayな
>>66 >>68 ところでPerlなら
print "hello" x 10;
でいいのだが?
M-x run-schemeでC-x C-eとするけど M-x run-gosh,M-x run-guileとソースの画面も合わせて、3画面にして goshでの評価、guileでの評価を各自のコマンドと 一気にgoshでもguileでも評価する設定できないのかな guileが不人気みたいだから、こういうのはないか Common Lispでもclispとsbclとできると個人的には便利なんだけどなあ
(iter:iter (for i from 1 to 3) do (print "hello"))
doなんか使うより
(for-each (lambda (x) (print "hello")) (iota 10 0))
>>80 じゃあrubyなら
puts"hello"*10
だな
Scheme は、仕様自体はコンパクトでも取り扱っている概念や方法論がハイレベル Lisp 系なら Emacs Lisp が初心者向きかと。Emacs も理解できイベントループや簡単な ウィンドウ取り扱いなども学べて一石二鳥にも三鳥にもなるし
Emacsのウィンドウやバッファの取り扱いはEmacsにしか通用しないだろ... ま、Emacs自体がREPLになってる上にコードのほとんどがElispでのぞきみ放題 なのはいい勉強になると思うけんど。 英語が苦にならないならcommon lispの方がライブラリが整っていて、自前の プログラムを1から書く分にはschemeよりいいと思うんだが。なんだか ruby vs pythonの構図と似てるなあ。
"一切ほかの言語に触りたくなく、(Scheme/Lispの中から)スクリプト言語をひとつ選ぶならどれがいい?"という質問があるけど、愚問だよね
初恋の子と付き合って、純愛を一生貫きたいみたいなもんで
3年目に浮気するからなあ
>>84 > Scheme は、仕様自体はコンパクトでも取り扱っている概念や方法論がハイレベル
言葉にするとSchemeはそういう存在のところもありそうだね
付け加えるならSchemeも初学者向きだと思う
ここのスレで実用言語としてのGaucheとLispがどういう関係なのか、興味があるところだけど
ここのスレで実用言語としてのGauche使いって多そうだよね
>>85 > ruby vs pythonの構図と似てるなあ。
触らず嫌いだけどrubyは、ないなあ
なぜか頭から却下してしまう
手続き型言語only使いからするとLisp/Schemeがそういう存在なんだろうけど
自分がググった限りだと触るならPythonがいいなあ
Scheme/Lispは親戚関係みたいに血がつながっているイメージ
なんか違う気がする
まあ、血縁関係にお金と権力が絡むと殺し合いが始まるんだけどね
日本の歴史のように
血の例はよくないね
話が飛躍しすぎ
2点だな
>>86 日本の歴史で、
血縁関係にお金と権力が絡むと殺し合いが始まる事例を
複数あげてください。
何ら具体性がない
>>89 同じ年代だけど織田さんのところと斉藤さんのところがそうだよ
俺のダチのツネとトモとか
93 :
デフォルトの名無しさん :2009/04/28(火) 22:05:14
>>91 斎藤さんとこは息子とバパで既に仲悪かったじゃん。
確かに織田さんとこに血縁者はいるけど、実質、斎藤さんとこの親子喧嘩に
義理の息子が割って入ったってかんじだから、
血縁者同士って括りでは斎藤さんとこだけの話だよね。
マムシとウツケの話? それはそうとして「バパ」って何?
「初学者」って受験参考書の前書きによく使われてる言葉だよな。 あと、大学入りたての鼻息荒い学生がよく使う。
>>96 それはゴメンなさい
自分の知らない言葉だと思ってググったりしてしまったw
『初心者』じゃない?微妙にニュアンス違うかもだけど
普通は「初心者」だろうな.「初学者」なんて一般社会では聞いたことがない.
横駄レス 俺はプログラマについて「初心者」って言うのを リアルでは一度も聞いたことないわ。 学術の世界って、法学とか文学でもそうでしょ。 Windows使いHOWTOを「初学者」っていうと 逆に固すぎる感じがするわ。
こういう場合は「人それぞれ」で話を終わらせるか 特定の個人に限定して話を続けるとよい
古い地球人よ
アクターじゃない! アクターじゃない! 継続なのさ〜
恥丘の男に飽きたところよ
108 :
デフォルトの名無しさん :2009/04/29(水) 01:39:10
継続ってノンエンプリティブなOSでマルチタスクやってたころを思い出すかな。
「少なくとも入門は済ませた俺は"初学者"ではない。むふふ」 という中二病心がうずくのさ。
くっ!俺の右腕のアセンブラが火を噴く前に、あんた逃げな!!
お前も実は
>>34 だったんだよ・・・
みんなが
>>34 で、
>>34 がみんなだったんだ!うわーい
ま、Smalltalkerなおでは違うけども
>>52 忍耐を要求する時点で終わってる
プログラミングは楽しくなきゃ
>>113 子供にとって楽しさってなんだろうなあ
サッカーだったら活躍したらうれしい、もっとうまくなりたいとかかな
でも、ピアノとか、お習字とか、武道の習いごとは、違うよね
個人的には子供のころは馬鹿みたいに時間があって、それを退屈しないで
過ごせればなんでもいい気がするんだけどなあ
退屈しない = 楽しさかな?
LisperってHHKとか使ってるの?
キーボードは個人の趣味
和田先生だし、Lispむけなのかな?HHKだと()打ちやすいのかなぁ? なんて考えたのですが。
>>110 そういえばcomp.lang.schemeで「継続をCで実装するにはどうするんですか〜?」って質問に"real man uses assembler."の一言でスレをストップした漢がいたなあ。
あれは、おまえの右腕だったのか@@・・・(w
()は、日本語配列の方が打ちやすいな〜とか思う。 US: 9→( , 0→) JP: 8→( , 9 →) 多くの人が小指より薬指の方が長いから、 指が届き易いんじゃないだろうか?
>>119 > 指が届き易いんじゃないだろうか?
JPの0の位置って好きじゃないかも
C-u 99 ほにゃららってするね
C-u 55 ほにゃららってするね
あとC-u 22 C-n 約半ページ移動
なぜC-uのあとに左手が多いのかなと思ったら、右手の人差指でuを押して、右手の薬指で9を押すと
右手がちょっと不安定になるからっぽい
まあ、どうでもいい話でした
US配列はjp106を設定していないあの配列なのか
hhkとか使いたくないなあ
>>86 Sheme/Lispで多言語の文字列生成検索関数があれば、
いいんだ!(emacs lispはいや。)
>>119 小指?
いや小指より薬指は長いけど
自分は890あたりは中指薬指で打つな
>>122 それだと、ホームポジションの基本から外れるじゃん。
だが、冷静に考えてみると、閉じ括弧って lisp の時、滅多に入力しない。
pairで入力するから。
だから、たまに括弧の数の調整をする時、使って、
「ああ、遠い」って思うんだよな。
>>122 わからなくなもないけど、混乱しないの?
右薬指で0もありならp/もそうなの?
標準的と思われるタッチタイプにどれだけ妥当性があるのか、よくわからないがね
小指の使用率高いし
人間の適用力はすごくて、vi, emacsのESCの過度のタイプも意外と平気だからなあ
俺も数字の段では小指を使わない。
これで腕は移動しなくても、手首の回転と指の折り曲げで対応できる。
>>124 > /もそうなの?
小指は短いんだから、折りたたむ位置のキーはかえって有利。
クロダって凄い人なの?
黒部ダムは、すごいところだ。
黒田節はいつ聞いても心にしみる
以前はEmacsのM-系はAltキーで viの挿入モード抜けはESCでしてたけど いまはどっちも^[。 Ctrlキーで代用が聞くBSやTABも^H、^I。 最近コンソールアプリで^Hが使えないものでも ^8が効くということに気が付いた。 Ctrlキーは便利なんだけど Macだとブラウザのアクセスキーとカチ合うのが難点 wikiを見てる時に何度履歴のページを見る羽目になったことか…
>>126 既存コミュニティの努力を全て無に帰して、新しい言語を構築しようって人は、
近代中世から何百年とずーっと存在し続けているのさ。
今に始まったことじゃない。
ESCがずいぶん離れていて不便だ・・・と思っていたんだが いわゆる省スペースのだとどうということもない
>>131 pgの悪口言うな><
クロッティはむしろ逆の方向性だろ。
キーボードの話が出たので
省スペースキーボードの KEK-EA9AU の
復活に向けて布教しようと思ったら、何故か普通に売られてた!
ヤホーイ!!
http://kakaku.com/item/01505010404/ 値段が上がり続けてるのが心配だがこのキーボードはマジでオススメ
キーピッチが小さいから数字キーまでブラインドで打てるし
フルキーだから変な配置で困ることもない。
なのに全く知られてないのは何故なんだ!
>>134 形が普通すぎてださいし、JIS配列だから使い物にならない。
thinkpadでいいよ 乳首最高
>>132 漢字キーと入れ替えちゃえばいいじゃないか
IMEのスイッチを変換に当てて使えば上段全部が遠いおれでも楽勝だぜ(無変換はSUPER)
>>137 うん、でかいキーボードに戻ったらそうするだろうw
省スペースだとファンクションキーも楽に届く・・・のはいいんだが
今度は左のALTやCTRLが押しにくい
>>138 小さくなるとALT,CTRLが押しにくかったりするんだよね
おれは店頭に並んでいる1000円キーボードが一番好きだね
外し方が悪いのかもしれないけど、うまくキーボードが外せなかったりするし
ブラシとエアーダストでお茶を濁している
あと、用途 来客訪問時用 and 予備用ととストックしてあるなあ
ケースバイケースで生活感のあるキーボードを見せたくない場合もあるし
乳首パッドも使っていたけど、しょせんノートパソコンだよね
持たなくて済むなら持ちたくないね
盗難がすごくこわいし、セキュリティ的にも安易に席を離れられないからなあ
デスクトップPCも盗もうと思えばできるんだろうけど
素人がやる犯罪行動コストとしてけっこうありそうだからなあ
常習者だったらあっさり行けるんだろうけど
左手小指の付け根でCtrl押す派はどれくらいいるのだろうか?
>>142 どんだけ変態なんだよ
なにかの事故で小指がないならわかるけど
お前らそろそろ自重しろよ
プラインド・タッチの普及に於いてサイト・アンド・サウンドの果たした 役割について考察せよ。因みにWikiでは触れられていない。 これネタ
>>142 俺もフルサイズのキーボードではやるよ。
ノートとかだとできなくて辛い。
>>143 某Scheme処理系作者もそうだった気がする。
結構打ちやすいよ?
>>148 付け根なんでしょ?
それだとCtrlとCaps lockは交換していないよね
第一関節と第二関節の腹で押すなら、多少は想像できるけど、でもとても効率性や機動性があるとは思えない
まったり操作のときに使うの?
右手小指の付け根では成り立たないの?
すげー謎過ぎる
小指の付け根あたりにもう一本指があればいいのに
ホームポジションでタイプするときに小指の付け根ってちょうど左右Ctrlキーのあたりにあるけど。 付け根で押すと、押した状態でさらに指が5本ともつかえて効率的。Emacsにイイ。
その態勢だったら親指が使えない
Lispスレと思って開いたらタイピングスレだった
あー、やっとイメージをつかめたけど USキーボードだとCtrlの幅が多少広くなって、他のキーに接触せずに押しやすいのかな でも、それならCtrlとCaps lockは交換する派のほうが共感できるなあ
>>151 > ホームポジションでタイプするときに小指の付け根ってちょうど左右Ctrlキーのあたりにあるけど。
その体制って手首や指が手の甲の側に反るので俺はダメだ。
俺がホームポジションでタイプするとき、小指の付け根は空中ですよ。手首はパームレストの上。
手が半球をつかむような自然な形を保てる方が手の負担が少なくて楽だと俺は思うのだが、
そんなの全然大丈夫って人も沢山いるんだね。
俺がホームポジションでタイプするとき、小指の付け根はCtrlキーの0.5cm上空ですよ。 手首はパームレストの上。手の負担も少ないってゆうかゼロ。
157 :
デフォルトの名無しさん :2009/05/02(土) 20:57:18
>>154 致し方ないので"A"の左がコントロールになっているキーボードを社内で普及させた俺みたいなのもいる
文字のキーを2つ以上同時に押すことはゲームしかありえないので 左手で文字キーを押すときは右手で右のShift, Ctrl, Altを 右手で文字キーを押すときは左手で左のShift, Ctrl, Altを 組み合わせて押す。 どんなキーボードでも有効w
>>157 すげー迷惑だよ
劇的な優劣差があるわけでもなし
むしろ不便さのほうを感じるんではないだろうか
キーボード変わると作業効率落ちる
漫画喫茶でストレス感じまくり
以前、某大学(東大じゃないよ)の実習用MacにHHK付けさせたのは何を隠そうこの私。
俺はコントロールキーを 小指側のてのひらの付け根で押してる。 小指の付け根というのはこのことかな?
Lispをやってこうと思うんですけど最近はHaskell最強の声も聞きました。 どっちがいいんですか。
こういう質問をする人の思考回路がまったく理解できないな。 両方やってみて自分で選べばいいじゃん。
まあ擁護してみると どちらも勉強する価値は大いにある しかしその価値がわかるほどに学習が進むとそれに染まってしまって どちらかに偏って考えてしまうようになる だから学習前のプレーンな状態で選択したいんでしょう
common lispもschemeもhaskellも全部触ってみるのが一番良いと思うが。 *nixならperlだって使えるべきだし、さらに言えばsmalltalkだって教養として 知っておくべきだと思う。 逆に言えば、特定の言語に染まっちゃった人の意見なんか参考にしてどうすんの?
それで他人にきいてその通りに選択するってのも気持ち悪いよな。
Haskellスレにも似たようなこと書いてるのかな
>>162 Haskellを触ったことないけど、興味があるんならやってみればいいんじゃないの?
>>164 さんが言うような偏りは、しょうがないとしか言いようがない
某日本人が新しい言語を使うときは、さっさと大きいものをつくるらしい
例え、失敗しても、根本的にまた勉強し直して、2度目で作れればいいし
かなりハードだろうけど、目的が直接的なこともあって、かなり得るものはあるらしいね
Haskellで実用的な何ができるのか、知らないけどね
個人的にはslime.elが便利らしいんで、Common Lispがいいと思うけどね
Common Lispで何か作ったことないけどね
>>165 Perlはわかるんですが、smalltalkは必要なんですか?
smalltalkは教養としてでもいいけど、smalltalkを知っておくことってそんなに大事なの?
smalltalkを知っていなくてすごく困ることになっても、そのとき対処するなあ
>>169 つOpenBSD かつ ストールマンと飲んだ人
>>168 興味が無いなら勧めないけど、何でもおもしろいって感じられる年頃の時にsmalltalkの中身を見ておくのは悪いことじゃないよ
あとcupsっていうeclipseでcommon lispさわれる環境もあるのでemacs系エディタがダメならそっちも検討してみるといいかも。
>>168 >smalltalkを知っていなくてすごく困ることになっても
ならないからオケ。
秘境を旅するみたいなもんで、知的好奇心があれば
満足出来ると思うけど、実用的な何かを期待するなら
無駄骨になる。一つの小さな閉じた世界を訪れるのが
楽しいと思える人向け。
>>171 京都だけど勉強会ってあるんだね
次回は5月17日だって
>>172 自分の場合はLisp/Schememも秘境という感じですがw
お金儲けに直結しづらい言語っていいなあという感じでマイペースにやっています
>>162 「問題の解き方」を研究したいなら Lisp、「問題の問い方」を研究したいなら Haskell
>>172 Lispはまだ外界との交流が盛んだと言うか、Lispが特殊なのは記法だけだよね。
Lispが砂漠のオアシスみたいな場所だとすれば、Smalltalkは山奥の隠れ里。
人によってはエルドラドや桃源郷に思えるかもしれないけど、交流は殆ど
断たれてしまってる。
SmalltalkはSqueakで子供に布教してる人もいるじゃない。
lispって名前空間がややこしいですよね。俺だけ? シンボルには変数と関数を入れることができて、 変数には関数を入れることもできるって。。 リストの先頭か #' で関数にアクセスできるけど、 変数に入れた関数には別の方法でアクセス・・慣れればしっくりくるのかな
リストの先頭でマクロにアクセスできるけど マクロは変数に入れられない リストの先頭にはファーストクラスオブジェクトを置けないと考えれば? 関数も、そのままでは変数に入れられないから #' を使うわけで
>>178-179 Scheme と CommonLisp で名前空間の扱い違うのか。
すみません、勉強不足だ。
あー、イメージは掴めそうかも。
変数の世界と 関数の世界があって x軸とy軸のように
双方向の写像の役割を #' と apply (funcall) がそれぞれ行っている。
写像なしではそれぞれの世界を行き来することはできない・・みたいな。
>>180 おおざっぱなイメージだと、symbol に
"値スロット" しかないのが Lisp1
"値スロット" と "関数スロット" があるのが Lisp2
scheme とかは前者, CL つか Maclisp の血を引いてる奴は後者
値、関数スロットのほかに属性とかもあるらしいね Schemerだから詳しく知らんけど
>>181-182 Thx。Scheme の方がシンプルでいいのかもなあ。
使ってる人も多そうな気が。
でも今 On Lisp 見てて面白そうだから CL もよさそうだw悩む。
両方やれw どっちも楽しいぞ
CLでSchemeを実装する、という話はPAIPにもANSI Common Lispにも載っている。 しかし、SchemeでCLを実装する、という話は聞かない。 最初に複雑なCLをやっておけばSchemeのシンプルな長所も理解できるけど、 Schemeから入るとCLが単に複雑なだけに見えてしまうかもしれない。 よって最初はCLをお勧め。反論は認める。
>>185 関数型言語をかじってみたい程度の動機だとSchemeがいいんじゃない?
実用的にこれをしたいという用途が明確にあるならCLに直接にいくのもあるのかもね
Scheme以外のLispはレベルが低いのでスレからでていってください
なんだ?そんなんで喧嘩売ってるつもりか
はい、喧嘩売られてます、今
J 魚 魚 魚<大きな釣り針だなあ 魚 <お口に入らないよ
せっかくだし、バトルしようよ
宿題スレで問題を適当に10問持ってきて、10問の中から各自5問選んで、
Lisp/Scheme(別の関数型言語の参加もあり)で解く
提出タイム、コードのエレガントさなど評価の対象になるだろうが、イベント運営側で特別評価はしない
各自の判断で評価してもらいたい
5月4日13時開始予定(夜の希望者がいるなら時間を変更して、20時予定)
直接対決専用スレ
ttp://pc12.2ch.net/test/read.cgi/tech/1239985829/ と妄想してみたんだがどうだろうか?w
算数ドリル的な問題だと言語としての真価も図れないし、つまらないかな?
明日にズレ混んでもいいから、なんかやってもいいかもね
>>185 > SchemeでCLを実装
on lisp に無かったっけか?
>>194 CL で continuation なら見かけたような気がする
最近ようやっと自分のお師匠が言っていた 「Lispはごくごく普通の言語だよ、記述がちょっと毛色の違うだけの」 と言っていた意味がよくわかった ひょっとして書かれかた(書き方じゃない)になれてしまえばC++より優しい?
ひょっとしなくても優しい、そして易しい Forthに匹敵するくらい
forceと供にあれだぞ、オビワン
>>196 そうだね。
Lispを特別な言語と思い込み、それを使いこなしている(?)自分が
特別な人間だと思い込んでいるユーザがLispを特別な言語にしている。
elispやCLはすごく普通だよね。ほかの言語の経験があれば割と素直っていうか。 Schemeは再帰が壁という声を聞いた。昔の話だけど。
Lispは、「言語設計者様が作った構文を真面目に覚える」という能力を プログラマーから奪う危険な言語。
ある程度Lisp触って他の言語を触ってみたら 足し算するときに1回はコンパイルエラー出す
>>200 単なる食わず嫌いなところがあるのかもしれないね
「ロシア語がおもしろいよ。ドストエスキーは原書で読まないと」と他人に言われても、そこまで興味を引かないもんね
>>201 よくわからない文章だね
a) Lispは、ある能力をプログラマーから奪う危険な言語である。
b) 「構文を真面目に覚える」という能力ってなんだ?
c) 能力を人から奪うという表現もすごいね
elipse(emacs)は、「言語設計者様が作った構文を真面目に覚える」という能力を
プログラマーから奪う危険な統合環境。
これなら成り立つね
>>203 Lispは構文を覚えなくていいから楽だなぁ
ってことだろ
誇張表現を受け入れられない人って結構居るみたいね…
ところでGuileのスレはどうするよ?
>>193 の言うような対決スレとして再利用でもする?
210 :
209 :2009/05/05(火) 12:16:51
文豪乙
そもそもそんな変な時間に集まるわけねーだろ
>>212 じゃあ、何時ならいいんだ?
集まらないと言っても3人集まったんだから成功だと思うんだけど
午前の部と午後の部を設けるとか
>>214 妥当な開始時間を聞いているのに
二部構成という企画提案になっているんだ
GaucheでSchemeを学んでいます。 quoteで悩んでいます。 (list 1 2 3 4) '(1 2 3 4) 違いがわかりません。
(list 1 2 3 4)は1 2 3 4といったデータからリストを作っている '(1 2 3 4)=(quote (1 2 3 4))はリスト(1 2 3 4)を評価せずそのまま渡している (list 1 (+ 2 3 4)) '(1 (+ 2 3 4)) の違いを比べてみれ
>>217 横槍だけど、(car (car '(1 (+ 2 3 4))))だと、評価されないけど
評価するのってどうやるの?
>>217 ありがとうございます。だいぶわかってきました。
(list 1 (+ 2 3 4))
'(1 (+ 2 3 4))
だと上では(1 9)のリストが作られるんですね
対話で(1 2 3 4)と渡すとエラーが出るのは、このリストのcarが手続きでないから、という解釈でいいのですか?
作ったリストとリストリテラルの違いはありますか?
'(+ 1 2 3) ; => '(+ 1 2 3) `,(+ 1 2 3) ; => 6 `',(+ 1 2 3) ; => '6
>>219 そう、(1 2 3 4)を評価しようにもリストの先頭要素1はただの数字だからな
リストとしてみれば同じだが実データとしてみれば違いがある
(equal? (list 1 2 3) '(1 2 3))
(eq? (list 1 2 3) '(1 2 3))
>>218 ん?
(car '(1 (+ 2 3 4))) => 1だから
(car (car '(1 (+ 2 3 4))))は(car 1)ということになる
いったい何を評価したいのかな?
>>221 (car (cdr '(1 (+ 2 3 4))))だね
(car '((+ 1 2 3 4) 1))で、もぞもぞいじっていたから気づかなかった
>>221 それ説明になってないじゃん。
(eq? '(1 2 3) '(1 2 3)) → #f
(equal? '(1 2 3) '(1 2 3)) → #t
(eq? (list 1 2 3) (list 1 2 3)) → #f
(equal? (list 1 2 3) (list 1 2 3)) → #t
(eq? '(1 2 3) (list 1 2 3)) → #f
(equal? '(1 2 3) (list 1 2 3)) → #t
なのに。
>>219 (list 1 2 3)と'(1 2 3)の違いは、
list関数が作ったか、read関数が作ったかだけ。
listの方はmutableで、quoteの方はimmutableだったりするんじゃない?
'(list 1 2 3) -> (list 1 2 3)
> list関数が作ったか、read関数が作ったかだけ。 なるほど、わかりやすいかも。
(let ((let '`(let ((let ',let)) ,let))) `(let ((let ',let)) ,let))
>>227 でジャンプに連載されてた、テニスの王子様描いてる人がその前ぐらいに描いてたCOOLって漫画思い出した。
>>223 実装が仕様って話かな
自分は、そういう意味でしか言語を理解できないけど
>>224 immutableじゃない。set-car!/cdr!出来る。
>>229 仕様そのものだ。
>>230 できるかどうかは実装依存じゃないのかな?
R6RSは知らないけど
232 :
デフォルトの名無しさん :2009/05/08(金) 22:12:53
>>230 R6RS だと immutable だよ
R6RS 5.10
>> 220 R5RSでも4.1.2にエラーだと書いてある。処理系に報告の義務がなかっただけ。
クォートしたリストはつまりリテラルなので、変更できないのが常識。
これからSchemeを勉強予定なのですが、 WindowsXPで遊ぶのにPLTとCHICKENどちらがお勧めでしょうか? もしくはその他お勧めがあればご意見をいただけますでしょうか
>>235 漏れなく開発環境もついてくることを考えると、PLT が一番無難じゃないかなあ。
chicken は windows だとビルドが面倒だったような気が。
遊ぶんだったら petit chez なんかでもいいかもしれんけど、
未だマルチバイトな文字に対応してないみたいだし。
237 :
デフォルトの名無しさん :2009/05/09(土) 10:37:31
プロジェクトオイラーって解き始めるとクセになるね。 Lisp以外では解く気が起きない問題も結構あるし 毛色の違う言語を2,3覚えた方が良いような気がしてきた。
>>237 > 毛色の違う言語を2,3覚えた方が良いような気がしてきた。
これってどういうこと?
Lispじゃだめなん?
project eulerと言えばhaskell
しかしifがwhenを兼ねるというなら mapがfor-eachを兼ねてもよさそうなものだが。
242 :
デフォルトの名無しさん :2009/05/09(土) 12:44:02
>>238 Lispがダメなんじゃなくて単に問題11はCの方が個人的に解きやすかっただけ。
プロジェクトオイラーの問題をいくつか解いたけど
解答はどこをみたらいいのかな?
解いたのはいいけど答えがあってるかどうかわからないので
悶悶としてきました。
Project Euler のサイトで回答を入れればあってるかどうかわかる。 このスレには貼らないでね。趣味で遊んでるんで、回答とか貼られると萎える。
>>242 ググると誰かの全問解答がみつかったかな
それか垢をつくると答えあわせができるんじゃないかな
垢つくつてログインまでしかしていないけど、なんかそんな感じだったよ
>問題11はCの方が個人的に解きやすかっただけ。
手続き型言語で解きたくなるけど、そこを我慢するのがLisper/schemmer
245 :
235 :2009/05/09(土) 13:58:03
>>236 >>240 ありがとうございます!
ご意見いただいた内容を意識してそれぞれ実際に触ってみたいと思います。
Win版は使った事が無いのだけれど 入門用には完成度の高いScheme48もオススメ R5RSに最も忠実な処理系だと思う もちろん独自の拡張も充実してる R6RS対応版であろう次期リリースが早くでないかとwktkして毎日のようにリポジトリを覗いてる
> (quote (quote (1 2 3))) '(1 2 3) > (list (quote (quote (1 2 3)))) ('(1 2 3)) > (' (quote (1 2 3))) *** ERROR
チャイティンのLispだと'はQUOTEの別名扱い (' (1 2 3)) ≡ (QUOTE (1 2 3))
(' (1 2 3))だとエラーになるね。Gauche。
>>235 日本語資料が一番充実してるのは Gauche だけど、Win ではちょっと不安定かも
あと、Common Lisp 寄りでときどき Scheme らしからぬとも評されたり
仕様に一番網羅的なのはおそらく Larceny で IEEE/ANSI から R6RS まで対応
事実上のリファレンス実装と言われることもあるらし
' は (quote) だから ((quote (quote (1 2 3)))) の意味になる
gosh> ((quote (quote (1 2 3)))) *** ERROR: invalid application: ('(1 2 3)) Stack Trace: _______________________________________ gosh>
MzScheme 様と Ypsilon 様は car が手続きじゃねえとお怒りです
だーかーらー!チャイティンのLispだと言っているでしょうがぁ CLならリードマクロテーブルをいじって通せるかもしれないけど Schemeは規格の上では通らない
S式に執着しなければ楽になれるのに。 syntax-rulesは良いね。consもquoteもmapcarもいらないから。
手続き名をかっこの外に出す方式は無引数の場合が大変そう
すべての関数は引数はひとつだけリストで渡します
lispからcへの可読な変換をしてくれるソフトないのでしょうか?
261 :
247 :2009/05/10(日) 18:55:58
>>216 同じようなの過去スレで見つけたよ。
LISP Scheme Part5
http://pc3.2ch.net/tech/kako/1023/10230/1023091882.html 98 名前: 93=95 投稿日: 02/06/17 10:43
>>96 もちろん、
(equal? '(a b c d) (list 'a 'b 'c 'd)) ==> #t
です。そういう意味では同じ。ただ、(list 'a 'b 'c 'd)は評価される
たびに新しいリストが作られることが保証されているのに対し、
'(a b c d)はコンパイラがあらかじめどっかにリストを作っておいて
そのポインタを返すだけ、とするかもしれない(処理系依存)。
(define (foo) (list 'a 'b 'c 'd))
(equal? (foo) (foo)) ==> #t
(eq? (foo) (foo)) ==> 常に#f
(define (foo) '(a b c d))
(eq? (foo) (foo)) ==> #tかもしれない
ひょっとして漢字コードを半角文字とみたときに "/"が入るような文字コードの文字は 処理できないのでしょうか? 2chのdatを読ませてるんだけど AAがよくあるdatだと、読み込みでバグって止まる
マルチバイトまわりは処理系依存なのでその情報だけでは不足 (\ でなく / なら普通問題ないはず) 処理系と対象ファイルの文字コード、あとできれば止まる前後のエラーメッセージなどplz
264 :
デフォルトの名無しさん :2009/05/12(火) 20:31:11
.NETってどうなん?
いいえ鉄です
268 :
デフォルトの名無しさん :2009/05/12(火) 23:49:10
>>264 .net系の net Scheme っての知らんの?
そんなのあるの?
>>264 asdf-installでProgram Filesフォルダーにいろいろいれてくれたりするのかな
と思ったらdefineでもdefunでもなくdefなんだ
271 :
デフォルトの名無しさん :2009/05/14(木) 11:00:47
272 :
デフォルトの名無しさん :2009/05/18(月) 00:22:56
(define (fact n) (if (zero? n) 1 (* n (fact (- n 1))))) という風に記述できない理由は何なのでしょうか? 再帰てきにはこちらの方が自然な気がするのですが... (Common Lispから来たのでSchemeとの違いにまだ戸惑っています。)
何なの、と言われましても
275 :
デフォルトの名無しさん :2009/05/18(月) 00:27:14
いや、どうして動かないのか気になりまして... 展開できるような気がするのですが.... あと、この関数を定義して使うとそのまま、フリーズしてしまうのが こまってしまって...
>>275 処理系書いてよ.動かないほうが珍しいと思うけど
最後のかっこが多い
すまん別に多くないか
279 :
275 :2009/05/18(月) 00:31:49
あれ.....端末から直接goshを使ったら動きました.... Emacsのrun-schemeから使ったら突然フリーズしたので 動かないのかと思いまして..... あと、立ち読み版Gaucheプログラミングでこのようなコードが (define (fact n) (define (fact-iter n ans) (if (zero? n) ans (fact-iter (- n 1) (* n ans)))) ; 最後に自分自身を呼び出している (fact-iter n 1)) 出ているのですが、上のコードとこれの違いはどこらへんなのでしょうか?
環境と処理系を書いてくれ。
>>272 でフリーズとか意味わからん。
もはや尋ね尽くされた質問だが,
>>272 が非末尾再帰呼び出しであるのに対し
>>279 は末尾再帰呼び出しになっている.
>>272 が「非」末尾再帰なのは
再帰呼び出し(fact (- n 1))の結果にさらにnを掛ける処理を行っているから.
リロードできてなかたorz
>>279 p56, 57あたり読んでみて。 って立ち読み版か。
>>272 は中間記法で書くと、
5*(4*(3*(2*(1*1))))って計算。
>>279 は、
1*(2*(3*(4*(5*1))))
なので、整数で交換律と推移律が成立するから同じ関数になる。
推移律だけで成立するような定義域の場合、(例えば文字列連結)
(define (fact n)
(define (fact-iter n acu)
(if (zero? n)
(* acu 1)
(fact-iter (- n 1) (* acu n))))
(if (zero? n) 1
(fact-iter (- n 1) n)))
末尾再帰はこんな形。
;; 文字列版
(define (fact n)
(define (fact-iter n acu)
(if (zero? n)
(string-append acu "*1")
(fact-iter (- n 1) (string-append "(" acu ")*" (number->string n)))))
(fact-iter (- n 1) (number->string n)))
common lispからpythonの機能をいろいろ使えるようにpython-on-lispを拡張してみました
http://d.hatena.ne.jp/niitsuma/20080328/1242595074 使い方の例
$clisp
(asdf:operate 'asdf:load-op :pythononlisp)
(py::py "print \"Hello from python\"")
(py::pyj "pylab.plot" '(1 2 3 4) '(4 3 2 1))
(py::py "pylab.show()") ;グラフの表示
(print (py::pyj "len" (list 1 5 6 ) ) ) ;3
(print (py::pyj "range" 2 7)) ;(2 3 4 5 6)
(py::setvalj "a" (list 2 3 4)) ;lispのデータをpythonの変数aに代入
(py::py "print a") ;[2, 3, 4] ;ちゃんと代入されてるか確認
(print (py::getvalj "a")) ;(2 3 4) ;pythonの変数aをlispのデータとして返す
(py::pyj "numpy.reshape" (list 1 2 3 4 5 6 ) (list 2 3)) ; -> ((1 2 3) (4 5 6))
(py::pyj "numpy.dot" '((1 2) (3 4)) '((1 2) (3 4)) ) ; -> ((7 10) (15 22)) ;行列の積
py::pyってのがエロイ。
中学生かおまえは
(. (. X Y
{ { x Y Cだと乳首が立つ。これが文化の違いってやつだな!
>>289 乳首は立ってるだろうがペチャパイに見える
貧乳乳首萌え…ないな
<< x Y なぜか「C++」までエロく見えてくる
この期に及んでも括弧の話とは恐れ入った。
う、いかん、想像してしまった・・・ もう"Y Combinator"とか恥ずかしくて女の子に言えない orz
Swankとは何なのですか?
λ. λ. X Y
>>296 SLIMEに附属する、lispのrepl環境をサーバ(デーモン)するプログラムのこと
これを使うことで複数の処理系のrepl環境を同時に使ったり、
リモートで立ち上げた環境を使うことができる
職安| λ…
>>298 ありがとう。
λ・・・SLIMEも良くわかってない俺orz
Swank-Gaucheというプログラムを公開してる人のブログを見つけたのですが、
初心者では使う必要もないでしょうね?
すげー便利だから頑張って入れてみれ
WindowsでGauche-BoxなんだけどSwank
入れれば幸せになれるかな。
Emacs難しいなぁ・・・orz invalid escape characterがパスのバックスラッシュだとわかるのに小一時間。 それからslime本体が必要だと理解するのに30分wwww やっとslime-2009-05-20というのを入れたら、 > An error has occurred while loading `c:/Program Files/Gauchebox/Meadow/.emacs': > > Symbol's value as variable is void: slime-lisp-modes そんなこと.emacsに書いてないんですけど…orz 今日はこの辺で勘弁してやる(TωT)
ありがとうございます。ただ自分が頭悪いだけかと思ってました(*^ω^*)
プログラマにしては表情豊かだな。 Lispをやると笑顔になるってか?
\(^o^)/
中村正三郎 乙
人居ないと思ったらリンガーに行ったのか。
ひょっとしてmaximaスレも他に移動してるのか
ん? Lingrはとっくに終了したはずだが...
いつからみんな、そんなに長崎ちゃんぽんが好きになったんだ……。
IRCでいいじゃない
何で Scheme って評価順が未定義なんですか? 左からで何の不満もないと思うのですが。
自由度があった方が最適化に都合がいいんじゃないかな。 たしかCも引数を評価する順序は決まってないんだよね。以前、仕事で 扱ったコードに評価順序を暗に決めてしまってたいたものがあって、 コンパイラのバージョンアップで評価順序が変わって動かなくなって しまったことがある。つかそのデバッグをやらされた。
>>316 遅延評価を積極的に持ち込むための布石として順序を未定
にしたんだと思ってた
処理系作る側から見れば, 引数をスタックに積む順番考えると
右側から評価するのが楽っちゃ楽だわな
>>317 右からが楽になるのは、不定長引数で引数の数を知らなくてもcalleeが
スタックトップからのオフセットでn番目の引数にアクセスできるからじゃない?
引数の数が固定、もしくは引数の数も一緒に渡す場合は右からでも左からでも
変わらないでしょう。
Schemeの場合、左から評価して積んどいた方がrest引数をリストに畳む操作は楽。
ところでなんでSchemeって (f . x) で (apply f x) と同じ意味にしなかったの?
わかりました (f x y) は (f . (x y)) だからですね ごめんなさい帰ります
(^o^)ノシ
練習でβ変換のプログラムを書いてるのですが質問 最左最内簡約の場合 ((lambda (x) (lambda (y) y) x) (lambda (z) z))を1段階簡約すると ((lambda (y) y) (lambda (z) z))ではなく ((lambda (x) x) (lambda (z) z))ですよね?
> ((lambda (y) y) (lambda (z) z))ではなく > ((lambda (x) x) (lambda (z) z)) この二つを区別する必要はあるの?
>>322 最左最内だと、まず(lambda (y) y) xここからだから正しい。
>>323 ウゼエ
つーか最初の式内の(lambda (y) y)は何の意味もないだろ ほんとに意味わかってやってんのか
( ゚д゚)ポカーン
gosh> ((lambda (y) y) 1) 1
>>324 ありがとうございます。
用語が色々ありすぎて自身無かったので助かりました。
>>327 クマー
で、2段階目はどうすんの?
>>322 ((lambda (x) (lambda (y) y) x) (lambda (z) z))
は
((lambda (x) ((lambda (y) y) x)) (lambda (z) z))
のコピペ誤り?
普通値呼びは最左最内簡約だと思う 自分の不勉強なだけかもしれないけど最右最内簡約って聞いた事無い カリー化のこともあるし右の項から簡約ってできるのかな?
三行目は「できるのかなぁ?(できない気がする)」って意味ね
右の項からの簡約も出来ると思いますよ 木構造のpre/in/post orderよろしく、以下の式には ((lambda (l) (l ((lambda (l1) l1) (lambda (l2) l2)))) ((lambda (r) r) (lambda (r1) r1))) ;最左最内 ((lambda (l) (l (lambda (l2) l2))) ((lambda (r) r) (lambda (r1) r1))) ;最左最外 (((lambda (r) r) (lambda (r1) r1)) ((lambda (l1) l1) (lambda (l2) l2))) ;最右最内 ((lambda (l) (l ((lambda (l1) l1) (lambda (l2) l2)))) (lambda (r1) r1)) の3パターン
そうか、ボケてた β基の簡約手段自体は変わらないんだった 右の方のβ基から簡約するようにするだけだからあり得る話だ 関数適用の結合を右結合にするのと勘違いしてた
I = λx. x として I (I y (I y)) でテストすれば4パターン全部わかる。
ここってDrSchemeも扱ってますか? 大学で使ってるんですが実行画面のキャプチャが出来なくて困ってます。OSはwindowsです。
>>336 その例だと(I y (I y))とI ((I y) y)の2パターンにしかならなくないですか
最内 I ((I y) (I y)) => I (y (I y)) => I (y y) => y y I ((I y) (I y)) => I ((I y) y) => I (y y) => y y 最外 I ((I y) (I y)) => (I y) (I y) => y (I y) => y y I ((I y) (I y)) => (I y) (I y) => (I y) y => y y
>>337 グラボのアクセラレータによる画面は普通キャプチャできないけど、その系かな?
>>341 パソコン初心者でよくわからないんですスイマセン。
Macだとcommand+shift+4とスペースバーでポインタがカメラになった後実行画面を選択するみたいなんですがwindowsにはそれにあたるものはないんですかね。
Windows板の初心者スレで聞け
343 :
デフォルトの名無しさん :2009/05/24(日) 13:18:38
PrintScreenボタン押せばいいんじゃね?
君、軽くイラっとさせてるのに気づかないタイプでしょ?
>>339 なるほど、最外も2パターンいけますね
私の勘違いかもしれないですが
1行目の最内の簡約は
最初は右側を簡約してるにもかかわらず、次に左側を簡約しているので
変じゃないですか?
最左最内であれば
I ((I y) (I y)) => (I y) (I y) => y (I y) => y y
となるように思うのですが
別の例を考えてみたのですが
M=(I1 y) (I2 y)
N=(I3 y) (I4 y)の時
((λx.x M) y) ((λx.x N) y)について
最左最内は(I1 y)から
最右最内は(I4 y)から
最左最外は(λx.x M) yから
最右最外は(λx.x N) y
339の例では、1行目は(I3 y)相当の箇所から簡約が始まっています
もし最左と最右以外の内部からの簡約も指すのであれば
最内簡約だけで、最大で2^(木の深さ)のパターン
考えられるようにも思います
ややこしいですが
(λx.x M) yは(λx.(x M)) yと書くべきでした。I Mとは別の意味です
>>345 左右とか内外と言うのは、最初に簡約する箇所ではなく、最初に探す箇所です。
最初に探した箇所で簡約できなければ、別の箇所から簡約を始めて良いです。
左右とか内外と言うのは、最初に探す個所ではなく、簡約する場所の探し方です。
>>347-348 ありがとうございます。やっと理解出来ました。
あと、関連して良サイトみっけました(Mosckw MLの人?)
ttp://ellemose.dina.kvl.dk/~sestoft/lamreduce/lamframes.html call-by-valueとapplicative orderってそもそも違うものなんですね
・いつlet束縛を展開するか(ζ変換?)
・どの展開形までもっていくか(WHNFや正規形など)
新しい用語が出てきて結果としては謎が深まりましたが
この辺、まとめてある資料ってないですかね・・
applicativeとかnormalとか言われるより
leftmost outermostとかで整理してある方が私には理解しやすいです
後、大雑把に言えば最右最内/最左最内の簡約は、
プログラミング言語では関数引数をどちら側から評価するか、
というだけの違いに思えてきました
Arc のアイディアってすごい惹かれるんだけど、どう思いますか? lambda が fn だったり let とか cond も 極力簡素にするスタイル。 [+ _ 10] は cut より直感的だけど、まぁ cut でも十分かな。 scheme で真似しようと思っけど hash table や 文字列を手続き的に呼んだりするのは無理だよね。
> hash table や 文字列を手続き的に呼んだりするのは無理だよね。 Gaucheなら出来ると思うけど。
object-apply メソッドな。 でも、あれって評価時にディスパッチされるんだよね? 性能的にはあんまりイケてないかも。 多用することは想定してないじゃろ
スマンスマン。 なんか勘違いしてたわ
>>357 ありがとうございます。
ちょっとずつ読み始めました&Miranda処理系入れました
しかし、大御所は太っ腹ですね
Super Combinatorって名前からして面白そうですが
そこまで行くのにはまだしばらくかかりそうです
あと、読んだ所までですが、
β変換自体の実装にα変換が必要ってのを知り
自分のβ変換プログラムのバグを発見してしまいました
いい本教えてくれてありがとう
comp.lang.lispのスパムを無視してくれるブラウザーみたいなのないでしょうか
>>360 >α変換が必要
って書いてあるじゃん。それで合ってるんだから、変なこと教えるなよ
lambda liftingって酷い名前だな 少なくとも自由変数と何か関係あるぐらいは一目でわかるように名前つけろよ・・・
>>358 自分も前にラムダ式を簡約するものをSchemeで書いたことがある。
高橋先生の本を読みながらやってたんだけど完全にはできなかった。
Arcのスレにすっごく巧み書かれたのがあったと思う。Arcが発表されて
まもなくだったので驚いたよ。
lambda liftingってscmのコンパイラhobbitでも使われているっていうアレかな?
コンビネータとかって実用的に価値はあるの?
なんかlambda droppingというのもあるみたいだ・・・もうワケワカ(w
実際にコードに適用させると副作用とかあるからそのままじゃいかんよ
368 :
デフォルトの名無しさん :2009/06/04(木) 06:47:01
schemeからCへの変換は、わりと可読性残したままできるものなのでしょうか
継続呼び出しをどう扱うかでえらいことに
371 :
デフォルトの名無しさん :2009/06/06(土) 12:09:16
Gaucheを使っているのですが、 渡された物がatomかどうか判別する関数って何でしょうか? CommonLispから来たのであまりわからないのですが atom?やatompが見当たらないような気がするのですが
>>371 (define (atom? x)(not (pair? x)))
ペア (コンス) も他の型と同様に型の一種でしかない。 「整数ではない」とか「文字列ではない」とかいったことを調べる述語が無いのに (それとも CommonLisp では有ったりする?) 「ペアではない」ということだけ調べる述語があると不自然、 というような価値観が Scheme では有るように思う。 かといってミニマムな仕様を好む Scheme で全部の述語に否定バージョンを用意するのは論外だし。
374 :
371 :2009/06/06(土) 13:55:12
>>373 たしかCommonLispでは
integerpとかstringpとかが有った気がします。
Schemeには政権を取ろうという意欲がない。 何故なら一方にCLという巨峰があり、汚い仕事でも引き受けてくれるからだ。 しかし、R6RSでは政権への意欲を見せた。 だが支持者からも反感を買い、最近は友愛の精神などとわけの分からない事を言い始めているが 結局は小沢の傀儡だろうとの批判が出ている。
>>374 > integerpとかstringpとかが有った
atom? は pair? の逆だろ?
integerp の逆とかが有るか? っていう話なんだけど。
377 :
371 :2009/06/06(土) 14:34:31
>>376 なるほど、よくわかりました。
Lispに置けるatomという概念がまだ良くわかっていなくて
了解しました。なるほど、Schemeはpair?の逆ということですね。
Common Lispはatomも属性の一つと認識してる部分がある気がします。
まー、atom処理したければ (if (pair? ... の else でいいし、 単独で使いたければ if じゃなく unless 使えばいい。 もちろん not つかったっていい。
vectorとかのコンテナもatomなのはおかしいと思うのはおれだけ? いやatomの定義が何なのか知らないので、おれの妄想の意見だが
えっ
コンテナがpairしかないならいいと思うんだわ
>>376 の意見は
でもよお
(container? (vector 1 2 3)) => #t (container? (cons 1 2)) => #t (define (atom o) (not (container? o))) なら納得なんだわ schemeの審美眼的にこの辺ほったかかしなのが謎だと思うんだわ
大抵の解釈では atom=それ以上分解することができないもの だよな? vector(やstringも?)分類上コンテナだと思うんだわ じゃあsymbolはどうなる?とか色々疑問は尽きない
仰るとおりで
pairと2要素を持つベクタとの区別は?
>>385 コンテナかどうかの話なのに、それがどんなコンテナか?
なんて区別の必要があるか?
必要なら個別にpair?とか呼べば?
俺はvectorがなかった頃に
>>372 が定石化してしまったから、
そのままatom?がない状態になっているのかと思っていた。
>>360 まだ全然読めてないですが・・
Cleanとかはグラフ書き換えによって名前衝突回避してるそうですね
Dockins氏のサイト、lambda式の評価器のコードがあったので
落としました。しかし、Haskell読めないという罠
>>363 >>368 のArcのプログラム見てみましたが
とても短いのに、そのままschemeに移植したら動いたので感動しました
α変換は暗黙的に置換に含まれてしまってますね
後、コード読んでて気づいたんですが
Arcのfn(lambda)式の引数部分とletはパターンマッチできる!
これはSchemeにも欲しい
;xがλx.Mかはテストしておいて
(let (lam var body) x
(do (prn lam) (prn var) (prn body) nil))
>>388 >
>>368 のArcのプログラム見てみましたが
>とても短いのに、そのままschemeに移植したら動いたので感動しました
すごくうまいよね。こりゃ、かなわんなぁと。
自分は素朴な方法で教科書どおりに書いていました。
すごい特殊な場合だけα変換が必要みたいに思いがちだけど 疑わしきは全部α変換しておけば確実だということと、 SICPに出てくる環境モデルのようなものが λ計算の変数の置換にも使えるということがポイントかな。
>>382 むしろ決められないから atom を定義してないんじゃね?
文字列→ char [] vector → void *[]
極端な話、整数だってビットに分解できるわけだしなぁ。 ベクタの例をとってみても 「ペアでない」=「アトム」 とは言えないという意見は納得できる。 でも、その方向でつきつめていけばアトムと 言えるのはビットだけってことにならないか? しかし、更に言えばビットで表現するのは実装の都合であって、 Scheme の意味論的にはそんなこと知ったことじゃないかもしれない。 何を以ってアトムとするかは状況によると思う。
なんで atom という common lisp の用語の話で scheme が出てきてるんだ?
実は AsTOMachine の略だったりして
common lispで書かれた数値計算のプログラムをStalinで動かしたいけど common lispのプログラム中にatomがあるので、どう翻訳しようか悩むことはある
それって悩むようなことかな・・
フォートランをcommon lispに変換したコードとか読める気がしない
Usenet上のcomp.lang.schemeをUsenetリーダーのアプリケーションから 読みたいのですが、newssaverというのは何処に設定すれば良いのでしょうか? Googleグループは便利なのですが、ニュースリーダーからアクセスできるともっと楽なのです よろしくおねがいします。
>>402 >gmane.org
ありがとう御座います。
comp.lang.schemeが見つからんとです。
ところでリスパーはどんな音楽を聴くニダ?
バッハだろう
いけてるリスパーはバッハなんか聴くんだ。 エレクトロニキスタの俺がバッハに耐えられるかな。
アニソン一筋30年〜♪
なんでも聞くぞ 各種民族音楽(日本の民謡も含む)からクラシック・シャンソン・ジャズ・ロック
リストじゃないの、やっぱり
>ところでリスパーはどんな音楽を聴くニダ? ここ20年音楽聞いてないかも
>>410 それでも括弧の奏でる旋律を感じたことがあるはずだ
最近楽譜見るとダカーポやセーニョダルセーニョが call/ccに脳内変換されるようになってきた。
楽譜も読めないし継続がいまだにわからない俺が来ましたよ。 やっぱりLisperならヒップホップだよね?
そろそろ雑談スレでも立てようか
どっかでgsllが遅いって言ってた人いたけど 行列の配列のcreate deleteをlisp側でやると遅いってことでいいの? cffi使うなら全部cで処理したほうがましってこと?
scheme/gaucheでscanlに相当する関数ってありますか?
つくるなら、 【色即是空 空即是色】Lisperのぼやきサロン【Lisp S式】 とでもしといて w w w
マ板に雑談向きなスレあったよーな
>>422 schemerにとって不満? lisperと書けば含まれていると思ったけど。
そういう意味じゃないと思うんだ。
SchemeはLispに非ず、Algolなのです! by 黒ちゃん
俺としては雑談スレというか、俺Lispの細かい仕様を相談したり プチ自慢したり遍歴ダベったりするスレが欲しいかな。 少々次元が低くても全然構わない空気の。
Lisperこそ真のプログラマーよ!! を乗っ取りする
スレ乱立しすぎだろ。Guileスレも結局、単発で終わったし。 本スレも過疎気味なのに、さらに分離すると…追っかけるの面倒
おまいらたまにはArcスレの事も思い出してやってください。
>>427 過疎っているのと、リアルが忙しくてかまっていられないだけだと思うよ。
低次元の話題は大歓迎なんだが。
というか、(Python) --.> guile --> lispと移行しようとがんばっているんだけど、sbclのasdf on gentooが動かなくて、パッケージとか、ライブラリが使えねーww
必要なログとか、晒すんで助けてください。
元カノのPython子とよりを戻そうかと真剣に考えたくなる。
でも、長年連れ添うなら、Lispのマクロって便利そうだよね。emacsのslimeも軽くて便利そうだし。
移行とかいわず、全部使えばいいと思うよ。 どんなエラーでるか、入門Common Lispスレのほうで晒してくれたらみたげるよ。 俺は仕事でSQLをいじるとPrologがいいなぁと思い、JavaをいじるとLispがいいなぁと思う。 しかしPrologをいじると、RDBMSのイロイロやっぱ必要だよな…と思い直し、 Lispをいじると言語以外のライブラリや商用サポートで現実に引き戻される。結局どれも捨てられない。
Gaucheを使っているのですが、 schemeのプログラムってどういう風に配布すれば良いのでしょうか? ユーザーにgaucheやパッケージ依存ならパッケージのインストールまでさせるべきでしょうか? すこし、敷居が高い気がするのですが... それとも、./configure && make && make installでバックグラウンドでgoshやパッケージを インストールする方式なのでしょうか? みなさまの方法をご教授ください。
並列処理でバーッと行こうぜバーッと。
>>433 NSISでインストーラーを書いてGaucheごと配布
>Lispをいじると言語以外のライブラリや商用サポートで現実に引き戻される。結局どれも捨てられない。 python on lisp
>>433 そういう用途ならPLTオススメ。
Gaucheでやるなら、
>>435 みたいに、本体ごと配布するのが面倒がない。
バージョンの違いとかで悩まなくていいし。
Franzとか商用サポートあるじゃないか! 仕事ではとても言い出せないけど
>>432 Common lispスレのほうに投稿しておきました。よろしくお願いします。
>移行とかいわず、全部使えばいいと思うよ。
サンデープログラマなんでさすがに無理です。でも、毛嫌いしているわけでなく、やるしかないような状況になったらやるんですが。
>Lispをいじると言語以外のライブラリや商用サポートで現実に引き戻される。結局どれも捨てられない。
時間に特別制約なくて、Lispでもあったほうが便利ならLisperなら単機能・簡易版でいいので作りたいところですね。(一応、理想だけは高く)
lispって糊言語的な使われ方って多いんですか?
雑談も良いけど、隔月刊か季刊でいいから丸ごとLispだけの雑誌が欲しいなぁ。 シローさんが連載持ったり、グレアムおじさんの文を翻訳したのとかも載せたり。 黒田さんの「黒板に書け!」みたいな記事とか。 中村正三郎さんがAS/400絶賛する連載記事・・・ってこれは関係ないかw
Scheme->C というコンパイラがあって、Stalin も最初はそれで記述されてた たぶんそのコンパイラ用のライブラリかと
schemeでslime並みにいたりれりつくせりな環境ってどれになるんでしょうか?
>>443 マジレスすればPLTSchemeになるんじゃないかと思う。
>>442 どこかでschemeにswank移植してたぞ
雑誌Lisp 100% が欲しいってか?rubyあたりではそんなムックは出てたね。 渋谷の連中に期待かな。
渋谷の連中って何
shibuya.lisp
創刊当時の月刊I/Oみたいな雰囲気でLisp/Schemeの記事満載の雑誌が欲しい。 無いもんはゲリラ的に自分たちで作っちゃうもんね〜というノリが懐かしい。 「Schemeで人工知能を」「Lispでロボット犬を制御する」なんてタイトルでさ。
shibuya.lispで会誌みたいなのをつくって見れば良いのでは 開催時に配布とか、プログラマの人も暇じゃないけど 今のshibuya.lispの開催間隔を見る限り記事一つ二つなら かけるぐらいの期間だろうから
>>450 > 創刊当時の月刊I/Oみたいな雰囲気でLisp/Schemeの記事満載の雑誌が欲しい。
月刊I/Oみたいな雰囲気というのがよくわからないけど。
雑誌の意味ってどのくらいあるの? すごくがんばって、季刊誌だろうから、タイムリーさは狙えないよ。
Webのほうがタイムリーさがあるから、Webでいいし。
本という形式にこだわるなら、専門書でいいと思うしなあ。
やっぱり、あれか、ノスタルジーというやつか。
連載「Lispで書くMultics」
454 :
デフォルトの名無しさん :2009/06/13(土) 00:33:26
>>452 興味の無い記事、専門外の記事も一緒に付いてくるのが技術雑誌のいいところなんだよ
Lispの雑誌なんて読んでたら女の子がうざいほど寄ってきて困るだろ。
>>454 ものすごく質が高ければ買うかもしれないけどなあ。
最近は、定期購読している雑誌はないし、新聞もWebで済ませちゃっているなあ。
本当は紙媒体で読みたいんだけどなあ。
興味なくても専門外でも、専門技術の記事で埋まってる雑誌なら喜んで買うぜ。 半分広告な雑誌ならノーサンキュー。
Lisp関連の学会の論文集読め。
論文集ほど堅くなくってのがミソなんじゃないかな? コミケとかで売ってくれないかなぁ。
comp.lang.lispで十分じゃね しかも雑誌みたいに広告もある
Oh!MZやOh!Xはいい雑誌だったな これでレポートが書けるとか言われたもんだ 今はこんな雑誌出せないのかなぁ
462 :
デフォルトの名無しさん :2009/06/13(土) 08:15:48
副作用がある関数の名前に ! を付けるのはナイスな慣習だと思うよね? マクロも名前だけでパッと見で分かるようにしたらいいと思うんだ。 だって、関数と違って引数が評価されないかもしれないんだよ。 例えば先頭を大文字にするとかがいいかな。
季刊 Lisp!
活動資金のない渋谷には本は難しいんじゃないかな。鯖とも手弁当なんでしょ。
>>463 年季入ったLisperに言わせると、!や?は発音にこまるからという話も。
「reverse!」「reverseね」「ちがうreverse!」「reverse?」「えっ」「えっ」
! 「あんせーふ」 ? 「ぷれでぃけーと」 reverse! 「りばーすあんせーふ」 reverse? 「りばーすぷれでぃけーと」
>>466 手弁当のほうが何の制約もなく、無闇に成果を出す必要がなくていいと思うが。
let* 「れっとあぬす」
記事すらほとんどないのに Lispの専門誌なんて出るわけないだろw
*はスターって読んでる
話題なんていくらでもある。
論文みたいにかっちり書かなくてもいいなら記事はあるでしょ。
記事にしないと話題にならない。
475 :
デフォルトの名無しさん :2009/06/13(土) 14:56:01
すいません、プログラッミングGaucheで勉強しよと思ってるんですが、 最初の方でEmacsでGaucheを使うっていうとこで ホームディレクトリに .emacs ファイルを作ったんですができません ↓どこかまちがっていますでしょうか? (modify-coding-system-alist 'process "gosh" '(utf-8 . utf8)) (setq scheme-program-name "gosh -i") (autoload 'scheme-mode "cmuscheme" "Major mode for Scheme." t) (autoload 'run-scheme "cmuscheme" "Run an inferior Scheme process." t) (defun scheme-other-window () "Run shceme on other window" (interactive) (switch-to-buffer-other-window (get-buffer-create "*scheme*")) (run-scheme scheme-program-name)) (define-key global-map "\C-c s" 'scheme-other-window)
何ができませんのか?
>>476 さん
C-c s で、そんなコマンドありませんって言われますorz
"\C-c s"ならC-c スペース sって意味になるから 多分C-c スペース sと入力すれば動く筈 C-c sにしたけりゃ"\C-c s"を”\C-cs"にしてみて
>>478 さん
ありがとうございます!!
御指摘いただいた箇所をなおしたらできました。
あと、先頭のutf-8のとこもおかしかったみたいでそこがよく分かりません
まじ感謝です。
481 :
デフォルトの名無しさん :2009/06/13(土) 16:18:01
A*アルゴリズムを使いたいけど実装方法がわかりません。 誰か代りに実装して
AIMAのサンプル見れ
(define a '(1 2 3)) と定義して (list 0 `,@a) は駄目なんですね。できてもよさそうなんだけどなぁ
@ってなに?
`(list 0 ,@a) 父さん・・・酸素欠乏症に罹って・・
>>483 perl では list(0, @a) とできますが
lisp 系では (apply list 0 a) と書きますね
>>486 あ、こういうときapplyか。ありがとう。
でも apply より (list 0 `,@a) の方が直截的で、何がやりたかったか明確じゃないですか。
これを許すとまずい事があるのかな。
apply や funcall 使うのがあんまり美しくないから
common lisp より scheme って人も結構いると思うんだよなぁ。
>>485 それだと (list 0 1 2 3 4) が返ってきちゃうよ。
Common Lispでやりたいのか、Schemeでやりたいのか どういう結果が欲しいか はっきり書かないと
>>488 ごめんなさい、最初に書いてなかった。schemeです。
>>487 > でも apply より (list 0 `,@a) の方が直截的で、何がやりたかったか明確じゃないですか。
そうか?
(0 1 2 3) がほしかったら`(0 ,@a)だな
俺は`(0 ,@a)ってやるな しかし、applyこんな風に使えるんだな
ちなみに `(0 ,@a) == `(0 . ,a) == (cons 0 a) == (apply list 0 a) パイソニアンが見たら青筋たてそうだな(笑
494 :
493 :2009/06/14(日) 12:55:30
あ、見た目が同じだけどリストの構造は違うものになるんだった。すまん。
>>491-492 リストが欲しい時はそれが自然ですね。
他の関数の引数に展開したい時は apply で我慢するかぁ。
>>490 違う?要は apply があんま好きじゃないってだけなんだけど。
scheme だと ((car (list + -)) 1 2) ができるって知った時はナイス!って思った。
(append '(0) a)
>>495 perl知らないせいか (list 0 `,@a) じゃ何がやりたかったかさっぱりわからなかった。
aの中身は実行時にしか決定されないからコンパイルするとlistでなくapplyが
呼ばれる。ソースコードに書いていないのに。むしろわかりにくい。
apply使うと損した気分になったり不愉快になる
病院へ池
Applyが嫌いならMicroSoftyなら良いのか?
502 :
495 :2009/06/14(日) 23:53:15
>>498 俺だって perl 知らないよ。
えー、分かりやすいよ。
apply って大体にして、scheme では変数をリストの先頭に置いて関数を呼び出せるんだから
実質、この用途 (リストに格納されている要素を引数として関数に渡す)
のためだけの関数でしょ?
`( ,@a) で展開できるんだから `,@a も展開できたっていいじゃん。
apply なんて不要になるよ。
quasiquote をとびこえて更に外側の括弧が表すリストの一部になるというのはダサいだろ。 list の場合だったらともかく、マクロだったらどう展開されるやら想像がつかん。 かと言ってマクロ展開より先にスプライシングするわけにもいかんし。
>>503 quasiquote の展開はリード時にやんなきゃ駄目じゃない?
とはいえリード時には関数かマクロかわからないしなあ。
確かに、単純な場合にはよさげにみえるけど、
ちょっと入り組んだことになっただけで落とし穴だらけになりそうだね。
aがリストかどうかもわからん
506 :
502 :2009/06/15(月) 01:03:52
>>503 あー、マクロ内で使われるとまずいのね。確かに。
apply だったら自動的に関数only だからそこは大丈夫だったのか。
んじゃ、マクロ内では `,@ は自粛でいいじゃんw。駄目?
だって apply も 関数にしか適用できないんだからお相子だって
507 :
502 :2009/06/15(月) 01:08:33
>>505 それはこれに限らず ,@ 全てが受ける制約じゃん
まあ、おそらく自分よりはるかに頭の良い人が必要だと思って 残してある機能なわけだから、、、と俺なら考えるかな。
>>508 paul grahamはこう言ってるよ。
http://tamo.tdiary.net/20080304.html#p01 > たとえば cond マクロ。こいつには Lisp 1 からこのかた余計な括弧がびっしり付いてきて、
> それを誰も何ともしてこなかった。
> if と cond を押しつぶしてひとつのオペレータにする Arc の技も、
> 誰かがとっくに見つけていたっておかしくなかったのだが、 間違いなくそんな周知の事実はない。
http://www010.upp.so-net.ne.jp/okshirai/arcll1-j.html > いくぶん躊躇しながらも、彼は伝統的なLisp
> のletが嫌いだ、なぜならletによって一段インデントが深くなるからだ、と認めた。彼
> が躊躇したのは、letは「正しい」ことだと原則としてはわかっているからだ。この点
> では、「誰にとって正しいの?」と尋ねなくてはならない。なぜなら彼よりも実際頭の
> よいプログラマがいるとは思えないからだ。
>>503 > quasiquote をとびこえて更に外側の括弧が表すリストの一部になるというのはダサいだろ。
一理あるかもしれない。見方によっては荒っぽくて汚い。
>>509 実装方針?quasiquoteをいじればできるのかな。どうすりゃできるだろ
盛り上がってるところ悪いんだけどマクロと関数を混同してるんじゃないかな。 (define (conc-len x) (apply + (map length x))) の定義のように、applyの最終的な評価の際に使われる引数が式の読み込み時に わかるという保証はないんだよ。,@じゃこの関数は定義できないでしょ?
>>512 ごめん、よく分からない。
,@ って実行時に展開されないの?
(define (conc-len x) (+ `,@(map length x))) じゃ駄目?
quasiquote まわりは全部 syntax だよ
gosh> (car ',@x) unquote-splicing
分かりやすいといいつつ続く文章が説明に全くなっていない件について。 自分の脳内が世界の全てって人なんだろうなあ。
>>517 えー、分かりやすいよ。
lisp って大体にして、言語を拡張できるのが売りなんだから
実質、この用途のためだけの言語でしょ?
perl で展開できるんだから lisp も展開できたっていいじゃん。
perl なんて不要になるよ。
replのreadの段で,@を自分の思うように仕込めばいいじゃん
>>518 > 実質、この用途のためだけの言語でしょ?
へー
>>513 一言で言えばnoです。
マクロと関数の違いについて理解していますか?式の変換と評価の違いがわかりますか?
backquoteは、
`(,x y ,z)と書くところを、
'(`x y `z)と書ければ、
'(x y z)との字面の対象性上は美しいが、
中を見なければquoteすら効率的に評価できなくなる。O(1)→O(n)
>>513 もそうだが、"全体"の構造や評価に影響を与える"部分"があるのはよくない。
Perlは展開「できる」というか、展開「しちゃう」言語なんだよな。
展開させないために、リファレンスという機能を使わなきゃいけない。
>>522 > "全体"の構造や評価に影響を与える"部分"があるのはよくない
ここ同意。美しくもないし、わかりやすくもないと思う。
そういう展開をさせたいという意志を、applyが一手に引き受けている現状のほうが、
俺には綺麗だし把握しやすい。
どっちがいいかっていうことには主観的な部分もあるだろうけど、 少なくとも Lisp はこういう理由でこういう選択をした、ってことだ。
525 :
513 :2009/06/15(月) 20:26:30
>>517 確かに説明になってなかったね。すまん。
>>519 自分の外の括弧に展開させることなんてできないんじゃない?
やっぱやろうとしたら要素に `,@ がある括弧は apply に読み替えるって
動作が必要だから、処理系の実装になっちゃうから無理だな。
しかもそのチェックがコストだろうし。
>>521 ,@ が実行時に展開してるように見えたから混同しちゃった。
どうやって ,@ は可変のリストを展開できるんだろうって思ったけど
たぶん apply に変換させてるだけなんだよね?
>>522-523 よくない派が多数か。んじゃやっぱあんまいけてないんだろうな。これはあきらめる。
お前ずばり、昔来たquote判ってないちゃんだろ ネタ提供ありがとう
横レスだけど、quoteとか評価とかってなにげに難しいですよね。 本読んでCPSやYコンビネータはわかった気になったけど、 何時までもquoteや評価のあたりで何かモヤモヤしてる。
>>525 あきらめるってのが良くわからないけど(まるでこのスレを起点に何かを動かすつもりだったみたいな)、
試しにそういう動作をするマイLispを作って遊んでみたらどう?
で、使ってみたらこんな感じだった、って報告を後日改めてここに書き込むとか。
>>526 その人とは違うよ。
>>528 そうだね。マイLisp作れたら面白そうだ。
汚いやり方でも少なくとも俺には合ってるからね。
俺がSICP読み終える頃には楽勝で実装できるんだろ、きっと。
>>529 quasiquoteは100行くらいか。
syntax だけじゃ多分無理だけど参考にするわ
quasiquote って効率を考えずに実装するだけならば外側から順に再帰的に consとappendに展開するマクロみたいな感じですむからそんなに難しくないと思う。 `@,で展開するのはもはやquasiquoteとは別の文法を導入しているような気が。 別にあっても悪くはないと思うけどもこれだけだと単なるapplyの中置演算子版みたいだし、 特殊な文法用意するのはlispらしくないし別にapplyつかえばいいじゃんということな気がする
>>530 SICP読破を目指して本ばっかり読んで頭でっかちになるより、ちゃんと手を動かして
コードを書きつつ試行錯誤して正しい理解を身につけてほしいと思う今日この頃。
べつにトンチンカンなことを言ってスレを賑わすのが悪いと言ってるんじゃないだが、
本に書いてある意味論以外に、コードがどういう流れで処理されて実行結果に
たどり着くのかという流れを理解してから物を言った方がいいよ。
それとquasiquoteのオレサマ実装ぐらいSICPなんて読まんでもHaskellの48時間で
書くやつで誰でもできると思うけど。
SICPは量は多いかもしれないが難解ではないよ。 本当に難しくなるのは、SICPで扱っていない枝葉末節が絡んできた時。
しかしapplyも変な仕様だよな。 Schemeも同じ仕様なのはどういうわけだろ。 (append (list arg1 ...) args)をas isにすれば、 コンパイル時に余計なコンスセルを消費しないのは確かだけど、 余計なお世話のような気がする。 便利主義の昔のLispはまあいいとしても。
彼は高校生くらいだろ 気持ちわかるよ 俺も滝に打たれるような気持ちでアセンブラ書いてた時期があったから これが済んだらスーパープログラマーになってるはず、みたいなw まあ無駄にはなってないけどさ
ふつう48時間かかるものが、 枝葉末節を知っているだけで生産性が100倍以上になるわけだ。
538 :
530 :2009/06/16(火) 22:10:10
>>536 おー、`,@ で展開ができるよ! ありがとう、面白い。
>>512 もできた。
mzsceme は #%app で関数実行の前に細工ができるのか。
#mzscheme よく分からないけど (require m) は (require "filename") だよね。
悪い意味じゃなくて、Gauche本がSchemeの全て な人が増えた気がする。
初学者に読んで貰うような本が出たら、 それしか読んでない人が増えるのは当たり前だわな。 アホですか?(悪い意味ではなく)
それしか読んでない≠それを全てと考える なはずなのにそれがイコールで結ばれじゃう単細胞が多いってこと
maximaのコードを高速化したい compileでcommon lispに変換はできる それをschemeで動くようにしてstalinで実行が一番高速なんだろうか
YpsilonとStalinってどっちが速いの?
stalinに決まってるだろボユゲ
stalin自身を高速化したいときはどうすんの
最適化をしないようなオプションを設定する(本末転倒)
stallinを動かすマシンを高速化する
Gauche本は参考文献を示していない。
>>550 だから?
別に気にするところじゃないだろ。
君も気にし過ぎでは。
schemeからcommon lispへのtranslaterはないみたいだけど 逆はあった. common lispからschemeに乗り換えて見ようかと思うんだけど 大幅に違うのは継続ぐらい?
>>553 Lisp-1とLisp-2の違いとか、結構色々違いがあると思うけど。
オレオレlispを作ってみたいのでちょっと質問 schemeでは#fのみが偽だそうですが Common lisp使いから見たらこれはどうなんでしょうか なんとなく、#fと()がどちらも偽のほうが使いやすそうには思いますが 問題になるケースがあったりするのでしょうか?
型チェックを厳しくしたいか、 (not-empty? x)の代わりにxが書ける簡便さを選ぶかの違い。 あなたのセンスで決めてOK
オレオレlispならいいけど、オラオラschemeを目指す場合、 意味が変わるので既存のschemeのコードがそのまま動かない 問題になるのはそれぐらい 既存のコードがきっちり動くってのはそれだけで楽しいから 昔scheme作った時泣く泣く準拠させたよ 中途半端はよくないと思った
なるほど。 作りたいのはオラオラschemeに近いので とりあえず#fのみにしとくのが無難そうですね ありがとう
>>559 それschemeじゃなくなっちゃうよ、Schemeみたいな俺Lispだよ
Schemeを名乗るならRnRSに準拠しないと。
Lisp属を名乗るだけならなんでもいいけどさ。
;;;; commonlispを名乗ると完成するまで大変過ぎる
変なのきた
SchemeはRnRSにあらず RnRSからSchemeが生まれたんじゃなくて RnRSは後からできたわけでしょ? 他人に使わせることや複数人で開発することがあるとすれば 規格準拠にしたほうがいいに決まっているけど
すみません、質問させてください 木構造のmapのiter版って作れるんでしょうか なんとかこんなのを書いてみたんですが、flattenされてしまってます (define (tmap f t) (define (aux f t r) (cond ((null? t) r) ((not (pair? t)) (cons (f t) r)) (else (aux f (cdr t) (aux f (car t) r))))) (reverse (aux f t ()))) (tmap (lambda (x) (* x x)) '((1 2) (3 (4 5)))) ;こうなって欲しい '((1 4) (9 (16 25)))
(define (tmap f t) (cond ((pair? t) (if (pair? (car t)) (cons (tmap f (car t)) (tmap f (cdr t))) (cons (f (car t)) (tmap f (cdr t))))) (else t))) こうかな >(tmap (lambda (x) (* x x)) '((1 2) (3 (4 5)))) =>((1 4) (9 (16 25)))
lisp/schemeでリファクタリングしてると、時間があっという間に過ぎてしまうんですが、同じ 経験をしている人いますか?
>>564 (define tmap (lambda (f x) (if (pair? x) (map (cut tmap f <>) x) (f x))))
>>564 普通に書くと再帰が二カ所あるので、単純な繰り返しにはできない
末尾呼び出し版でよければ、CPSでこんな感じ
(define (tmap f t)
(define (aux t cont)
(cond ((null? t) (cont t))
((not (pair? t)) (cont (f t)))
(else (aux (car t)
(lambda (r1)
(aux (cdr t)
(lambda (r2)
(cont (cons r1 r2)))))))))
(aux t values))
>>564 (define (tmap f t)
(define (aux f t r s)
(cond
((null? t)
(if (null? s)
(reverse r)
(aux f (caar s) (cons (reverse r) (cdar s)) (cdr s))))
((not (pair? t))
(if (null? s)
(f t)
(aux f (caar s) (cons (f t) (cdar s)) (cdr s))))
(else
(aux f (car t) '() (cons (cons (cdr t) r) s)))))
(aux f t '() '()))
On Lispに書いてあるみたく継続使ってもいいよね。
リストの入れ子ならともかく 木構造ならcdrも'()でもpairでもない場合があるだろ。
二分木ならともかく 木構造なら子が3個以上の場合があるだろ。
どちらも矛盾しないお
ただし564はそれを意図したものではないと思われる。
ローテク版。アルゴリズム的には一番簡単? (define (tmap func tree) (cond ((null? tree) '()) ((pair? tree) (cons (tmap func (car tree)) (tmap func (cdr tree)))) (else (func tree))))
この場合はどうする? (tmap null? '((() 2) (3 (() 5)))) ;こうなって欲しい ((#t #f) (#f (#t #f)))
(branch (leaf 1) (leaf 2))みたいにタグをつけないと (leaf ())と(branch)の違いが曖昧になるね
>>576 末尾再帰のものも、最初はそういうのから始めて継続渡しに変換して作る。
練習がてら、やってみたら。
(define (tmap f t)
(let loop ((t t) (r '()) (s '()))
(if (pair? t)
(if (list? (car t))
(loop (car t) '() (cons (list (cdr t) r) s))
(loop (cdr t) (cons (f (car t)) r) s))
(if (null? s)
(reverse r)
(let ((st (list-ref (car s) 0)) (sr (list-ref (car s) 1)) (s (cdr s)))
(loop st (cons (reverse r) sr) s))))))
>>577 carに現れる'()を要素とみるか空ノードとみるかの違い。
上の関数は4行目の list? を pair? にかえるという実にそのものの変更で所望の動作に。
(quote ())と(#%app)の違い。
581 :
564 :2009/06/22(月) 23:39:28
みなさん色々ありがとうございました。
>>567 はとても短いし
>>568 はすごく参考になります
主に
>>568 を参考に、
>>571 や
>>577 のケースも含めて動くものを書いてみました。
(define (tmap f t)
(define (aux t cont)
(cond
((and (pair? t) (null? (car t)))
(aux (cdr t) (lambda (r) (cont (cons (f (car t)) r)))))
((null? t) (cont t))
((not (pair? t)) (cont (f t)))
(else (aux (car t)
(lambda (r1)
(aux (cdr t)
(lambda (r2)
(cont (cons r1 r2)))))))))
(aux t values))
以下のパターンで動きます
(tmap (lambda (x) (* x x)) '((1 2) (3 (4 5))))
(tmap (lambda (x) (* x x)) '((1 . 2) (3 (4 . 5))))
(tmap null? '((() 2) (3 (() 5))))
(tmap (lambda (x) (* x x)) ())
ドットペアについては方針が分かれるよな リスト表現としてのツリーを普段どう見てるか ・対応する →初心者 ・無視する →中級車 ・エラーにする →高級車
car だけに
クダーらないギャグを言うなよ。
てめーもクッダらねーぞ
こんな時だけ加速するなw
carだけに
ヌルポ
590 :
576 :2009/06/25(木) 07:06:29
時間ができたので継続渡しの再帰版を書いてみた。
もう
>>564 氏のカタはついたようだが、すこしだけ短くなった気もするので
エロイ人からの突っ込みを期待して書いておくことにする。
(define (tmap f t)
(define (tmap-cps f t cont)
(cond ((pair? t) (tmap-cps f (car t)
(lambda (x) (cont (cons x (tmap-cps f (cdr t) values))))))
((null? t) '())
(else (cont (f t)))))
(tmap-cps f t values))
つ ((null? t) (cont t)) tmap-cps自体を関数として使うつもりがあるなら 内部でvaluesを決めうちしちゃだめよ
>>590 次はクロージャを使わずに継続をスタックで表現してみよう
>>590 >(cont (cons x (tmap-cps f (cdr t) values)))
部分式の値は一時変数に入れてから使う。
(tmap-cps f (cdr t) (lambda (y) (cont (cons x y))))
本当は
(cdr-cps t (lambda (d) (tmap-cps f d (lambda (y) (cons-cps x y cont)))))
と書きたい。
http://en.wikipedia.org/wiki/Continuation-passing_style >The key to CPS is to remember that
>(a) every function takes an extra argument, its continuation, and
>(b) every argument in a function call must be either a variable or a lambda
>expression (not a more complex expression).
GIMPのscript-fu (基本的にR5RS準拠) では 真偽値 #t, #f とは別に TRUE, FALSE の定数が用意されています。 標準のダイアログで真偽値を受け取ると TRUE, FALSE で受け取ってくるので 条件判定を (if (= flag TRUE) 処理) と書かなければいけないのですが、マクロなどを使って (if flag 処理) と書けるようにするにはどうすれば良いでしょうか?
>>594 うちのWindows上のGIMP 2.6.6でマクロを評価すると、
Script-Fuコンソール固まるから詳しいことは言えないけど、
hygienicじゃない伝統的なマクロは使えるみたいだから、
(define-macro (dialog-if test then . else)
`(if (= ,test TRUE) ,then ,@else))
みたいなのでいいんじゃないか。
最悪、マクロ使えないなら、他の処理系でS式変換すればいいと思う。
再帰を全て末尾再帰に変形する手続きとか論文のネタになってそうなものだけど どなたかご存じない?
CPS? foldrとfoldlの双対性?
>>595 GIMP2.6.5で試したところ期待通りの動作になりました。
ありがとうございます。
最近思うこと schemeはカリー化を言語組み込みでサポートしたほうが シンプルになるように思うんだけど 今からそんなことをせずともpa$もcutもあるわけで R6RSはすでに十分実用的になってしまった感がする R5RSまでのシンプルさのが、良いなぁ
前にも言ったけどね R5RSのマクロはcons, quote, quasiquote, mapなど一切使わないで書けるよ という意味でLisp界にとって危険な存在だからね 黒歴史ということにしたい人もいるだろう
カリー化って引数の並び順に依存するから そのままだとあんま便利とは思えない。 名前付きのキーワード引数をサポートして オプションを固定化するために使えればいいけど。 (define (http cmd host port url auth ... )〜) (define htttpa (http :host "192.168.10.2" :auth "")) (httpa :cmd "GET" :port 8080 :url "/") でも引数全部埋めないと実行できないから不便か
引数を全部埋めるってのはデフォルト値の提供で解決するが しかし、どちらにせよ名前付き引数は嫌いだなぁ 5引数あって3引数埋めたら 2引数の:hoge :fugaを埋めたら使えるカリー化関数になるが これってつまるところ、structuralに型がついた関数なわけで ちょっと息苦しい 大体、引数が2個か3個の関数は多いし 引数の順番を入れ替えるのは3引数のflipみたいなのを使えばよくね (map (- 1) '(1 2 3)) (map (flip - 1) '(1 2 3))
>>602 うん、だからカリー化って意味ねーなと思って
つーかカリー化前提でデフォルト値の提供ってどうすんの?
そもそも引数たくさんあるような関数なら
自力でmake-httpみたいなパラメータ固定化手段を用意するだろうし
足し算とか、引数の性質が簡単なやつならカリー化もいいけど
引数に値と関数を取るようなやつとか、
関数をいくつも引数にとって関数を返す関数なんかをカリー化したら
保守できなくなりそうだよ
>>599 試しに作って公開してみてよ
カリー化はS式にターメリックやらスパイスを使えばいいよ
それ何て
ここできいて良いかわからないですが gauche-glをcygwinで動かせた人います?
やったことないけど出来るはず。 ちなみにMingwでは出来た。
cygwinで0.8.13では動いたよ 0.8.14ではなんかしらんがコケた
OpenBSDでguile-1.9.0のビルドがコケるんでソースを追ってみたんですが guileもboehm-gcを使ってたって知りませんでした それも5.2とか古いver よく今まで動いてたなとゾッとしました(メジャープラットフォームでは問題なかろうけど) Changes in 1.9.0を読んでかなりワクワクしながらビルドしたんですけど コケるんで萎えて放置中 偶数版リリースまで待ったほうがいいのかなぁ 1.8までのプラットフォームでちゃんと動くようになれば2.0はかなり期待大
>>608 これを聞いて、mingwのインストールからやってみましたが
私には無理でした。gauche-glのmakeで失敗します
具体的には(home-directory)が#fを返すためにそこでmakeが止まります
gaucheのmingwでのビルドでは全てのテストにパスしていない
(make testは9050/9067 pass)のが原因かもしれません
cygwinは全然だめで
./configure --includedir=ほげ --oldincludedir=ふがを
windowsとcygwinのパス表示で色々試しましたが
GLUT/glut.hどころか、Cのヘッダ(sys/types.h等)も
configureでnoになります。
(gaucheのインストールでは普通にyesになります)
なお、glut自体はcygwin/windowsで動作確認済です
Gauche-boxの存在にその後気づいてインストールしたのですが
バイナリ配布されているgauche-glは
リンク切れになっていました
なんでもいいのでwindows環境でgauche-glが使いたいのですが
バイナリ配布してる箇所って、他にないですかね・・
ほげとふがをわはとむすにすればうまくいくかもしれない。わけない。
>>614 悪い
今再Up中だからちょっとまってくれや
>>613 どうやってビルドしているんだろうか。詳しい手順が知りたい。
618 :
611 :2009/06/28(日) 21:39:27
>>616 再アプ乙です!!
今、gauche-glの動作を確認しました
これで思う存分図形言語で遊べる、ありがとう
>>617 忘れた。
でも、ひっかかったのはしょーもないことばっかりだった気がする。
ひっかかったところをそのつど修正すればだいたいいけるよ。
もしかしたら Gauche 自体もちょっとは弄ったかもしんない。
>>618 Cygwin でなくてよかったんかい?
Mingw でビルドした Gauche はいくつかの機能が使えないよ。
重大なのはプロセスとスレッド関連くらいだけど。
問題ない 窓使いでcygwin版を使いたがる人は少ないはず
schemeをさらにシンプルにしようと思って こんなのを考えてみたんだけどどう思う? consセルだけのほうが ()について非対称なリストよりもシンプル ;consセル版fold (define (cfold f a b) (cond ((not (pair? b)) (f a b)) (else (cfold f (f a (car b)) (cdr b))))) (define (cfold1 f lst) (cfold f (car lst) (cdr lst))) ;reverseがリストよりもシンプルで効率的に(appendなしで)書ける (cfold1 (lambda (x y) (cons y x)) '(1 2 . 3)) ;このままだと、「空」が表現できないので ;consを仮にこんな風に定義してみる ;()なら無視するcons (define (conss x y) (cond ((null? x) y) ((null? y) x) ;片側だけのほうがよいか? (else (cons x y)))) ;末尾に()がないと思っても良い (cfold (lambda (x y) (conss y x)) () '(1 2 . 3)) ;←これを言語レベルで'(1 2 3)と表記 (cfold (lambda (x y) (conss y x)) () '(1 2 3))
「リストを末尾の要素に持つリスト」はどう表現するの、それ。
普通に'(1 2 (1 2))という感じです (cfold (lambda (x y) (conss y x)) () '(1 2 (1 . 2))) (cfold (lambda (x y) (conss y x)) () '(1 2 (1 2))) ただ、空リストからなるリストは表現できないので これは不備だなぁ conssを片側だけにしてもreverseは動かないし
ああ、言ってる意味がわかった (cdr '((1 2)))が()だから今動いてるけど そうじゃなかったら動かないですね そういう意味ではリストの末尾は必ずatomじゃないとダメになるから これじゃダメだ
ボクの考えた最強のLISP(Scheme)!
ってネタは尽きないよな
気持ちは判るが、妄想垂れ流す前に一度それで組んでみろよ
>>622 みたいなのはすぐ作って確認できるだろ
どう思う?って、俺はまたキチガイかと思ったよ
>>626 作らない奴はクソだ,と思っているんだろうけど,
設計は設計で,そっちも大事だと思うぞ。
全部作ってみろで返すのはひどい。
そういうネタだらけでスレが埋まってしまうのは困るけど 閑散としている時のネタとしてはアリじゃないかな
S式を2分木として見ればどうやっても歪に見える ドットペアを含むリスト(1 2 . 3)は /\ 1 /\ 2 3 リスト(1 2 3)は /\ 1 /\ 2 /\ 3 nil 主観ではcdrがconsかnilに統一されてる後者の方がシンプルだと思う 前者はcdrがatomという可能性をいつも意識するからハゲそう
竹内先生の入門本が増補改訂版で出るらしいんだが、 Schemeなのかな。CLなのかな。
ICFPのプログラミングコンテスト、Steele兄貴の招待講演が Organizing Functional Code for Parallel Execution: or, foldl and foldr Considered Slightly Harmful ってなってるが、foldは悪なのだろうか 内容が気になるな
演算がmonoidalならfoldも並列化できる (x + y) + z = x + (y + z) { associative } x + e = e + x { unit } x + (y + (z + e)) = (x + y) + (z + e) (((e + x) + y ) + w) = (e + x) + (y + w) ちなみにこれはfoldlからfoldrへの相互書き換えが可能になる条件でもある 多分この辺がslightlyに留まる理由で、 結論としてmonad最高!!ってな流れになったりならなかったりという予想
うはxxxxxxxxxおkxxxxxxxxxxxxxxxx
>>634 書店の人が出版社に確認してくれた。当初予定より遅れて
平成21年12月2日だそうだ。楽しみだね。
入門Gaucheで勉強してるけどp64から急に難しくなってきたぜでもがんばるぜ
LittleSchemer読もうぜ
竹内センセの本が出るのか。それは全力で買いだ。
一冊あれば十分だけどなw
増補で付録とか付くんかな? 竹内先生の本は持ってるけど、記念で買おう。
lisp本、wktkしてきたぜ。
初めての人向けじゃなくって もっと突っ込んだの書いて欲しいな
竹内先生監修シリーズって感じで、5人ぐらいに書かせればいいんじゃねえ?
Lispじゃないけどそういう感じの本あったよね。 意外と面白くなかったw それより雑誌bitのTAOの連載を合本したら面白いのに。
今思えば、ビューティフルコードは初心者に媚びない所だけはよかった 日本であれぐらい書ければ、もっちーがファビョることもなかっただろうに
>>647 あの本は初心者向けの本じゃないよ。
Lispマニア向けの本だ。初心者が読んでもそれなりに楽しめるけど。
LISPの本と思わずに、T先生と生徒のかけあいを楽しめばいいんだ。
初心者向けと書かれるとおれそんなんじゃないし読むことないや と結局買っても積んだままにしてしまう お決まりの言語のおさらいを数章割かれてるのを見ると頭に来るからだ いっそのこと超上級者向けのが興味をそそられる
だから1章で飽きて放り投げちゃったんだよ。
目次みて1章はつまんなそうだと思ったら3章あたりから読み始めればよかったのに。
良い本は、 例え初心者向けと銘打たれていても、 光る記述で満ち溢れており、 熟練者でも楽しめるものなのだ。 だからグルの書いた本は面白いのだ。
苫米地先生の事ですね。わかります。
>>658 ビビッタ。
実は、最近なぜか洗脳について勉強していたりする。関係あるの?
Lisperじゃん。
661 :
デフォルトの名無しさん :2009/07/04(土) 02:02:46
とまちゃんだけはガチ
sage忘れたすまぬ
竹内本は目次の時点で駄目だな
無縁の衆生ですな。
The Little Schemer買ったお。たくさん勉強するお。
shibuya.lispどうだった、行った人?
>>667 面白かったよ。#4あるならLTしようと思ったくらいには(TTはなんいどたかい)。
すみません、以下のプログラム想定外なことだらけなのですが 以下のs1で、値が変更出来るようなプログラムは書けますか? schemeは値渡しなので無理なような気もしますが また、test関数では内部でtをset!しているにもかかわらず その変更は影響がないように見えますが何故なのでしょうか (define (s1 t v) (set! t v)) (define (sa t v) (set-car! t v)) (define (sd t v) (set-cdr! t v)) (define (sa2 t v) (let ((r (cdr t))) (set-car! r v))) (define (test f) (define t '(()())) (let ((r (f t 1))) (print t) (set! t '(()())) r)) (test s1) (test sa) (test s1) ;why? (test sd) (test sa2) ;(map test (list s1 sa sd sa2))
引数のバインディング変えても外からは見えないだろ。 int f(int x) { x = 10; } やってるのはこれと同じ
>>669 set! は変数とオブジェクトの結び付き (束縛) を付け替えるオペレータ。
set-car! や set-cdr! はオブジェクト (consセル) の中身を変更するオペレータ。
ってことを念頭に置いて考えるとわかりやすいかも。
あまりに根本的すぎることなのでそこを理解できてないようだとちょっと説明しづらい。
> また、test関数では内部でtをset!しているにもかかわらず > その変更は影響がないように見えますが何故なのでしょうか 処理系がわからんから何とも言えんが、 おそらくその処理系は、クォートされたリストをすべての関数呼び出しで共有するように作られているんだと思う。 test 内の (define t '(()())) のところでは、 すべての関数呼び出しで共有される '(()()) というリストを t に束縛する、みたいな処理が行われる。 そこで、(test sa) を実行してしまうと、そのリストが '(1 ()) に書き換えられてしまう。 そのため、次回以降の test の呼び出しでは、'(1 ()) というリストが t に束縛されてしまう。 そもそも scheme では、クォートされたリストに set-car!、set-cdr! しちゃいけないことになってるので、 こんな処理をすること自体が間違い。 やるんだったら、毎回リストを生成するようにする。 (define t (list '() '())
問題をきちんと理解してから解答を考えよう って約束したじゃないですかー
>>672 > 処理系がわからんから何とも言えんが、
むしろ何も言うな
おまえがな。
shibuya.lispの参加者、もっと感想・ネタを書いてくれ。 悪口・不満的な話は、直接、主催者にメールでもしてくれ。
いずれ上がるだろう動画を楽しみに待つ
678 :
デフォルトの名無しさん :2009/07/05(日) 15:48:43
ニコに挙げたのか つべで探してたわ
感謝。既に上がってるのは想定外だった
681 :
デフォルトの名無しさん :2009/07/05(日) 15:54:39
>>670-672 ありがとうございます
>>671 関数の引数はjavaのように、
実体を指すポインタのコピーが渡ると考えれば良いですよね
set!だとコピーしたポインタ自体を変更しても元データには全く影響がないが
set-car!だと、コピーしたポインタの指す先を変更するので
引数にset-car!しても破壊的変更が可能
だとすれば、参照渡しで実現出来る
関数の実引数の実体を直接書き換えるような
関数の作成は不可能ですね
>>672 >そもそも scheme では、クォートされたリストに set-car!、set-cdr! しちゃいけない
これは初めて知りました。これが原因ですね
コードはGaucheとGuileで試したのですが
どちらもクォートされたリストは共有されるような実装ってことですね
>>682 > クォートされたリストは共有されるような実装ってことですね
確か Gauche の場合は REPL が起動してるときは共有されないはず。
だからといってそれを期待しちゃだめなんだけど。
Gauche のマニュアルから引用 ↓
注: R5RSは、リテラル式の値を変更するのはエラーであるとしています。
しかしGaucheはペアとベクタについてはそれが定数であるかどうかをチェックしておらず、
set-car!やvector-set!等の破壊的手続きによってそれらの値を変更してもエラーは報告されません。
そうした場合の動作は不定です。
参照渡しって何か ダイナミックスコープっぽいような気がするけど この二つは何か関係あるのかな?
全く関係ない。 参照渡しは仮引数/実引数バインディングスタイルの一つ ダイナミックスコープは自由変数のルックアップスタイルの一つ
そんなめんどうな話なのか? 局所変数と大域変数の話なのでは。 湯浅先生の「Scheme入門」だとP32〜。
koguro さんのトークは資料が見やすくていいなー
いちいちそんな糞本挙げなくていいよ
湯浅先生を糞呼ばわりできるお前って何様?
俺は
>>689 じゃないけど、その先生が立派な人で、その本が立派なものだったとしても時代にそぐわなくなることってあると思うんだよなー。
湯浅先生の名前があればもう否定しどころがないみたいな言い方じゃなくて、もっと良い点と悪い点を検討する必要はあるんじゃないの?
もちろん、糞本って言う方もどのへんが糞なのか示さないと議論にならんけど。
とりあえず糞って言っとこう的な煽りは2chの華だねw
たいした人でもないのに いちいち先生つけるなよ
何の脈絡もなく 湯浅の糞本持ち出す687ってなんなんだろう?
名著はちゃんと読んだ方がいいと思うぞ。 おっと、ここは2chだったな。玉石混交ですな。
読む本は選べ 時間の無駄
嫉妬ってみっともないなとオモタ
糞本の宣伝に嫉妬とか
釣れますか
湯浅の本なんて有り難がってよんでんのか
ところでここLispスレ
うっかりSICP
>>677 そういうことじゃないだろ。
実際に参加したの感想が聞きたいんだが。
いいアイデアが浮かんだとか、もっと○○の分野を勉強しようと思ったとか、その他いろいろ。
マ板行けよ
Scheme入門はちょっと古すぎる気がしないでもないな 内容もCommonLisp入門とほぼ同じだし。 でも絶版とはいえ某所でpdfでくばってたから結構読んでる人は居るんじゃないかな
>>701 ありがたがってるかどうか別として、先人への敬意が無い連中って
人として問題ありってことだと思うよ。
世界初のCL実装
世界初のCL実装でしょ。 MITあたりの人達もびっくりしたという。
Little Schemerに出てくるYコンビネーターってどういう利点があるの? 難しくてめげそう。だれか教えれ。プリーズ
実用上たいして意味は無い (define (fact n) (if (= n 1) 1 (* n (fact (- n 1)))) みたいなのを、factっていう名前を使わずに 無名関数のみで定義できるという意義がある
そうそう。KCLをわずか2人で開発した日本が世界に誇るLisperだぜ。 本の内容は今となっては古い部分もあるが基本的な考え方は変わらないだろ。
util.sparse が組込みになってないのは、 やっぱ普通のスクリプト言語的用途だと従来のハッシュテーブルの方が効率はいいってことでいいんだよね?
>>710 無名関数のみで定義できるという意義ってナーヌ?
λ計算には関数定義なんてない 無名関数だけで再帰の計算が出来ることがわかれば λ計算だけで、色々な計算が出来ることが示せるわけ
スマヌ。 λ計算だけで、色々な計算が出来ることが示せると何が証明できるの?
ちょっとは自分で調べれ チャーチ・チューリングとかでググってみそ
>>717 ググッた。
「チャーチ=チューリングのテーゼとは、「計算できる関数」という直観的な概念を、帰納的関数と呼ばれる数論的関数のクラスと同一視しようという主張である。
このクラスはチューリング・マシンで実行できるプログラムのクラス、ラムダ記法で定義できる関数のクラスとも一致する。
よって簡単にはテーゼは、計算が可能な関数とは、その計算を実行できるような有限のアルゴリズムが存在するような関数、
よっておおよそコンピュータで実行できる関数と同じだと主張する。」
つまり、「SchemeはYコンビネータがあれば計算可能な再帰関数を有限のステップで計算可能ですYO!」ってことでおk?
「あれば」じゃなくて「あるので」の方が正しいニホンゴかなw
schemeはYコンビネータを使わなくても計算可能な関数は計算出来る 普通の名前つきの再帰関数やletrecなどが実質Yコンビネータに相当
>普通の名前つきの再帰関数やletrecなどが実質Yコンビネータに相当 おお、そういうことなのか。でもよく考えると「計算できる関数」ってどういう意味かわからん。 とりあえず漏れの使う程度の関数は「計算できる関数」ってことか? じゃ、無限ループするようなバグがある関数は「計算できない関数」ってクラスなのか? どういう違いがあるとそうなるんだろう?
「Lisp脳」の謎に迫る - Schemeプログラマの発想
http://karetta.jp/book-node/gauche-hacks/023107 上のページのように問題をリストの加工と捉えて
(map 何らかの加工 (iota 100 1))
という風にすると、確かに処理が分かりやすいんだけど、
一旦、処理の過程の無駄なリストにメモリが使われますよね。
iota 10000000000 とかリストがでかくなった時を考えると、困ると思うのですが
僕が神経質なだけでしょうか。
(map f (iota 100 1))の場合で、仮にリストを順に辿って最後に結果を返す関数をgとして (g (map f (iota 100 1))のようにすればgの実装次第では コンパイルの結果、Cでfor (i = 1; i <= 100; ++i) {...}と書いたようなループになって 中間リストは一切作られない…ような最適化をする為の理論とかはあります common lispのseriesライブラリ等は、この手の中間リスト消去をある程度してくれると聞いてます
>>722 無駄を省くプログラミング技術はLisp, Schemeでも重要。
ただし、よいプログラマは本当に無駄なところだけ、改良しようとする。
(iota 1 10000000000)のセル消費が他に比べて負担が
大きいプログラムの多くはトイプログラムじゃないですか?
Haskellでも使えばいい
>>722 SICPにある遅延を使ったストリームによればいいんじゃない。
今のコンピューターはたっぷりメモリがあるんだし富豪プログラミングでも
いいとは思うけど。
>>721 「ゲーデルの世界」(海鳴社)にそういった計算可能関数の話があった。
今、読んでいるところ。λ、チューリングマシンとの関係の説明も
あったと思う。とりあえず原始帰納的関数から理解しようとしている。
Schemeが理解の助けになるかもしれない。
>>723-726 ありがとうございます。
>>724 >本当に無駄なところだけ
やたらめったら改良するより、労力のコスパが高いところを見つけて改良すれば十分って話ですよね。
>>726 3.5.1にこの話題が出てますね。
ちょっと難しいけど、これがベストな解決策だろうなぁ。
遅延ストリームを使い始めると、何でこれ遅延ストリーム使わないの!!って思うようになりそうだ。
>富豪プログラミングでもいいとは思うけど。
反復だと時間さえかければ解けるものが
リスト渡しだと記憶空間の限界に達したら絶対に解けないというのは
僕には気持ち悪さが残ります。
足りなくなったら考えればいいのよ
2000年問題、文字コード、IP枯渇・・・
>>727 チャーチ=チューリングのテーゼによれば、アルゴリズムのある関数は全て計算可能である。
つまり、アルゴリズムを学ぶことが計算可能関数を学ぶことに相当している。
そしてアルゴリズムを学ぶ際にはSchemeが理解の助けになる。
簡単にまとめると、「Yコンビネータがあるチューリング完全な言語ではアルゴリズムのある関数は全て計算可能である」ということになる。
あたりまえの事だけど、数学的に保証してくれてるので安心してプログラミングして計算ができるわけだ。
Yコンビネータの話とλ計算の話をごっちゃにしてはいけない。 コンビネータの話とλ計算の話はもともと別の話。それが途中で コンビネータの理論はλ計算の理論に翻訳可能だとわかったので、 同時に語られることが多いというだけ。 コンビネータ理論の歴史は古くて1920年代にSchonfinkelと言う人が始めて Curry(カリー化のカリー)が発展させた。
Yコンビネータに関する疑問について言えば、Yコンビネータの存在意義という のは、確か再帰の概念が存在しない言語において再帰と同等の物を導入するため、 だったと思う。
そういえば、ものまね鳥、あれからすぐに図書館に 返したんだけど。借りられたかな。
ここで
>>368 のリンク先にあるラムダ式を簡約するArcのプログラムを読むと感動すること請け合いである。
>>713 詳しいことはドキュメントに書いてあるよ
まだ実験的なものかと思ってたのでドキュメント見てなかった でも、英語の説明しかねーや。 読むのめんどい。 ところで、 sparse って名前だと sparse な何かわからんので、 モジュール名はあんまりよくないと思った。 Scheme 処理系に入ってたら、 S式をパースするものっぽい気もしてしまう…
保守的GCと心中する気がなければ、ただの一時しのぎだろ
>>737 > Scheme 処理系に入ってたら、 S式をパースするものっぽい気もしてしまう…
その発想は鳴かった
>>731 計算可能な関数には3つの系譜があるようだ。
○ゲーデル〜クリーニ 一般帰納的関数
○チャーチ λ−定義可能な関数
○チューリング チューリングマシンで実行できる関数
ゲーデルの流れだと原始帰納的関数は計算可能関数。
Lispの本の例題に登場するアッカーマン関数は原始帰納的関数ではないのだけど
帰納的関数であり計算可能関数らしい。階乗計算とかフィボナッチ数とかは
原始帰納的関数なんだと思う。詳しい方、間違ってたら補正してください。
>>740 チューリングマシンと等価なのは部分再帰関数であって、原始再帰関数は
部分再帰関数の部分集合に過ぎない。
>>740 あんまりわかんないなら,書き込まなくていいと思う.
ボイスコッド正規形ならクリーニアンクロージャ作れるからラムディ
帰納的定義のackermann functionってこんな感じ? (define (iter f n) (if (= n 0) (f 1) (f (iter f (- n 1))))) (define (ack n) (if (= n 0) (lambda (m) (+ m 1)) (lambda (m) (iter (ack (- n 1)) m)))) (display ((ack 3) 5)) ;; nice curried...
>>741 740ではないが, 原始帰納関数 ⊆ 部分再帰関数 ⊆ 一般帰納関数 ということになるってこと? 部分再帰関数と一般帰納関数の違いって何?
function = partial function∪total function
>>745 一般再帰(帰納的)関数の定義は?Kleeneの言うgeneral recursive function
の意味で言っているのなら、部分再帰関数の真部分集合。なぜなら部分再帰関数は
全域関数でもありうるから。
つまり、
原始再帰関数 c 一般再帰関数 c 部分再帰関数
ということ。ちなみに、原始再帰関数も真部分集合だぞ。Ackermann関数がその一例。
つーかおまい情報系出身か?この辺は一般常識だぞ。
門外漢なら計算理論の教科書を読むべき。
>>746 partial function ⊃ total function
オレ、門外漢なんで高橋先生の「計算論」を読んでみた。 関数と部分関数ってのがあるんだね。そこを強調するのに 部分帰納的関数という言い方をするんだそうだ。 一般帰納的関数はゲーデルの本にあった言い方で クリーニの1936年の論文らしい。邦訳があったら読んでみたい。
→ゲーデルのセミナーでの言い方 ゲーデルは共同研究やセミナーで使っただけで、 帰納的関数について長らく公表しなかった。 ゲーデルにとっては公表するほどの成果ではなかったらしい。
ゲーデルは算定可能という概念も提案した。 結局、これら6つの同等性が証明されてチャーチの提唱へ。
すいません、LittleSchemerが難しいと感じるのってやばいですか? いま2章のand again, and again...のとこなんですが意味わかめです。
どこがわからないんですか?
>>753 すいみません自己解決しました。
>What is the meaning og the line
>((null? l) #t)
を(#f #t) と勘違いしてました。
先に出てるdefine lat中の文章のことなんですね。もっとしっかりと読まねば。
しっかりしろバカ
再帰関数(帰納的関数)は数学的に扱いやすい良い性質があるようですが、 なぜ関数プログラミングが世の中の主流になれないのですか?
>>747 情報出身じゃないっす。興味あるだけの人。
そうか一般再帰関数って最小解操作を許す全域関数(total function)の
ことだったのか。
>>756 世の中の現象を反映させるにはオブジェクト(対象)指向じゃないとだめだろ
世の中にあるのは対象なのだから。
んでもって、対象間の関係が数学である。
オブジェクト指向開発されたシステムの真に理想的な姿というか関係が
”数学”になる、んだろ。
関数だけ持ってきても対象が無い(というか対象とは?と言う話になる)
からどうしようもないとかそういう話じゃない?よく知らんが。
いえいえ。
“不運”(ハードラック)と“踊”(ダンス)っちまったんだよ に似てる
schemeってすばらしいですねぜひきわめたい。
頑張れ Lisp/Schemeは面白いぞ
リリカルlisp ベルカ式はパターンマッチを主体としている
ΣxΣyf(x,y)な計算をSchemeで処理するはどう書けばいいんでしょうか。 Rubyで書くとこんな感じなんですが… v = 0.0 (0..10).to_a.each do |x| (0..10).to_a.each do |y| v += f(x, y) end end
色々あると思うけど例えば (dotimes (i 10) (dotimes (j 10) (set! v (f i j))))
SRFI-42で (sum-ec (: x 11) (: y 11) (f x y))
(fold (lambda (n i) (+ i (f (car n) (cdr n)))) 0 (map (lambda (x) (map (lambda (y) (cons x y) ) (iota 11)) ) (iota 11)) ) unko
これぐらいならやはりlist comprehensionが一番かな
素直に再帰で考えてみたけど (define (sum1 n m f) (if (= m 1) (f n m) (+ (f n m) (sum1 n (- m 1) f)))) (define (sum n m f) (if (= n 1) (sum1 n m f) (+ (sum1 n m f) (sum (- n 1) m f))))
竹内関数って原始帰納的関数なのですか? それともアッカーマン関数のように原始帰納的関数ではない帰納的関数なのでしょうか? (define (tak x y z) (if (> x y) (tak (tak (- x 1) y z) (tak (- y 1) z x) (tak (- z 1) x y)) y))
>>773 再帰関数ではあるが、原始再帰関数ではない。
>>774 ありがとうございました。
区別がわかってきました。
set! による破壊的代入がなければ絶対に書けないプログラムって どういう種類のものですか?
無限リストとかじゃね
クリンゴン、エンタープライズの位置座標 フェイザー砲の残りエネルギー、ダメージ
>>779 あるんだねぇ。GCLで動いたよ。
あっけなくやられてしまった。
さっき知ったんだが schemeのcondって継続渡しみたいな構文をサポートしているんだな (cond ((or #f '(1 2 3)) => cdr))
今日ずっと考えてるんですが解けないので もしわかる人いたら教えてください (cata n)で、n個の要素の括弧の付け替えからなる リストを生成する関数を作ろうとしてます 規則がよくわからなくてどうもうまくいきません 例えば (cata '(1 2)) ((1 2)) (cata '(1 2 3)) (((1 2) 3) (1 (2 3))) (cata '(1 2 3 4)) ((1 (2 (3 4))) (1 ((2 3) 4))) ((1 2) (3 4)) ((1 (2 3)) 4) (((1 2) 3) 4)) 要素数はカタラン数になるそうです (define (cataran n) (define (nck n k) (cond ((or (= k 0) (= n k)) 1) (else (+ (nck (- n 1) k) (nck (- n 1) (- k 1)))))) (/ (nck (+ n n) n) (+ n 1)))
>n個の要素の括弧の付け替えからなるリスト もうちょっと厳密に
>>783 わかりにくくてすみません
言い換えると
一度に2つの要素の足し算しかできない+を使って
n個の要素を全て足すとしたときの
可能な計算の順序の指定の仕方と同じです
1+2+3は(1+2)+3と1+(2+3)の計算法があります
これは(cata '(1 2 3))に対しての
((1 2) 3)
(1 (2 3))
に相当します
・二分木である
・葉にしか要素がない (
>>784 で言えば数)
・分岐には要素がない (
>>784 で言えば+)
という場合、要素数がn個なら木の種類は? と同じ問題。
・要素の間の何処に分岐点を持ってくるかの数え上げ
・二つの部分木に分けた後の分割統治
を考えればわかるでしょ。
規則とかいってるからサンプル眺めるだけでえいやっと思い付こうとしてるのかな。 n=1からn=4, 5くらいまで自分で書き出してみれば考え方もわかりそうなものだが。
>>785 出来ました。ありがとうございます
(define (cata l)
(define (flat1 x) (fold append () x))
(define (aux n l)
(map (lambda (x)
(map (lambda (y)
(if (and (pair? x) (null? (cdr x))) (cons (car x) y)
(cons x y)))
(cata (drop l n))))
(cata (take l n))))
(define (aux2 n l)
(if (<= n 0) ()
(append (flat1 (aux n l)) (aux2 (- n 1) l))))
(if (< (length l) 3) (list l)
(aux2 (- (length l) 1) l)))
()を評価したら()でええの? エラーではないの?
規定ではエラーだねぇ
>>787 (cata '(1 2 3 4)) の実行結果が、最初に書いてあった実行例と違うんですが
(cata '(1 2 3 4))
(((1 2 3) 4) (((1 2) 3) 4) ((1 2) 3 4) (1 (2 3) 4) (1 2 3 4))
>>788 '()のがいいですね。Gaucheだとエラーにならないので
他の処理系使うまで気づきませんでした
>>790 (1 2 3)を(1 . (2 3))のように見たら
>>784 を満たしているので
中途半端ですが満足してしまいました
多分ちょっといじればその出力に出来ると思います
>>791 自分も考えてみたけどけっこう難しい例題だと思うよ。
根本的に書き直さないといけないんじゃない?悪いけど。
そんなことない、ちょっと書き直したら動きましたよ
>>792 さんも考えてるかもしれないのでヒントだけ
ネストしたmapの中身を修正するだけです
ちなみに srfi-42 使えばこんなに簡単 (define (cata l) (if (< (length l) 2) l (list-ec (: pos 1 (length l)) (: fst (cata (take l pos))) (: snd (cata (drop l pos))) (list fst snd))))
795 :
785 :2009/07/12(日) 11:34:56
実はドット対で二分木を構成した方が分かりやすい とアドバイスを入れるかどうか迷った。 結局元の問題と違っちゃうから書かなかったけど。
(define (cata xs) (cond ((null? xs) '()) ((null? (cdr xs)) (list (list (car xs)))) ((null? (cddr xs)) (list (list (car xs) (cadr xs)))) (#t (let ((a (car xs)) (b (cadr xs)) (rest (cata (cddr xs)))) (define (patr x) (list a (list b x))) (define (patl x) (list (list a b) x)) (append (map patr rest) (map patl rest)))))) うんこーどですが、どうでしょうか
797 :
796 :2009/07/12(日) 11:43:40
駄目ですた
799 :
792 :2009/07/12(日) 17:53:13
>>793 やっぱ、難しい。考えて相互再帰のこんなの↓考えた。
fooの部分はそれぞれのリストの直積みたいにすれば
いいと思うのだけど、どうもうまくいかない。
また、考えてみるよ。
(define (cata ls)
(if (<= (length ls) 1)
ls
(cata1 ls 1)))
(define (cata1 ls i)
(if (= i (length ls))
'()
(cons (foo (cata (take ls i))
(cata (drop ls i)))
(cata1 ls (+ i 1)))))
800 :
792 :2009/07/12(日) 19:37:44
やっとできた。勉強になった。 (define (cata ls) (if (<= (length ls) 1) ls (cata1 ls 1))) (define (cata1 ls i) (if (= i (- (length ls) 1)) (product (cata (take ls i)) (cata (drop ls i))) (append (product (cata (take ls i)) (cata (drop ls i))) (cata1 ls (+ i 1))))) (define (product ls1 ls2) (if (null? ls1) '() (append (map (lambda (x) (cons (car ls1) (list x))) ls2) (product (cdr ls1) ls2)))) > (cata '(1 2 3 4)) ((1 (2 (3 4))) (1 ((2 3) 4)) ((1 2) (3 4)) ((1 (2 3)) 4) (((1 2) 3) 4)) >
>>800 おめでとん
自分の環境では、
3つのコード中
>>800 が最速でした
参考までに
>>787 の修正版も張っておきます
(define (cata l)
(define (flat1 x) (fold append '() x))
(define (single? x) (and (pair? x) (null? (cdr x))))
(define (aux n l)
(map (lambda (x)
(map (lambda (y)
(cons
(if (single? x) (car x) x)
(if (single? y) y (list y))))
(cata (drop l n))))
(cata (take l n))))
(define (aux2 n l)
(if (<= n 0) '()
(append (flat1 (aux n l)) (aux2 (- n 1) l))))
(if (< (length l) 3) (list l)
(aux2 (- (length l) 1) l)))
802 :
デフォルトの名無しさん :2009/07/13(月) 11:09:33
>>758 すまん、まじめに反応してみるが、
それは命題論理->一階述語論理の流れでは歴史的事実だが、
そこでの対象指向自体は、関数プログラミングとOOプログラミング
を篩にかけるものではない。FOLレベルのオブジェクトであれば、
関数プログラミングだろうがなんだろうがまあ存在する。
また、重ねて恐縮なのだが、対象間の関係を記述するのが数学の
すべてという意味なら、それは正しくない。
何も理解してないバカと説明する気のないバカ
数値計算に比べて数式処理は世の中の主流になれないみたいな感じなのかな? map f (map g xs) == map (f . g) xsとか、数式処理みたいなものだと思うんだけど。
う〜ん、難しくてよくわからないな。 x = x + 1 みたいな変なのがプログラミングの世界ではまかり通ってる のだけど、こんなの普通の高校や大学初年で習う数学じゃ扱えないはず。 高度な数学なら扱えるのかな?もっと詳しくお聞きしてみたいです。
数式処理が主流になれない理由は、解析的に解けない問題がたくさんあるから、だね。
set-car!とset-cdr!を使って (define a (list 1 2)) このaを'()にすることは可能ですか?
gosh> (define a (list 1 2)) a gosh> (set-car! a 'quote) #<undef> gosh> (set-cdr! a '(())) #<undef> gosh> a '()
手品みたいですね ()にも出来るのでしょうか?
811 :
デフォルトの名無しさん :2009/07/13(月) 19:22:14
>>804 それは、より正しくは、Numeric ComputationとSymbolic Computationとの
比較のことだと思うが、そうであるとして、
それと、関数プログラミングとそれ以外(おそらく命令型?)の比較は同型ではない。
NCとSCは、806の言うとおり、そもそも活用できる問題領域に大きな差がある。
>>805 x = x + 1 は算数の意味論で言えば明らかに偽な文だが、数学の世界であってもこれが
有意義になる意味論を定義することはできる。
なので一般性をもってその観点でそれを否定することはできない。
命令型プログラミング言語において、この式または文が、x + 1 が環境への参照であり、
x = は環境への束縛の操作であるという意味論であることを想起させにくいという点で
いえば同意。
812 :
デフォルトの名無しさん :2009/07/13(月) 20:43:07
>>810 set-car!,set-cdr!は対象がpairであることまでは破壊しないので、
pairとしての表現を持たない空リストにするのは無理じゃないかな。
gosh> (let ((src (list 'a 'a)))(set-car! src 'quote) (set-cdr! src '(()))(eval src (interaction-environment))) () ;; unko-
>>805 > x = x + 1
C/C++ では lvalue と rvalue を区別してフォーマルな意味論を与えられている。
後付けの感は拭えないが、ちゃんと扱える理屈は存在する。
厳密な意味においては数学的とは言えない面はあるけど、
プログラミングに必要な要素ってのを考えると充分な妥協だと思う。
>>805 Hoare Logicだな
実行文の前でのxの値をX,実行文の後ではYとすると
このプログラムが正常に動作すると仮定すれば
{x=X} x:=x+1 {x=Y}というHoare Tripleが構成できて、代入の規則から
x=X ≡ (x+1=Y) <=> x=X ≡ (x=Y-1) ← X = Y - 1 ≡ Y = X + 1
ってな具合にxに1を加えるっていう動作をする事が証明できたりする
代入を感覚で理解できなくて、
a=10,b=20; a=b; a=?,b=?;っていう問題を解けない人でも、この技法を使えば
計算で解くことができる、素晴しい!!
勿論、こういう単純な例だけでなく分岐やループも扱えるんだけど
「ループで配列内要素の総和を求める」っていうような問題でも
A4レポート用紙2枚に収まるか怪しいような長い証明を
書く羽目になるから、そうバシバシ使っていけるものでもないな
これと比べるとdependently typeとcurry-howard対応の何と実用的なことか…
ログが残っているから
直リン張らないほうがいいな。すまん。
821 :
805 :2009/07/14(火) 07:36:23
>>815 知りたかったのはそういうことです。
関数プログラミングは高校で習った帰納的定義、数学的帰納法など
普通の数学の延長にあるように思えました。
一方、命令型の破壊的代入を主体とするものには理屈はあるのだろうか?
と思っていました。実用的なものが関数型だけで書けるとは思ってないのですが。
Static single assignment的に、 X_1 = X_0 + 1 と考えると面白い。 あるlambda式をlambda droppingすると、それは、 対応するSSA文をoptimal変換したことと同じ。
>>821 それならホーア論理じゃなくてチューリング機械じゃないの?
・表示的意味論(ピラミッドの頂点=神) 数学の延長。 ・公理的意味論 ホーア論理。長い証明を書く羽目に。 ・操作的意味論(食われるだけの存在=ミジンコ) 抽象機械。
>>824 言いたいことはわからなくもないが、3つとも数学だろ。
>>821 意味論というより、命令型プログラミングの根拠となる計算モデルを
知りたいということではないのか?
だとすれば、RAMモデルでは破壊的代入が定義されている。
>>824 Aczelの項書換えシステム。文脈原理。
>>805 が知りたいこととは違うかもしれないが
プログラミング言語論に関しては
構文論(syntax)と意味論(semantics)という大きな分類がある
>>824 の分類は意味論(semantics)の中での分類
構文論はx=x+1の数学的な意味は考えずに
これら言語の構造自体について扱う
式の「意味」という意味では
代入に=ではなく:=や<-を代入に割り当てている言語もあるわけで
構文と意味は独立なわけ
そもそも数学は代入のような副作用ってあまり扱ってないように思う
俺が知っている中で副作用を扱っているのは
線形論理ぐらいかなぁ
A:「100円持っている」
B:「80円以上持っていればパンが買える」
C:「50円以上持っていればチョコレートが買える」
A→Bは真
A→Cは真
よって「100円持っているならばパンとチョコレートが買える」
線形論理ってアスペルガー症候群みたいな感じだね。
逆では? 線形論理では、上の例でA→B∧Cが成り立たない。
>>828 805です。自分でも何を知りたいのか混乱していました。
表示的意味論です。
「プログラム意味論」横内寛文著(赤本)は持っているのですが
よく理解できていません。R^5RSに収録されているのは表示的意味論
とのことで理解したいとは思うのですが。
ところでR^6RSでは表示的意味論が放棄されて操作的意味論になった
そうですが何故なのかと思っています。
Operational Semanticsは意味論を勉強してなくても簡単に理解できるからな。
> 「プログラム意味論」横内寛文 その本読んでみたいんだけど売ってないんだよね。
>>831 >ところでR^6RSでは表示的意味論が放棄されて操作的意味論になった
>そうですが何故なのかと思っています。
表示的意味論が分かり難い上に実装にも証明にもあまり役に立たないから。
しかもR5RSのは矛盾だかあいまいさが証明されてたはず。
>>805 意味論を理解することが目的なら、もう少し具体的に今どこがわからないのかを
示せばここで解説される可能性はある。
意味論がさっぱりわからん、ということでしかないとすると、本読め、以外にない。
意味論を理解することが目的じゃなくて、何かをするために意味論を理解したい
なら、目的を示した方がいいと思う。それについて助言可能かもしれない。
>>828 いや、変数、変項、というのは形式的な数学では日常茶飯事だから、
代入というのは数学でもよくある概念じゃないか? それは人間の
頭の中で実施されることが多いが、何かを証明するときに紙に
書いたりもする。
よくある概念であるがゆえ、それ自体が明示的な対象となるのは数学基礎論
にはなるが。
あと、一見代入だからといって副作用を伴うとは限らない。
述語論理のユニフィケーションとかもあるし。
代入?いいえ項書換えです
>>835 805です。数学がわからないと数学を必要とするコンピューターの理論も
理解できないのではないかと思いしばらくの間、数学の勉強に行っていました。
目的はプログラムと数学との関連の理解です。
本を読みつつ、ご助言を仰ぐこともあるかもしれません。よろしくお願いいたします。
真面目に勉強するなら2chにレスしてないで本読めでぶ
>>839 ああ、ここは2chだってことを忘れてた。でも玉石混交だから。
>>838 それなら、まずは計算可能性理論を勉強してみると良いな。
>>838 上にでてきたfjとか。2chだとせっかくの話が消えてしまう。
ただ、迷惑にならないようにしたほうがいいだろうけど。
>>802 >また、重ねて恐縮なのだが、対象間の関係を記述するのが数学の
>すべてという意味なら、それは正しくない。
難しい話になるとは思うのですが、現時点では”数学”とは何を指している
言葉だといえるのですか。
マックレーンはアイディアを抽出化して形式化したものが数学だ、形式機能主義だ
と言ってるんですけど、それって、つまり数学的対象とはあくまで形式という事なんですか。
確かに、理解していないバカではある。書いてて確かに思う。
けど、表立っては出ないがこういう話が問題になる分野領域は存在する気がするんだよね。
もう十分以上の情報が出ているぞ 耳学問としょうもないプライドのせいで 無知だとかバカだとか思われたくないからいつまでも演説を続けるんだろうが いいかげん黙れ
805=815で釣りでもやってるのかと思ったが
846 :
802 :2009/07/15(水) 22:41:53
>>844 おお、すまなかった。誰を指しているかがイマイチわからんが、
この流れをつくった私がいけないのだろう。
>>843 というわけで、すまんが退散しようと思う。844の言うとおり、
結構いろいろな情報が出ているので、参考にして欲しい。
お邪魔しました。
>>844 混在してわけがわからないことになってるけど、いくつか独立した話しが
並行して進んでいるんだよ。
それに、そんなぶっきらぼうに言っちゃうとみんなびっくりしてしまうよ。
たまに情報学板のことも思い出してあげてください。
確かに最近の話題は情報学板の方が向いてるな。 あそこ過疎りすぎだけど、見てる奴はそれなりにいるっぽい。
>>838 数学とか理論計算機科学の話題だったらプログラム板はやめておいたほうがいいよ。
でたらめな情報が多すぎてろくなことがないから。
ERR5RS(だっけ?)って幾らかでも流行ってるんですか?
顧みるにR5RS自体流行ってるかな? お察しください
LOL邦訳本ってamazonじゃ普通に買えないんだろうか。 ページはあるんだけど、なぜかプレミア価格の出品しかない。(´・ω・`)
まさかすぐに絶版にしたりしないよね?
SICPの悪文と格闘している間にLOL翻訳が出てしまったんだな。 On Lispも積読になってるが、LOLも積読しとく事にしよう。 以上チラ裏でした(・∀・)
857 :
デフォルトの名無しさん :2009/07/17(金) 01:43:00
>>855 弱小出版会社だから、東販/日販の初回取り扱いが少なかったんだと思う。
注文すれば、出版社に発注されるでしょう。在庫はしているだろうから。
ふぁびょったってしゃーない。
と書いたけど、LOLが売れるとはおもえない。グレアムのような知名度もなけりゃ LOLそのものがそれほど定評だったレビューもなかった。 なにより、極度にマニアックだから。 細く長く生き残ればよいという本だと思う。
On Lisp はついてけないけどLOLは単にLisp最強伝説本として楽しめた
COMIC LOL
LOLは前提知識それほど必要ないの?
いまから買いに行こうと思ってたのに・・・・・
>>863 コードが短くて解説がうまいから分かった気分になれる
866 :
863 :2009/07/17(金) 16:44:02
>>865 じゃあ丘リスパーの漏れにぴったりでつね(自嘲
>>852 ERR5RSは、実際に対応してるのはLarcenyくらい。
提唱者のWilliam D Clingerが開発してるから当然だけど。
Ypsilonは対応予定。Gaucheもそのうち対応する予定。予定は未定。
他は知らない。
ちなみに、ERR5RSで書いてる人はいる。主にLarceny-usersとかに。
というわけで、will先生の活躍に御期待下さい。
連休中、みなさんはLOLを読みふけるのでしょうか^^
とりあえず著者はVimmerってとこまで読んだ。
とりあえずForth最高!ってところまで読んだ。
postscript万歳!ってところまで書いた
LOL、オビの煽りに苦笑い、スルーw
lolって略はネトゲ的にどうなんだろう
LOLは元々ネトゲ用語じゃないよ
MUDからUsenetに輸入された可能性もあるので一概にそうとも言えない
emacs論だけ立ち読みすれば十分な本だな
>>854 今見ると「一時的に在庫切れですが、商品が入荷次第配送します。 」だそうですよ
タイトルがかっこいい class over defとは違うんですみたいな
lol=laugh out loudly だからwwwwwwwww だよ。
Lispは関数型言語じゃない。まで読んだ。
881 :
デフォルトの名無しさん :2009/07/20(月) 21:59:02
すみません、私はschme大好き人間なんですが、 common lispの defunが嫌いです。「でふん」っていう語感が。 やっぱしscheme最強でしょ。
致命的なまでに英語が苦手なようだなw
でふん デフィネ
つか気に入らないなら自分で好きな名前にすればいいじゃない これだから最近scheme始めたガキは困る
(defmacro define (fun_arg body) `(defun ,(car fun_arg) ,(cdr fun_arg) ,body))
886 :
デフォルトの名無しさん :2009/07/21(火) 00:58:24
すみません、私はschme大好き人間なんですが、 common lispの funcallが嫌いです。「ふんこーる」っていう語感が。 やっぱしscheme最強でしょ。
labels使え
let over set!
letrec over μ
scheme大好きな私ですがたった一つ好きになれないのがランバダです。 語感が嫌ですね。
コードギアスでさぁ、 ルルーシュが C.C. の名前を呼ぶ場面があるでしょ。 call/cc を見るたびに連想するんだ
でっかいアニメ好きです
俺はCCガールズっていう人達見ると思い出すな。
それじゃあ、思い出さないんですね。見ることないもんね。
その代わりにCCレモンをよく見るからね。
896 :
デフォルトの名無しさん :2009/07/21(火) 08:54:45
lispのコードを出してくれるyacc,lexって有りますか?
CCっていったらサクラだろJK
俺もNHKでやってるという免罪符で見てた>CCさくら なんか色使いが綺麗だったし 話自体はよくわからなかった
それを言うならリリカルなんて
リリカル・トカレフ・キルゼムオール
りこさんのエロ画像キボンヌ
もっとネタscheme処理系を!
いぷしろん萌え
VSCM萌え
Mathematica 萌え
割と普通に関数型として使えるのには感心したが 正直書きにくかった
908 :
デフォルトの名無しさん :2009/07/21(火) 22:30:28
Little Schemerを読んでるんですが、Qを読んですぐAを読むっていう ただ読んでるだけなんですが、 みなさんはちゃんと自分で答えを考えながら読んでるんですか?
俺は考えて読んだけど、好きなようにすればいいんじゃないかな。 一度全部読んでから、次は自分で考えれば? たぶん二回目でも100点にはならないと思うから、 二回読むことには意味があると思う。
>>909 なるほど、ありがとうございます。
いま3章の終りに来ていますがなかなかなか複雑で頭を使います。がんがる。
LOLなんだけど、ざっと斜め読みしてたら、 マクロを本当に使いこなせるのはSchemeで修行してきた人達だ。 みたいなことが書いてあった。
Schemerのほうが偉い症候群ですねわかります
↓ここからCLerの猛反論
まあ最近はSchemeからこの世界に入って、 Schemeで修行せずにCommon Lisp入る人の数の方が少ない、 ってのはそれほど間違ってないと思う。 Schemeは取り上げる大学が多いからね。 そんな噛みつくことじゃないのでどうでもいい。
C99/C++のコメントを除去したかったので コードを書いたんだけどえらい遅い 改良するとしたらどの辺でしょうか? 最初非末尾再帰版で書いて 末尾再帰に書き直したのですが 相互再帰関数は通常最適化されないのですかね? 処理時間が通常の再帰版と同じで 250kbのファイル(5千行中4000行がコメント) を処理するのに100秒かかります コード(続く)
;remove comment (define (remcom l) (define (test str lst) (if (< (length lst) (string-length str)) #f (let* ((a (string->list str)) (l (take lst (length a)))) (every eq? a l)))) (define (outcomment l res) (cond ((null? l) res) ((test "/*" l) (incomment (cddr l) res)) ((test "//" l) (inlinecomment (cddr l) res)) ((eq? #\' (car l)) (inquote #\' (cdr l) (cons #\' res))) ((eq? #\" (car l)) (inquote #\" (cdr l) (cons #\" res))) (else (outcomment (cdr l) (cons (car l) res))))) (define (incomment l res) (cond ((null? l) res) ((test "*/" l) (outcomment (cddr l) res)) (else (incomment (cdr l) res)))) (define (inquote sep l res) (cond ((null? l) res) ((eq? sep (car l)) (outcomment (cdr l) (cons sep res))) (else (inquote sep (cdr l) (cons (car l) res))))) (define (inlinecomment l res) (cond ((null? l) res) ((eq? #\newline (car l)) (outcomment (cdr l) res)) (else (inlinecomment (cdr l) res)))) (list->string (reverse (outcomment (string->list l) '()))))
>>915 test の中の (length lst)
コメントが現れる度string->listしてる所、 (test "/*" l)とかを (test `,(string->list "/*") l) にしとくとか。(test側も修正) それと、100秒掛かるって言われても判らんから 環境と処理系も書いて欲しいな
あ、`',(string->list "/*")にしないとだめだったかな 動かしてないから間違ってたらごめん
(define (test str) ;; Let Over Lambda (let ((l (string->list str))) (lambda (lst) ...))) (define test/* (test "/*")) (define test*/ (test "*/")) (define test// (test "//"))
lengthをやめたら、100秒が3秒になりました 長さはmaxで2と固定なので (if (or (not (pair? lst)) (not (pair? (cdr lst)))) #f ...) に変更しました また、string->listの箇所も修正するとさらに早くなりました (環境はGauche+cygwin) ありがとうございました!
上の"/*"みたいな最終的にstring->listに掛かるようなやつって gaucheじゃ定数伝播してくれないのかな
数値計算を主体でプログラムしてると あまり自分でマクロを作る場面に出くわさない on lispのマクロはそのまま使ったりするけど
こういうのはどうよ (define-syntax let/ec (syntax-rules () ((_ r b ...) (call/cc (lambda (r) b ...))))) わざとらしい例 (let/ec r (fold (lambda (x y) (if (= x 0) (r 0) (* x y))) 1 '(2 3 0 5)))
何が?
いや、なんでもない
let/ccってのはPLTやGaucheにあるね
エロファイルのサンプルをダウンロードして来ました.このファイルはzipで圧縮されておりファイル名の末尾がアルファベットもしくは数字+拡張子zipになっており,展開すると拡張子が取れたディレクトリ名の中にファイル名+拡張子wmvのファイルが出現します. 例: aaaa0725a.zip, aaaa0725b.zip, aaaa0725c.zip, aaaa0725d.zip aaaa0725a/aaaa0725a.wmv aaaa0725b/aaaa0725b.wmv aaaa0725c/aaaa0725c.wmv aaaa0725d/aaaa0725d.wmv b0725-1.zip, b0725-2.zip, b0725-3.zip, b0725-4.zip b0725-1/b0725-1.wmv b0725-2/b0725-2.wmv b0725-3/b0725-3.wmv b0725-4/b0725-4.wmv で,このファイルを末尾がアルファベットの場合は a 数字の場合は 1 にまとめるという作業をLispで行う場合,Lisp脳ではどう考えますか? aaaa0725a/aaaa0725a.wmv /aaaa0725b.wmv /aaaa0725c.wmv /aaaa0725d.wmv b0725-1/b0725-1.wmv /b0725-2.wmv /b0725-3.wmv /b0725-4.wmv 教えてくださいエロい人
zshで unzip *.zip for d in *a; mv ${d%a}[bcd]/*.wmv $d for d in *1; mv ${d%1}[234]/*.wmv $d rmdir * 試してないけど。
> unzip *.zip 訂正 for f in *.zip; unzip $f
932 :
デフォルトの名無しさん :2009/07/25(土) 09:45:41
MatzLispを搭載してるmfilerで展開&連番リネーム
MatzLispなんてLispはありません Lispと言うからにはS式とマクロがないと駄目です
lisp--
l4u…
AVRやPICで使えるSchemeってある?LEGO Mindstrom用は見つけたけどマイコン用は見つからなかった。
stalinでCコード吐かせてgccでコンパイルする
938 :
929 :2009/07/25(土) 21:15:23
なんだ結局正規表現に頼るのか
こういう時のための正規表現だからね。 まぁ、正規表現に親を殺されて憎んでいるから絶対使いたくないとか、 そういう理由があるなら仕方ないかもしれんが。
正規表現殺人事件 「私は見ました!! 彼はバックトラックに轢き殺されたんです!!」
オートマでした
>>936 Marc Feeleyの研究室で何年か前にPIC用Schemeコンパイラを作ってた人がいたと思う。
>>938 やりたければ SRE でも PEG でも使うがいい。
やろうとしてることがいかにもスクリプト言語的なので、
手段だってそれに見当ったものになるだけだろ。
そこに Lisp らしさを求めたところでナンセンスなだけだ。
944 :
929 :2009/07/25(土) 23:30:41
>>943 > やりたければ SRE でも PEG でも使うがいい。
SRE S-expression Regular Expression
PEG Parsing Expression Grammar
ですね.勉強します.
> やろうとしてることがいかにもスクリプト言語的なので、
はい,あえてこういう問題をLisperはどう考えるか知りたくてきいてみました.
ありがとうございました.
>>944 というか、そもそもLisp族での回答が出てないじゃないか。
典型的なパターンだと、ディレクトリを探索する手続きに、
ファイルごとの処理を行う手続きを渡すのがLisp的だと思う。
文字列のマッチングとかは、SREとかPEGとかあるけど、
特別Lisp的に、ってのは無いんじゃない?
まぁ、質問が悪すぎたね。 物事を「無駄に難しく」解決したくてLispをやってる人なんて、 そう居ないわけだからさぁ。
だが、SICPの日本語は無駄に難しい。
質問者の頭が悪すぎた
>>946 そうだったのか。おれは"物事を「無駄に難しく」解決したくてLispをやってる"と思ってた。
頭の体操のために開発された言語だと思っていたが間違っていたか。、
まぁ、間違ってるね。 言語としてのLispは、ラムダ算法の表現法として開発されたのであって、頭の体操の為ではないし、 「頭の体操」が主に指向するのは、物事を「無駄に難しく」解決することではなく「美しく」解決することだし、 (その美しさを理解or表現する力を身につけるのが「難しい」ということはあり得るけど) 句点のあとに読点つけるのは、正式な日本語としても、2chによく見られる崩しとしてもおかしいし。
「。、」 は ↓こんな風に落ち込んでる人の顔文字だと解釈した。 。、 -
>>950 読点消し忘れたからってそんなに喜ぶなよ。
ラムダ算法の表現法として開発されたということはラムダ算法に無縁の人には
いらない言語ということか納得できる答えだ。頭の体操の定義はおいといてい
らない人には頭の体操以外のなんでもない。
> 言語としてのLispは、ラムダ算法の表現法として開発されたのであって、 リスト処理用の言語として作られたんであって、ラムダは用語以外関係ない。
>>952 何をムキになって、相手の言葉からできるだけ相手が辿り着いて欲しく無さそうな結論を見出す
中二病っぽいクソゲーを頑張ってるのかわからないけど、
最初に開発した人の目的なんて、その後の人々にはそこまで関係のあるものではないよ。
Unix開発したい人だけがCを使うわけでもなし。
あと、「いらない人には」って条件つけちゃったら何でもアリだよな。 板チョコから人命まで、「いらない人には価値を見出すことができない」のは共通でしょ?
あなたもわざわざ構いなさんなw
>>953 リスト処理用のFORTRANライブラリとして歩みだし、
ラムダ算法の表現を模索するうちにプログラミング言語となった。
といってもそれほど間違ってないと思う。
>>956 でも、そんな長くない文章でかなり凄いこと言いまくってて、つい反応してしまうだろうこれはw
「Xの定義はおいといて、X以外のなんでもない」って物言いも、かなりキてるし。
「頭の体操のために開発された言語」という話を「いらない人には頭の体操」まで一気に前線下げて、
それを鼻息のパワーアップでカバーしようとしてるのも、えらくシュールだし。
なんか変な資質あるぞ、この子w
959 :
929 :2009/07/26(日) 10:55:16
なるほど,Lispにとってこういう問題は難しいのですね. Lisperと名乗る人も身近なものにはLispを使わない. ググったところで教科書の写経をするページしか見つからないわけですね.
おれがよく行くアニメ系板ならわんさかこーゆーのいるけど。
>>959 Lispに限らず他言語のスレ行っても「ファイラでやれ」「シェルでやれ」って反応が殆んどだと思うが。
あーでもrake使ってエロ画像整理とかはやってる人が稀にいるかもしれん。
正しく道具を使い分けるよう心がけてる人が多いのはどの辺だろうねぇ。
リストのリストをソートする機会があったので (define a '((0 1 2) (0 2 1) (1 0 2) (1 2 0) (2 0 1) (2 1 0))) C++のSTLみたく こんなのを書いてみたんだけど (define (listpred pred a b) (cond ((or (null? a) (null? b)) #f) (else (if (or (pred (car a) (car b)) (pred (car b) (car a))) (pred (car a) (car b)) (listpred pred (cdr a) (cdr b)))))) (sort a (pa$ listpred <)) (sort a (pa$ listpred >)) こういうのって既にあったりします? それか既存の関数の組み合わせでもっと楽に作れたりしませんかね
あ、比較関数をリスト用に合成するのだからこっちのほうがいいですね (define (listpred pred) (lambda (a b) (cond ((or (null? a) (null? b)) #f) (else (if (or (pred (car a) (car b)) (pred (car b) (car a))) (pred (car a) (car b)) ((listpred pred) (cdr a) (cdr b))))))) (sort a (listpred <)) (sort a (listpred >))
>>959 どういう過程を辿ってそういう結論に至ったのかは知らないけど、
別に難しくもないし、身近な用途にも使ってるよ。むしろ身近にしか使ってない。
某ネ実ゲーの武器の性能計算したりとか、もう日常感たっぷり。
ネット見ると結構そういうのあると思うんだけどな。
ニコニコのコメント抜き出したり、WinampをSchemeで操作したりしてる人とかいたよ。
965 :
929 :2009/07/26(日) 11:40:01
> 正規表現も自前で実装するのが Lisp クオリティ 正規表現を必要としないのが Lisp クオリティと思ってた.
>>916 とかは正規表現では出来ない例
正規表現で出来ない問題を出せよ
967 :
929 :2009/07/26(日) 11:58:49
>>964 >
>>959 > どういう過程を辿ってそういう結論に至ったのかは知らないけど、
> 別に難しくもないし、身近な用途にも使ってるよ。むしろ身近にしか使ってない。
はい,945の方がおっしゃってるように
ディレクトリを探索する手続きに,ファイルごとの処理を行う手続きを渡すというのは理解できるのですが
ここで正規表現って発想ではなくリードマクロを使って...てのを期待してました.
968 :
929 :2009/07/26(日) 11:59:36
>>966 >
>>916 とかは正規表現では出来ない例
> 正規表現で出来ない問題を出せよ
やりたいことはエロファイルの整理です.
エロファイルの整理がしたいんじゃなくて
Lispのリードマクロを使った回答を知りたい、が正しいんじゃないの?
その目的なら
>>930-931 で回答が出てるんだから
970 :
929 :2009/07/26(日) 12:10:38
やりたいことは,エロファイルの整理 知りたいことは,シェルスクリプトなどで簡単にできる問題を lisp脳はどう考えるかです.
シェルスクリプト使うよ
(define (a x) (let ((end (last x))) (cond ((isalpha end) 'place_a) ((isnum end) 'place_1) (else (error "tukareta"))))) (for-each a ero) 'placeの所はフォルダにおく処理
>>967 俺その
>>945 。
リーダーマクロについて、何か勘違いをしてる気がする。
根本的に正規表現とは違う層の概念だよ。
独自の記法をS式にマッピングするだけ。
単に、正規表現以外の文字列のパターンマッチが知りたいのなら、
パーザコンビネータとかがそれ。上に出てるPEGとか。
>>958 あなたには頭の体操は「美しく」解決しなきゃいけないのかそれともそうではないのか。
「美しく」とはどういうことかなどを定義されることをお勧めします。そしてその後レス
してください。
976 :
929 :2009/07/26(日) 14:30:38
>>974 > リーダーマクロについて、何か勘違いをしてる気がする。
いえ,理解出来ていないというか,誤解しているのでしょう.
だから,相手に対して勘違いをあたえる.
> 根本的に正規表現とは違う層の概念だよ。
> 独自の記法をS式にマッピングするだけ。
ディレクトリ(ファイル)名のリストを作る.そのリストを読み込む際,リードマクロを使って処理をディスパッチする.のかなぁって考えました.
> 単に、正規表現以外の文字列のパターンマッチが知りたいのなら、
> パーザコンビネータとかがそれ。上に出てるPEGとか。
文字列処理で正規表現使わない.リードマクロを使う.と言う発想じゃなくPEGを使うって発想するのですね.
>> リーダーマクロについて、何か勘違いをしてる気がする。 >いえ,理解出来ていないというか,誤解しているのでしょう. 勘違いして理解してるから誤解だろ。
>>976 リードマクロは表現をS式にマッピングする機能だって上で出てるだろうが。
書いてある表現のパースは必要なんだよ。
違う層の話が入り混じっててわけわかんなくなってるぞ。
まあ確かにcfgやreは無駄に難しいから 素朴な再帰下降パーサーを高階関数とかで改良していこうという方針は正しい気がする そして、Perlのような言語がそういう方針転換をするよりも 過去の成果物にとらわれないLispのほうが有利だと言えないこともない
50以上レスが進んでるから何かと思えばずっと雑談か 暇だなおまいら
981 :
デフォルトの名無しさん :2009/07/26(日) 19:53:39
処理系何使ってるあたしはGauche。
/\___/ヽ /ノヽ ヽ、 / ⌒''ヽ,,,)ii(,,,r'''''' :::ヘ | ン(○),ン <、(○)<::| |`ヽ、 | `⌒,,ノ(、_, )ヽ⌒´ ::l |::::ヽl . ヽ ヽ il´トェェェイ`li r ;/ .|:::::i | /ヽ !l |,r-r-| l! /ヽ |:::::l | / |^|ヽ、 `ニニ´一/|^|`,r-|:「 ̄ / | .| | .| ,U(ニ 、)ヽ / | .| | .|人(_(ニ、ノノ
テキスト処理を主体としたいわゆる「スクリプト言語」的な使い方をするなら Gauche はやはり強いよなぁ。 日本語の扱いをちゃんとしているところがよい。 Ypsilon なんかはやたら高速なのがよい。 まぁ、用途によるんじゃね?
Gaucheとclisp、newlispを入れてる newlispは簡単にwindow出せたりして面白いよ
ベタで申し訳ないが、schemeの健全なマクロって必要なのか? 正直 ` , ,@ (gensym) だけのほうがスマートだし、変数捕捉されるのも考慮してこそマクロだと思うんだけどなぁ。 schemeの仕様作ってる人は何を心配してるんだろう。ユーザのこと心配してくれてるのかな。 (PGが人が使う用の為に作っちゃダメっていってたよ。)
ノシ clisp
不健全なマクロはきたない。健全なマクロのほうが美しい。
` gensym を必要としなくなれば シンボルやコンスが無い言語でもマクロが書けるようになるかもしれない
>>985 モジュール化が絡んでくるとそう単純な話ではない。
scheme と CL ではスコープのルールも若干違う。
健全性に固執しすぎなのは確かかもしれないけど、
Scheme 的な一貫性のためには必要だと思うよ。
>>985 scheme では同じ名前のシンボルは常に同じシンボルなので、
gensym では名前の衝突を本質的には回避できない。
991 :
985 :2009/07/26(日) 22:28:07
なるほど。今まで馬鹿みたいに「うは、ペアeval apply ぐるぐる最強!」とか思ってたけど、 ことはそう単純じゃないのね。もうちょっと精進するよ。馬鹿みたいなこといってごめんね。
純粋さよりも簡潔さを重んじるSchemeとしてはそれこそ シンプルな古典的マクロの上に保健的マクロを構築するアプローチのほうが合っていると思う R5RSのなかでもsyntax-rulesは浮いているように感じる
>シンプルな古典的マクロの上に保健的マクロを構築する 挫折した奴がここにおわす
>シンプルな古典的マクロの上に保健的マクロを構築する これをまじめにやろうとすると、言語の構文をほぼ全て上書きして 意味論を追加するってこと LISPだから可能なんだけど おれは挫折した
シンプルさを保つべきだって考えと現実問題を解決するときに少々の汚れ仕事を請け負っても良いの2派閥の間の溝だからなぁSchemeとCommonLISP
>シンプルな古典的マクロの上に保健的マクロを構築する
Alex Shinn さんの chibi-scheme がそういうような方向性かな
Syntactic Closure の上に Explicit Renaming と Syntax Rules を実装してる
Syntax Rules はまだ動いてないところもあった気がするが
ttp://synthcode.com/wiki/chibi-scheme
997 :
デフォルトの名無しさん :2009/07/27(月) 08:13:36
CommonLisp(笑)、Scheme(笑) これからはF#の時代だからwww
998 :
デフォルトの名無しさん :2009/07/27(月) 08:23:37
名前に#が付く言語ってwindows以外のOSで動くの?
Monoでそれなりには動くらしいよ 使ったことないからよく知らんけど
SML#があるじゃん
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。