X



Lisp Scheme Part40 [転載禁止]©2ch.net
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2015/03/16(月) 13:45:52.92ID:EEYZoZ1i
Common Lisp、SchemeをはじめとするLisp族全般のスレです

■前スレ
Lisp Scheme Part39
http://peace.2ch.net/test/read.cgi/tech/1408017352/

■テンプレ
ttp://wiki.fdiary.net/lisp/

■関連スレ
【入門】Common Lisp その11【質問よろず】
http://peace.2ch.net/test/read.cgi/tech/1411307361/
【Scheme】Schemeインタプリタ Mosh Part1【Lisp】
http://peace.2ch.net/test/read.cgi/tech/1272469779/
【Lisp】プログラミング言語 Clojure #3【JVM】
http://peace.2ch.net/test/read.cgi/tech/1380333808/
【魔法】リリカル☆Lisp【言語】
http://peace.2ch.net/test/read.cgi/tech/1183396621/
0955デフォルトの名無しさん2018/06/30(土) 21:17:22.45ID:68JzM2MV
>>954
雰囲気ってのが曖昧だけど、質問内容が馬鹿げたものでもどんどんしていいよ。
初心者の質問内容がしょうもないことなのは普通のこと。
だけど、質問の仕方にはある程度の作法がある。

https://ja.stackoverflow.com/help

「ホントの初心者」というのは自分が何を知りたいのか理解していないことが多いので、
回答できる質問に修正されるまでしつこくコメントされるかもしれないけど、
それは非難ではなく回答するために必要な対話なので、面倒くさがらないでね。
0956 ◆QZaw55cn4c 2018/07/01(日) 21:02:57.27ID:7W/RE1b9
>>955
>自分が何を知りたいのか理解していないこと
それがわかるようであれば、回答を半分得たも同然ですね…
私にはわからないことが沢山あります、それが減る気配もない…
0959はちみつ餃子 ◆8X2XSCHEME 2018/07/03(火) 22:38:46.07ID:BKTruI85
>>958
ずっと兼業してるみたいだよ。

俳優としての履歴はここに書かれているけど、 (実際には仕事につながらなかったオーディションも含めると) 2003 年からスタートしてる。
http://practical-scheme.net/wiliki/wiliki.cgi?Shiro%3AAuditionRecords

スクウェアの映画の仕事を終えてから Scheme Arts という名前で法人 (といっても史郎さんひとりの会社だが)
を立ち上げてコンサルティングの仕事を始めて、そのほんの少し後から平行して俳優としても活動してることになる。
0961デフォルトの名無しさん2018/07/04(水) 01:17:41.82ID:OTzKBqUL
関数型言語で画像処理をやってみたいんだけれど
Common Lispで画像読み込みの定番ってある?

debianでcl-png使おうとしたらlibpng12が必要みたいで
使えませんでした。(libpng16ならある)

clwikiに載っているimageライブラリでドキュメントが充実してるのって
cl-pngが一番なんだけど。
0963デフォルトの名無しさん2018/07/04(水) 21:49:20.18ID:gFgZc5FG
KI1
0965デフォルトの名無しさん2018/07/06(金) 01:28:47.94ID:xqwQ2rU4
ラムダ計算と純lispはともにチューリング完全
だからlambdaだけで純lispが作れるはず
実際、cons,car,cdrは作れる
(define (my-cons a d) (lambda (f) (f a d)))
(define (my-car ad) (ad (lambda (a d) a)))
(define (my-cdr ad) (ad (lambda (a d) d)))
でも、atom?またはpair?はどう作ればいいの?
0966デフォルトの名無しさん2018/07/11(水) 13:07:02.79ID: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です。
他の処理系でも同じような動作になるのでしょうか。
09679662018/07/11(水) 13:41:02.30ID:7FwajRbN
何でこうなるかは、何となくわからなくはないのですが(1回目の実行と2回目の実行で同じリストをletで束縛してるってことですよね?)、
letってそういう動作するのを想定して使わなきゃいけないものなのか、ってのがわかってないのです。
僕の理解では元の関数定義でいけそうな気がするのです。
09689662018/07/11(水) 15:14:10.25ID: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

こーゆーもんなん?
0969デフォルトの名無しさん2018/07/11(水) 15:25:01.53ID:16Hc9NDk
>>966
let の使い方というより、 quote されたリストの破壊的変更は literal object の変更にあたるから未定義動作になるはずで、そのせいで変な挙動になってるんだと思う。


ちなみに Allegro だと LispWorks と同じ挙動になった。

SBCL だと警告で "Destructive function SB-KERNEL:%RPLACA called on constant data: (0 0 0)." と出る。
で、繰り返し呼んでも毎回 (0 0 0 0 0 0) が返されるみたい。
09709692018/07/11(水) 16:28:25.75ID:16Hc9NDk
>>967
あ、質問の趣旨が違うか。

(defun hoge ()
'(1 2 3))

があるときに、

(eq (hoge) (hoge))

は、同じリストを返すのだから常に T になるのか?って話かな
09719662018/07/11(水) 17:18:46.59ID:7FwajRbN
>>970
966です。
僕が知りたかったのは>>969の内容です。どうもありがとうございました。
未定義動作なのですね。基本的にこのような破壊的代入は避けるってことですかね。

しかし、これが未定義だと、確率は低いでしょうけど、いつかどこかで事故が起こったりするんじゃないのかな。知らんけど。
0972デフォルトの名無しさん2018/07/11(水) 19:41:32.56ID:16Hc9NDk
>>971
うーん、リストを破壊的に変更する場合、上のようにリテラルを破壊するのもまずいし、リテラルでなくても部分共有されたリストだと予想外の場所に影響が及ぶので、自分は安全とわかってないとやらないです。

破壊的変更をするのが前提なら、 list 関数や言及されてるmake-listで新しく作ったり、 copy-list で複製してからいじったりすることが多いかも。
09749662018/07/11(水) 20:23:44.77ID:7FwajRbN
>>972
破壊的な変更には注意が必要なこと自体は、入門書などを読んで知っていたのですが、
今回の例では関数を呼び出す度に別のリストをletが束縛するだろうjkと勝手に思っていました。

勉強になりました。ありがとうございます。
0975デフォルトの名無しさん2018/07/11(水) 20:33:50.22ID:Igjhxsb4
>>966
SBCLは警告が出るから出ないように修正するだけだし、無視しても意図した通りに動く
LispWorksは警告出ないの?
09769662018/07/11(水) 20:46:42.70ID:7FwajRbN
>>975
でないっす。
09779662018/07/11(水) 21:11:34.91ID: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)
0978デフォルトの名無しさん2018/07/11(水) 21:46:27.14ID:zGhUAGhR
リテラルのリストに対する破壊的変更はダメ
っていうのはLand of Lisp(の訳注)で初めて知った
他の本やサイトでこれに関する注意を見た覚えがない

「literal object の変更にあたるから未定義動作になる」(>>969)ということは、リストに限らないんだね

[1]> (defun f () (let ((x "abc")) (format t "~S~%" x) (setf (elt x 0) #\!) x))
F
[2]> (f)
"abc"
"!bc"
[3]> (f)
"!bc"
"!bc"
[4]>
0979デフォルトの名無しさん2018/07/11(水) 22:50:38.31ID:nrnWofQI
CLHSで "The consequences are undefined if literal objects are destructively modified." って書いてあるページ
http://www.lispworks.com/documentation/HyperSpec/Body/03_ga.htm

そして、 literal の方には "appearing as data in a quote form" なんて書いてあるので (http://www.lispworks.com/documentation/HyperSpec/Body/26_glo_l.htm#literal)
quote の中身は literal, よって破壊的に変更すると undefined ..?
0980デフォルトの名無しさん2018/07/11(水) 22:59:01.95ID:vOu8ozZx
何故maxには:keyがつかえないの?
定義だから。いや、知ってるけどあってもええやん。
みんなreduceとか使ってやってんの?
0981はちみつ餃子 ◆8X2XSCHEME 2018/07/11(水) 23:38:32.21ID:RBgflsxh
リテラルの破壊が駄目ってのは割と一般的な気がする。
C がそうなってるのを知ってたので、
後に他の言語を学ぶときも意識して仕様をチェックしてる。
0982デフォルトの名無しさん2018/07/12(木) 00:32:56.92ID:bsVrPe++
>>977
SBCLは警告出すということは危険なコードと言うのを認識してコピーを作成してるんでしょ
ちなみにEmacsだとクオートされたリストの書き換えは問題ないからついやってしまうな
0984デフォルトの名無しさん2018/07/12(木) 12:25:48.63ID:l643qOMO
>>973
なるほど、first側にatomかpairかのフラグを入れて、実際のリストの構造はsecond側に入れればいいのか。
ありがとう、この線でやってみる。
0985デフォルトの名無しさん2018/07/12(木) 13:13:34.80ID:QKPLqpS1
mapcarしてremove-if #'nullするのと、
mapcan使うのとどっちがおすすめなん。
0987デフォルトの名無しさん2018/07/12(木) 18:20:07.59ID:eSxWwMsY
>>980
:key を持つのは sequence か cons を扱う関数/マクロだけみたい。
max は数を扱う関数だから :key がない、くらいの理由なのではと予想。

で、僕だったらそういう状況は loop ~ maximize で書いちゃうな:

(loop with list = '((1 a) (100 b) (5 c))
for i in list
maximize (car i))
0989はちみつ餃子 ◆8X2XSCHEME 2018/07/12(木) 20:31:21.01ID:m8Dd1031
Lisp系だからってひとまとめにするには違いが大きすぎるし、
ちょっとしたことならともかく、
入り組んだ事柄を話すにはやっぱり専門のスレがよさそうな気もするし、

それぞれの言語でコミュニティがあるから、
5ch は雑談程度って割り切ってもいいのかもしれないとも思うし…。
0990デフォルトの名無しさん2018/07/13(金) 23:56:41.22ID:1D4AU09B
Maxima以外に実用出来るオープンソースの数式処理システムを知らないのだけど
Common Lispが優秀過ぎるからmaximaしかないのか
自分の知らない数式処理システムが他にあるのか
0991はちみつ餃子 ◆8X2XSCHEME 2018/07/14(土) 01:56:22.39ID:Eblv1Llg
>>990
俺が知ってるのだとこういうのもある。

http://www.math.kobe-u.ac.jp/Asir/asir-ja.html
https://www.gap-system.org/

貢献する人が多いと良くなっていくのは当然だし、
良くなるとまた人が集まってくるというスパイラルが出来るので、
一度人気が出るとあえて他の不人気のプロジェクトに手を出そうという人は
現れにくいんじゃない?

まあ、数式処理と一言で言っても数学の分野は広大だから、
今までコンピュータで扱えなかった分野のためのソフトが新たに出てくることだってあるだろうし、
ちょっと別の分野用の数式処理ソフトを探したら案外たくさんあるかもしれないぞ。
0992デフォルトの名無しさん2018/07/14(土) 07:02:57.27ID:0vuXs+dx
>>989
ええ……

Lispでスレ分割なんかしたら
過疎って仕様がないぞ
現に今過疎ってるのにもっと過疎る
0993デフォルトの名無しさん2018/07/14(土) 09:15:24.67ID:/GhuOfpQ
んじゃ関連サイトは過去スレを除きとりあえず残すけどええんか?
0995はちみつ餃子 ◆8X2XSCHEME 2018/07/15(日) 00:24:40.70ID:HERu1+Fl
>>992
分割しようってのじゃなくて、現時点でそれぞれにスレ立ってるやつがあるわけよ。

個別にスレ立ててるやつは、
ここでやるのはちょっと違うなと思ったからこそ立ってるわけでしょ?
統合するとなると違和感は有るよなっていう程度の話。
10011001Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 1217日 1時間 23分 46秒
10021002Over 1000Thread
5ちゃんねるの運営はプレミアム会員の皆さまに支えられています。
運営にご協力お願いいたします。


───────────────────
《プレミアム会員の主な特典》
★ 5ちゃんねる専用ブラウザからの広告除去
★ 5ちゃんねるの過去ログを取得
★ 書き込み規制の緩和
───────────────────

会員登録には個人情報は一切必要ありません。
月300円から匿名でご購入いただけます。

▼ プレミアム会員登録はこちら ▼
https://premium.5ch.net/

▼ 浪人ログインはこちら ▼
https://login.5ch.net/login.php
レス数が1000を超えています。これ以上書き込みはできません。

ニューススポーツなんでも実況