[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 901- 1001- 2chのread.cgiへ]
Update time : 05/09 19:46 / Filesize : 220 KB / Number-of Response : 1002
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

Lisp Scheme Part17



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://が多すぎるらしいので分割

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 ]
コンストラクタだけでコードを書くことをイメージするんだ

642 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 10:09:17 ]
関数型が……っていうんなら
!が付く関数がある時点でアウトだろ。

643 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 12:34:47 ]
まぁ安全かどうかを突き詰めるなら Haskell でもやってなさいってこった

644 名前:デフォルトの名無しさん mailto:sage [2007/06/26(火) 22:41:14 ]
TMとノイマン型とを同列に並べるのはどうも違和感ががが

645 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 01:39:47 ]
>644
関数型と比較した場合の逐次命令実行型という意味では同じと思った

>まぁ安全かどうかを突き詰めるなら Haskell でもやってなさいってこった
それを言ったらC++でC風なコードを書いているのといっそで、関数型言語を
使う意味ないよ


646 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 02:10:10 ]
関数型言語なんて使ってないし

647 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 02:12:23 ]
はいはい

648 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 02:24:12 ]
関数型信者うざ



649 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 02:29:49 ]
ごめん...

650 名前:デフォルトの名無しさん mailto:sage [2007/06/27(水) 20:47:13 ]
リクナビ

651 名前:デフォルトの名無しさん [2007/06/28(木) 06:53:59 ]
おっ、common厨は消えたか

652 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 12:20:31 ]
はいはい

653 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 12:44:18 ]
common厨ですけど、今忙しいのでちょっと待っててね

654 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 16:28:20 ]
うん。待ってるから……
ずっと待ってるから、必ず来てね。
約束……だよ?

655 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 17:48:58 ]
カット!やりなおし

656 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 19:16:10 ]
カットってPrologのあれ?
確か ! だったっけ

657 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 19:16:46 ]
誰が上手い事を言えと

658 名前:デフォルトの名無しさん mailto:sage [2007/06/28(木) 21:55:50 ]
cutといえばコンビネータだね



659 名前:デフォルトの名無しさん [2007/06/30(土) 12:57:27 ]
質問です。
(defun color (fruit)
(case fruit
(apple 'red)
((banana lemon) 'yellow)
(peach 'pink)
(otherwise "I don't know")))
という果物の名前を引数にとって、色の名前を返す関数colorで
何もマッチしない時の処理が、
(otherwise "I don't know")))
なんですが、これを
(t "I don't know")))にしてもOKだと説明してあって、
どうしてなのかな?と自分なりに考えたんですが、
LispではNIL以外は何でも真だからマッチしない物を一緒くたにまとめた物を
tとして扱うのかな、と思ったんです。
実際のところ、なんでtなんですか?
otherwiseなら納得できるのですが。

660 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 15:18:08 ]
condにおいて条件が常に真という意味。if (1) { 〜 }と同じ。
elseに相当する物がなかった時代の名残り。
caseでも使われるのはcondと同じ構文だから。
長い間LISP使いにとっての常識だった。
otherwiseみたいな長いシンボルはCommonLisp特有。

661 名前:デフォルトの名無しさん mailto:sage [2007/06/30(土) 15:28:28 ]
伝統的には t だけど otherwise のほうが判りやすいという意見もあって追加された。
car と first みたいなもんで、好きな方を使えば良い。

662 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:22:31 ]
ttp://blog.so-net.ne.jp/rainyday/2007-02-21

PAIP 読んだ事無いけど、λの発祥が ^ だとは知らんかった。

(^ (x) (* x x))

何気に良いんじゃないだろうか...

663 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:32:50 ]
今や (λ (x) (* x x)) で良いんじゃないかという気もする

664 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:59:50 ]
あちらの人はどうやって入力するんだ?

665 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:03:06 ]
ギリシャ人ならへっちゃらだな(本当か?)

666 名前:デフォルトの名無しさん [2007/07/01(日) 19:05:54 ]
>>662
え、めっちゃ有名な話だと思ってたよ。
俺の持ってる本にも書いてあるし。

667 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:07:11 ]
>>664
λ

668 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:26:31 ]
>>662
顔殴られたクマーみたい



669 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:36:59 ]
lambdaと打ったらリガチャ扱いでλ出す、くらいのことは出来るだろう

670 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 20:03:58 ]
>>666
俺、貧乏で本買えないから…

671 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 20:11:24 ]
>>670
図書館行くとよいぞ。


672 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 20:24:56 ]
関係ないけど、教養のためにとλ計算のプログラムを今書いてますが、
bashとかperlみたいに$を使う事にしてます。
(厳密には$と.で識別子を挟む。)
束縛子に$を使って、参照は識別子そのままなので、用法は逆ですけどね。
($m. $n. $s. $x. m s (n s x)) ($s. $x. s x) ($s. $x. s (s x))
こんな感じで

673 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 21:00:01 ]
>>671
あんた賢いな

674 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 21:12:31 ]
SKKのほうがいいよ

675 名前:デフォルトの名無しさん [2007/07/02(月) 07:03:32 ]
>>660
>>661
とても親切な返答有り難うございます。分かりました!


676 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 07:43:04 ]
>>662
俺LISPで採用けってい

677 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 11:00:15 ]
俺Lisp作ってる人ってどれくらいいるのかな

678 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 13:27:38 ]
少なくとも今ある処理系の数だけあるよな



679 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 14:14:52 ]
俺LISPといえるほどの独自仕様の処理系ってそんなにあったっけ

680 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 16:35:54 ]
だから俺Lispなんじゃね?

681 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 18:14:29 ]
lispじゃないけど>>662っぽい記法使ってる言語には
bugyo.tk/~zick/cosak/
こんな変なのがあったぞ。

682 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 20:18:53 ]
ホントだ、良く見つけたね。

個人的には ^ は return に見えてしまう...

683 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 20:55:16 ]
このSmalltalkerが

684 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 21:32:48 ]
Metaluaはluaでlispのマクロっぽい事ができるらしい。
いっちょ前にquasi-quoteっぽい仕組みまである(様に見える)。

685 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 22:31:01 ]
本質的にはλは開き括弧、.は閉じ括弧だから
[]でも<>でも{}でも`'でも良いのに
接頭字+空白セパレタが主流なのはなぜなんでしょうね?

686 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 22:34:22 ]
書き込んでから気づきましたが
歴史的には接頭字の方が先なんでしたね

687 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 14:32:31 ]
質問です。
アトムとリストと、
car,cdr,cons,atom,eq
これでどうやって足し算が出来たりするのでしょうか?

688 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 14:41:01 ]
>>687
チャーチ数 でググれ



689 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 14:42:49 ]
リストの長さで0以上の自然数を表すのがよく使われる手だね。
そうすると足し算はappendになる。他も自分で考えてみな。



690 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 14:54:04 ]
あ〜、足し算はappendなのか。
だいたいイメージつかめた。
有り難うございます。

691 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 16:35:22 ]
ん、やっぱりなんか引っかかります。
リストの長さで0以上の自然数を表すなら、
()=0
(())=1
((()))=2
は納得できるのですが、
これでどうやってリストを表すのでしょうか?
アトムしか表現できないんじゃないんですか?

692 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 18:49:44 ]
()
(())
(() ())
(() () ())

693 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 19:35:56 ]
>これでどうやってリストを表すのでしょうか?
言ってる意味が分かんないなぁ

694 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 20:56:23 ]
砂場の石ころでもできる
だから何ってやつ

695 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:13:45 ]
何段階かの問答を経て、ようやく「自分が何を訊ねたいのか」を掴む質問者っているけど、
この人もそれと同様、これから自分の疑問の内容がわかるんだと思う。

696 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:36:29 ]
ttp://rikunabi-next.yahoo.co.jp/tech/docs/ct_s03600.jsp?p=001094

リスパーなら演技くらいはできないとな。

697 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:42:57 ]
マジな話、Lisperと話しするときは教養がいるよ。
プログラム言語の話とかだけじゃ相手にしてもらえない。
科学好き、数学好きとかが多すぎる。

698 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:03:06 ]
個人的には数学は敬して遠ざけておきたい

そんな僕でも立派なLisperになれるでしょうか



699 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:09:47 ]
ところで河合さんの頭は本物なの?


700 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:13:10 ]
>>698
GNU GPLを暗唱できたらあるいみ立派なLisperになれるかも!

701 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:14:31 ]
687さんは純Lispが五つの基本関数「だけ」で
本当にチューリング完全かどうか
疑問に思ってるんじゃないですか?

ちょうど1ヶ月前の自分と同じで

マッカーシーの論文斜め読みしたら
関数は五つで良いけど
→表記も含まれるから
condかifスペシャルフォームも必要みたいに感じました

本当に五つの基本関数(と真偽値)「だけ」でチューリング完全なら
自分にも教えてください

702 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:15:18 ]
Lisp と GPL は全く関係無いな

703 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:25:57 ]
おいおい、Gの付く話はやめてくれよ

704 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:35:59 ]
>>701
再帰かループがないとどうにもならんよ


705 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:41:00 ]
大前提としてλ式が必要

706 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:41:26 ]
>>704
と、いうことはcondまたはifと
関数抽象のためのlambdaが必要ということになりますか
要素としては5関数2特別式でチューリング完全

707 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:44:52 ]
そうか、lambdaだけでチューリング完全ですね
でもそうすると5関数の立場が…

708 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:48:57 ]
Lispエバリュエータを書くのに最低限必要な関数だと思うが



709 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 22:51:55 ]
λ算法とLispのlambdaは等価ではないので

710 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 23:01:19 ]
そういやifはλで表現できたんだな…。






[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<220KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef