- 1 名前:デフォルトの名無しさん mailto:sage [04/11/25 21:48:56]
- lispを触ってみたい入門者のQ&A
初心者のQ&A 本スレでは恥ずかしくて聞けない人のQ&A 本スレは高度すぎて割り込めない人のQ&A linuxでなくてwindowsでやりたいんですが・・・Q&A lispを使用してC#やJAVAの代替にするための方法(おまけ) ま、ゆっくりたりましょう。 「いいものの本質は、いかなる時代においても変わらない」byパワーズ
- 528 名前:デフォルトの名無しさん mailto:sage [2005/07/21(木) 05:48:46 ]
- ハッカーと画家 読んだことある香具師いる?
- 529 名前:デフォルトの名無しさん mailto:sage [2005/07/21(木) 09:08:55 ]
- >>528
ノシ
- 530 名前:デフォルトの名無しさん mailto:sage [2005/07/21(木) 23:47:57 ]
- >>528
ノシ
- 531 名前:デフォルトの名無しさん [2005/07/23(土) 03:57:57 ]
- 誰かCL-HTTPでhelloworld書いてくれ
俺のACLではloadできない
- 532 名前:デフォルトの名無しさん mailto:sage [2005/07/24(日) 21:42:19 ]
- 関数内で任意のz(関数内で使われていない変数)を定義して、それを値として使いたいのですが、どのようにしたらよいでしょうか?
- 533 名前:デフォルトの名無しさん [2005/07/24(日) 21:42:53 ]
- 期待age
- 534 名前:デフォルトの名無しさん mailto:sage [2005/07/24(日) 22:35:57 ]
- >>532
よく質問の意味がわからんが、関数内で任意のz(関数内で使われていない変数)を 定義して、それを値として使えは良いのではないのか?w
- 535 名前:デフォルトの名無しさん [2005/07/25(月) 16:35:07 ]
- >>534
説明が下手でサマソ。 なんというか、例えば全部のアルファベットを受け取ったときにも まだ未使用のアルファベットとして定義して、そいつを値にしたいんだ そんなことって可能なのか?
- 536 名前:デフォルトの名無しさん mailto:sage [2005/07/25(月) 18:33:08 ]
- とことん説明の下手な香具師だな。
- 537 名前:デフォルトの名無しさん mailto:sage [2005/07/25(月) 18:42:19 ]
- gensymでいいんじゃない?
- 538 名前:デフォルトの名無しさん [2005/07/25(月) 23:54:43 ]
- 二つのリストから最大値と最小値を1個づつ取り出し、この二数を割る
プログラムはどうつくればいいですか?
- 539 名前:デフォルトの名無しさん mailto:sage [2005/07/26(火) 00:03:56 ]
- 最大値を求めるプログラムと
最小値を求めるプログラムを書く。 二回走査するのがいやだったら 走査は一回にして最大値と最小値をリストにしてapply
- 540 名前:デフォルトの名無しさん mailto:sage [2005/07/26(火) 02:35:34 ]
- おー久しぶりにのぞきにきたが,Lisp 関連スレが増えてる.
>>538 いいか,若いの.問題の定義がよくわからんが,考え方をおしえてやろう. お前さんは (欲しい関数 リスト1 リスト2) => (/ リスト1の最大値 リスト2 の最小値) としたいわけだ?ならそう書けばよい. (defun 欲しい関数 (リスト1 リスト2) (/ リスト1の最大値 リスト2の最小値)) 一度に考えるな.すぐにわからんものは関数にしてしまえ. (defun 欲しい関数 (リスト1 リスト2) (flet ((リスト1の最大値 () ...) (リスト2の最小値 () ...)) (/ (リスト1の最大値) (リスト2の最小値)))) さて,こうすると,除算の問題はもう解けた.あとは リスト1の最大値, リスト2の最小値という小さな問題を解くだけだ. さて,日本語だと通らない処理系もあるから,↓のようにしよう. (defun answer (list1 list2) (flet ((max-of-list1 () ...) ;; list1 の最大値を求める (min-of-list2 () ...)) ;; list2 の最大値を求める (/ (max-of-list1) (min-of-list2)))) なに?授業を聞いてないしやる気もないから最大値も最小値も求められない? そうだね, (apply #'max list1) や (apply #'min list2) でいいんじゃないか?
- 541 名前:デフォルトの名無しさん mailto:sage [2005/07/26(火) 03:14:00 ]
- テキストには#ついてねーよ
progは習ったがfletはやってねー ま、8クイーン頑張れよw
- 542 名前:デフォルトの名無しさん mailto:sage [2005/07/26(火) 05:47:40 ]
- >>535
何か具体的にやりたいことがあるんでしょうから、 具体例を出しちゃった方が話が早いと思いますよ。 >>541 prog って使ったことないや。 tagbody つきの let みたいなんでしたっけ。
- 543 名前:535 [2005/07/26(火) 18:02:54 ]
- >>542
その通りです。 では、具体的な話。 λ計算中に現れる[lexp1/x]lexp2を表現する関数 (defun substitution (x lexp1 lexp2))の中で x≠yかつφ(E)∋x、φ(Q)∋yをどちらも満たすなら 任意のλ式E、任意のz(ただしzはx≠z≠yかつ (E)Qの自由変数でも束縛変数でもない)に対して [Q/x]Ly.E → Lz.[Q/x]{z/y}E って書き換えたいんです。 ここで、Lx.Ly.(y)xは(L x L y (y) x)と表現します。
- 544 名前:535 [2005/07/26(火) 18:04:30 ]
- あ、ここでっていうのは単なる表現の例です。あしからず。
- 545 名前:デフォルトの名無しさん mailto:sage [2005/07/26(火) 18:10:14 ]
- >>543
相変わらず説明は下手だなぁ。gensymじゃ駄目なのか?
- 546 名前:535 [2005/07/26(火) 18:27:20 ]
- >>545
鬼 才 現 る ! すいませんでした。 >>537でも書き込んでいただいていたみたいなのにスルーしてましたorz そんな関数が存在していたとは・・・知りませんでした。 ありがとうございました!
- 547 名前:538 [2005/07/26(火) 20:39:51 ]
- >>540 539
説明ありがとうございますm(_ _)m やってみます。
- 548 名前:デフォルトの名無しさん [2005/08/07(日) 00:16:00 ]
- このスレって、やっぱCommonLisp専用スレ?
EmacsLispやSchemeの初心者レスはすれ違いでしょうか?
- 549 名前:デフォルトの名無しさん mailto:sage [2005/08/07(日) 00:20:37 ]
- >>548
うん。スレ違い。 このあたりかな。 pc8.2ch.net/test/read.cgi/tech/1115901841/
- 550 名前:デフォルトの名無しさん [2005/08/08(月) 01:12:30 ]
- 質問です。
(defun func (x) (setq x 2)) (setq a 1) (func a) などとして、グローバルな変数をfuncの引数にして呼び出した時に そのグローバル変数自体が書き換えられるような、 C言語で例えるならポインタ引数のような使い方をするには どうすればいいのでしょうか?
- 551 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 01:20:58 ]
- トップレベルで変数を定義して、関数内でsetqなりsetfなりを呼び出せばOK
- 552 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 01:28:25 ]
- (set x 2) とか (setf (symbol-value x) 2) とか。お好きな方で。
関数に渡すのはシンボルね。
- 553 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 01:52:21 ]
- call by name にしたいならマクロ
(defmacro macro (x) `(setq ,x 2)) (setq a 1) (macro a) a => 2
- 554 名前:550 [2005/08/08(月) 04:02:54 ]
- ということは、550で書いたコードをそのまま実行すると
(func a) の後はaの値は2になっているはずですよね? でもトップレベルでsetqした値、つまり1になっています… ここでどうにかaを2にしたいんですが… 質問の仕方が悪いのかもしれません、すみません
- 555 名前:550 mailto:sage [2005/08/08(月) 04:04:46 ]
- あああすみませんわかりました!!
seqじゃなくてsetを使うとできました。お騒がせしました… とても助かりました。命の恩人です。
- 556 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 04:39:29 ]
- 嬉しさは伝わるが、すごい表現。出来なかったら首でも吊ってたんだろうかw
- 557 名前:デフォルトの名無しさん mailto:sage [2005/08/08(月) 11:44:30 ]
- >>556
わろす
- 558 名前:デフォルトの名無しさん [2005/08/19(金) 04:41:05 ]
- すいません、LISPで画像処理をしたいのですが、
JPEGを扱うにはどうしたらいいのでしょうか。 いいライブラリがあったら紹介ください。
- 559 名前: [2005/08/19(金) 09:05:28 ]
- gcl で substring が呼べないのはなぜでしょうか
- 560 名前:559 [2005/08/19(金) 09:20:57 ]
- ごめ。
(subseq "hoge" 0 2) "ho" で出来た。色々変わったのかね
- 561 名前:デフォルトの名無しさん [2005/08/25(木) 04:45:03 ]
- 選別収集ってどんなだったっけ
(mapcan #'(lambda (x) (cond ここまでおもいだした
- 562 名前:デフォルトの名無しさん mailto:sage [2005/08/25(木) 06:02:14 ]
- 選別収集ってなんだったっけ。
srfi-1 でいう filter-map?
- 563 名前:デフォルトの名無しさん mailto:sage [2005/08/26(金) 01:30:58 ]
- (mapcan #'(lambda (x)
(cond ((predicate x) (list x)) (t nil)) list) predicateがoddpでlistが'(0 1 2 3 4 5) なら '(1 3 5)が返る
- 564 名前:デフォルトの名無しさん mailto:sage [2005/08/26(金) 02:09:00 ]
- (remove-if-not #'oddp '(0 1 2 3 4 5))
=> (1 3 5)
- 565 名前:デフォルトの名無しさん mailto:sage [2005/08/26(金) 02:26:56 ]
- remove-if-not や delete-if-not やらは deprecated らしいよ。
www.google.co.jp/search?q=remove-if-not+deprecated (remove-if (complement #'oddp) '(0 1 2 3 4 5)) と書くそうだ。
- 566 名前:デフォルトの名無しさん mailto:sage [2005/08/27(土) 03:33:37 ]
- deprecatedって推奨されてないってこと?
remove-ifはなんだか収集という感じがしない mapcanにできてremove-ifにできなさそうなものを考えてみる
- 567 名前:デフォルトの名無しさん mailto:sage [2005/08/29(月) 12:07:23 ]
- 別にやってることの本質は同じじゃない?
選別収集を言い換えればつまりはいらないものを捨てるってことだろうし。 remove-ifでもlambdaつかえば結局同じことだと思うけれど。
- 568 名前:デフォルトの名無しさん mailto:sage [2005/08/30(火) 02:11:36 ]
- mapcan でなら複数のリストを取って選別収集するようなことができるかな。
(mapcan #'(lambda (&rest x) (if (every pred x) x nil)) list) みたいに。 つか、実装の詳細は措いて、mapcan で書き下したもの(の限定版)に 名前をつけたもんがremove-if(-not) なんじゃないかいな。
- 569 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 21:38:55 ]
- lispでCGI組みたいんですけど、
Apacheから直接PHPとかPerlみたいにはできないんでしょうか? mod_lispとかlispachとかgocheとかはネットで調べたんですが、 なんとなくすっきりしません。 やっぱ自分で作るしかないのかな?
- 570 名前:名無しさん@そうだ選挙に行こう mailto:sage [2005/09/11(日) 23:01:59 ]
- >>569
> なんとなくすっきりしません。 詳しく
- 571 名前:デフォルトの名無しさん mailto:sage [2005/09/12(月) 12:46:48 ]
- Portable AllegroServeは?
表にApache建てたいならmod_proxyで。
- 572 名前:デフォルトの名無しさん mailto:sage [2005/09/12(月) 23:20:06 ]
- >>570 えーと、つまりPerlやPHPのようにApacheのModuleとして組み込んで
直接ApacheのAPIを操作できるようにならないかということです。 >>571さん、なんとなくすっきりしないといったのは、 こういったApacheから何かを介してLispへアクセスするというのが、 私にとっては違和感がありまして…。 最近になってプログラミングをやりだしたものですので、 変なこと言ってるかもですが、 Apacheを使ってsoapとかのWebserviceのxmlを読み込み、 Routerのようにできないかなと思ってまして。 もちろん他の言語でもできるのですが。。。 こんなLisp初心者にご解答ありがとうございます。
- 573 名前:デフォルトの名無しさん [2005/09/26(月) 03:17:10 ]
- Cで書くLISP処理系の本で今手に入るものはあるんでしょうか
大学近くの古本屋を回ってもあんまり理工書がないんですが
- 574 名前:デフォルトの名無しさん mailto:sage [2005/09/26(月) 12:07:11 ]
- LISPでGoogle検索すればゴロゴロ転がってる気が
昔のアスキーのCプログラムブックIIIは独自LISP処理系扱ってるけど 今風の実装じゃないし 個人的には末尾再帰できない独自LISPはあんま魅力ないな 自分で作るならSchemeの方がいい
- 575 名前:デフォルトの名無しさん mailto:sage [2005/09/26(月) 12:11:52 ]
- >>574
末尾再帰の実装なんて普通のLispでもさほど難しくはない。Schemeは full continuationの実装など悩む割に報われない部分で苦労する。 まぁ作ってみるだけなら面白いけど、実用的な処理系は結構大変。
- 576 名前:デフォルトの名無しさん mailto:sage [2005/09/26(月) 12:14:50 ]
- 難しいかどかじゃなくて末尾再帰も標準的でない独自LISPには魅力感じないつってんの
- 577 名前:デフォルトの名無しさん mailto:sage [2005/09/26(月) 12:17:57 ]
- >>576
おまえスレタイ読めるのか? スキームの宣伝は他でやれよ。
- 578 名前:デフォルトの名無しさん mailto:sage [2005/09/26(月) 12:20:35 ]
- ちなみにちゃんとしたSchemeでも継続はあんま使わないよ
別に無くてもなんとかなるレベルでしょ ただし末尾再帰は無いとコーティングスタイルにまで影響する 最適化の余地があるCommonLispならともかく、 独自LISPにはもう期待できる事が何も無い
- 579 名前:デフォルトの名無しさん mailto:sage [2005/09/26(月) 12:23:36 ]
- >>577
スキームの宣伝て何? おまえこそちゃんとレス読めよダボが
- 580 名前:デフォルトの名無しさん mailto:sage [2005/09/26(月) 12:28:57 ]
- >>578
はぁ? > 最適化の余地があるCommonLispならともかく、 > 独自LISPにはもう期待できる事が何も無い 何か言ってる意味わかんねよ。 Common Lisp系の独自LISPとかイメージできないの?
- 581 名前:デフォルトの名無しさん mailto:sage [2005/09/26(月) 14:26:44 ]
- >Common Lisp系の独自LISP
イミフメ
- 582 名前:デフォルトの名無しさん mailto:sage [2005/09/26(月) 21:57:00 ]
- 見事に話が噛み合ってないな(w
ちなみに漏れは580の言ってることは理解できる派ね。まぁただでさえマイナーな言語に 関わってる者同士マターリと行こうや。
- 583 名前:デフォルトの名無しさん mailto:sage [2005/09/27(火) 01:25:11 ]
- 末尾再帰の最適化をするのは Scheme だけじゃないしね。
俺も継続は無くても良いけど、末尾再帰の最適化は欲しいなぁ。
- 584 名前:デフォルトの名無しさん mailto:sage [2005/09/27(火) 01:36:27 ]
- >>583
以前話題になった気がするけど、Common Lispにおける末尾再帰の最適化は、 ・インタプリタはほとんどの処理系がやらない ・コンパイラはほとんどの処理系がやる という結果だったと思う。Common Lisp的思想からすれば順当なところだろうね。
- 585 名前:デフォルトの名無しさん mailto:sage [2005/09/27(火) 02:42:55 ]
- Scheme 勉強したてで毒されてるな.
末尾再帰の最適化はメリットばかりじゃねーんだぜ? インタプリタ上では *常に* 最適化されちゃったらデバッグしにくいだろ? Common Lisp 的思想なら,コンパイル時の最適化オプションで 制御できるほうが嬉しい. 末尾再帰の最適化を示すオプションが欲しいって話もあるけどな.事実上, speed 3 とか debug 0 にしとけばほとんどのコンパイラがやってくれっからねぇ.
- 586 名前:デフォルトの名無しさん mailto:sage [2005/09/27(火) 11:44:41 ]
- >>585
> インタプリタ上では *常に* 最適化されちゃったらデバッグしにくいだろ? これはスタックトレースが取れないとかそういう意味?
- 587 名前:デフォルトの名無しさん mailto:sage [2005/09/28(水) 02:18:03 ]
- 常に最適化されちゃって選択できねーとかははやすぎる最適化の部類に感じる時がある.
CL 派としては c.l.l で出てた宣言的アプローチで解決してほしいなー. 「可能な限り最適化する」「自己呼び出しとローカル関数のみ最適化」「自己呼び出しのみ」「最適化なし」 とかが宣言できるみたいな.まぁ,現状はコンパイラのマニュアルを見る必要 があるわけだけど,それで不都合あるのかっつーはなし.Common Lisp におけ る末尾再帰の最適化はだってほぼ標準だしね.
- 588 名前:デフォルトの名無しさん mailto:sage [2005/09/28(水) 02:22:10 ]
- >>587
結局Common Lispの仕様の問題になるわけだよな。20年間にわたって仕様が安定 している(ANSIでわずかに変更されたところもあるが)のは利点でもあるわけだが、 そろそろ次期規格の話が出てきても良いように思う。
- 589 名前:デフォルトの名無しさん mailto:sage [2005/09/28(水) 09:10:11 ]
- 元々の話が>>573なわけで・・
- 590 名前:デフォルトの名無しさん [2005/09/28(水) 14:17:11 ]
- Schemeばかり書いてると、関数呼び出しが関数呼び出しに
見えなくなるというか、全部継続へのジャンプに見えて来るんだよな。 それに関数とブロック(let)が頭の中でブレンドされて区別されなくなる。 そうすると自己末尾呼び出しだけ特別扱いしたりするのがとても不自然に 感じる。 まあ、Common Lispの空気に合わないってのはわかる。CLで書くときは スタイルが変わるからな。
- 591 名前:デフォルトの名無しさん mailto:sage [2005/09/29(木) 01:15:48 ]
- このスレこんなに人がいたのか(^_^ゝ)
- 592 名前:デフォルトの名無しさん mailto:sage [2005/09/29(木) 03:42:33 ]
- >>588
仕様の問題ねぇ.改善の余地(個人的希望は >>587 な)があるとは思うが, Scheme が The Right Thing だとは思わない.なぜなら,俺には区別したい 時があるからだ.最適化する,しないは選択したい.まぁ,その選択肢が 存在するのが不自然だと言われりゃしょうがねーけどなぁ. ま,CL にも末尾再帰の最適化は実装依存だが,「ある」という事を言って おきたかったわけ.
- 593 名前:デフォルトの名無しさん mailto:sage [2005/09/30(金) 19:03:53 ]
- lispファイル用の良いアイコン知りませんか?
- 594 名前:デフォルトの名無しさん mailto:sage [2005/09/30(金) 23:27:09 ]
- >>593
自作すれば。 ↓雛型 (())
- 595 名前:デフォルトの名無しさん mailto:sage [2005/09/30(金) 23:31:51 ]
- Planet Lisp のサイトアイコンは () だね
- 596 名前:デフォルトの名無しさん mailto:sage [2005/09/30(金) 23:36:49 ]
- >>593
λ
- 597 名前:デフォルトの名無しさん mailto:sage [2005/10/01(土) 00:34:23 ]
- (car cdr)
なんてどうだ
- 598 名前:デフォルトの名無しさん [2005/10/01(土) 01:19:05 ]
- >>592
CommonLispで以下の相互再帰がループになる保障があるってわけじゃないでしょ? こういうとこで根本的にコーティンングスタイルに関わってくるわけ。 (defun f(a) (g a)) (defun g(a) (h a)) (defun h(a) (f a)) (f f) Schemeでトレースしたけりゃ末尾再帰の最後に適当な置石すりゃいいだけだし。 既存の処理系にも普通にバックトレースぐらい存在してるでしょ。
- 599 名前:デフォルトの名無しさん mailto:sage [2005/10/01(土) 01:28:56 ]
- >>598
言いたいことはわかるけど、だからCommon Lispは駄目、Schemeが良い という話をしたいのであればスレ違い。そもそもここはCommon Lispのスレ なので、もうちょっと建設的に考えてほしい。 例えばCommon Lispで末尾再帰を強制するようなdeclareを提案するとか。 あと、念のために言っておくと相互再帰をループ化する最適化はさほど 難しくはないので多くの処理系がやっているはず。
- 600 名前:デフォルトの名無しさん [2005/10/01(土) 01:51:26 ]
- >>599
あのな、CommonLispをどうこうしようってんじゃなくて、>>573の回答として 独自LISP勉強して作るぐらいならScheme作っとけって話。 CommonLispがどこまで最適化できるとか云々は別に興味ない。
- 601 名前:デフォルトの名無しさん mailto:sage [2005/10/01(土) 01:55:45 ]
- >>598
そりゃ環境を問わずあらゆるCL処理系で動く必要のあるコードとかいうなら 仕方がないけど。元々の方向性が違うんだから仕様の問題というよりは そういうスタイルでCLを選択する方が間違ってるんでは。 ちゃんと末尾再帰を最適化する処理系を使えばいい話でしょ? 相互再帰だろうが末尾再帰だろうが基本的に違いはないよ。 cmuclでも、declareも何もせずにreplからそのままdefunして直ぐにdisassemble しても、ちゃんとジャンプになってるよ。
- 602 名前:デフォルトの名無しさん mailto:sage [2005/10/01(土) 02:10:36 ]
- >>600
別に>>573氏はおまえが使う処理系を作ろうというんじゃないと思うぞ。w おまえの好むScheme的スタイルをCommon LispスレでLISPの処理系でも 作ってみようかという奴にしつこく言う必要はあるまい。
- 603 名前:デフォルトの名無しさん mailto:sage [2005/10/01(土) 11:21:07 ]
- >>598
すると,あなたは R5RS にないものは使わないのですか? 事実上標準だと主張しているのだが.メインストリームの商用 コンパイラで末尾再帰の最適化機能を持たないコンパイラがある のかと.Scheme ではコンパイルについての規格がないから, 安心してコンパイルできない!! というくらいの心配症の人なら まぁ,止めないけどね. > Schemeでトレースしたけりゃ末尾再帰の最後に適当な置石すりゃいいだけだし。 残念な結末ですね.大規模なプログラムでそれが簡単な事だお思いますか? 末尾再帰の最適化を OFF にしたら Scheme じゃないんでしょ? Scheme の処理系依存機能はよくて,CL の処理系依存機能はだめなんですか. そんな事言うなら,CLOS 相当の機能がなく,したがって安全にオブジェクトの 定義を更新できないほうが嫌だ. 再帰というトンカチを手にすると他の全てが再帰に見えてくる.ループは 再帰の特殊系だけど,本来並列動作とかもあるから (map fn lst) を見て,再帰的な実装がまず第一に頭に浮ぶならもう一度良く考えたほう がいい.
- 604 名前:デフォルトの名無しさん mailto:sage [2005/10/01(土) 11:36:24 ]
- つうか,>>600 からしておかしい。
俺なんか既存の概念をくつがえすようなトンデモない 処理系を期待しちまうけどな。がんばって勉強しろーよ。 最初はショボくても独自 Lisp 上等。Lisp の進化の歴史を 学ぶもの一興。 まず自分で作ってみれば?ショボショボインタプリタとかでいいから。 つうか 573 を応援してやりたいが,情報がないな。 Lisp/Scheme の腕前と C の腕前はどーなんだろう。
- 605 名前:デフォルトの名無しさん mailto:sage [2005/10/01(土) 12:02:37 ]
- 馬鹿だなおめーらは
- 606 名前:教えて厨 [2005/10/01(土) 16:54:07 ]
- 質問。
(-1 3 2 5 3 -3 -4) というようなリストがあるとしますよね。 これを ((-1 -3 -4) (3 2 5 3))というように負数と正数で別々のリストに分類したい。 これ、負数だけとりだす関数と正数だけ取り出す関数を作って、 それをlistすれば簡単にできるけど、 再帰関数ひとつだけで作る方法もあるんだよね?? それってどうやるの? letやlet*なんかでnilとかに初期化した変数って、再帰で呼び出すと 再帰呼び出し先でもまたnilとかになるの? 再帰呼び出し先で再帰呼び出し元での変数の値が引き継がれるような方法 があればうまくやれそうなんだけどなあ。 みなさんなら、どうやって再帰関数一つだけで、上のような処理を実装できますか
- 607 名前:デフォルトの名無しさん mailto:sage [2005/10/01(土) 17:31:36 ]
- LOOPマクロ
(defun plus-minus (list) (loop for x in list if (>= x 0) collect x into plus else collect x into minus finally (return (list minus plus)))) 再帰 (defun plus-minus (list) (labels ((iter (l plus minus) (if (null l) (list (nreverse minus) (nreverse plus)) (let ((x (car l))) (if (>= x 0) (iter (cdr l) (cons x plus) minus) (iter (cdr l) plus (cons x minus))))))) (iter list '() '())))
- 608 名前:デフォルトの名無しさん mailto:sage [2005/10/01(土) 19:49:26 ]
- 質問させてください。
(setq a t) とした変数aの真偽を連想リストに入れてやりたいのですがうまくいきません。 (setq b '((res . a) (res2 . ....))) みたいにすると(cdr (assoc 'res b))はtではなくaを返すし (setq b '((res . (eval a)) (res2 . ....)))などとしても同様です。 環境はxyzzyです。どうかお願いします。
- 609 名前:デフォルトの名無しさん mailto:sage [2005/10/01(土) 20:16:30 ]
- (cdr (assoc 'res `((res . ,a))))
- 610 名前:デフォルトの名無しさん mailto:sage [2005/10/01(土) 20:29:24 ]
- そんな説明なしで得意げに書かれてもな・・
- 611 名前:& ◆6g4XpN.URU [2005/10/01(土) 20:35:27 ]
- >607
どうもありがとう。 ちなみにiterって初めてみるんだけど、どういう関数なの?
- 612 名前:608 mailto:sage [2005/10/01(土) 20:53:15 ]
- >>609
ありがとうございます。backquoteを使ってなんとかするということですね。 確かにまだよくわからないですが勉強します。
- 613 名前:デフォルトの名無しさん mailto:sage [2005/10/01(土) 20:57:32 ]
- >>611
labelsの行をじっと見つめてみろ。
- 614 名前:デフォルトの名無しさん mailto:sage [2005/10/01(土) 23:13:06 ]
- >>612
quoteしたら評価されないって言うことです。 quoteしないようにこんな感じで書けばOK (setq a t) (cdr (assoc 'res (list (cons 'res a)))) いちいちこう書くのは面倒だからbackquote構文が用意されてる って感じかな。
- 615 名前:デフォルトの名無しさん [2005/10/01(土) 23:15:33 ]
- 言っとくけど、backquoteもマクロなんだぜ?
マクロって偉大だよなあ・・・
- 616 名前:デフォルトの名無しさん mailto:sage [2005/10/02(日) 04:39:29 ]
- >>606
宿題だとすると labels の内部関数はつかっちゃだめかも?ということで 親切にも別解だっ. ;; 再帰関数一つ (defun plus-minus (lst &optional plus minus &aux (x (car lst)) (xs (cdr lst))) (cond ((null x) (values plus minus)) ((>= x 0) (plus-minus xs (cons x plus) minus)) (t (plus-minus xs plus (cons x minus))))) ;; メソッド一つ (defmethod plus-minus-2 ((lst null) &optional plus minus) (values plus minus)) (defmethod plus-minus-2 ((lst cons) &optional plus minus) (if (>= (car lst) 0) (plus-minus-2 (cdr lst) (cons (car lst) plus) minus) (plus-minus-2 (cdr lst) plus (cons (car lst) minus))))
- 617 名前:デフォルトの名無しさん mailto:sage [2005/10/02(日) 09:38:28 ]
- (defun partition (test lis)
(labels ((recur (lis in out) (cond ((null lis) (values (nreverse in) (nreverse out))) ((funcall test (car lis)) (recur (cdr lis) (cons (car lis) in) out)) (t (recur (cdr lis) in (cons (car lis) out)))))) (recur lis '() '()))) CL-USER> (partition #'(lambda (x) (>= x 0)) (list 1 -3 0 -2 9 -8)) (1 0 9) (-3 -2 -8)
- 618 名前:デフォルトの名無しさん mailto:sage [2005/10/02(日) 10:59:40 ]
- (defun partition (test list)
(let ((in (cons nil nil)) (out (cons nil nil))) (let ((i-tail in) (o-tail out)) (dolist (x list (values (cdr in) (cdr out))) (if (funcall test x) (setf i-tail (setf (cdr i-tail) (cons x nil))) (setf o-tail (setf (cdr o-tail) (cons x nil))))))))
- 619 名前:デフォルトの名無しさん mailto:sage [2005/10/02(日) 11:40:15 ]
- (defun partition (pred lis)
(do ((lis lis (cdr lis)) (in '()) (out '())) ((null lis) (values (nreverse in) (nreverse out))) (if (funcall pred (car lis)) (push (car lis) in) (push (car lis) out))))
- 620 名前:おしえて厨 [2005/10/02(日) 23:47:39 ]
- clispをwinで使ってるんだけど、lispでウィンドウやダイアログボックスを
だすようなGUI作ることってできないの?できるとしたら そういう情報はどこにある?
- 621 名前:デフォルトの名無しさん mailto:sage [2005/10/03(月) 00:01:59 ]
- >>620
例えば www.wxcl-project.org/
- 622 名前:デフォルトの名無しさん mailto:sage [2005/10/03(月) 01:27:27 ]
- できるよ.(621 は試したことないの別のネタで)
自分で Windows の API を呼べばいい. A) FFI で必要な API をラップする (hocwp.free.fr/ah2cl/ とか) B) Lisp 向けの API を実装したライブラリを作る ただし,どっちもある程度 C の知識がないと難しいかもね. Corman Lisp とか AllegroCL や LispWorks といった処理系を使う手もある. AllegroCL や LispWorks はどっちも GUI ライブラリを持ってるよ.
- 623 名前:デフォルトの名無しさん mailto:sage [2005/10/03(月) 16:43:37 ]
- CommonLispにはpartitionがなかったのか…
- 624 名前:デフォルトの名無しさん mailto:sage [2005/10/03(月) 17:56:31 ]
- R5RS には remove-if すらないけどね
- 625 名前:デフォルトの名無しさん [2005/10/05(水) 15:05:45 ]
- 質問です。
(my-reverse '(1 (2 3) (4 (5 6)))) を与えたら(((6 5) 4) (3 2) 1) と、 中身が全て反転するような関数my-reverseを定義するやり方を教えてください。 お願いします。
- 626 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 15:14:34 ]
- >>625
>>513-525
- 627 名前:デフォルトの名無しさん [2005/10/05(水) 17:33:39 ]
- >>626
すいません。>>513-525を読んでもわかりませんでした。。
- 628 名前:デフォルトの名無しさん mailto:sage [2005/10/05(水) 18:07:07 ]
- (defun my-reverse (list)
(let ((result '())) (dolist (x list result) (if (consp x) (push (my-reverse x) result) (push x result)))))
|

|