[過去ログ]
Lisp Scheme Part40 [転載禁止]©2ch.net (1002レス)
Lisp Scheme Part40 [転載禁止]©2ch.net http://mevius.5ch.net/test/read.cgi/tech/1426481152/
上
下
前次
1-
新
通常表示
512バイト分割
レス栞
抽出解除
必死チェッカー(本家)
(べ)
自ID
レス栞
あぼーん
このスレッドは過去ログ倉庫に格納されています。
次スレ検索
歴削→次スレ
栞削→次スレ
過去ログメニュー
966: デフォルトの名無しさん [sage] 2018/07/11(水) 13:07:02 ID:7FwajRbN 教えてください。初心者です。 (defun test () (let ((result '(0 0 0 0 0 0 0))) (format t "~{ ~a ~}" result) (incf (nth 4 result) 7) (incf (nth 6 result) 6) result)) この関数なんですが、実行するたびに結果が変わるのです。 HOGE 28 > (test) 0 0 0 0 0 0 0 (0 0 0 0 7 0 6) HOGE 29 > (test) 0 0 0 0 7 0 6 (0 0 0 0 14 0 12) (let ((result (make-list 7 :initial-element 0)))... にすれば意図したとおりに動作するのは分かっているのですが、 何で元の関数定義でだめなのかが分からないのです。 ちなみに、Lispworks 7.0 Windows 32bitです。 他の処理系でも同じような動作になるのでしょうか。 http://mevius.5ch.net/test/read.cgi/tech/1426481152/966
967: 966 [sage] 2018/07/11(水) 13:41:02 ID:7FwajRbN 何でこうなるかは、何となくわからなくはないのですが(1回目の実行と2回目の実行で同じリストをletで束縛してるってことですよね?)、 letってそういう動作するのを想定して使わなきゃいけないものなのか、ってのがわかってないのです。 僕の理解では元の関数定義でいけそうな気がするのです。 http://mevius.5ch.net/test/read.cgi/tech/1426481152/967
968: 966 [sage] 2018/07/11(水) 15:14:10 ID:7FwajRbN (defparameter *FOO* '(bar bar bar)) (defun hoge-is-foo (&optional (piyo nil)) (let ((hoge '(fuga fuga fuga))) (if piyo (setf *foo* hoge)) (format t "HOGE: ~{ ~a ~}~%" hoge) (format t "*FOO*: ~{ ~a ~}~%" *foo*) (if (eq hoge *foo*) (format t "HOGE IS FOO!~%") (format t "HOGE IS NOT FOO!~%")))) PIYO 82 > (hoge-is-foo) HOGE: FUGA FUGA FUGA *FOO*: BAR BAR BAR HOGE IS NOT FOO! NIL PIYO 83 > (hoge-is-foo t) HOGE: FUGA FUGA FUGA *FOO*: FUGA FUGA FUGA HOGE IS FOO! NIL PIYO 84 > (setf (car *foo*) 'baz) BAZ PIYO 85 > (hoge-is-foo) HOGE: BAZ FUGA FUGA *FOO*: BAZ FUGA FUGA HOGE IS FOO! NIL こーゆーもんなん? http://mevius.5ch.net/test/read.cgi/tech/1426481152/968
971: 966 [sage] 2018/07/11(水) 17:18:46 ID:7FwajRbN >>970 966です。 僕が知りたかったのは>>969の内容です。どうもありがとうございました。 未定義動作なのですね。基本的にこのような破壊的代入は避けるってことですかね。 しかし、これが未定義だと、確率は低いでしょうけど、いつかどこかで事故が起こったりするんじゃないのかな。知らんけど。 http://mevius.5ch.net/test/read.cgi/tech/1426481152/971
974: 966 [sage] 2018/07/11(水) 20:23:44 ID:7FwajRbN >>972 破壊的な変更には注意が必要なこと自体は、入門書などを読んで知っていたのですが、 今回の例では関数を呼び出す度に別のリストをletが束縛するだろうjkと勝手に思っていました。 勉強になりました。ありがとうございます。 http://mevius.5ch.net/test/read.cgi/tech/1426481152/974
976: 966 [sage] 2018/07/11(水) 20:46:42 ID:7FwajRbN >>975 でないっす。 http://mevius.5ch.net/test/read.cgi/tech/1426481152/976
977: 966 [sage] 2018/07/11(水) 21:11:34 ID:7FwajRbN 自分の環境でSBCLでやってみたら↓みたいになった。 個人的にはLispworksの挙動より意味不明かも。 (hoge-is-foo)はLispworksと同じ結果。 * (test) 0 0 0 0 0 0 0 (0 0 0 0 7 0 6) * (test) 0 0 0 0 7 0 6 (0 0 0 0 7 0 6) * (test) 0 0 0 0 7 0 6 (0 0 0 0 7 0 6) http://mevius.5ch.net/test/read.cgi/tech/1426481152/977
メモ帳
(0/65535文字)
上
下
前次
1-
新
書
関
写
板
覧
索
設
栞
歴
スレ情報
赤レス抽出
画像レス抽出
歴の未読スレ
AAサムネイル
Google検索
Wikipedia
ぬこの手
ぬこTOP
1.425s*