14/05/23 23:34:12.06 VIeF9Nr2
818 : 815[sage] 投稿日:2014/05/23(金) 02:13:12.85 ID:Dj6yziyp
>>817
なるほど 120.00001 になるんだったら120にならないのは当然ですね
近似値になるって事を考えて試行錯誤し
2.6 を 2.6001にすると言う適当な事で対処しました・・・
819 : デフォルトの名無しさん[sage] 投稿日:2014/05/23(金) 08:31:19.17 ID:S9ZhBRpZ
じゃなくて、四捨五入にしないと危ないだろそれ。
820 : デフォルトの名無しさん[sage] 投稿日:2014/05/23(金) 08:41:53.80 ID:UMGtPnEJ
ラウンドやな
821 : デフォルトの名無しさん[sage] 投稿日:2014/05/23(金) 08:58:33.93 ID:UMGtPnEJ
リスプ勉強始めました。まだリスプらしい発想ができず知識もないのですが、C言語でいう静的局所変数の実現方がわからず次のようにしてみました。
もっと、まともな方法有るでしょうか?
;;;隠れ引数cntを利用して静的局所変数を実現する
;;;
;;;目的のatomが与えられたlistの何番目にあるか?
;;;なければゼロを返す
;;;(member* 'c '(a b c d )) -> 3
;;;(member* 'x '(a b c d )) -> 0
(defun member* (x lst &rest cnt)
(if (null cnt) (setq cnt '(1)))
(cond
((null lst) 0)
((eq (car lst) x)
(car cnt))
(t
(member* x (cdr lst) (+ (car cnt) 1)))))
821:2/6
14/05/23 23:35:29.81 VIeF9Nr2
822 : 815[sage] 投稿日:2014/05/23(金) 09:13:01.50 ID:5/FhmPgX
>>819
なんて説明したら良いんだろう・・・
あるブラゲのカードの攻撃力を求める計算を良くするので
それを簡単に求めれないかと xyzzyのLisp入門見て関数作ったのです
Lv1時数値の0.08倍ずつLvUp毎に増えるので
Lv1からLv?の計算は簡単でした
(defun st計算 (ステ Lv) (decf Lv)
(+ Lv ステ (* Lv 0.08 ステ))
)
しかしLv10とかLv20とかからLv?で躓きました
LvUp済み数値は切り捨てられているため
その数値から計算した数値は必ず求めたい数値以下になる
なのでceilingで切り上げたのですが
丁度の場合 (/ 312 2.6) に落とし穴が><
後、四捨五入も最初試しましたが
Lv3のカードとか低Lv時にまずい結果となりダメでした
もっとスマートなやり方あるのでしょうが
現在問題なく計算出来てるため良しとしています
日本語入ってたり段落が・・・初心者丸出しですが晒します TT
(defun st (ステ 現L L) (decf 現L) (decf L)
(setq X (ceiling (- ステ 現L) (+ 1.001 (* 0.08 現L))))
(+ L X (* 0.08 L X ))
)
ステ = 現在のステータス値
現L = 現在のLv値
L = 求めたいLv値
822:3/6
14/05/23 23:36:52.93 VIeF9Nr2
823 : デフォルトの名無しさん[sage] 投稿日:2014/05/23(金) 10:05:01.75 ID:fRyU8CgY
>>820
この例ではカウンタを引数渡しでいいと思う。
C言語でいう静的局所変数に相当する機能としてはクロージャがある。
URLリンク(www.geocities.jp)
クロージャを使ってmember*を実装しようとするとこうなる。
(let ((cnt 1))
(defun member* (x lst)
(cond ((null lst)
(setq cnt 1)
0)
((eq (car lst) x)
(prog1 cnt
(setq cnt 1)))
(t (setq cnt (1+ cnt))
(member* x (cdr lst))))))
823:4/6
14/05/23 23:37:31.47 VIeF9Nr2
824 : デフォルトの名無しさん[sage] 投稿日:2014/05/23(金) 11:01:01.63 ID:VIeF9Nr2
(defun member* (x lst &hidden (c 1))
(cond
((null lst) 0)
((eq (car lst) x) c)
(t (member* x (cdr lst) (1+ c)))))
(member* 3 '(1 2 3 4 5) 1) => ERROR
(member* 3 '(1 2 3 4 5)) => 3
みたいな砂糖が欲しい
825 : デフォルトの名無しさん[sage] 投稿日:2014/05/23(金) 11:14:23.71 ID:EZ1gF0i3
>>823
どうも有り難うございます。書いてもらったSample睨みながら勉強してみます。
826 : デフォルトの名無しさん[sage] 投稿日:2014/05/23(金) 11:15:49.84 ID:SQmi/tAr
nthに合わせて0オリジンじゃないと気持ち悪いな。
824:5/6
14/05/23 23:37:56.54 VIeF9Nr2
827 : デフォルトの名無しさん[sage] 投稿日:2014/05/23(金) 11:24:51.58 ID:fRyU8CgY
>>821,824
Lisp的に書くなら関数内で局所関数を定義すると思う
(defun member* (x lst)
(labels ((iter (lst cnt)
(cond ((null lst) 0)
((eq (car lst) x) cnt)
(t (iter (cdr lst) (1+ cnt))))))
(iter lst 1)))
Schemeの名前付きletを移植するとか (Let over Lambdaより)
(defmacro nlet (n letargs &rest body)
`(labels ((,n ,(mapcar #'car letargs)
,@body))
(,n ,@(mapcar #'cadr letargs))))
(defun member* (x lst)
(nlet iter ((lst lst) (cnt 1))
(cond ((null lst) 0)
((eq (car lst) x) cnt)
(t (iter (cdr lst) (1+ cnt))))))
825:6/6
14/05/24 01:55:42.59 78dmexXG
828 : デフォルトの名無しさん[sage] 投稿日:2014/05/23(金) 11:33:16.96 ID:C0KuPecL
>>827
たびたびサンクスです
どうも有り難う
829 : デフォルトの名無しさん[] 投稿日:2014/05/23(金) 11:46:22.83 ID:/J+wV7gv
できるだけ無駄をはぶきたくてライブラリ解読して、書き換えて自前のライブラリつくっていってるんだが、usocketの内部をだれか解説してけろ。
830 : デフォルトの名無しさん[sage] 投稿日:2014/05/23(金) 12:54:38.32 ID:3Eda7qDb
usocket-0.6.1/backend/使ってる実装.lispを参考にしてください。
"U"niversal部分はいらないだろうから。
826:デフォルトの名無しさん
14/05/24 08:21:03.00 DTqC/a46
ログが失われるほどの鯖落ちなのに
誰も騒がないところを見ると
本当にもう2ちゃんには人居ないんだな
827:デフォルトの名無しさん
14/05/24 16:21:26.68 rBEx7EtV
>>820-825
㌧
828:デフォルトの名無しさん
14/05/29 01:43:29.39 Qf2MT9JX
quicklispのインストールに失敗するので質問します
sbclのwindows fork(32bit)をgnupack12.03のhomeディレクトリ直下に置いて使っています
URLリンク(github.com)
11 MiB ~ sbcl-ci-exe-1.1.4.0.mswin.1288-90ab477-x86.zip: Stand-alone executable for 32-bit Windows (ia32)
OSSはアルミニウムの翼で飛ぶ: gnupack devel 12.03 非公式アップデート
URLリンク(aikotobaha.blogspot.jp)
です
逆引きCommon Lisp: Quicklispを使う
URLリンク(tips.lisp-users.org)
のとおりに入力すると
CL-USER(1): (load "./quicklisp.lisp")
CL-USER(2): (quicklisp-quickstart:install)
CL-USER(3): (ql:add-to-init-file)
debugger invoked on a SB-INT:SIMPLE-READER-PACKAGE-ERROR in thread
#<THREAD "main thread" RUNNING {24238849}>:
(ql:add-to-init-file)で止まります
./sbclrcはあらかじめ作成してあります(ただし空)
何か追加で設定しなければならないのでしょうか
829:デフォルトの名無しさん
14/05/31 20:17:59.71 68RLDo7O
>>828
Windowsでやるなら Clozure CL のがトラブルなくていいと思うよ。
と、アドバイスしつつ、エラーが断片的すぎてよくわからんゾ、といいたい。
830:デフォルトの名無しさん
14/06/02 14:21:49.03 Q2JN1vdj
readやread-charで引数にrecursive-pが真だと
再帰的に呼びだされるって説明があるけどいまいちよく分からない
readでrecursive-pがtだとreadの中でreadが呼びだされてnilだと呼びだされない?
それだとread-charもそうなのかな
ググっても例が見つからないし困った
831:デフォルトの名無しさん
14/06/02 15:38:30.88 H3ihprqs
>>830
URLリンク(www.mat.uc.pt)
リーダーマクロ関数からの呼び出しをもっぱら想定しているみたい。
832:デフォルトの名無しさん
14/06/02 17:26:57.64 Q2JN1vdj
>>831
英語苦手だしよくわからないよ
(set-macro-character #\@
(lambda (stream char)
(list 'quote (read stream))))
で
@(1 2 @(4 5 6))
としたら
(1 2 '(4 5 6))
となるし再帰的に処理されてるんだけどなあ
でも
@(#3=(1 2) @(#3#))
とかだと#3#が無いと怒られるしこれが再帰的に呼ばれないってことなのかな
833:831
14/06/02 22:02:17.48 H3ihprqs
>>832
じゃあこちらで。
URLリンク(g000001.cddddr.org)
834:デフォルトの名無しさん
14/06/02 22:20:10.83 hdza40A5
>>833
ありがとう
結局処理系によって動作が微妙に違って有耶無耶になってるね
835:デフォルトの名無しさん
14/06/02 23:28:47.81 Evci24oh
>>830
内部で再帰的に呼び出すかどうかを呼び出し側で制御するための引数じゃないよ。
この呼び出しはトップレベルでの呼び出しではないう意味のフラグ。
内部処理でこのフラグを使う。
set-macro-character等で定義したコード内でも同様。
分かりにくい名前だけど。
preserving_whitespaceのケースが分かりやすい。
836:デフォルトの名無しさん
14/06/02 23:43:50.79 hdza40A5
ああずっと勘違いしてたのか
readに再起されてることを教えるためにrecursive-pをtにするのか
すっきりした
837:837
14/06/03 00:08:51.38 cDJn8bWQ
read macroのようにシステムの振る舞いを変える特殊な機構がなければ、
こんなものはプログラマーに見せる必要はないのだ。
逆に言うと、CL使う時はプログラマがいつも言語屋に近いことをやらされるというか、
出来るということを想定してないと意味が分かりにくいものが結構ある。
だからCLの本はマニアックなものが多い。言語屋思考が前面に出てる。
838:デフォルトの名無しさん
14/06/03 00:30:35.72 Mp2Ed1vv
インスタンスとletによる束縛の範囲が良くわからないのです。
(defclass foo ()
((a :accessor foo-a)))
(defvar *bar* (make-instance 'foo))
(let ((obj *bar*))
(setf (foo-a obj) 1))
(foo-a *bar*)
=> 1
このとき、obj は let の中で操作されてるのに、何で外側の実態まで変わっちゃうんでしょう??
いっぽうで、
(let ((a (foo-a *test*)))
(setf a 2)
a)
=>2
(foo-a *bar*)
=>1
このときはちゃんとlet内でのみ束縛されてるみたいです。
839:837
14/06/03 10:40:12.45 uQjrLyNg
Common Lispに限らないかなり初歩的なことを理解できてないので、
プログラミング入門的な本から始めることをオススメします。
ヒープオブジェクト、バインディング、ポインター辺りのキーワードから。
(setf (foo-a obj) 1)はオブジェクトの破壊的変更ですが、
(setf a 2)はバインディングを変更しただけです。
840:はちみつ餃子 ◆8X2XSCHEME
14/06/03 15:10:40.12 hEzMKve3
C++ で書いたらこんな感じかな。
#include <iostream>
class foo {
private:
int a;
public:
int& foo_a(void);
};
int& foo::foo_a(void) {
return a;
}
foo bar;
int main(void) {
foo& obj = bar;
obj.foo_a() = 1;
std::cout << bar.foo_a() << std::endl;
return 0;
}