1 名前:デフォルトの名無しさん [2007/04/20(金) 19:41:39 ] Lisp全般のスレです 過去スレ Part16: pc11.2ch.net/test/read.cgi/tech/1172404795/ Part15: pc10.2ch.net/test/read.cgi/tech/1151025773/ Part14: pc8.2ch.net/test/read.cgi/tech/1132275726/ Part13: pc8.2ch.net/test/read.cgi/tech/1115901841/ Part12: pc8.2ch.net/test/read.cgi/tech/1100229366/ Part11: pc5.2ch.net/test/read.cgi/tech/1091456033/ Part10: pc5.2ch.net/test/read.cgi/tech/1075630259/ Part9: pc2.2ch.net/test/read.cgi/tech/1069594582/ http://が多すぎるらしいので分割
541 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 19:09:59 ] そうですね はい次。
542 名前:デフォルトの名無しさん [2007/06/03(日) 23:27:36 ] pushすると ("C" "B" "A")となりますが 例えば、 (def test(x lst) ... ) (setq lst '()) (test "A" lst) (test "B" lst) (test "C" lst) (print lst) で("A" "B" "C")とするには、どのようにtest関数を作ればよいのでしょうか? pushした後 reverseせず、純粋に("A" "B"..というリストを作りたいです。
543 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 23:35:57 ] >pushすると >("C" "B" "A")となりますが なりませんでした はい次。
544 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 23:40:12 ] >>542 何故そんなに push を嫌うのか分からん
545 名前:デフォルトの名無しさん mailto:sage [2007/06/03(日) 23:45:09 ] rplacdでマクロ作ればいいんじゃね
546 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 00:17:17 ] push して nreverse が一番効率いいと思うがな
547 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 00:42:34 ] 誰一人>>543 の仕切りに従ってない点について。
548 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 00:49:08 ] そりゃー2chだもの
549 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 00:54:11 ] 拝啓547様 正しいマナーが根付くには時間がかかるものです。 悪癖は容易には正されません。 円滑なスレ進行のため今後も努力する所存です。 543
550 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 00:55:35 ] うまく人を逆撫でできる人は自分の話題に持ち込めるけど、 単なる阿呆、とだけ思われてオシマイだと、うち捨てられて終わりなんだよね。
551 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 03:29:47 ] >>542 君が欲しいのはこんな感じのものでは? (defmacro test (x lst) `(setq ,lst (append ,lst (list ,x)))) でも>>546 の言うとおり、pushしてnreverseのほうがたぶん速いよ。
552 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 04:08:00 ] 多分 queue が使いたいんじゃないかなーと思った。
553 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 13:51:23 ] Common Lispらしいという意味ではfill pointer付きarrayという手もあるな。使ったことないけど。
554 名前:デフォルトの名無しさん mailto:sage [2007/06/04(月) 21:13:09 ] >>553 コンシングを減らすために使ってみたことあるよ。 おれがヘボなせいかあんま高速化しなかったけどorz cl-user(5): (setq vec (make-array 10 :fill-pointer 0 :adjustable t)) #() cl-user(6): (vector-push "a" vec) 0 cl-user(7): (vector-push "b" vec) 1 cl-user(8): (vector-push "c" vec) 2 cl-user(9): vec #("a" "b" "c") cl-user(10): (concatenate 'list vec) ("a" "b" "c")
555 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 00:50:01 ] >>542 それはマクロでやると簡単。 (defmacro test (x lst) `(setf ,lst (append ,lst (list ,x))))
556 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 01:02:27 ] 既にでてたorz.
557 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 03:19:49 ] nreverseの方が早いっていうのは appendが新しいリストをconsセル一つ一つつなげて返すのに対して nreverseは元のリストを破壊操作で処理するからって言うことで正しいですか?
558 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 07:17:24 ] 最後に付け加えるのが時間かかるってことじゃない? nreverse なら cons セルのつなげかえをするだけなので O(n) なのに対して、 リストの最後に付け加えていくのはリストが長くなるほど たどる量が増えて O(n^2) になる、っていうことだと思う。
559 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 14:06:30 ] FreeBSD6.2RELEASEでGauche0.8.7をつかっています。 (inc (dec inc))と(1 2 3)を入力として与えると (2 (1 4))を返すような関数が欲しいんですけど、 なんか既にあるような気がします。 こ存じないですか?
560 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 14:16:59 ] (define (foo x y) '(2 (1 4)))
561 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 15:58:34 ] そんな変な関数ある気がしないw
562 名前:559 mailto:sage [2007/06/05(火) 16:20:06 ] そうですか… リストを構造体に見立てて、 別の構造体に変換するような操作は結構あるような気がしたんですが… だとすると俺のやりかたが間違っているんだろうか。 ちょっと違う形になりましたけど、とりあえず書いたもんさらしてみます。 (define (general-apply syn args) (eval `(,syn ,@args) (interaction-environment))) (define (data-convert index record convert-rule) (general-apply 'let (list (zip index record) convert-rule)) ) で、 (data-convert '(a b c) '(1 2 3) '(list (inc a) (list (dec b) (inc c)))) みたいな使い方をします。
563 名前:デフォルトの名無しさん mailto:sage [2007/06/05(火) 16:27:00 ] いまいちよくわからないんだけどutil.matchみたいなことを考えているのかな。 practical-scheme.net/gauche/man/gauche-refj_163.html#SEC435
564 名前:559 mailto:sage [2007/06/05(火) 17:31:16 ] >563 おお、なんかこれでよさそうです。 ありがとうございました。
565 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 16:24:42 ] wilikiのスタイルシートってcgiと同じディレクトリにおけばいいの? 全然うごいてくれない
566 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 17:15:18 ] 吐かれたHTML読んでみたら?
567 名前:デフォルトの名無しさん mailto:sage [2007/06/08(金) 20:38:12 ] >>565 キーワード引数で :style-sheet のとこにスタイルシート名を指定すること。
568 名前:565 mailto:sage [2007/06/10(日) 14:51:28 ] 結局解決できませんでした しかたないのでpukiwikiをインストールします
569 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 15:02:04 ] うんそれがいいよ
570 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 00:38:23 ] (if (解決-p 565) (install wiliki) (install pukiwiki)) 残念。。
571 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 00:56:25 ] pukiwikiをschemeで書き直せばいいじゃん
572 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 00:59:38 ] ウッキ、ウッキ、ウィッキー
573 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 01:01:44 ] わかったよブービー(´・ω・`)
574 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 01:03:49 ] ウィッキーさん元気してるかね? なつかしすなー
575 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 04:45:52 ] ウィッキー→みのもんた だと思ってた時期が(ry
576 名前:デフォルトの名無しさん mailto:sage [2007/06/12(火) 21:31:35 ] ウィッキーは落語家のえーっと鶴なんとか
577 名前:デフォルトの名無しさん [2007/06/13(水) 21:15:05 ] (define port (open-input-file "c:\\tmp\\data.txt") (define line (read-line port)) (append lst (line)) テキストファイルから、一行ずつ読み込んでリストに加えて行くという処理を書いてるのですが、 3行目の(line)でエラーになります。 こういう場合、どう書けばいいんでしょう?
578 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 21:17:35 ] どんなエラーとか書こうぜ
579 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 21:32:15 ] >>578 > gosh: "error": invalid application: ("aaa") こんな感じです。 "aaa"は、テキストファイルから読み込んだ内容になってます。
580 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 21:50:46 ] (append lst line)
581 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 21:56:13 ] 質問です。 リテラルを破壊的に変更してはいけないといわれますが、次のような場合もでしょうか? (do ((i 10 (- i 1)) (r '() (cons i r))) ((zero? i) (reverse! r))) (reverse r) と書くべきなんでしょうか?
582 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 21:58:39 ] >>581 その例ならリテラルを破壊的に変更はしないと思う
583 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:08:26 ] >>582 じゃあ、次の場合はどうでしょうか。 リテラルを破壊的に変更してしまっているので、(reverse r) と書くべきでしょうか? (do ((i 0 (- i 1)) (r '() (cons i r))) ((zero? i) (reverse! r)))
584 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:12:33 ] wiliki の質問スレはどこですか?
585 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:13:31 ] >>583 空リストはそもそも破壊できるような物ではないので大丈夫
586 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:16:52 ] >>585 じゃあ、空リストでない次の場合には破壊的に変更しているので、 (reverse r) と書くべきですね? (let ((lst '(a b c))) (do ((i 0 (- i 1)) (r lst (cons i r))) ((zero? i) (reverse! r))))
587 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:17:53 ] >>586 そう。こういう場合は reverse! は厳禁。
588 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:23:03 ] >>587 なるほど、やっと解ったような気がします。どうもありがとうございました。
589 名前:デフォルトの名無しさん [2007/06/16(土) 11:57:56 ] lisp厨、必死だなw
590 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 17:34:58 ] ここはlisp厨のスレだが何か?
591 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 18:47:59 ] チュウチュウうるさいなぁ、おまえらそんなにチュウが好きならスペースチャンネル5でもやってろ!
592 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 20:57:21 ] Squeakもあるぜよ
593 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 22:15:21 ] 本谷有希子さんとチュウしたい love6.2ch.net/test/read.cgi/book/1176782409/
594 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 14:29:24 ] FreeBSD6.2RELEASEでGauche0.8.10[utf-8]を使っています。 字句解析を使用と思い、以下の様なコードを書きました。 (define (lex-analyze inpx) ;; inpx: input port (define (op? inpx) (define op-char #\() (if (char=? op-char (peek-char inpx)) (begin (read-char inpx) (cons 'op (list op-char)) ) #f )) (define (cp? inpx) (define cp-char #\)) (if (char=? #\) (peek-char inpx)) (begin (read-char inpx) (cons 'cp (list cp-char)) ) #f ))
595 名前:594 mailto:sage [2007/06/18(月) 14:31:06 ] (define (ws? inpx) (if (char-whitespace? (peek-char inpx)) (let loop ((r (list (read-char inpx))) (nc (peek-char inpx)) ) (if (char-whitespace? nc) (loop (cons (read-char inpx) r) nc) (cons 'ws (reverse r)) )) #f )) (define (wd? inpx) (define (allowed-char? x) (not (char-whitespace? x))) (if (allowed-char? (peek-char inpx)) (let loop ((r (list (read-char inpx))) (nc (peek-char inpx)) ) (if (allowed-char? nc) (loop (cons (read-char inpx) r) nc) (cons 'wd (reverse r)) )) #f )) (define tokens (list op? cp? ws? wd?)) (define (f inpx) (let loop ((t tokens)) (cond ((null? t) #f) (((car t) inpx) => values) (else (loop (cdr t))) )))
596 名前:594 mailto:sage [2007/06/18(月) 14:32:01 ] (let loop ((r '())) (if (eof-object? (peek-char inpx)) (reverse r) (loop (cons (f inpx) r)) )) ) ここで、 echo '(+ 1 2)' > /tmp/hogeして作ったファイルを、 (define inp (open-input-file "/tmp/hoge"))として読み込ませて、 (lex-analyze inp)としたのですが、結果が返ってきません。 どうやら、2を読み込むところで時間がかかっている様なのですが、 どうしたらよいのでしょうか。
597 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 16:27:31 ] 答えじゃなくて悪いんだけど、 (let loop ((r (list (read-char))) (nc (peek-char))) letの束縛規則により、read-charとpeek-charの どっちの副作用が先に適用されるのか不明ですよ。 Cの関数呼び出し時の引数でgetcとungetcを同時にしてると考えてください。
598 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 16:28:16 ] とりあえずそのallowed-charでは ) も #t にしてしまう。
599 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 16:39:34 ] (loop (cons (read-char) r) nc) ncが更新されてないよ。 peek-charを使わずに書き直した方が良いのでは。
600 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 16:51:06 ] >>599 let loopの内側に(let ((nc peek-char)) ... ) でいいでしょ それよりファイル末尾がwhitespaceの列だったりするとws?がeof読もうとして死ぬ
601 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 17:18:39 ] そういえばchar=?で#<eof-object>を比較して大丈夫なの?
602 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 17:39:44 ] wd? は whitespace でしか終了しないでしょ。 ということは、 "2)" まで wd? で読み取って eof になっているが、 eof に対処するコードが wd? にないのでここで終了できなくなっている。これが原因でしょう。 仮に (+ 1 2 ) のように2と閉じカッコのあいだに空白を入れてみてごらん。それなら終わるから。 あと Gauche を使ってるなら text.parse とか便利なライブラリがあるから、そういうのを使った方がすっきり書けるよ。 ws? みたいなやつは skip-while を使えば一発だし。
603 名前:594 mailto:sage [2007/06/18(月) 18:32:44 ] >597 それは気づきませんでした。 ありがとうございます。 >598 すいません、怠けたかっただけなんです… でもそのせいみたいですね。 >602 ありがとうございます。 (+ 1 2 )にしてもエラーで止まってしまいます。 でもそこら辺にもんだいがありそうですね。 もう少しやってみます。 それからこれは自分でパーサを書いてみよう、という試みなので、 ライブラリを使うのは無しです。 でも参考にしてみようと思います。 みなさんありがとうございました。
604 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 20:08:26 ] 文字はリストやストリームとしていつでも取り出せるように蓄えとくと バックトラックとか副作用気にせずできて便利っすよ。 named-let活用したいみたいだしCPS勉強すると良いでしょう。 例えばトークン抽出時や#f返してる所は末尾コンテキストだから、 そのまま他の判定処理にたらい回しして継続できるし。 慣れればread-charとかのI/O操作は違うレイヤーとして管理できるよ。
605 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 21:37:01 ] 今日初めてreaderマクロなるものとCL-YACCと言う物を体験しました。 惚れた、もっと昔に食わず嫌いしないでやっておけばよかった。 ちょいとのめり込み中。
606 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 20:12:56 ] リストから、n番目の要素を削除して、その削除した要素を返す関数を書きました。 まず下のような感じで書いたのですが、これだと、nが0の場合にエラーになります。 (define (remove-at! ls n) (let loop((prev '()) (rest ls) (count n)) (if (zero? count) (begin (set-cdr! prev (cdr rest)) (car rest)) (loop rest (cdr rest) (- count 1))))) それで、nが0の場合は別に処理を入れてみたのですが、破壊的操作で、リストの先頭を削除するのがどうしてもわかりません。 どう書けばいいでしょうか? (define (remove-at! ls n) (cond ((null? ls) '()) ((zero? n) (let ((tmp (car ls))) (set-cdr! ls (cdr ls)) ;; ここがダメ tmp)) (else (let loop((prev '()) (rest ls) (count n)) (if (zero? count) (begin (set-cdr! prev (cdr rest)) (car rest)) (loop rest (cdr rest) (- count 1)))))))
607 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 20:41:55 ] >>606 > 破壊的操作で、リストの先頭を削除するのがどうしてもわかりません。 そういうことは原理的にできない。(理由は考えてみるべし) append! で第一引数が () の場合なども同様で、結果は明示的に返す必要がある。
608 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 21:24:07 ] (define (remove-at! ls n) (if (null? ls) (error "list too short") (if (zero? n) ((lambda (tmp) (set-car! ls (cadr ls)) (set-cdr! ls (cddr ls)) tmp) (car ls)) (remove-at! (cdr ls) (- n 1)))))
609 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 21:42:44 ] >>607 >(理由は考えてみるべし) Cだったら、下のようなコードで、仮引数のほうを書き換えて、実引数が変化しないって悩んでるようなもんですかね? struct cell { struct cell* next; const char *symbol; }; const char* remove_at(struct cell* p, int n) { p = ・・・・ ・・・ }
610 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 22:04:41 ] (define (remove-at! ls n) (cond ((null? ls) '()) ((zero? n) ((lambda (tmp) (set-car! ls (cadr ls)) (set-cdr! ls (cddr ls)) tmp) (car ls))) ((= 1 n) (if (null? (cdr ls)) '() (if (null? (cddr ls)) ((lambda (tmp) (set-cdr! ls '()) tmp) (cadr ls)) ((lambda (a b c) (set-car! b (car c)) (set-cdr! b (cdr c)) a) (cadr ls) (cdr ls) (cddr ls))))) (else (remove-at! (cdr ls) (- n 1)))))
611 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 22:42:56 ] >>608 >>610 サンキューです。 ((lambda (tmp) (set-car! ls (cadr ls)) (set-cdr! ls (cddr ls)) tmp) (car ls)) で、書き換えできるみたいですね。 勉強になります。
612 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 23:22:49 ] でも結局 (remove-at! 0 '(a)) とすると破綻する。 変数の参照先をconsセルから全く別のものに置き換える操作って無いよね?
613 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 23:35:42 ] 話を単純にして、「リストの先頭を削除」を考えれ。 (set! リスト (cdr リスト)) これを関数化するのは不可能というのを理解してるかどうか。 (define (リスト削除 リスト) (set! リスト (cdr リスト)) リスト) (define リスト '(a b c)) (リスト削除 リスト) => (b c) リスト => (a b c) (set! リスト (リスト削除 リスト)) リスト => (b c) 答え (define-macro (リスト削除 リスト) `(let ((リスト ,リスト)) (set! リスト (cdr リスト)) リスト)) (リスト削除 リスト) リスト => (b c)
614 名前:デフォルトの名無しさん mailto:sage [2007/06/20(水) 23:37:16 ] ごめ、間違えた まあ判るよね
615 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 17:54:16 ] CLにはsetってのがありますが、 なんでschemeではないのでしょうか。
616 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 18:16:03 ] 思想が違うから
617 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 18:35:45 ] 最初期のSchemeにはあったが 危険だし行儀が悪いってことで廃止された
618 名前:615 mailto:sage [2007/06/21(木) 19:04:54 ] >617 危険だというのは分かりますが、 行儀が悪いというのはどういうことですか?
619 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 19:28:08 ] プログラミングスタイルとしてよろしくないってこと
620 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 19:29:11 ] はあああああ?????
621 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 20:08:13 ] 知能障害発生
622 名前:デフォルトの名無しさん mailto:sage [2007/06/21(木) 20:35:34 ] (gc)
623 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 10:46:01 ] LISP 1.5 Programers manual(MIT press) というものが発掘された。
624 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 14:22:00 ] 下の例で、1 は自然に理解できるんですが、次の 2 がなぜそうなるのか… ;; 1 (define a '(big brown dog)) (define b (cons 'the a)) a ;=>(big brown dog) b ;=>(the big brown dog) (eq? a (cdr b)) ;=>#t (set-cdr! a '(black cat)) (eq? a (cdr b)) ;=>#t ;; 2 (define a '(big brown dog)) (define b (cons 'small (cdr a))) a ;=>(big brown dog) b ;=>(small brown dog) (eq? (cdr a) (cdr b)) ;=>#t (set-cdr! a '(black cat)) (eq? (cdr a) (cdr b)) ;=>#f (cdr a) ;=>(black cat) (cdr b) ;=>(brown dog) 同一のオブジェクトを指しているのに、なぜ (cdr b) は元のままなんでしょうか?
625 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 15:01:42 ] 図に書いてみればいいんでない
626 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 15:10:25 ] > 同一のオブジェクトを指しているのに 指していません。
627 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 16:33:26 ] >>625 > 図に書いてみればいいんでない 図を書いてみてやっとわかりました! >>626 > > 同一のオブジェクトを指しているのに > 指していません。 set-cdr! する前の (cdr a) と (cdr b) は同一のオブジェクトを指しているけど、 set-cdr! のところで、新しいコンスセルが作られて、a の cdr がそのコンスセルを 指すようになっただけなんですね! 1 のケースもやっぱりわかってなくて、 eq? で比較して同じなんだから当然だよなとか思ってただけでした。 今度からはちゃんと図を書いて考えることにします。ヒントありがとうございました!
628 名前:デフォルトの名無しさん mailto:sage [2007/06/23(土) 18:32:46 ] 1つの定数を使いまわすならeq?は真だけど 2つの同値の定数が同アドレスになるかどうかは処理系依存
629 名前:デフォルトの名無しさん [2007/06/24(日) 21:51:05 ] lispとschemeって何が違うの? 普段はclispをcygwinとfinkで使ってるんだけど ttp://itpro.nikkeibp.co.jp/article/COLUMN/20070618/275142/ ここ見てたら 「私のお勧めは,Lispの方言の一つであるSchemeの処理系,Gaucheです」 なんて書いてあるからすこし気になって・・・
630 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 23:05:32 ] 方言つーことはSchemeはLispの一種であるわけだ。 単にLispっていうとCommonLispのことを指したりする場合が多いけど、 それっぽい系統の言語は全部Lispだ。 だけど、CommonLisp使いはSchemeをLispと呼びたくない人もいたりして、 それぞれの主張がある。 その辺は空気を読んで折り合いを付けていかねばならんところ。 CommonLispとSchemeの何が違うかって言う話を一言で言えば規格が違う。 どのように思想が違うかってのはウェブ上に色々文章があるから、 それを見てから疑問に思ったことを質問してくれ。
631 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 23:14:19 ] スペイン語とイタリア語みたいなちがいだ。 使ってるやつらにとっては大きな違いで、お互い意味通じねえよ! っていってるが、日本から見たらどっちも同じようなもん。
632 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 23:42:54 ] >>631 ポルトガル語とスペイン語のほうが分かりやすいかも。
633 名前:デフォルトの名無しさん mailto:sage [2007/06/24(日) 23:53:37 ] >>629 人の勧めにいちいち流されない人間になるのが先決では?
634 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 00:03:01 ] >629 JavaとD言語くらい違う ダートマス大学のBASICとMS-BASICぐらい違う 元々同じ系統で似たような書き方をするが 同じコードが通ることはまず無いって感じかな 同じことするにも違う書き方をする場合が多い
635 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 00:31:53 ] >>629 今のSchemeと少し違うけどこれ読むといいよ Scheme: A Interpreter for Extended Lambda Calculus www.brics.dk/~hosc/local/HOSC-11-4-pp405-439.pdf
636 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 01:23:43 ] >>633 関係なくね?
637 名前:デフォルトの名無しさん mailto:sage [2007/06/25(月) 23:54:24 ] >>635 ほえーこれがCSの論文かー。本文にコードが書きまくってあって驚いた。 普段自然科学の論文しか読まないもので。いきなり本文に、 Let us now compute (fact 3).とかあって笑た。
638 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 02:14:02 ] >618 関数型は基本的に変数というものが希薄。理由は、関数型のスタートは チューリングマシンや階差機関、ノイマン型を元とした手続き型言語と基本的 な原理が違う。同様にloopもunsafe。考え方を改めないとだめ。
639 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 06:37:45 ] >>638 的外れ。 set! なら関数型で安全なのか?
640 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 08:26:45 ] 日本語でおk
641 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:02:32 ] コンストラクタだけでコードを書くことをイメージするんだ