1 名前:デフォルトの名無しさん [2005/05/12(木) 21:44:01 ] 過去スレ Part1: piza2.2ch.net/tech/kako/987/987169286.html Part2: pc.2ch.net/tech/kako/1002/10025/1002584344.html Part3: pc.2ch.net/tech/kako/1008/10082/1008220265.html Part4: pc.2ch.net/tech/kako/1016/10162/1016211619.html Part5: pc3.2ch.net/tech/kako/1023/10230/1023091882.html Part6: pc3.2ch.net/tech/kako/1031/10315/1031560687.html Part7: pc5.2ch.net/tech/kako/1042/10421/1042167213.html Part8: pc5.2ch.net/tech/kako/1058/10582/1058263391.html Part9: pc2.2ch.net/test/read.cgi/tech/1069594582/ Part10: pc5.2ch.net/test/read.cgi/tech/1075630259/ Part11: pc5.2ch.net/test/read.cgi/tech/1091456033/ Part12: pc8.2ch.net/test/read.cgi/tech/1100229366/ 関連リンクは>>2-10 あたり
458 名前:デフォルトの名無しさん mailto:sage [2005/06/21(火) 01:27:02 ] cmucl とかアセンブラ(に変換するlisp)で書かれているし。
459 名前:デフォルトの名無しさん mailto:sage [2005/06/21(火) 01:35:40 ] >>457 再発明なんて高々一回程度だよ。 古臭いCL使うぐらいなら再発明も悪くないだろう。
460 名前:デフォルトの名無しさん mailto:sage [2005/06/21(火) 02:49:08 ] CommonLispもSchemeもそうやって作られてきた。
461 名前:デフォルトの名無しさん mailto:sage [2005/06/21(火) 06:49:58 ] >>452 コマンドラインで、clisp -E ASCII とかどう?
462 名前:デフォルトの名無しさん mailto:sage [2005/06/22(水) 16:59:02 ] schemeを始めたんですけどリストを逆順にする関数がわかりません。 (define (reverse lst) (if (null? lst) '() (cons (reverse (cdr lst)) (car lst)))) こうやるとペアになってしまいます。 (reverse '(1 2 3)) ((3 2) . 1) (3 2 1)となるやつをおしえてください。
463 名前:デフォルトの名無しさん mailto:sage [2005/06/22(水) 17:29:15 ] (define (reverse lst) (if (null? lst) '() (append (reverse (cdr lst)) (cons (car lst) '()))))
464 名前:デフォルトの名無しさん mailto:sage [2005/06/22(水) 17:42:55 ] >>462 ↓わかりやすい例 (define (my-reverse lst) (if (null? lst) '() (append (my-reverse (cdr lst)) (list (car lst))))) ↓より効率の良い例 (define (my2-reverse lst) (my2-reverse-1 lst '())) (define (my2-reverse-1 lst done) (if (null? lst) done (my2-reverse-1 (cdr lst) (cons (car lst) done))))
465 名前:デフォルトの名無しさん mailto:sage [2005/06/22(水) 17:48:54 ] >>463 そりゃ効率が悪いよ。append で同じリストを何回もコピーしてしまう。 こっちの方がいいと思う。 (define (my-reverse list0) (let loop ((list0 list0) (result '())) (if (null? list0) result (loop (cdr list0) (cons (car list0) result)))))
466 名前:465 mailto:sage [2005/06/22(水) 17:50:23 ] あ、やっぱりかぶっちゃった。 私のはローカル関数を使って一つにまとめたバージョンということで。
467 名前:デフォルトの名無しさん [2005/06/22(水) 18:41:55 ] こういう片方向のリスト演算って、 他の言語だとしょーもないライブラリ関数や自作関数で 限定的にやるしかないんだよね。 やっぱ年季が違うなあ。 LISPすごい。
468 名前:デフォルトの名無しさん mailto:sage [2005/06/22(水) 19:39:23 ] (define my-reverse reverse)
469 名前:デフォルトの名無しさん mailto:sage [2005/06/22(水) 19:54:52 ] ワラタ。 (setf (symbol-function 'my-reverse) #'reverse)
470 名前:デフォルトの名無しさん mailto:sage [2005/06/22(水) 20:01:19 ] 無知丸出しw
471 名前:デフォルトの名無しさん mailto:sage [2005/06/22(水) 20:04:33 ] えー、どうやるの?
472 名前:デフォルトの名無しさん mailto:sage [2005/06/22(水) 20:07:53 ] >>470-471 え、なんかあったの?
473 名前:デフォルトの名無しさん mailto:sage [2005/06/22(水) 20:17:37 ] 無知ですいません。 これって Common Lisp だとどう書くのがスマートなんでしょうか?
474 名前:462 mailto:sage [2005/06/22(水) 21:09:29 ] 理解できました。ありがとう。
475 名前:デフォルトの名無しさん mailto:sage [2005/06/23(木) 06:31:50 ] (define (my-reverse! list0) (let loop ((list0 list0) (result0 '())) (if (null? list0) result0 (let ((result1 (loop (cdr list0) list0))) (set-cdr! list0 result0) result1))))
476 名前:デフォルトの名無しさん mailto:sage [2005/06/23(木) 06:49:08 ] !イラネ!!
477 名前:デフォルトの名無しさん mailto:sage [2005/06/23(木) 07:32:30 ] 効率命の破壊的リスト操作なのに、スタックを消費するのがつらいところだのう。
478 名前:デフォルトの名無しさん mailto:sage [2005/06/23(木) 08:15:37 ] (define (my-reverse! lst) (let loop ((l lst) (r '())) (if (null? l) r (let ((l1 (cdr l))) (set-cdr! l r) (loop l1 l)))))
479 名前:デフォルトの名無しさん mailto:sage [2005/06/23(木) 19:25:49 ] (define my-reverse! reverse!)
480 名前:デフォルトの名無しさん mailto:sage [2005/06/25(土) 06:39:47 ] >>165 に書かれてるイベント行った方います?
481 名前:デフォルトの名無しさん mailto:sage [2005/06/27(月) 04:36:05 ] この板にちょくちょく出没している様子のtabesugiのひとが行ったんじゃないか?
482 名前:デフォルトの名無しさん mailto:sage [2005/06/27(月) 22:50:00 ] Scheme のレキシカルスコープは Algol 60 の影響なのでしょうか? 私はラムダ計算の変数の、自由変数と束縛変数による影響だと思った のですが。
483 名前:デフォルトの名無しさん mailto:sage [2005/06/27(月) 22:58:18 ] 1970年代のLispは動的スコープが主流でFUNARG問題に悩んでいた。 それに対するアンチテーゼというか実験としてSchemeという言語が作ら れたような節はあるね。その後Common Lispにも採用されてLisp界全体 でもレキシカルスコープが主流になるわけだが。
484 名前:482 mailto:sage [2005/06/27(月) 23:10:36 ] >>483 もっと計算機よりの実装を知らなければならなかったのですね。 Lisp の歴史を勉強してみてよくわかりました。m(_ _)m
485 名前:デフォルトの名無しさん mailto:sage [2005/06/28(火) 08:54:21 ] Emacsが動的スコープなんで、何でレキシカルスコープじゃないの?とRMSに 尋ねた人によると、「レキシカルスコープは実行速度が遅い」といったそうな。 昔の話。
486 名前:デフォルトの名無しさん [2005/06/28(火) 09:22:24 ] International Lisp Conferenceに参加した人に聞いたんだけど、結構を盛り上がってたって聞いた。 結構人も集まってて、熱心な若者Lisperも結構いたのに驚いたとか。 bioinformatics系のアプリが結構多くて、時代の流れを感じたとか。 当日proceedingsが配布されたけど、後日、 www.international-lisp-conference.org から販売するそうな。
487 名前:デフォルトの名無しさん [2005/06/28(火) 12:56:20 ] 理解に苦しんでいるstatic scopeの話がちょうど出たようですので、 質問させてください。 ;;; 例-A ---------------------------------------- A1> (define foo begin) A2> (define bar (lambda (a b c) (foo a b c))) A3> (bar #t 0 1) ;;==> 1 A4> (define foo list) A5> (bar #t 0 1) ;;==> 1 ;;; 例-B ---------------------------------------- B1> (define foo (lambda (m) (- m 3))) B2> (define bar (lambda (n) (foo n))) B3> (bar 10) ;;==> 7 B4> (define foo (lambda (m) (+ m 3))) B5> (bar 10) ;;==> 13 例-Aのほうは、fooをtop-levelで再定義(A4)しても、 barを呼び出したとき(A5)には、手続き定義時(A2)の 環境が使われています。 これはstatic scopeの考え方からすると当然だと 思えるようになりました。 ところが、例-Bのほうは、 fooを再定義(B4)すると、手続き呼び出し時(B5)には 手続き定義時(B2)のfooではなく、再定義されたfooが 使われています。 この違いは何でしょうか?
488 名前:487 [2005/06/28(火) 13:00:37 ] 失礼。 static scopeではなくて、lexical scopeでした。
489 名前:デフォルトの名無しさん mailto:sage [2005/06/28(火) 13:20:54 ] >>487 変数が既に束縛されている場合の top level での define は set! と同等な ので例-B が妥当。例-A は A1 で変数に syntax を代入してるけど、変数経由 で syntax を使用した場合の動作は未定義のはず。たぶんその処理系では foo も syntactic keyword になって、かつ A2 の段階で展開されてしまってるん じゃないかと思う。
490 名前:487 [2005/06/28(火) 13:52:58 ] >>489 ありがとうございます。 > 変数経由で syntax を使用した場合の動作は未定義のはず。 これって、どこかに書いてありますか? 書いてないから未定義なのかな? ここらへんのことをよく知りたいと思っているのですが、よい 資料はありますでしょうか?
491 名前:デフォルトの名無しさん mailto:sage [2005/06/28(火) 17:17:51 ] >>490 >これって、どこかに書いてありますか? >書いてないから未定義なのかな? おれは489ではないのだがちょっと失礼する R5RSの5.2 Definitionsによれば、定義は (define <variable> <expression>) でもって7.1.3. Expressionsにはsyntactic keywordが<expression>になる記述は無い。 だから、(define foo begin)はR5RS的には有効ではないと思われる(例えばPLTとかchezとかはシンタックスエラーとなる) しかし1.3.2 Error situations and unspecified behaviorによれば処理系にそのエラーの報告義務は無い。 つまり動作は未定義で処理系依存でよいということであり、(define foo begin)などが通る場合は処理系独自の拡張の結果という事だと考えて良いと思うんだけど.......これでいいのかな?皆の衆
492 名前:487 [2005/06/28(火) 20:17:38 ] >>491 なるほどR5RSはそういう読み方をしなければいけないんですね。 私が試した処理系のほとんど(kawa,guile,gosh)では >>487 例-Aのようになったので、そうあるべきなのかと思いこんでいました。 唯一biglooと個人的に使っているマイナーな処理系では 同様のコードを読ませると、手続き定義後の変更も反映されて A3>==> 1 A5>==> (#t 0 1) となります。 厳密にはエラーなんですね。 489さん、491さん、ありがとうございました。
493 名前:デフォルトの名無しさん mailto:sage [2005/06/30(木) 05:47:08 ] かっちょえー lemonodor.com/archives/001177.html
494 名前:デフォルトの名無しさん mailto:sage [2005/07/02(土) 08:50:26 ] >>486 日本人もたくさん参加してたのかな?
495 名前:デフォルトの名無しさん mailto:sage [2005/07/03(日) 21:51:02 ] すいません 入れ子のリストの中身を調べて 最も大きい値を返す関数の定義という問題なのですが、 例えば(al-max'((1 3)((9)4)))を与えた時9を返すような 定義を教えて頂きたいのですが。 どのようにすれば良いのでしょうか? 入れ子を考えなければ (defun max1(x)(cond((null (cdr x))(car x))((<= (max1(cdr x))(car x))(car x))(t(max1(cdr x))))) このようになるんですけど。入れ子だと良く分かりません。
496 名前:デフォルトの名無しさん mailto:sage [2005/07/03(日) 22:13:31 ] >>495 scheme だけど。 ttp://www.geocities.co.jp/SiliconValley-PaloAlto/7043/index.html#lambda fold-tree っぽいものは標準であってもいいような気がするんだけどなあ。
497 名前:495 mailto:sage [2005/07/03(日) 22:32:44 ] >>496 ありがとうございます。 サイト見ましたが高級関数を定義とか ユーティリティ関数とかさっぱり分かりません。 具体的にはどうすればいいですかね?
498 名前:デフォルトの名無しさん mailto:sage [2005/07/03(日) 22:45:38 ] (defun al-max (lst) (cond ((numberp lst) lst) ((null (cdr lst)) (al-max (car lst))) (t (max (al-max (car lst)) (al-max (cdr lst))))))
499 名前:495 mailto:sage [2005/07/03(日) 22:48:47 ] >>498 ありがとうございます! 感謝です。
500 名前:デフォルトの名無しさん mailto:sage [2005/07/03(日) 23:01:11 ] (defun al-max (x) (if (listp x) (apply #'max (mapcar #'al-max x)) x))
501 名前:495 mailto:sage [2005/07/03(日) 23:05:49 ] すいませんmax使わないで作ることって事出来ますかね?
502 名前:デフォルトの名無しさん mailto:sage [2005/07/03(日) 23:08:35 ] max
503 名前:デフォルトの名無しさん mailto:sage [2005/07/03(日) 23:09:26 ] max を使いたくないなら、自分で max を書けばいいじゃない。
504 名前:デフォルトの名無しさん mailto:sage [2005/07/04(月) 00:03:01 ] >>503 そうですね、ありがとうございました。
505 名前:デフォルトの名無しさん mailto:sage [2005/07/04(月) 00:55:21 ] こっそりGauche 0.8.5が来てた。
506 名前:デフォルトの名無しさん mailto:sage [2005/07/04(月) 06:08:07 ] (al-max '()) の時はエラーですね。
507 名前:デフォルトの名無しさん [2005/07/04(月) 22:26:42 ] cmuclはまだwindowsでは動かんのか?
508 名前:デフォルトの名無しさん mailto:sage [2005/07/04(月) 22:59:59 ] 何の為に?
509 名前:デフォルトの名無しさん mailto:sage [2005/07/05(火) 00:24:57 ] >>508 何のためにって・・・Lispがネイティブに落ちるなら色々使えるじゃん。 いつまでもウニ系しか使えないからLispはマイナーなんだよ
510 名前:デフォルトの名無しさん mailto:sage [2005/07/05(火) 00:59:05 ] テツ&銀行・リスプを使えって、外国のおにいちゃんがゆってた
511 名前:デフォルトの名無しさん mailto:sage [2005/07/05(火) 01:05:16 ] 鉄銀行もWindows版はまだじゃなかったっけか
512 名前:デフォルトの名無しさん mailto:sage [2005/07/05(火) 04:50:41 ] なんでお前の話はすぐループするのか?一ヶ月前の有意義な話を、単に煽りの材料に転用しただけ。 お前の頭のねじれ具合は笑えるな。すげーおもしれえ。ちょーうけた。さいこー。
513 名前:デフォルトの名無しさん mailto:sage [2005/07/05(火) 04:54:27 ] KCLは20年前からネイティブコードで走ってるけど、何か?
514 名前:デフォルトの名無しさん [2005/07/05(火) 17:23:06 ] 長くなってすみません。 Schemeの手続きとそのスコープについて教えてください。 たとえば [ソースコード]------------------------------------------------------------ .1: (define a_proc .2: (lambda (n k) .3: (if (null? n) .4: ; true-clause .5: (begin .6: (newline) .7: (write 'true-clause) (newline) .8: (write 'n=) (write n) (newline) .9: (write 'k=) (write k) (newline) 10: (k '())) 11: ; false-clause 12: (begin 13: (newline) 14: (write 'false-clause) (newline) 15: (write 'n=) (write n) (newline) 16: (write 'k=) (write k) (newline) 17: (a_proc (cdr n) 18: (lambda (u) 19: (write 'n=) (write n) (newline) 20: (write 'k=) (write k) (newline) 21: (write 'u=) (write u) (newline) 22: (k (append n u)))))))) 23: (a_proc '(a) (lambda (x) x)) というコードを処理系に読ませると、
515 名前:デフォルトの名無しさん [2005/07/05(火) 17:24:47 ] >>514 の続き [出力結果]---------------------------------------------------------------- .1> false-clause .2> n=(a) .3> k=#<closure (x) x> ..> .4> true-clause .5> n=() .6> k=#<closure (u) ..> (write (quote sub-clause)) (newline) \ ..> (write (quote k=)) (write k) (newline) \ ..> (write (quote n=)) (write n) (newline) \ ..> (write (quote u=)) (write u) (newline) \ ..> (k (append n u))> ..> .7> n=(a) .8> k=#<closure (x) x> .9> u=() 10> (a) のような結果が得られます。
516 名前:デフォルトの名無しさん [2005/07/05(火) 17:26:14 ] >>514 の続き(ここまで) ソースコードは末尾再帰になっているので、 a_procのスコープは呼び出しにかかわらず単一であると考えると、そのスコープ内で 2>〜3>で表示されている最初の束縛関係が、一度5>〜6>のように変更されています。 ところが、18:〜22:で内部手続きを作成すると、そこでは、 変更されたの束縛関係(5>〜6>)ではなく最初の束縛関係(7>〜8>)に戻っています。 R5RS 4.1.4 Procedures には The environment in effect when the lambda expression was evaluated is REMEMBERED as part of the procedure. とあります。 この「REMEMBER」という語は「そのScopeへの参照を記憶する」ことを意味すると 理解していたのですが、上の実験結果を見る限り 「そのScopeを元に作成した複製を保持する」と解釈すべきなのでしょうか? 全く思い違いをしているかもしれません。ご指摘ください。
517 名前:デフォルトの名無しさん mailto:sage [2005/07/05(火) 18:23:24 ] まあ、一般論だが「考えると」いう条件つきで考えると、前提が間違っている せいで予想と違ってしまうようだ。
518 名前:デフォルトの名無しさん [2005/07/05(火) 19:25:05 ] >>517 間違えている前提を指摘してください。 お願いします。
519 名前:デフォルトの名無しさん mailto:sage [2005/07/05(火) 19:54:14 ] 自分で書いた文章の読解もできないの?
520 名前:デフォルトの名無しさん [2005/07/05(火) 19:58:53 ] 「a_procが末尾再帰になってない」ということでしょうか。 それとも「a_procのスコープは単一ではない」ということでしょうか。
521 名前:デフォルトの名無しさん mailto:sage [2005/07/05(火) 20:16:38 ] dynamic scope と lexical scope との違いを理解しましょう
522 名前:デフォルトの名無しさん mailto:sage [2005/07/05(火) 21:52:01 ] >>520 末尾再帰とスコープを関連づけているのはなぜですか
523 名前:本田 [2005/07/05(火) 22:54:51 ] >>513 :デフォルトの名無しさん :2005/07/05(火) 04:54:27 > KCLは20年前からネイティブコードで走ってるけど、何か? KCLのコンパイラはC言語にコンパイルするはず。
524 名前:デフォルトの名無しさん mailto:sage [2005/07/05(火) 22:58:46 ] C 言語は ASM にコンパイルされるし、ASM は機械語に変換される。 C にしない処理系でも IL に変換されたりするし、C にコンパイルしていても 最終的にネイティブコードになる事には変わりない。
525 名前:デフォルトの名無しさん [2005/07/05(火) 23:34:23 ] >>522 疑問に思ったのがこのコードを実行してみてだったので、 そのまま質問してしまいました。 末尾再帰は直接関係ありません。 手続きを定義するときにその手続きは定義時の環境を「覚えて」いて、 手続きを呼び出したときにはその環境内で手続きが評価される、と 理解しています。 514の質問の意図は、作られた手続きが保持しているものが (1)手続き作成時の環境そのもの(シンボルテーブルなど環境内の要素を含む) なのか、 (2)手続き作成時の環境への参照またはポインタ でよいのか、についての答えをいただきたいということでした。 (2)でよいと思っていたのですが、もしそうだとすると、>>514 の例では 手続き18:の環境は手続き2:と共有されるために、束縛関係が書き換えらてしまい、 実際の結果の説明ができません。 ということは、手続き定義時には、そのときの環境が複製され、 定義された手続き固有の(他の手続きなどからアクセスできない) 環境となって保持される、ということでよいのでしょうか。
526 名前:デフォルトの名無しさん mailto:sage [2005/07/05(火) 23:42:52 ] 根本的に変な固定概念に取り憑かれているようだな。憑き落とししなきゃ。w
527 名前:デフォルトの名無しさん mailto:sage [2005/07/06(水) 00:20:41 ] >>525 参照とかポインタとか複製とか実装の観点から考えないほうがいいですよ 文字通り「字面上の」スコープに縛られるんです ; それをどう実装するかは別の話
528 名前:デフォルトの名無しさん mailto:sage [2005/07/06(水) 02:35:31 ] >>523 それが何か?
529 名前:デフォルトの名無しさん mailto:sage [2005/07/06(水) 02:37:20 ] >>525 >>521 を勉強汁
530 名前:デフォルトの名無しさん mailto:sage [2005/07/06(水) 02:43:08 ] SICPに載ってる環境モデルでええやん
531 名前:デフォルトの名無しさん mailto:sage [2005/07/06(水) 03:33:24 ] 必要以上に深く考え過ぎ。しかも間違った方向に。
532 名前:デフォルトの名無しさん mailto:sage [2005/07/06(水) 04:58:04 ] 學而不思則罔、思而不學則殆 ってやつだな。あやうくてしかたない。
533 名前:デフォルトの名無しさん [2005/07/06(水) 09:02:31 ] >>530 >SICPに載ってる環境モデルでええやん 知りたかったのはまさにこれです。 ありがとうございました。
534 名前:デフォルトの名無しさん [2005/07/06(水) 17:37:37 ] SICPが名著だと言われるゆえんを実感しました。
535 名前:デフォルトの名無しさん mailto:sage [2005/07/06(水) 18:22:40 ] 油煙
536 名前:デフォルトの名無しさん mailto:sage [2005/07/06(水) 18:25:04 ] SICPって何ですか?
537 名前:536 mailto:sage [2005/07/06(水) 18:26:01 ] って >>6 に書いてあったですね スマン
538 名前:デフォルトの名無しさん [2005/07/07(木) 20:09:49 ] いや、普通わからんて Structure And Interpretation Of Computer Programs すとらくちゃーあんどいんたーぷりてーしょんおぶこんぴゅーたぷろぐらむす コンピュータープログラムの構造と解釈 略してSICPという。 え? SAIOCPじゃないの? AとOはどこいったよ? なあ? 普通わかんねーよなあ ところで SICPって何て読むか知ってるか? 俺は知らないが しくぷとか発音すると馬鹿にされそうで 恐い
539 名前:デフォルトの名無しさん mailto:sage [2005/07/07(木) 20:17:20 ] ここは Lisp/Scheme スレだから SICP で十分通じる。 俺の脳内ではシックピーって読んでるよ。
540 名前:デフォルトの名無しさん [2005/07/07(木) 20:19:36 ] お前の脳内の事なんか聞いてない
541 名前:デフォルトの名無しさん [2005/07/07(木) 20:22:23 ] あ、ごめん 間違えて書き込むボタン押しちゃったよ こういうのは本来書き込むべき内容ではなかったが、 名無しだからいいやと思ってしまうな 匿名って恐いな 2chにいるとどんどんクズ人間になっていく気がする おれのこと軽蔑した? 悪かったよごめんな
542 名前:デフォルトの名無しさん mailto:sage [2005/07/07(木) 20:49:05 ] 接続詞は頭文字に含めないことくらい普通は知ってる
543 名前:デフォルトの名無しさん [2005/07/07(木) 20:50:13 ] >>541 ドンマイ、しかし、貢献するべし
544 名前:デフォルトの名無しさん mailto:sage [2005/07/07(木) 20:59:23 ] さて、そろそろ LISP の話 キボンヌ
545 名前:デフォルトの名無しさん mailto:sage [2005/07/08(金) 13:25:12 ] >>542 前置詞もな あと冠詞 他に何かあったっけ? SICPよりも LISP の方がわかりにくい。 LISt Processor
546 名前:デフォルトの名無しさん mailto:sage [2005/07/08(金) 14:30:34 ] LITHP (LITHtth Prothethor) John Unger Zussman が冗談で作った架空言語。 1982年Infoworldが出した「あまりよく知られていない言語」という書籍の面白言語リストに掲載され、 後にUsenetに投稿された。この架空言語の本質は、「もしLisperのキーボードに"S"が無かった」という発想である
547 名前:デフォルトの名無しさん mailto:sage [2005/07/08(金) 14:34:42 ] S式はTH式になるのか? まあ算盤も広い意味では計算機だがな
548 名前:デフォルトの名無しさん mailto:sage [2005/07/08(金) 23:38:15 ] すいません、質問なのですが、 (p'((1)2 3)) とすると 1 2 3 と表示する、括弧を取り除いて表示するような 関数pはどのように定義すればよいのでしょう?
549 名前:デフォルトの名無しさん mailto:sage [2005/07/08(金) 23:38:45 ] ↑は(1 2 3)と表示する、の間違いでした。
550 名前:デフォルトの名無しさん mailto:sage [2005/07/08(金) 23:46:19 ] >>548 (defun p (x) (if (listp x) (mapcan #'p x) (list x)))
551 名前:デフォルトの名無しさん mailto:sage [2005/07/08(金) 23:54:24 ] >>550 ありがとうございます! mapcanと#の意味がわからないんですけど これはどういうことですか?
552 名前:デフォルトの名無しさん mailto:sage [2005/07/08(金) 23:58:27 ] >>551 Common Lisp 勉強汁
553 名前:デフォルトの名無しさん mailto:sage [2005/07/08(金) 23:59:42 ] >>551 mapcanはmapcarと同じ動作をした後に各館数の返り血をappendで連結した物を返す関数。 #`はそのシンボルを関数として扱うという意味。
554 名前:デフォルトの名無しさん mailto:sage [2005/07/09(土) 00:04:19 ] >>552-553 よくわかりました。 本当にありがとうございました。
555 名前:デフォルトの名無しさん mailto:sage [2005/07/09(土) 00:06:49 ] >>553 重箱の隅ですまんが append ではなく nconc、#` ではなく #' だね。
556 名前:デフォルトの名無しさん mailto:sage [2005/07/09(土) 02:43:36 ] 素人質問への解答乙。 つか、明らかに荒らしだよなこいつの質問は。
557 名前:デフォルトの名無しさん mailto:sage [2005/07/09(土) 02:44:24 ] 基本的な関数のみで書いた、初心者向け版。 (defun p (x) (if (null x) '() (if (consp (car x)) (append (p (car x)) (p (cdr x))) (cons (car x) (p (cdr x))))))
558 名前:デフォルトの名無しさん mailto:sage [2005/07/09(土) 03:01:55 ] Scheme には mapcan が無いとお嘆きの貴兄に、Scheme 版。 (define (p x) (if (list? x) (apply append (map p x)) (list x)))