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


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

【入門】Common Lisp その3【質問よろず】



1 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 21:41:07 ]
lispを触ってみたい入門者のQ&A
初心者のQ&A
本スレでは恥ずかしくて聞けない人のQ&A
本スレは高度すぎて割り込めない人のQ&A
linuxでなくてwindowsでやりたいんですが・・・Q&A
lispを使用してC#やJAVAの代替にするための方法(おまけ)

ま、ゆっくりたりましょう。

「いいものの本質は、いかなる時代においても変わらない」byパワーズ

(list
(url pc8.2ch.net/test/read.cgi/tech/1101386936/l50 :part 1)
(url pc11.2ch.net/test/read.so/tech/1140012484/l50 :part 2))


152 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 06:14:20 ]
>>150
おはようございます、教わった関数とdirectory関数をつかってパスがディレクトリかどうか判定できるようになりました。
ありがとう。



153 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 07:34:09 ]
>>150
>>Lisp は「ディレクトリ」って概念がないファイルシステム

って、どんな感じなんでしょう?

全部、ひとつのディレクトリの中に収まっているようなイメージなんでしょうか?
ぜひ、教えてください。

154 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:50:59 ]
>>153
そう。一階層しかない。
Common Lispが制定された頃(20年以上前)はそういうOS(たとえばCP/M)が生き残っていたのじゃよ。

155 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 15:55:51 ]
だれか政治力のある人に CLtL3 を提案してほしい。GLSはもう興味無いのかな。

156 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:05:02 ]
>>155
何か案があるなら提案すりゃいいんじゃね。各ベンダとも独自の拡張を施してるわけだし。
で、なんで共通部分である ANSI CL の部分を変更したいんだ?
処理系の対応なんかでかなりのコストがかかるけど。

157 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:15:37 ]
>>156
そりゃ独自に似たような拡張やってるなら共通部分に入れたほうが良いでしょ。
コスト掛かるって意味がわからんけど、標準になればみんな対応するでしょ。

158 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:48:41 ]
よくわからん。何を標準化してほしいんだ?ただ改訂したい改訂したいといわれても…

159 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:50:48 ]
憲法論議みたいだな

160 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 18:53:58 ]
>>158
例えばちょっと上で出たディレクトリの話とか、多少時代遅れになってる部分はあると思う。
Unicodeの扱いなんかもベンダ独自でやってるけど、共通化すると便利ではないか?



161 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:05:35 ]
あーそりゃ便利だと思うけどね。その程度では規格制定のコストを払ってくれるところはないと思うよ…
Unicode 周りというか国際化対応にかんしてもまだ課題は多くて The Right Thing は見えないしね。
CLRFI clrfi.alu.org/ でどかんとブチ挙げるとか、ライブラリ書いて cliki あたりで公開してデファクト
目指すか、 CL-FAD みたいな事実上標準的なライブラリで我慢するか。

> コスト掛かるって意味がわからんけど、標準になればみんな対応するでしょ。
結構軽く考えてるな。まず R6RS の推移と主要処理系が対応するまでの過程を見てみると参考になると思う。


162 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 19:12:44 ]
>>161
まあ軽く考えてると言われればそうかもしれん。せめて R6RS みたいな話が Common Lisp にも
出てこないかな、という無責任な希望程度の話。議論するつもりは無いので、このくらいで。

163 名前:デフォルトの名無しさん [2007/07/01(日) 21:04:30 ]
karetta.jp/article/blog/ll-spirit/033840
これをCLで素朴にやってみたんですけど誰か添削してくれませんか。

(defvar *capacity* nil) ; int list
(defvar *goal-p* nil) ; int list -> bool

(defun room-of (n state) (- (nth n *capacity*) (nth n state)))
(defun lset (l n v) (cond ((= n 0) (cons (+ (first l) v) (rest l)))
                           (t (cons (first l) (lset (rest l) (- n 1) v)))))

; int list -> (int . int) -> int list
(defun move (state pair)
  (let* ((from (first pair))
        (to (rest pair))
        (m (min (room-of to state) (nth from state))))
    (lset (lset state from (- m)) to m)))

; int list -> (int . int) list
(defun all-moves (l)
  (remove-if #'(lambda (pair) (= (first pair) (rest pair)))
      (mapcan #'(lambda (x)
                (mapcar #'(lambda (y) (cons x y))
                        l))
              l)))
;続く

164 名前:デフォルトの名無しさん [2007/07/01(日) 21:05:18 ]
;続き
; int list -> int list list
(defun successors (state)
  (mapcar #'(lambda (x) (move state x)) (all-moves '(0 1 2))))

(defun solve-abura (a b c)
  (let* ((*capacity* (list a b c))
         (target-amount (/ a 2))
         (*goal-p* #'(lambda (state) (= (count target-amount state) 2)))
         (start (list a 0 0)))
    (abura (list start))))

(defun abura (goal-stack)
  (let ((state (first goal-stack)))
    (cond
      ((funcall *goal-p* state) (reverse goal-stack))
      ((member state (rest goal-stack) :test #'equal) nil)
      ((some #'(lambda (amt cap) (> amt cap)) state *capacity*) nil)
      (t (reduce
           #'(lambda (result new-goal-stack) (or result (abura new-goal-stack)))
           (mapcar #'(lambda (s) (cons s goal-stack)) (successors state))
           :initial-value nil)))))

;(trace abura)
(print (solve-abura 10 7 3))

165 名前:153 mailto:sage [2007/07/01(日) 22:32:38 ]
>>154
レス、どうもです。

ファイル操作に関連する苛立たしさ、
(cltl2の本、アンナに分厚いのに)
change directoryが無いとかは、
そういうことに起因してたんですか。

私が使っているlispのアプリの作者さんが、cd等の関数を、
処理系毎にaliasっぽく簡単な書き換えをしているのを見て、
なんでこんな基本的な関数も用意してくれないのかと思っていたのです。

「directoryの概念の無いファイルシステム」
とか言われちゃうと、仕方がないとも思えるけど、
ansi cl化する時、足してほしかったな。

166 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 23:16:49 ]
当時、UNIX ベースのシステムが主流になるとは保証できなかったからしょうがない。
大抵の言語ではファイルシステム関連の機能は規格というよりライブラリの領分だしね。

個人的には pathname は夢の残骸みたいな感があるね。構成要素は↓だけど、
pathname-device, pathname-directory, pathname-host, pathname-name, pathname-type, pathname-version
UNIX だと directory, name のみだよね(拡張子を type とみるかもしれない)。 Windows だと device, directory, name, type か。
当時の Lisp Machine はネットワークを備えていたから host なんてのがあるし、version なんてのも面白いよね。
バージョニングを備えていたファイルシステムが当時あったのかな?

167 名前:デフォルトの名無しさん mailto:sage [2007/07/01(日) 23:29:14 ]
> バージョニングを備えていたファイルシステムが当時あったのかな?

VMS とかかな。

168 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 00:12:02 ]
TOPSにもあった気がする

169 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 21:53:37 ]
CommonLispでの外部ライブラリの使い方等について質問です。
htmlgenというライブラリをaptでインストールしましたが、このあと
どうやってそれを使えばいいのかが分かりません。

require? load?

ここらへんの知識が全くないのですが、
どこかに情報まとまっていたりしますか?

とりあえずaptでいっしょにインストールされたtest.clを読み込めるところまで
いきたいのですが・・・

170 名前:デフォルトの名無しさん mailto:sage [2007/07/02(月) 23:07:16 ]
apt とか Debian いわれてもわからん。SBCL か?
(asdf:oos 'asdf:load-op :htmp-gen)
でコンパイル + ロード完了だ。だめなら、これの前に
(load "/path/to/somewhere/htmlgen.asd")
を実行しとくこと。



171 名前:デフォルトの名無しさん [2007/07/02(月) 23:15:39 ]
    ┌─10
 ┌─┼─20
 │  └─30
 │  ┌─40
─┼─┼─50
 │  └─60
 │  ┌─70
 └─┼─80
    └─90

を表す引数なしの関数tree定義して、

次に,car や cdr 等以外の何らかのコマンドや関数等を使って,tree から次のような要素を取り出すにはどうすればいいんですか?

> XXXXXX
10
> XXXXXX
20


172 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 00:41:36 ]
>>169
ubuntuかdebianだと思うが /usr/share/doc/cl-htmlgenとかにドキュメントが入る
んで (asdf:oos 'asdf:load-op :htmlgen)か(require :htmlgen)で使えるよ。
share/docにあんまり記述が無い奴(たまにある)だったら:htmlgenの部分は/usr/share/common-lisp/systemの中に入れたとおぼしきパッケージのasdファイルがあるから
他のパッケージでワケワカメになったら探すと良いよ。


全然関係ないけど、windowsとlinuxどっちもslime+emacs+sbclでかなり幸せになれました。
で、windowsでアプリ書くのにlispbuilder使ってますが結構しんどいです。(windowのレイアウトだけはポトペタにしたいです)
windowレイヤーだけ別にポトペタして、sbclで作ったロジックと結びつけたりするような手段って無いでしょうか?
あるいは製品版のlispworksとかだとできるのでしょうか?(aclは再配布コストを負担できないので除外してます)



173 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 00:51:19 ]
LispWorks の InterfaceBuilder か?一応ポトペタもどきだが、 CAPI ライブラリは宣言的なので手で書いたほうが楽だったりする。
GUI の速度がいらねーなら LTK でいいんじゃね。GTK 系でも Socket で通信する GUI があった気がする。
どんなアプリ作るの?

174 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 00:57:12 ]
>>171
宿題なら宿題とかけよ…。なんで宿題ですって正直に言えない奴が多いんだ。
宿題じゃない風を装いたいならもうちょっと日本語をなんとかしろよ…
まぁ、どうせ答え丸写しで小言なんか聞きやしないんだろうけどよぉ

(defun tree () '((10 20 30) (40 50 60) (70 80 90)))

> (caar (tree)) もしくは (first (first (tree))) もしくは (nth 0 (nth 0 (tree)))
10
> (cadar (tree)) もしくは (first (rest (first (tree)))) もしくは (nth 1 (nth 0 (tree)))
20


175 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 00:59:46 ]
>>174
おまえ、親切だなw

176 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 01:31:07 ]
>>173
任意のファイル開いて諸元の一部を表示して、入力欄の数値を使って解析して
結果を別の名前のファイルでしまうっていうタイプのよくある奴です。
入力欄に日本語のコメントつっこんだらLTKが毎回落ちるので orz

ATOK使ってるせいかもしれないけど。 


177 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 01:46:55 ]
>>176
lispuser.net のスクリーンショットでは LTK の日本語入力できていたようだけどなー。
文字コードの設定まちがってるとかない?日本語入れたいなら LispWorks も厳しいかもねぇ。
IME のインライン入力なんか対応してる気配ゼロです。





178 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 08:28:50 ]
>>177
おはようございます。
ご指摘の通りエンコードでした、cp1250だからラテンになってました。
lispuser.netとかの記事とltk.lisp本体を参考にして次のようなフック組んだらなんとかなりました。
(defun wish-enable-japanese ()
  (let* (( s (ltk:wish-stream ltk:*wish*))
   ( i (two-way-stream-input-stream s))
   ( o (two-way-stream-output-stream s))
   ( n (make-two-way-stream
    (sb-sys:make-fd-stream
    (sb-sys:fd-stream-fd i)
    :input t :external-format *CURRENTENCODE*)
    (sb-sys:make-fd-stream
    (sb-sys:fd-stream-fd o)
    :output t :external-format *CURRENTENCODE*))))
    (setf (ltk:wish-stream ltk:*wish*) n)))

(pushnew 'wish-enable-japanese ltk:*init-wish-hook*)

set-external-formatとか(setf (external-format is))とかで処理できるかと思ったのですがデキマセンでした。
ここで小一時間ほど時間を食ってしまいました(仕事に遅れるかと思ったです@通勤電車)
#slimeからだとutf-8でlispファイルダブルクリックだとsjisなのもなんとかしたいなぁ。


Lispworksですがpersonal版はちゃんとime制御されていましたのでそんなに心配はしてないのですが、いかんせん今の円ドルレートだと送料込みで16万超えるのでショボーンって感じです。
allegroは絶対安全なんですが、事業所内分のランタイムライセンス出せません(w




179 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 08:43:45 ]
うう、lispファイルダブルクリックだとエンコードが何になるのかわからないです > _ <
ltkの戻りはutf-8で食えばsbcl側で認識するんですが orz

コンパイル時のエンコードがどこかにあるのかな?



180 名前:デフォルトの名無しさん mailto:sage [2007/07/03(火) 21:05:02 ]
(setf sb-impl::*default-external-format* :cp932)
ググリまくって該当する解見つけました、




181 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 17:02:03 ]
numberp とかの p は predicate の p ですか property の p ですか?
たぶんどっちもありかも知れませんが、
property の p だという記述を見つけて気になったもので。


182 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 17:05:39 ]
predicateに決まってるじゃん。number propertyじゃ意味わからん。

183 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 17:12:21 ]
>>182
ttp://nicosia.is.s.u-tokyo.ac.jp/pub/essay/hagiya/kaisetsu/lisp_nyuumon

184 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 17:20:29 ]
>>183
単なる間違いだと思うが

185 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 17:32:59 ]
>>183
たんなるミスでしたか。predicate だと思ってたので、あれ?って感じで。
(数値の性質 obj) でも通じるかなぁと。


186 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 22:52:18 ]
どんだけ肩書き補正かかってんだよ。 predicate ったら predicate 〜
匿名の言う事よりも肩書を信じたいなら、GLS も predicate の略だといっている、と覚えよう。

187 名前:デフォルトの名無しさん mailto:sage [2007/07/04(水) 23:54:50 ]
俺の本にも述語(predicate)って書いてあるよ。

188 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 12:19:17 ]
>>163-164
ちょっと効率よくしてみた

(defun solve-abura (a b c)
  (let* ((*capacity* (list a b c))
         (target-amount (/ a 2))
         (*goal-p* #'(lambda (state) (= (count target-amount state) 2)))
         (start (list a 0 0)))
    (catch 'solved (abura (list start)))))

(defun abura (goal-stack)
  (let ((state (first goal-stack)))
    (cond
     ((funcall *goal-p* state) (throw 'solved (reverse goal-stack)))
     ((member state (rest goal-stack) :test #'equal) nil)
     ((some #'(lambda (amt cap) (> amt cap)) state *capacity*) nil)
     (t (dolist (s (successors state))
          (abura (cons s goal-stack)))))))

違うのは catch, throw を使うようにしたところ。
これで abura の再帰呼び出し部分の reduce, mapcar がなくなった。

あとは lset も copy-seq と破壊的操作にすると少しだけ空間効率がよくなるみたい。

189 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 16:15:51 ]
質問です。
対話によるCommon Lisp入門 栗原正仁 著
p103で
(defun to (b) (< (random 1.0) b))
という関数toが出てくるのですが、
これが副作用を持つと書いてあります。
どこに副作用が有るのでしょうか?


190 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 16:17:29 ]
>>189
random



191 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 22:39:11 ]
え、randomって副作用なんですか?
副作用ってsetfで変数に値を代入したり、
defunで関数が使えるようになる事じゃないんですか?

192 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 22:46:39 ]
randomは疑似乱数列を返す。つまり、どういう順序でどういう数値が返るのか
あらかじめ決定している。従って、randomを呼ぶか呼ばないかによって、次の
randomで返る値は変化する。これを副作用と呼ばずして何を副作用と呼ぶ?

193 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 22:56:50 ]
ははぁ、成る程!
分かりました!

194 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 22:57:19 ]
引数が同じなら何度呼んでも結果が変わらないのが副作用のない関数だよ。
したがって random には副作用がある。


195 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 23:02:23 ]
こんなに詳しく解説していただいて感動です。
精進します。

196 名前:169 mailto:sage [2007/07/07(土) 23:29:11 ]
>>170, 172
返答どうもです。とりあえず、(asdf:oos 'asdf:load-op :htmlgen)もしくは(require :htmlgen)
で、何やらいろいろ読み込んでいるメッセージがでます。そのあと、サンプルファイルtest.clをloadしたいのだけど、
失敗します。test.clはファイルの先頭行で

(defpackage :user (:use :htmlgen))をしているのだけど、(load "test.cl")したときに、

----ここから
debugger invoked on a SB-KERNEL:SIMPLE-PACKAGE-ERROR:
The name "HTMLGEN" does not designate any package.

Type HELP for debugger help, or (SB-EXT:QUIT) to exit from SBCL.

restarts (invokable by number or by possibly-abbreviated name):
0: [ABORT] Exit debugger, returning to top level.

(SB-INT:%FIND-PACKAGE-OR-LOSE "HTMLGEN")
----ここまで

というエラーがでます。"HTMLGEN"というパッケージは存在しないという
内容のように見えますが、これはつまり最初の読み込みがうまく行ってないということでしょうか?

197 名前:169 mailto:sage [2007/07/07(土) 23:30:13 ]
>>196の続き

htmlgen.asdファイルは以下のようになってます。

----ここから
kengo@Somali:/usr/share/common-lisp/source/htmlgen$ view htmlgen.asd

;;; -*- mode: lisp -*-
(defpackage #:htmlgen-system
(:use #:cl #:asdf))
(in-package #:htmlgen-system)

(defclass acl-file (cl-source-file) ())
(defmethod source-file-type ((c acl-file) (s module)) "cl")

(defsystem htmlgen
:author "John K. Foderaro"
:licence "LLGPL"
:default-component-class acl-file
:components ((:file "htmlgen"))
:depends-on (acl-compat)
:perform (load-op :after (op htmlgen)
(pushnew :htmlgen cl:*features*)))
----ここまで

まずasdfについて勉強しないと駄目なのかな・・・さっぱりわからん。。

198 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 23:38:24 ]
>>194
> 引数が同じなら何度呼んでも結果が変わらないのが副作用のない関数だよ。

ちょっと語弊があるんじゃないか?

結果って書くと普通は戻り値と解釈されることが多いが、戻り値が一定でも
副作用のある関数を書くことはできる。

逆に現在時刻を返す関数等は副作用があるとは言わないと思うし。

199 名前:デフォルトの名無しさん mailto:sage [2007/07/07(土) 23:47:54 ]
横レスだけど、

>逆に現在時刻を返す関数等は副作用があるとは言わないと思うし。

全く同じ引数を渡したのに毎回異なる結果(現在時刻)を返すのであれば、
参照透明が崩されるので副作用があると思います。
現在時刻に合わせて変動する環境へのポインタみたいなのを引数に渡す
様になっていればその限りでは無いと思いますが。

200 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 00:36:21 ]
>>196
ubuntuのだとhtmlgenのパッケージ宣言がnet.html.generatorになっていてtest.clと異なるからダメポみたいだね。
取り合えずこうやって呼び出しパッケージ変更すると先にはいけます
(require :htmlgen)
(defun simple-table-a ()
(with-open-file (p "test.html"
:direction :output
:if-exists :supersede)
(net.html.generator:html-stream p ;;net.html.generator:パッケージを指定
(:html
(:head (:title "Test Table"))
(:body (:table
(:tr (:td "0") (:td "0"))
(:tr (:td "1") (:td "1"))
(:tr (:td "2") (:td "4"))
(:tr (:td "3") (:td "9"))
(:tr (:td "4") (:td "16"))
(:tr (:td "5") (:td "25"))))))))


でもこれよりhtml-templateの方が使いやすい気がするんだけどそれじゃいやなのかな?

#実はcgiでlisp使おうとしてるんで学習がてらです。
#ちっともlisp自体には詳しくないです。




201 名前:200 mailto:sage [2007/07/08(日) 00:37:43 ]
うぐ、コードはtest.clの物です、インデントは脳内で補間してください


202 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 00:42:57 ]
副作用という単語の定義の問題だと思う。個人的には時間取得関数を「副作用がある」と言う
のには抵抗を感じる。便宜的に「副作用がある」と宣言して、ある種の最適化を抑止しなければ
ならないケース(言語)は多いと思うけど。

上記の乱数の例についても、もし予測不能な「真の乱数」(物理乱数)を返す関数だったらどう
だろう、とか考えてしまった。(混乱させてしまったらごめんなさい)

203 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 01:07:57 ]
>>202
(setf a (f x))

こう書いたときにaが常に一意に決まる関数は副作用が無い。

aの結果が変わることを無視すれば副作用は無いように
見えるかもしれないけど
副作用の無い関数を組み合せた結果
副作用のある関数が作りうるのは副作用が無いといえないのではないか?

と、この観点では真の乱数は副作用があって、
疑似乱数で必ず種を受けとらないと動作しないものは副作用の無い関数として
扱ってよいと考える。

オプショナルで省略されたデフォルトグローバルな種を書き換えるかどうかは
この場合あまり重要ではない。

参照透明性とか言っている人はこういう風に考えているんじゃないかなと思った。

違ったらスマヌ

204 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 01:10:26 ]
>>196

> (defpackage :user (:use :htmlgen))をしているのだけど、(load "test.cl")したときに、
(defpackage :user (:use :cl :net.html.generator))
とすればいいよ。asd の定義は Makefile のプロジェクト名とターゲット指定相当なんで
実際の CL におけるパッケージ名とは別。パッケージ名は net.html.generator 。
というかそのパッケージにはドキュメントついてこないのか。ヒドいなぁ…

205 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 01:11:21 ]
思考実験をする前に、脳内定義を外界と摺り合わせしておくのも悪くない事だと思う
サンプルとして、純粋関数型言語オタクの言う副作用はこんな感じ

ttp://www.sampou.org/haskell/article/whyfp.html

206 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 01:54:47 ]
wikipediaの副作用の項にある
1. 同じ条件を与えれば必ず同じ結果が得られる
2. 他のいかなる機能の結果にも影響を与えない
が良く分からん。
1は当然として(パソコンの時間が狂ってたらアレだけれど)、
2はどういう意味なんだ?
上の例だと時間取得関数は、その戻り値(時間)を使用した
関数の結果には影響を与えるから副作用を持つ?

207 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 02:16:33 ]
>>206
2. は(上記疑似乱数の例のように)その関数を呼び出すことによって、その後に呼び出す関数の
動作が変化しないという意味じゃないかな。例えば上の疑似乱数の例は呼び出すことによって乱数
の系列がずれてしまうので副作用がある。
(正直、君の言っている意味のほうが理解できない)

208 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 02:20:03 ]
その関数呼び出しによってほかの場所に影響をあたえる、ってのが副作用じゃない?
random を一回呼び出すと次の random 呼び出しに影響を与えるけど、
時刻取得関数を呼び出しても次の時刻取得関数には影響をあたえない。
戻り値は『ほかの場所』じゃないから気にしなくていいんじゃないかな。

って書いてたら >>206に先を越された。

209 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 02:20:40 ]
>>206 じゃなくて >>207

210 名前:デフォルトの名無しさん [2007/07/08(日) 02:28:09 ]
>>206
ぶっちゃけ状態を扱う関数はみんな副作用がある関数と言える
1.が状態を取り出す
2.が状態を書き換える

副作用というと書き換えるほうをイメージしちゃって>>202みたいに思っちゃう人が多い



211 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 02:31:14 ]
>>199
全く同じ引数を渡した時に同じ結果を返す(いわゆる「純関数」である)というのは副作用とは別の概念じゃないかな。
例えばグローバル変数の値を返すという関数は「純関数」ではないが「副作用がある」とは一般には言わないと思う。
時間を返す関数もこれと同じだよね。

もちろん、副作用のある関数は(たとえ同じ引数に同じ結果を返しても)「純関数」とは呼ばないだろうけど。

212 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 02:33:05 ]
>>210
ああ「取り出すほうも副作用と呼ぶ」のか。議論がかみ合わない理由がわかった。
日本語的には激しく抵抗があるが、そういう定義は一般的なの?

213 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 02:42:11 ]
関数型言語屋はそういう定義を使うことが多いね(偏見かな)

214 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 04:52:39 ]
>>212
日本語的にとかいい出すなら、参照透明でないものを関数と呼ぶ方が抵抗あるだろ……。

215 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 05:51:37 ]
Lispってこんなこともできねーの?

216 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 09:07:59 ]
>>214
副作用って一般的にも使うし、そもそも「作用」の一般的な意味が

| (1)他に力や影響を及ぼすこと。また、そのはたらき。
| 三省堂提供「大辞林 第二版」

だから、「取り出すほうも副作用と呼ぶ」なんて言うのは違和感が
あるのはしょうがない。

対して、参照透明なんて普通の人はあまり使わんから、どんな定義
でも「はあそういう定義ね。」っで終わり。

専門用語と一般的に使われる言葉の意味が異なることは珍しくないよ。

217 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 09:33:01 ]
いや、>>214が問題にしてるのは「参照透明」じゃなくて「関数」の方だと思う。
普通は関数っていったら数学の関数を想像するだろ?

218 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 10:23:20 ]
参照透明の定義をよく知らない人にとっては、「参照透明でないものを関数と呼ぶな」
って言われたら、「ふ〜ん、そうなんだ。」って思うだけで別に違和感を感じる余地
はあまりない。

「普通は関数っていったら数学的な関数を想像するだろ」とか書いてるけど、関数と
言う言葉のイメージって結構ばらばらなのはこの板の連中なら知ってて当然だから、
このスレではそういう(=「参照透明でないものは〜」と言う) 定義なんだと理解でき
るだろうと思う。

219 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 10:35:44 ]
>>218
参照透明という言葉を知ってるかどうかは関係ない。
printfみたいなのを関数と呼ぶ時点で慣れない人(非プログラマとか)には違和感があるだろ。
「副作用」という言葉が慣れない人にとって違和感のある意味で使われているのも、
「関数」という言葉の場合と同じ構造だ、って主張だと思うが。

220 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 12:53:05 ]
副作用のあるものも含めて「関数」と呼ぶのはソフトウェア業界全体に普及している表現だが、
「副作用が無い」を「参照透明」の意味で使うのはそれほど一般的ではないと思う。



221 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 15:12:09 ]
副作用の有無と参照透明性の有無は別々の話。関係はあるけど。
俺は「副作用」が>>210の意味で使われるのって普通じゃないと思うんだけど
そういう意味で使われている文脈って例えばどういうの?

222 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 15:19:05 ]
>>221
>>213

223 名前:デフォルトの名無しさん mailto:sage [2007/07/08(日) 15:58:07 ]
gccのinfo、関数のattributeの説明から

> `const'
> Many functions do not examine any values except their arguments,
> and have no effects except the return value. (中略)
>
> The attribute `const' is not implemented in GCC versions earlier
> than 2.5. An alternative way to declare that a function has no
> side effects, which works in the current version and in some (後略)

この "a function has no side effects" が意味するものは当然これ。

> Many functions do not examine any values except their arguments,
> and have no effects except the return value.

224 名前:169 mailto:sage [2007/07/08(日) 17:07:58 ]
>>200,>>204

おーー。できました!
どうもありがとうございます。

net.html.generatorというのは、htmlgen.clの先頭で
defpackageしている名前のことですね。

html-templateっていうのもあるんですか。
何がメジャーとかぜんぜん知らないんで一番最初に見つけたhtmlgenで
とりあえずやってみました。他にもlmlとか言う名前のhtmlテンプレートも
あったような気がする。いろいろあってわからんです

225 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 00:31:09 ]
>>222
具体的に例えばどれ?

226 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 00:40:56 ]
ごめ223見てなかった。Thanks.


227 名前:デフォルトの名無しさん [2007/07/09(月) 21:24:17 ]
CLISPでのデバッグ方法を解説している日本のサイトはないでしょうか?

228 名前:デフォルトの名無しさん mailto:sage [2007/07/09(月) 23:49:25 ]
どんなバグなのかによるんじゃないかな。バグ入り関数の例とか示せる?

229 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 08:45:11 ]
www.kmonos.net/wlog/61.html
これの、Curry-Howard Isomorphismの項なんだけれど、
これをCLでやるにはどうすればいいんだろう。
(a かつ (aならばb)) ならば b

haskellで
Prelude> :t ¥x -> (snd x) (fst x)
¥x -> (snd x) (fst x) :: (a, a -> t) -> t
らしいんだが、CLならどう書けばよいのかHaskellに詳しくないからさっぱり。
そもそもHaskellの::に相当する構文が無いからCLには無理?


230 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 09:03:24 ]
CL には直積型がないからね
cons で代用するとこうかな
(lambda (x) (funcall (cdr x) (car x)))



231 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 09:09:01 ]
そのまま (defun hoge (x) (funcall (cdr x) (car x))
普通にカーリー・ハワード対応で調べればいいのに。



232 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 09:16:29 ]
>>230
(lambda (x) (funcall (cdr x) (car x)))

:t ¥x -> (snd x) (fst x)
に対応しているのは分かるんだけれど、
このラムダ式が定義できる事が、証明した事になるのかな?

233 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 09:28:45 ]
>>232
> このラムダ式が定義できる事が、証明した事になるのかな?
疑問点がいまいちわかんない。
直観主義命題論理の証明と Lisp の関数とが対応するかということなら、
少なくとも上に書いたような方法では対応させられないと思う。

234 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 09:34:14 ]
いや、証明に対応する関数は書けるか。
関数を書いても対応する証明があるとは限らない。

例えばこういうのは、対応する証明が命題論理の範囲にはない。
(lambda (x) (funcall x x))

235 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 09:41:03 ]
>>233
>直観主義命題論理の証明と Lisp の関数とが対応するかということなら、
>少なくとも上に書いたような方法では対応させられないと思う。
残念、無理なのか。
いや、カーリー・ハワード対応という言葉を今回初めて知って、
(Lispで数式証明のアプリケーションが有るのは知ってるけれど)
んで、(a かつ (aならばb)) ならば bを証明してみたいなぁと思った訳です。

236 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 13:47:03 ]
>>235
(lambda (x) (funcall (cdr x) (car x)))
を満たすようなxの値が存在することが証明に対応、
つまりそんなxを一つ挙げればいい……んじゃなかったっけ? うろ憶え。

237 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 16:38:25 ]
静的な型がないと駄目だな。
\x -> x xはHaskellでは型エラー。

238 名前:デフォルトの名無しさん mailto:sage [2007/07/10(火) 22:14:43 ]
(defun hoge (a b)
(if (and a (eql a b)) b
nil))
じゃ、ダメなのかな?
っーかこの分野って、やってる人少ないのかな?
あんまりレスないね。
ここの人、こんなこと好きそうなイメージなんだけれど。

239 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 00:51:45 ]
Cで書いたプログラムとCLispで書いたプログラムを
互いに通信させたいんだけど,そういった場合ってやっぱSocket?
何かいいライブラリとかありませんかね

240 名前:200 mailto:sage [2007/07/11(水) 01:40:07 ]
通信だとsocketですが、お互いのやり取りの中身が直接呼び出しだったり、共有メモリでなんとかできるのならCFFIあたりを使ってみてはどうですか?
OpenGLの呼び出しとかで使われてるやつです。




241 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 04:06:54 ]
>>238
本スレ行ったほうがいいかもね。
その手の話はスキーマーのほうが乗ってくる。

242 名前:デフォルトの名無しさん mailto:sage [2007/07/11(水) 09:27:13 ]
>>238
λ計算は知ってるけど、Lisp とはそれほどきれいに対応しないと思う。
ちなみにそのコードは Curry-Howard とはぜんぜん関係ないような。

243 名前:デフォルトの名無しさん mailto:sage [2007/07/13(金) 00:19:32 ]
(format t "~X ~X~%" a b)とやって
#(69) 69
と表示されるんですが,同じ数値でも片方に#()がついてしまいます.
これってただの数値じゃないってことですか?
その成果,後々にa = #x69とやってもTになってくれません

aは
(let ((a (make-array 1 :element-type '(unsigned-byte 8)))))
とかやって
EXT:READ-BYTE-SEQUENCEとかで読み込んだ値なんですが...

244 名前:デフォルトの名無しさん mailto:sage [2007/07/13(金) 00:24:36 ]
>>243
ただの数値じゃないんですよ。配列ってわかります?

245 名前:デフォルトの名無しさん mailto:sage [2007/07/13(金) 00:27:13 ]
>>244
それだ!

246 名前:デフォルトの名無しさん [2007/07/13(金) 21:41:29 ]
Lispの練習問題を探していて

Define show-list to act like Lisp's PRINT, except that it should print
square brackets instead of parentheses. (Printing to a string and
replacing parentheses doesn't count.)

Both functions should be able to print any S-expression, including
atoms.

> (show-list '(a b c))
→ [A B C]

ってのを見つけました。

これを、"ANSI Common Lisp"の第3章までの知識で解きなさい、ってんですけ
ど、オジサンの頭ではどーにもなりません。

そのものズバリでなくても、ヒントとか考え方とか教えていただけないでしょ
うか?





247 名前:デフォルトの名無しさん mailto:sage [2007/07/13(金) 22:14:08 ]
SBCLでcompile-fileしてもあんまり速くならないんですが、
何か他に速くする手段てあるでしょうか?


248 名前:デフォルトの名無しさん [2007/07/13(金) 22:39:40 ]
>>246
1. 全てのS式を表示だからatomの場合、consの場合、nilの場合で場合わけすることになるはず。atomとnilは自明。
2. consの場合の表示を分解すると括弧の表示+最初の要素を表示(要素はさらにconsかもしれない)+残りの表示+括弧閉じになるはず。
3. この「残りの表示」を別関数で定義してみる。(←ここがポイント)
4.「残りの表示」の場合わけもさっきと同様になる。
5. ここでconsの場合の処理はやっぱり「最初の要素について(これもconsかもしれない)」「残りについて」になる。

249 名前:デフォルトの名無しさん mailto:sage [2007/07/13(金) 22:42:50 ]
説明下手糞?

250 名前:デフォルトの名無しさん [2007/07/13(金) 22:48:00 ]
ごめん、代わりに頼むよ



251 名前:デフォルトの名無しさん [2007/07/14(土) 00:35:32 ]
>>248
おぉ、早速ありがとうございます。
参考にしていろいろいじってみます。

日本語で読むと簡単そうに見えるんだけどなぁ。

(defun show-list (lst)
 (if (null lst)
  lst
   (if (atom lst)
    :

って感じでいいんですよね?





252 名前:デフォルトの名無しさん mailto:sage [2007/07/14(土) 00:55:32 ]
配列とか構造体とか () 使うのはほかにもあるけど
symbol と cons だけでいいのかな

>>251
>  (if (null lst)
>     lst
"nil" って文字列を印字しなきゃいけないんでないの?






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

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

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