1 名前:デフォルトの名無しさん mailto:sage [2009/01/13(火) 23:16:33 ] ※ ここはCommon Lisp、SchemeをはじめとするLisp族全般のスレです ※ Part24: ttp://pc11.2ch.net/test/read.cgi/tech/1224939205/ Part23: ttp://pc11.2ch.net/test/read.cgi/tech/1215875388/ Part22: ttp://pc11.2ch.net/test/read.cgi/tech/1211381920/ Part21: ttp://pc11.2ch.net/test/read.cgi/tech/1207300697/ Part20: ttp://pc11.2ch.net/test/read.cgi/tech/1205021786/ Part19: ttp://pc11.2ch.net/test/read.cgi/tech/1200237296/ Part18: ttp://pc11.2ch.net/test/read.cgi/tech/1186922295/ Part17: ttp://pc11.2ch.net/test/read.cgi/tech/1177065699/ Part16: ttp://pc11.2ch.net/test/read.cgi/tech/1172404795/ Part15: ttp://pc10.2ch.net/test/read.cgi/tech/1151025773/ Part14: ttp://pc8.2ch.net/test/read.cgi/tech/1132275726/ Part13: ttp://pc8.2ch.net/test/read.cgi/tech/1115901841/ Part12: ttp://pc8.2ch.net/test/read.cgi/tech/1100229366/ Part11: ttp://pc5.2ch.net/test/read.cgi/tech/1091456033/ Part10: ttp://pc5.2ch.net/test/read.cgi/tech/1075630259/ Part09: ttp://pc2.2ch.net/test/read.cgi/tech/1069594582/ Part08: ttp://pc5.2ch.net/tech/kako/1058/10582/1058263391.html Part07: ttp://pc5.2ch.net/tech/kako/1042/10421/1042167213.html Part06: ttp://pc3.2ch.net/tech/kako/1031/10315/1031560687.html Part05: ttp://pc3.2ch.net/tech/kako/1023/10230/1023091882.html Part04: ttp://pc.2ch.net/tech/kako/1016/10162/1016211619.html Part03: ttp://pc.2ch.net/tech/kako/1008/10082/1008220265.html Part02: ttp://pc.2ch.net/tech/kako/1002/10025/1002584344.html Part01: ttp://piza2.2ch.net/tech/kako/987/987169286.html
492 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 11:02:23 ] 質問します。 組合せ問題、経路問題などの、記号処理問題をリストを使って解決するのに 相応しい言語を教えてください。 環境はできるだけ特定のOSに限定されない方が結構です。 グラフ表示は別の専門家が扱うのでロジック部分のみです。
493 名前:492 mailto:sage [2009/03/12(木) 11:15:29 ] すみません。誤爆です。"初心者のためのプログラミング言語ガイド Part14"に書き込む つもりでした。直前にこのスレを確認していたのでpasteされたURLがここになって いました。 このスレの方々は それはSchemeだ! っておしゃいますよねw
494 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 11:16:25 ] cl-graph boost::graph
495 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 11:54:50 ] >>492 「リストを使って解決するのに相応しい」って、その質問がすでにLISPを想定しているとしか。その名も、LISt Processer。 昔は人工知能を書くために使われていたので、ターゲット分野的にもぴったり。 LISPをはずすなら、Haskellかなぁ。 ただ、Haskellはマルチバイト文字の処理周りが痛いらしい。
496 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 12:03:13 ] >>485 Gauche特有の話だし、wilikiででも質問してみたら?
497 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 16:25:52 ] ものまね鳥をまねる、14000円つけてるなw 今図書館で借りっぱなしで催促の電話が何度もかかってる。 忙しくて読めなかったんです。 この場を借りて予約入れてる人に謝るよ。
498 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 16:33:29 ] lispのラーメンタイマーだよ (require :pythononlisp) (py::py "import noodletimer;noodletimer.noodletimer")
499 名前:デフォルトの名無しさん mailto:sage [2009/03/12(木) 16:43:28 ] QiはQiからlispよぶのは簡単なのに Qiをdumpしてlispから呼ばせるにはコードいじれって書いてある 自動でできないものなんだろうか
500 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 03:25:49 ] lispは、カッコばかりでみづらいとよく言われるけど これは、慣れだね 生産効率性については、まだよくわからないけど
501 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 05:23:24 ] 入門者レベルなんですが、lambdaを使わないと書けないんでしょうか 練習問題 1 次の関数を再帰を使って書いてください。 3. リスト (ls) から要素 (x) を取り除いたリストを返す関数。 ; 3 模範解答 (define (remove x ls) (if (null? ls) '() (let ((h (car ls))) ((if (eqv? x h) (lambda (y) y) (lambda (y) (cons h y))) (remove x (cdr ls))))))
502 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 06:56:30 ] >>501 (define (remove x ls) (cond ((eq? x (car ls)) (cdr ls)) (else (cons (car ls) (remove x (cdr ls))))))
503 名前:502 mailto:sage [2009/03/14(土) 08:50:42 ] Σ(゚д゚) ls の中に x が二回以上出る場合はこうだ。 (define (remove x ls) (cond ((null? ls) '()) ((eq? x (car ls)) (remove x (cdr ls))) (else (cons (car ls) (remove x (cdr ls))))))
504 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 08:58:47 ] >>502 突っ込もうと思っていました 最初のは、(remove 5 '(1 2 3 2))でもコケますね ヒントで実装までできました ありがとうございました
505 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 19:18:21 ] これ読んでいるとlispのほうが良さそうにみえるね www.unixuser.org/~euske/doc/python/python-lisp-j.html
506 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 20:54:29 ] Schemeでスタックを書こうとした場合 スタックのデータはグローバル変数に置くのが普通ですか? 出来たらクロージャとかに閉じ込めたいのですが 引数を2個にして1個目でpush/pop判断だとpopの時は引数が一つ無駄だし 個別にクロージャを使うと環境が別々になるし。 Gaucheのオブジェクト指向拡張とかだと綺麗にかけるんでしょうかね 他に思いつくのは、モジュールを作って そこにスタック本体のデータを置くとかですが どれが良いと思いますか 環境はGauche0.8.14です
507 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 21:08:09 ] どれがって、consセルで作れば簡単じゃないかと
508 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 21:21:08 ] (define top car) (define pop cdr) (define push cons) じゃまずいですか?
509 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 21:40:07 ] >>505 例外処理の項目の数値が未だに信じられない
510 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 21:52:51 ] >>508 スタックをリストとして直接触らせたくないってことなんじゃね? まぁ、Gauche の OO 関連はそんなに効率が良くないので、 クロージャに閉じ込める方がまだ無駄は少いかもね。
511 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 22:01:34 ] >>509 > まぁ、Gauche の OO 関連はそんなに効率が良くないので、 > クロージャに閉じ込める方がまだ無駄は少いかもね。 くわしく なにと比べて? 効率って生産効率?
512 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 22:06:56 ] >>506-508 想像だけど、破壊的更新をしたいじゃないの? オブジェト志向なら、 a = stack.pop() stack.push(b) … とか書くわけジャン。
513 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 22:14:32 ] >>511 速度とかメモリ効率とか。 メソッドのディスパッチも基本的には実行時にしか出来ないし。 どうでもいいけど、アンカ間違ってるぞ。 速度的には検証していないけど、 なんとなく>>506 がイメージしているものを想像して書いてみた。 Gauche には依存していないつもり。 (define (make-stack) (let ((stack (cons '() '()))) (lambda(proc) (proc stack)))) (define (push stack-obj elem) (stack-obj (lambda(stack) (set-cdr! stack (cons (car stack) (cdr stack))) (set-car! stack elem)))) (define (pop stack-obj) (stack-obj (lambda(stack) (if (null? (car stack)) '() (let ((elem (car stack))) (set-car! stack (cadr stack)) (set-cdr! stack (cddr stack)) elem)))))
514 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 22:23:34 ] スタックはconsで実装するつもりだったし、 なんか話がかみ合わないと思ったら・・そういうことか、理解しました 自分がやりたかったのは510氏のいうような意味でして ちょっと調べてたら可変長引数なる便利なものがあるってわかったので これで実装出来ました。もう少し処理を追加したら自分の目的には使えそうな感じ (define (stack) (let1 val '() (lambda a (let-optionals* a ((b 'none)(c '())) (cond ((eq? b 'none) val) ((eq? b 'top) (if (eq? val '()) '() (car val))) ((eq? b 'push) (set! val (cons c val)) c) ((eq? b 'pop) (if (eq? val '()) '() (let1 r (car val) (set! val (cdr val)) r)))))))) (define a (stack)) (a 'push 1) (a 'push 2) (a 'push) (a) (a 'pop) (a)
515 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 22:43:02 ] >>513 (規制されてて書き込みのタイミングが悪かったのですが・・) そういえば、Schemeのライブラリは、こういう形のほうが多いですね 参考にさせてもらいます ありがとうございました
516 名前:デフォルトの名無しさん mailto:sage [2009/03/14(土) 23:03:47 ] 最近のスタックインターフェースは、 top, pop, pushと三つに分けるのが主流だよ。 もはやイディオムになっているといっていい。
517 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 00:08:39 ] ;; クロージャに閉じ込める (define (with-stack f) (let ((stack '())) (f ;; push (lambda (obj) (set! stack (cons obj stack))) ;; pop (lambda () (if (null? stack) '() (let ((obj (car stack))) (set! stack (cdr stack)) obj))) ;; top (lambda () (if (null? stack) '() (car stack)))))) (with-stack (lambda (push pop top) (push 1) (push 2) (push 3) (write (top)) (write (pop)) (write (top)) (write (pop)) (write (pop)) (write (pop))))
518 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 00:10:58 ] topってなんや?
519 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 00:11:52 ] 解決 あとemptyっていうのも重要っぽいね
520 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 02:34:25 ] []も使うようにしたほうがいいの? 処理系によっては [] を () と同じように使えて、多少見かけを区別することができます: (let ([x (calculate-x a b c)] [y (calculate-y d e f)]) body ...) (cond [(predicate x) (do-something) (do-something2)] [(predicate y) (do-another-thing)] [else (do-whatever)]) 括弧の意味の多重化 (中段) practical-scheme.net/wiliki/wiliki.cgi?Lisp%3aS%E5%BC%8F%E3%81%AE%E7%90%86%E7%94%B1
521 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 03:12:22 ] どうせそんなのはppしたら消えてしまうでしょ。 意味がある試みとは思えない。
522 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 03:32:55 ] つーかカッコが何種類も入り乱れるのは激しくウザい
523 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 04:59:08 ] 世間でC言語みたいなものが好まれるのは、 演算子を含む式と文とのバランスが良く、 メリハリが付くからだと思う。 LISPは書式が関数も式も文も全く同じ規則で さらにそれを括る括弧に極端に縛られる。 C言語でも関数呼び出しだけで書いていけば 同じ印象になるが、C言語では関数のネストなんて 書こうと思わなければほとんどする必要がない。 要するに括弧の形を変えたところであまり効果はない。 S式ベースでうだうだ考えるよりは、括弧に縛られない 都合の良い構文フロントエンドを作った方がマシである。
524 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 05:20:32 ] 俺は好きでよく使っているけどなぁ。 処理系によっては()[]{}の3種類が使えるから、数学の式を書くときみたいな感覚で。
525 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 05:34:48 ] ・よく言われる演算子の有無 前置記法である事と関係する。 a.b.cは (ref(ref a 'b)'c) 1 2 3 のような書き方になる。 見ての通り1を脳内スタックに積んで2を読み、 1を降ろして3と結合する、という思考を要求する。 また、aとb,cは同一に扱えない。 ((ref a b c)とは書けず、何かしら歪になる) 演算子があれば a.b.c 1 2 3 や a().b().c() 1 2 3 どちらも1から3まで、左から右へと目を動かすだけで良い。 修正が発生しても一箇所で済む。 これはS式というより、前置記法では解決できない問題と認識している。
526 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 05:46:04 ] 前置記法を排除すればS式でも(a -> b -> c)と書ける。 ここで、aをマクロ的に加工して実装してしまう事も考えられる。 が、それが現実的ではない事も判っている。 自分で演算子を作り、管理するのと同じ事になる。
527 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 05:58:26 ] また>>526 の(a -> b -> c)のように、 S式内で独自言語を構築する場合、 独自言語の構文としての括弧もあるので、 S式のくくりの括弧がどうしても邪魔に見える。 ここまでやるならもうS式である意味がない。 a->b->cと書きたいならそのまま書けばいい。
528 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 06:25:55 ] だから、どうせやるなら>>523 に書いた通り、必要時にS式も扱えるような ちゃんぽん言語でもLISPで作ったらどうかというわけ。 不毛な縛りの中で何かやるよりはよっぽど健全ではないかと思う。 S式はデータとしてならともかく、コードとして出てくる必然性はあまりない。 >>520 とどっちが読みやすいだろうか? let x=calculate-x(a, b, c), y=calculate-y(d, e, f) in body ...; if (predicate(x)) { do-something(); do-something2(); } else if (predicate(y)) { do-another-thing(); } else { do-whatever(); }
529 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 06:54:38 ] 入門者なんですが、shchemeでS式以外の書き方の標準構文ってあるんでしょうか? 人間のパターン認知力なのか、人間の適応力のすごさ、慣れなのか、よくわからないけど 今のままのほうがいい気がする 基本レベルの正規表現が使える人で、schemeを100時間触ってみて、それで真っ当な意見を聞きたいかも みんな、「このまままでいいんじゃねえ?」って言いそう 採用する理由になった論文の疑似コードもみてみたいところだが
530 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 07:12:55 ] >>525 refが関数なら、(define ref* (lambda x (fold ref (car x) (cdr x))) で (ref* a 'b 'c) って書けるんじゃない。 つか一般に二項演算子があるならfoldしてやりゃ不定長でも扱えるでしょ。 マクロならマクロでくるんでやればいいだろうし。 まあquoteは必要だけど、それは別の話だよね。
531 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 07:43:20 ] >>529 昔の Lisp の論文とかには M 式ってあったね。 en.wikipedia.org/wiki/M-expression Scheme の方だと SRFI 49 で I 式っていうのが提案されてる。 srfi.schemers.org/srfi-49/srfi-49.html 正規表現云々は知らないが、どっちもあまり流行ってない。
532 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 10:10:46 ] そういえば、syntax が安定するまでは yacc を使って試行錯誤して 安定したら手書きの parser を使うという話を聞いたことがある。 lisper は逆に yacc より更に柔軟な方向に進もうとするのか。
533 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 10:31:03 ] リードマクロがあるからね。
534 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 11:54:13 ] >>528 マクロを忘れてるぜ。 コードがS式だからマクロ変換子は単なるリスト操作をすれば済むんだろう。 Scheme のマクロは単なるリスト操作じゃないけど、S式は大前提だ。 リーダーマクロにしたところで、内部的にはやっぱりS式だしな。
535 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 12:13:45 ] リードマクロってキャラクタストリームベースじゃなかったっけ?
536 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 21:58:23 ] ; M-x run-scheme で下のコードをC-x C-eすると、最後に添付するエラーになってしまいます (define (foo x) (if (= x 0) '() (cond ((= (modulo x 15) 0) (cons "FizzBuzz" (foo (- x 1)))) ((= (modulo x 5) 0) (cons "Buzz" (foo (- x 1)))) ((= (modulo x 3) 0) (cons "Fizz" (foo (- x 1)))) (else (cons x (foo (- x 1))))))) 環境 "GNU Emacs 22.3.1 (x86_64-unknown-linux-gnu) of 2009-03-10 on localhost.localdomain" guile> "1.8.0" ちなみにon emacsでloadすると、うまくいきます。 guile> (load "fizzbuzz.scm") guile> (foo 21) ("Fizz" "Buzz" 19 "Fizz" 17 16 "FizzBuzz" 14 13 "Fizz" 11 "Buzz" "Fizz" 8 7 "Fizz" "Buzz" 4 "Fizz" 2 1) また、gosh on emacsだと、こうなります gosh> (32 31 #0="FizzBuzz" 29 28 #1="Fizz" 26 #2="Buzz" #1# 23 22 #1# #2# 19 #1# 17 16 #0# 14 13 #1# 11 #2# #1# 8 7 #1# #2# 4 #1# 2 1) OS再起動してもダメでした エラー(長いので、一部略) guile> ... ... Display all 1922 possibilities? (y or n) ... Display all 1922 possibilities? (y or n) $abs EISCONN ERROR: Unbound variable: s ABORT: (unbound-variable) "Fizz"
537 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 21:58:57 ] Backtrace: In current input: 307: 0* [foo 3] 304: 1 (if (= x 0) (quote ()) ...) <unnamed port>:304:1: In procedure memoization in expression (if (= x 0) (quote ()) ...): <unnamed port>:304:1: In line 303: Missing or extra expression in (if (= x 0) (quote ()) d ((= (modulo x 15) 0) (cons "FizzBuzz" (foo (- x 1)))) s "Buzz" (foo (- x 1))). ABORT: (syntax-error) ERROR: In procedure scm_lreadr: ERROR: #<unknown port>:307:24: unexpected ")" ABORT: (read-error) ERROR: In procedure scm_lreadr: ERROR: #<unknown port>:307:25: unexpected ")" ABORT: (read-error) guile> Display all 1922 possibilities? (y or n) $abs %app %cond-expand-features %cond-expand-table %get-pre-modules-obarray %guile-build-info ERROR: Unbound variable: s ABORT: (unbound-variable) 4 Backtrace: In current input: 308: 0* [foo 3]
538 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 21:59:36 ] <unnamed port>:304:1: In procedure memoization in expression (if (= x 0) (quote ()) ...): <unnamed port>:304:1: In line 303: Missing or extra expression in (if (= x 0) (quote ()) d ((= (modulo x 15) 0) (cons "FizzBuzz" (foo (- x 1)))) s "Buzz" (foo (- x 1))). ABORT: (syntax-error) ERROR: In procedure scm_lreadr: ERROR: #<unknown port>:308:19: unexpected ")" ABORT: (read-error) ERROR: In procedure scm_lreadr: ERROR: #<unknown port>:308:20: unexpected ")" ABORT: (read-error) ERROR: In procedure scm_lreadr: ERROR: #<unknown port>:308:21: unexpected ")" ABORT: (read-error) ERROR: In procedure scm_lreadr: ERROR: #<unknown port>:308:22: unexpected ")" ABORT: (read-error) ERROR: In procedure scm_lreadr: ERROR: #<unknown port>:308:23: unexpected ")" ABORT: (read-error) guile>
539 名前:デフォルトの名無しさん mailto:sage [2009/03/15(日) 22:58:47 ] (print (foo 21)) or (write (foo 21)) トップレベルプリンタが同一オブジェクトを複数回出力しないだけの問題では?
540 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 02:04:38 ] >>539 どういう意味ですか? 自分なりに解釈して、やってみたけど、ダメでした
541 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 04:02:54 ] >>540 >>539 の言っているのは gosh の出力についてだね。 guile のエラーについては式が guile にちゃんと渡されてない感じがする。 プロンプトが複数回表示されてるあたり、 式が複数に分割されて渡されている形になってそうなんだけど。 gosh だと C-x C-e でちゃんと動いてるのかな。
542 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 06:02:16 ] アドバイスをきっかけに解決しました タブによるインデント構造をつくるとこのエラーになるみたいです スペースに置換してみたら、通りました おとといまでは、普通に使えていた気がしたので、謎です 特別な設定をしたとしたら、メニューバーのschme欄をちょっと触ったときなのかな 触ったあとに特別不都合は、なかった気がしたけど >>541 > >>539 の言っているのは gosh の出力についてだね。 把握しました > gosh だと C-x C-e でちゃんと動いてるのかな。 もちろん、そうです ドキュメント関係とデバッグ関係が整備されていそうなguileで行きたいんですよね 言語に慣れていないレベルなので、文字列処理関係は、まだ先っぽいので 気に掛けてくださったみなさま、お世話になりました
543 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 07:18:20 ] ああそっちの問題か readlineが悪さをしてる予感 emacsで使うときはactivate-readlineを無効にしたらどうでしょう
544 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 09:56:12 ] >>543 本当だ cat ~/.guile (use-modules (ice-9 readline)) (activate-readline) の設定を外したら、tabインデントでもC-x C-eが通るようになりました また、安直にcat ~/.gosh (use-modules (ice-9 readline)) (activate-readline) としていたんですが、これって効いていないんですね goshに関しては、info関連をまだ目を通していないので、あれなんですけど 構文を多少読めるようになったので、readline.scmとguile関連のinfoを眺めてみることにします
545 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 16:32:24 ] gaucheのインタラクティブモードで読み込まれるスクリプトは.gaucherc。 それとice-9モジュールはguileの物であってgaucheにはない。 .guileから外すのは(activate-readline)だけでいいと思う。 gaucheを使うのならttp://practical-scheme.net/gauche/man/gauche-refj_toc.htmlを読む事を勧めます。 guileのgaucheに対する利点:多くのOSでportやpackageが用意されている。リードマクロがある。親方GNU。 gaucheのguileに対する利点:速い。日本語のドキュメントが多い。マルチバイト文字がサポートされている。
546 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 22:37:55 ] (activate-readline)を外すのが嫌だったので、とりあえず関数に割り当ててみました scheme, lisp関連の設定って、みなさんは、どういうふつうにされているんでしょうか? 不都合がなければ、晒してほしい・・・ cat ~/.guile ; first setting (use-modules (ice-9 readline)) (define (a) (activate-readline)) ; adding (use-modules (ice-9 popen)) (use-modules (ice-9 rdelim)) (define date (read-line (open-input-pipe "date -R"))) (define pwd (read-line (open-input-pipe "pwd"))) (define echo-home (read-line (open-input-pipe "echo $PATH")))
547 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 22:43:57 ] activate-readlineはemacsからrun-schemeで使うときは不要。っていうか邪魔。 (or (string=? "dumb" (getenv "TERM")) (activate-readline)) とか書けばいいんじゃないかな (run-schemeのときは環境変数TERMがdumbに設定されるから)
548 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 22:59:01 ] ああそれからactivate-readlineは起動後の任意の段階で評価できるから .guileに書かないでおいて、シェルから直にguileを起動しただけ 手動で評価してもいい。 $ guile guile> (activate-readline) guile> scheme、lisp関連の設定といっても自分は.emacsくらいですね。 ttp://karetta.jp/book-node/gauche-hacks/004682などを参考にするといいと思います。
549 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 23:11:27 ] >>543 なるほど、readline が \t を食っちゃうのか。 知らないと意外とはまりそうだな。覚えておこう。
550 名前:デフォルトの名無しさん mailto:sage [2009/03/16(月) 23:26:15 ] 逆に言えばreadlineでシンボル補完が効きます
551 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 00:01:45 ] ドキュメントとデバッグ環境でGuileを選ぶってのも珍しい気がする。 そういう場合はPLTとかに行きそうなもんだけど。
552 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 00:26:21 ] >>547 コンソール時 echo $TERM linux gnome-terminal時 echo $TERM xterm emacs時 echo $TERM emacs なのに、なぜemacs時だけ(activate-readline)が実行されないの? >>551 scheme処女なもんで4つのinfoがあるguileなのかなと思って PLTは、存じませんでした 候補として考えたのは、Gauche, guile(, tiny scheme)の2つ(3つ)ですね ちょっとした疑問なんですが、guileにあるhelp関数ってGaucheにもあるんでしょうか? あと日本人のguile率って少ないんでしょうか? SchemeでぐぐるとGaucheがいっぱいひっかかりますね
553 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 00:47:53 ] Gaucheは高機能な上、日本人のShiro Kawaiさん作なので日本語のドキュメントがたくさんある。 guileはGNU標準でポータビリティは高いんだけど動作が遅くてスタックが(標準では)少ない。 入門用ならばR5RS規格に最も厳格にマッチしている上にguile以上のポータビリティがあるScheme48もお勧め。 自分はGauche>>guile>Scheme48の順に使ってます。 マクロの種類で言えば Gauche:syntax-rulesマクロ、伝統的マクロ guile:syntax-rulesマクロ、syntax-caseマクロ、伝統的マクロ、リードマクロ Scheme48:syntax-rulesマクロ、明示的改名マクロ なのでguileが最も充実してますが。
554 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 04:34:29 ] >>552 gaucheにはhelp関数は無いけどinfo関数というのがある。 ただ、表示されるのが「その関数を含むinfoの1ページ」なのでちょっと面倒。 emacsから使ってるなら、カーソルのある関数のinfoエントリを一発で*info*バッファに 表示するelispが昔MLに流れたことがあった気がする。
555 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 04:57:19 ] describeもaproposも使えるけど なんだかんだでhyperspecとslimeが使いやすいやね
556 名前:552 mailto:sage [2009/03/17(火) 05:23:33 ] 自己解決しました コピペまんまだと、activate-readlineきいていました "dumb"のところを"emacs"に変えればいいわけですね 当たり前と言えば、当たり前なんだけど 日本語WikipediaのSchemeの項目の最下部の外部リンクの「関数プログラミングは、なぜ必要か、うんぬん」の文章ってわけわからないっすね あの疑似コード、わかりにくいw プログラミングしていて、なんとなく関数言語がいうモジュール化がわかってきたかも >>553 今、気づいたんですが、日本語WikipediaにSchemeの処理系の項目は、Gauche以外書かれていないんですね そういう意味でもGaucheに流れる人が多いのかな >>554 info関数なんてあるんですね Gaucheのインストール失敗したのか、よくわかりませんが、info閲覧できないんですよね まだ必要に迫られていないので、ちゃんと調べていませんが >emacsから使ってるなら、カーソルのある関数のinfoエントリを一発で*info*バッファに >表示するelispが昔MLに流れたことがあった気がする。 便利そうですね >>555 slimeって聞きますね もうちょっとしたら、導入してみます
557 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 08:05:53 ] あれ、run-schemeで起動したguileで guile> (getenv "TERM") "dumb" ってなりませんでしたか? guile> (getenv "TERM") "emacs" なら"dumb"を"emacs"でいいですけど…
558 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 09:22:34 ] >>557 shellモードもrun-schemeモードも"emacs"と返りますね infoドキュメントでがんばって、勉強しているんですが けっこう大変ですね 基本的なlet, set, lambda関連の記述の仕方は、わかるんですが ちょっと複雑になると理解しにくい・・・
559 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 10:39:23 ] >SchemeでぐぐるとGaucheがいっぱいひっかかりますね 絶望した!横文字をウェブ全体から検索した結果に絶望した!
560 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 13:28:37 ] infoで勉強する心意気は結構ですけど 先ずは>>216 あたりのウェブページで勉強するほうが楽かもしれません。 わからない所はこことかに具体的にドシドシ書きこむと さらに後に続く人の為にもなるでしょう。
561 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 19:17:54 ] >>560 > infoで勉強する心意気は結構ですけど > 先ずは>>216 あたりのウェブページで勉強するほうが楽かもしれません。 infoで勉強するのが今回の目的だったりするんですよね あとguileは、なにができるだ(どういう機能があるの?)というのも速く知りたいから、 とりあえず、なぞっているのもあります もちろん、Schemeの学習階段的には、日本語の入門サイトは有用ですね 英語圏の人は、infoだけで事足りるのか、プログラミング経験度を前提しているのかとか
562 名前:デフォルトの名無しさん mailto:sage [2009/03/17(火) 22:17:23 ] >infoだけで事足りるのか そんな完璧な文書があると思うか? あるわけねーだろ 完璧を目指すのはいいが少しずつ地道に改善していくしかない ちなみに、アジャイルとかなんとか言われるようになる以前は 一発で完璧なものが作れると思ってる奴がたくさんいたとかいないとか
563 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 02:46:26 ] >>562 完璧な文書だとは、思わないけど 十分な文書だと思うよ
564 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 12:35:17 ] common lispの情報探そうとするとhatenaなどのblogにいきあたること多い schemeは2chの過去スレが検索にかかることが多い この違いは何?
565 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 12:46:13 ] Googleの中の人に聞いて下さい。
566 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 12:48:47 ] schemeしか知らないけど、lispでぐぐればいいんじゃない? lisp --> common lisp scheme --> scheme という理解だけど
567 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 12:48:51 ] &hl=en付けたら2chにもhatenaにもいきあたらないな
568 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 13:00:54 ] >564 実用性があるか無いか、実アプリ開発に使ってるか否かの差だとオモ。 言い方を変えればSchemeは教育的効果は高いが…
569 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 13:30:55 ] おっとBASICの悪口はそこまでだ
570 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 15:54:36 ] schemeで、(car '())や(cdr '())の結果はどうなるんしょうか? 昔読んだLISPの本か何かでnilのcarやcdrはnilになるという 説明を見た気がするのですが、schemeにも当てはまるんでしょうか。
571 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 16:04:13 ] r5rsでは空のリストにcar,cdrはエラーって定義されてるな
572 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 16:05:36 ] R5RS 6.3.2
573 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 16:06:31 ] r5rs-ja.pdfにありました。ありがとうございました。
574 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 21:02:29 ] >>497 オレ、とある図書館でその本の順番待ちなんだが、 まさかオマエが止めてるのか?w
575 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 22:54:43 ] なんだこいつ
576 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 23:33:46 ] これをLIFOと言います
577 名前:デフォルトの名無しさん mailto:sage [2009/03/18(水) 23:59:26 ] 後入れ中出しだっけ
578 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 00:29:47 ] アッー!
579 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 01:54:40 ] guile, gaucheよりelispのほうがデバッガが整備されているの? >Shiro(2007/09/05 13:39:49 PDT): 慣れが半分、後は「バグを出しにくいコードの書き方」が半分でしょうか。出来る限り副作用無しで書いておくとバグの切り分けが非常に容易になります。 >たぶん、「ソースの動きを追う」という考え方自体、C/C++とSchemeで差があるんではないかと思います。 practical-scheme.net/wiliki/wiliki.cgi?Scheme%3a%E5%88%9D%E5%BF%83%E8%80%85%E3%81%AE%E8%B3%AA%E5%95%8F%E7%AE%B1#H-1frlpc5 C(手続き型言語)との対比でschemeにとってソースの動きを追うってどんな感じなんですか? 個人的にデバッガを使って、「ソースをよく読み、ときどき書き」というのをしたいんですが
580 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 05:47:16 ] >>579 そのすぐ下に書いてある通りでは。 デバッガを使わずとも、replで個々の手続きを呼べるので、色々な入力を与えて出力を 見るかな。入力と出力の関係がすぐに把握できない(手続き内でステップ実行したいと思う) ようであればたぶん手続きが(あなたにとって)大きすぎる。
581 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 07:32:34 ] で、何のソースを読みたいの? 抽象論はもう飽きたよ
582 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 08:30:31 ] >C(手続き型言語)との対比でschemeにとってソースの動きを追うってどんな感じなんですか? そういえばあんまり追ったことないかも・・・スタックトレースが1000行と出ちゃうから。面倒なんでデバッガ使わなくなった。"Type (debug) to enter the debugger."とか出されても、もう無視(w
583 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 08:34:34 ] >>580 処理系への絶対的な信頼性ってこと? 効率的なデバッグ術の個人の差ってかなり開きがありそうだね >>581 日本語サイトのサンプルとか、とりあえず、デバッグツールで読みたいなあと思って バグでハマって、解決はしたけど、ものすごく時間がかかった場合は バグの見つけ方のポイントを教えてくださいね
584 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 10:56:39 ] 初心者ですけど (define (f x) (let ((a (hoge1 x)) (b (hoge2 a)) (c (hoge3 b)) (d (hoge4 c))) d)) ;; (f "なんちゃら") みたいな書き方をしています。 Emacsで、最後のコメントアウト行でC-c C-eで評価。 思ったような主力がでないときは、最後のdをcとかbとかに書き換えて、その段階での出力をみます。 手続き型に毒されたやり方でしょうか?
585 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 14:10:57 ] それをやるならlet*じゃないかね
586 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 14:33:22 ] >>579 自分はC++でプログラム書く時も、 デバッガ使うのはcore dump(assert含む)した時くらい。 基本的にユニットテストやってる。 自分のことを全然信用してないから、 全自動で網羅的なチェックした方がよい。 もちろんテストコードの方が圧倒的に多いし、 assertも馬鹿みたいに書いてる。 コードを書いたらすぐにユニットテストも書いてるから、 何かテストしたい時には、デバッガ立ち上げて操作するより、 既存のユニットテストコードを基に新たに書く方が速いw テスト、assertコードを書くのは設計の検討にもなってる。 設計をあらゆる角度から観察する必要があるから。 もちろんdtrace, profilerなんかも使いますが。
587 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 14:36:15 ] >自分のことを全然信用してないから、 分かるわ〜 自分もいっつもデイジー・デイジー歌っちゃう
588 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 15:46:53 ] そんなんじゃボーマンさんにスイッチ切られちゃうぞ。
589 名前:デフォルトの名無しさん mailto:sage [2009/03/19(木) 19:56:25 ] >>585 ご指摘のとおり、let* でした。
590 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 21:57:53 ] そのテストツールの作り方の方針というか みたいなものをまとめている本ってないでしょうか
591 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 23:28:14 ] そのってどの?
592 名前:デフォルトの名無しさん mailto:sage [2009/03/20(金) 23:32:39 ] まずデバッガに依存するのをやめて徹底的に構造化プログラミングを意識するようにした方がいいんじゃね?