stackoverflowってホントの初心者が質問してもいい雰囲気なん?
Gauche の 0.9.6 リリースが近いらしい
0.9.6 キタ――♪ o(゚∀゚o) (o゚∀゚o) (o゚∀゚)o キタ――♪
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?はどう作ればいいの?
教えてください。初心者です。
(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です。
他の処理系でも同じような動作になるのでしょうか。
何でこうなるかは、何となくわからなくはないのですが(1回目の実行と2回目の実行で同じリストをletで束縛してるってことですよね?)、
letってそういう動作するのを想定して使わなきゃいけないものなのか、ってのがわかってないのです。
僕の理解では元の関数定義でいけそうな気がするのです。
(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) が返されるみたい。 自分の環境で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]> 何故maxには:keyがつかえないの?
定義だから。いや、知ってるけどあってもええやん。
みんなreduceとか使ってやってんの?
リテラルの破壊が駄目ってのは割と一般的な気がする。
C がそうなってるのを知ってたので、
後に他の言語を学ぶときも意識して仕様をチェックしてる。
0984デフォルトの名無しさん2018/07/12(木) 12:25:48.63ID:l643qOMO
>>973
なるほど、first側にatomかpairかのフラグを入れて、実際のリストの構造はsecond側に入れればいいのか。
ありがとう、この線でやってみる。 mapcarしてremove-if #'nullするのと、
mapcan使うのとどっちがおすすめなん。
Lisp系だからってひとまとめにするには違いが大きすぎるし、
ちょっとしたことならともかく、
入り組んだ事柄を話すにはやっぱり専門のスレがよさそうな気もするし、
それぞれの言語でコミュニティがあるから、
5ch は雑談程度って割り切ってもいいのかもしれないとも思うし…。
0990デフォルトの名無しさん2018/07/13(金) 23:56:41.22ID:1D4AU09B
Maxima以外に実用出来るオープンソースの数式処理システムを知らないのだけど
Common Lispが優秀過ぎるからmaximaしかないのか
自分の知らない数式処理システムが他にあるのか
んじゃ関連サイトは過去スレを除きとりあえず残すけどええんか?
10011001Over 1000Thread
このスレッドは1000を超えました。
新しいスレッドを立ててください。
life time: 1217日 1時間 23分 46秒