したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | |
レス数が900を超えています。1000を超えると投稿できなくなるよ。

ヒッキープログラミングスレ 2

1(-_-)さん:2013/06/20(木) 03:58:01 ID:???
プログラミングの話題のスレ

質問・相談
初心者からプロまで
プログラミングに関することなら何でもOK

ヒッキーのプログラミングするスレ
http://ikura.2ch.net/test/read.cgi/hikky/1362050172/

プログラミングできる奴、一緒にアプリ作ろうぜ!!
http://ikura.2ch.net/test/read.cgi/hikky/1360671157/

ヒキ板情報技術部
http://ikura.2ch.net/test/read.cgi/hikky/1348106094/



前スレ
ヒッキープログラミングスレ
http://jbbs.livedoor.jp/bbs/read.cgi/internet/17286/1361821799/

68(-_-)さん:2013/06/23(日) 18:43:16 ID:???
今気づいた>>58の通りに作ると変数はバインドされてるとこを書き換えるという設計になるな、
今の俺の純lispだとlabelの仕様はカレントスコープへの書き込みだからちょっと違うことになるな
IBM704がどうだろうとチューリング完全にするなら仕様と同じ動作せにゃならんから
どっちかを変えるかだな・・・・labelのほうの仕様を変えるか

69(-_-)さん:2013/06/23(日) 18:44:31 ID:???
そうだな、Wikipediaの動的スコープのページの感じで考えるなら動的スコープならバインド変数を書き換えるのが妥当だよな

70(-_-)さん:2013/06/23(日) 18:46:46 ID:???
labelの仕様をカレントスコープへの変数設置から
バインドがあればバインドの変更、無ければカレントに新規、という感じが良さそうか?
でも待てよ、それだと再帰関数とか作って内部でlabelとか使うと再帰先でどんどん値を変更されることになるのか・・・

71(-_-)さん:2013/06/23(日) 18:52:05 ID:???
wikipediaの動的スコープの説明
>このとき参照されるのは、親子関係を親側に辿り、より近いブロックにある変数である
を考えると、必ずしもバインド先を書き換えるというわけではなさそうだな、
同名変数がいくつもあっても一番近いところのを参照するということはブロック形成時に同名変数を作れるという意味だし
labelでの設定はバインドじゃなくカレントスコープで良さそうだな、となると>>58の設計のほうを考えなおすべきなのか・・・

72(-_-)さん:2013/06/23(日) 18:54:55 ID:???
変数リストにスコープの区切りになる目印的なものを入れて
getvarは目印を超えて変数を検索取得できて
findvarは目印を超えて変数を検索できないようにすればよさそうかな

73(-_-)さん:2013/06/23(日) 19:00:06 ID:???
そうだな目印としてシンボルTを挟むとか
((abc . x) (efg . y) (qwer . z) T (hoge . x) (unko . y) T ((args)))
とかすれば出来そうかな
論文のほうはどうしてんだろ、もしかしてIBM704はバインド変数を変えるのだろうか

74(-_-)さん:2013/06/23(日) 19:06:34 ID:???
さて、どうあがいても論文を読まなきゃ先にすすめない展開になってきたぞ・・・どうする俺

75(-_-)さん:2013/06/23(日) 19:07:33 ID:???
今気づいたが>>66のやり方はバインド変数の書き換えじゃないと成り立たない考え方だったな・・・ナンテコッタイ

76(-_-)さん:2013/06/23(日) 19:09:06 ID:???
論文のほうが>>66みたいなやりかたをしないのはlabelがバインド変数を書き換えないからか
逆にバインド変数を書き換えてしまうならevalを実行する前に同名変数がたまたま使われてたらヤバイわけだし
なーるほどねえ・・・

77(-_-)さん:2013/06/23(日) 20:19:39 ID:???
思ったが何も論文みたいにevalを再帰させて実現する必要もないんだよな
evalが玄関口であればいいだけで実際に処理するのは別関数を作ってそれにやらせてもいいんだろうな
もう一度再設計してみっか・・・

78(-_-)さん:2013/06/23(日) 20:26:17 ID:???
論文のeval書いてるページしか見てなかったけどあとのページとかザッと見てみたらIBM704の仕様とかについても触れてるくさかった
36bitのリスト構造だとかそんな感じの、ただそれらのページは本当文章だらけだから、読む気しねえ・・・

79(-_-)さん:2013/06/23(日) 20:31:12 ID:???
evalを入口にして
名前を適当にexecとでもするか、戻り値として変数リストと実行結果をまとめたリストにするとかして
変数リストと合わせてexecを再帰的に実行とか、で行けそうかな
論文のやつよりはバカにデカいコードに仕上がりそうだけど、その方向性でやってみるか
純LISPの仕様も論文に合わせる必要はなく、チューリング完全を証明するためなんだから
再現できそうな仕様にすればいいんだよな

80(-_-)さん:2013/06/23(日) 20:34:46 ID:???
evalで再現されるのは同仕様の一行LISPマシンのeval実行実行側とは別マシンということにすれば
eval実行側で設定されてる変数等はアクセスできなくても当然なわけだし
eval実行側から見れば別マシンであり見かけ上の静的スコープな呼び出しとlispコード実行ってことになるけど

81(-_-)さん:2013/06/23(日) 20:38:57 ID:???
オーケー、指針は固まった、変数の保持方法は論文からヒントは得られたし、もう一度ゼロから設計しなおすぞ!おー!

82(-_-)さん:2013/06/23(日) 20:41:01 ID:???
まー、ひとまず最初のステップとして純LISPの仕様をちゃんと厳格に設定し固定することが大事だな・・・

83(-_-)さん:2013/06/23(日) 20:46:05 ID:???
何もIBM704に拘る必要は無かったんだな、近い仕様であればeval作るのが楽になるというだけで、
ただ問題はLAMBDAの仕様か、現状は戻り値に特別なデータ型(LAMBDA関数型)を定義してしまってるから
それだと再現性がなくなるから、純LISPのほうもLAMBDAは自身の本体を返すようにしたほうがいいのかな

84(-_-)さん:2013/06/23(日) 20:52:03 ID:???
でもそうなるとLAMBDA周りの作りが大幅に変更になるし
静的スコープと動的スコープでの互換性を残してるけど、それが邪魔になるなあ
今は静的スコープとしても使えるようにLAMBDA関数型というデータタイプを作ることで対応してるけど
そもそのままのlambdaリストを返すとなると、
((cons (quote lambda) (quote ((x y) (cons y x)))) (quote a) (quote b))
で(B . A)というlambda関数実行が行われちゃうことになるんだけど、どうなるんだコレ

85(-_-)さん:2013/06/23(日) 21:01:35 ID:???
評価対象のリストが来たら
先頭の要素がアトムなら
 変数として置き換えののち (システム関数や特殊形式は (LABEL ATOM (QUOTE ATOM)) みたいな自己参照変数とすればいいわけで)
 それがアトムなら
  対応する関数か特殊形式があるかをひととおりチェックし
 それがリストならLAMBDA関数リストかチェックする、
先頭要素がリストならLAMBDA関数リストかチェックする

とまあこんな仕様に作りなおすなら今回作った純LISPの大半を作り直さなきゃならんか・・・

86(-_-)さん:2013/06/23(日) 21:07:44 ID:???
リストの先頭要素がアトムなら変数の置き換えを許容するなら
リストの先頭がリストならやはり評価後でなけりゃ矛盾するか

評価すべきリストの
先頭要素の評価後が
システム関数や特殊形式を表すアトムかLAMBDAで始まるリストかってことにすりゃいいのか
なるほど、なるほどね、先頭要素がLAMBDAのリストはそのまま返すだけんだからも無いないわけだし

こりゃ純LISPの丸々作り直しが必要になるわ・・・はぁ・・・

87(-_-)さん:2013/06/23(日) 21:12:23 ID:???
まぁそんな難しい変更でもないし、また1週間くらいはかかるかな・・・

88(-_-)さん:2013/06/23(日) 21:32:55 ID:???
今書いたことを考えると先日までとりかかってた俺製純LISPはLISPとしてはあまりよろしくない実装だったのかもしれないな

89(-_-)さん:2013/06/23(日) 21:34:31 ID:???
lisp8.jsへの編集を放棄して新しいファイルで作成するか

90(-_-)さん:2013/06/23(日) 22:33:36 ID:???
lisp8.js(v1.2.1)はそのまま完成型へ持っていく、また純LISPにならないので名前を正式にminimal-lispに変更し、目標の拡張方向であった数値や文字列を扱う機能を付与させていく
lisp8.js(v1.2.1)から派生させて新定義版純LISP(lisp13.js)を作る
新定義版lisp13.jsは完全動的スコープでチューリング完全性をテストすることのみに特化した仕様に作り変える

91(-_-)さん:2013/06/23(日) 22:36:15 ID:???
またlisp8.jsの拡張の正確な方向性はまだ決まってないので今後考えることにする
(方向性とはCommon LispやEmacs Lisp や SchemeなどのどのLisp方言に合わせるか、または独自lisp方言に仕上げるか、というもの)

92(-_-)さん:2013/06/23(日) 22:38:14 ID:???
"minimal lisp"でググったら当然ながら先に誰かが仕様してるようなので名称はまた後日に改めて考えることにする

93(-_-)さん:2013/06/23(日) 22:46:03 ID:???
俺はやったるぞおおおおおおおおおおおお!!!!!!

94(-_-)さん:2013/06/24(月) 00:20:01 ID:???
もうレス読むの疲れたし技量的にもアドバイス出来ないけど頑張れ
自分は今Lispで書く方に力を入れてる

95(-_-)さん:2013/06/24(月) 03:38:24 ID:???
ごめんね、メモ的なこともここに書いちゃって・・・

96(-_-)さん:2013/06/24(月) 14:23:51 ID:???
新しく定義しなおした純LISP、意外にもほんのちょこっと修正するだけでなんとかなった・・・よかった
あとはevalを考えるは

97(-_-)さん:2013/06/24(月) 14:26:47 ID:???
新しく定義した純LISPだと
((cons (quote lambda) (quote ((x y) (cons y x)))) (quote a) (quote b))
でも動く
前バージョンのだとこれだと動作しない
この式に関する一般のLISPの挙動は不明だけどね
動作したほうがいいんなら前のバージョンも修正が必要なわけだが

98(-_-)さん:2013/06/24(月) 14:30:32 ID:???
もちろん新定義ではこれでも動く
((quote (lambda (x y) (cons x y))) (quote ABC) (quote XYZ))

99(-_-)さん:2013/06/24(月) 14:42:11 ID:???
新定義版だと
(label F (lambda (e a) ((cons 'LAMBDA (cons '() (cons (cons e a) ()))))))

(F 'CONS '('X 'Y))
(F 'EQ '('ABC 'ABC))
(F 'CAR '('(A B C)))
(F 'CDR '('(A B C)))
(F 'ATOM '('XYZ))
(F 'COND '(((EQ 'A 'B) 'HOGE) ('T 'UNKO)))
(F 'COND '(((EQ 'A 'A) 'HOGE) ('T 'UNKO)))
(F 'QUOTE '((A B C D)))
(F 'LABEL '(V '(X Y Z))) ; Fのスコープ内でのみVが定義される
(F 'LAMBDA '(() 'HOGE)) ; 定義のみ
((F 'LAMBDA '(() 'HOGE))) ; 実行

で簡易eval的な挙動もできてしまう・・・いいのかこの定義で・・・?

100(-_-)さん:2013/06/24(月) 14:45:18 ID:???
(F '(LAMBDA (X Y) (cons (cons X X) Y)) '('ABC 'XYZ))

アカン、Fがevalになってもうた

101(-_-)さん:2013/06/24(月) 15:03:15 ID:???
(label F (lambda (e a) ((cons 'LAMBDA (cons '() (cons (cons e a) ()))))))
(F
'(label subst (lambda (x y z) (cond ((atom z) (cond ((eq y z) x) ((quote t) z))) ((quote t) (cons (subst x y (car z)) (subst x y (cdr z)))))))
'((quote (X Y)) (quote B) (quote (A (B C) A B C)))
)
アカンでえ・・・これはチューリング完全と言えるのか・・・?evalを内包してるだけな感じ・・・?

102(-_-)さん:2013/06/24(月) 15:05:15 ID:???
evalを実装してるようなもんだから、これは何か違うで・・・

103(-_-)さん:2013/06/24(月) 15:07:44 ID:???
これはLAMBDAが万能すぎる関数にしすぎたんや・・・
純LISPを試す環境としては設計ミスや・・・lambdaとlabelとconsだけで全部やらかしてっぞ・・・・

104(-_-)さん:2013/06/24(月) 15:10:08 ID:???
所謂実装がもともと持ってるeval関数にそのまま引数を渡して実行してもらったみたいな処理だからアカンのか

105(-_-)さん:2013/06/24(月) 15:13:45 ID:???
まぁでもやろうと思えば論文みたいなコツコツevalも作れるだろうし、これでOKでいいか・・・な?

106(-_-)さん:2013/06/25(火) 12:12:24 ID:???
プログラミングコード貼り付けスレ part1
http://jbbs.livedoor.jp/bbs/read.cgi/internet/13109/1370769621/

107(-_-)さん:2013/06/25(火) 14:20:08 ID:???
眠い

108(-_-)さん:2013/06/25(火) 21:38:08 ID:???
eval作るのあともうちょっとでできそう
やってみて思ったのが
今回JavaScriptで純LISPを作ったけど
今度は純LISPで純LISPを作るって感じなんだね・・・
evalというのをなんだか難しく考えすぎてたようだよ・・・

109(-_-)さん:2013/06/25(火) 21:43:13 ID:???
JavaScriptで純LISP作ったのと同じ要領で純LISPで純LISPを作ればいいんだって今日eval考えてて気づいた
あとちょっとで出来ると思う
今んとこlambda関数の実行以外は何とか出来上がった
JavaScriptで純LISPを作るのと同じ要領で作ってるので
エラートラップがバカに多いのと、ちょいと設計が悪くて
エラートラップの真逆の条件処理で処理を進めたほうが有利な部分が多々でてきちゃった・・・
でも逆にすると、このテキストエディタだと可読性が落ちて修正とかしにくくなるから、今んとこ放置だけど
処理速度に問題があったときに見直そうと思う
とにかくエラートラップ大杉

110(-_-)さん:2013/06/26(水) 00:25:31 ID:???
おっしゃ!めっさ遅いくてめっさ重いがevalが出来たぞ!

111(-_-)さん:2013/06/26(水) 00:27:50 ID:???
軽くするには過剰なまでのエラートラップを排除すらいいんだけだが
どのくらい軽くなるのかまでは分からんな

112(-_-)さん:2013/06/26(水) 01:15:54 ID:???
一応自分で作れたことに感動だわ・・・すげえ感動

113(-_-)さん:2013/06/26(水) 02:41:36 ID:???
エラートラップをかなり削ったけど
まだ重いや
あとはlambda関数オーバーヘッドを減らすくらいか

114(-_-)さん:2013/06/26(水) 03:06:33 ID:???
ほんの少しだけ軽量になった・・・もうこれ以上は無理ぽ

115(-_-)さん:2013/06/26(水) 03:47:52 ID:???
軽量化でおよそ2倍くらいの実行速度にはなったが、やはり重い

116(-_-)さん:2013/06/26(水) 04:01:24 ID:???
しかし、このevalは一行LISPだから
このeval内でevalを作るってのは無理そうだなあ
糞重そうだけどw

117(-_-)さん:2013/06/26(水) 04:38:34 ID:???
純LISP (JunLISP)
http://www.geocities.jp/takeiteasy_idontthinkso/mysoft/js_minimal_lisp/index.html

もうこれで一応の完成ってことでいいよね・・・色々と疲れた

118(-_-)さん:2013/06/26(水) 12:34:03 ID:???
eval上でeval実現させてみた
programという関数新たに追加して

最初にlisp15.txtの内容を走らせてから

(program (quote (

;;ここにlisp15.txtの内容コピペして

)) (quote NIL))

これを実行させたら時間かかったけど
ちゃんとテストコードのSUBSTが実行された

チューリング完全を確認でけたよ・・・

119(-_-)さん:2013/06/26(水) 12:35:20 ID:???
まぁ実際はeval上っていうか実行実体であるexec関数上だけどね

120(-_-)さん:2013/06/26(水) 12:37:10 ID:???
チューリング完全のテスト、なんだかデジャヴを感じるんだよね・・・なんでだろ?

121(-_-)さん:2013/06/26(水) 15:02:29 ID:???
lisp8.js lisp13.jsで共通のバカミスを発見した・・・orz
期待動作が同じ動作をする関数を別名で定義して2つも使ってた・・・片方無駄定義・・・しかもすぐ隣で定義しているという・・・

122(-_-)さん:2013/06/26(水) 15:51:43 ID:???
以前も再再現テストみたいなことをしたような記憶がある・・・
でも、まともなプログラミング言語的なものを作ったのは今回が初のはずだし・・・
何なんだろう、この既視感は。
覚えてないだけで以前に他の何らかの言語でこういうことをしたのかなeval上eval
それとも誰かがそれをしたという報告をネット上とかでしててをそれを読んだとかか?

123(-_-)さん:2013/06/26(水) 16:20:49 ID:???
いくつかLISPを説明してるサイト見てみたけど
lisp8.jsを元に拡張するのは難しそう
根本設計が違うわ

124(-_-)さん:2013/06/26(水) 16:28:51 ID:???
マクロとかも難易度高そうだし、逆クオートって何だよ逆クオートってさ、どう見ても作るの難しすぎだんろ
あとprintとかの出力系とかもそうだし、

125(-_-)さん:2013/06/26(水) 16:35:29 ID:???
マクロとはこんな感じかな

(defmacro hoge (x y) (list 'cons 'x 'y))
(hoge 'a 'b)

↓ 引数のxとyを展開

(list 'cons ''a ''b)

↓ これを実行

(cons 'a 'b)

↓ これを実行

(a . b)

126(-_-)さん:2013/06/26(水) 16:48:43 ID:???
ようは
(subst ''a 'x '(list 'cons 'x 'y))

127(-_-)さん:2013/06/26(水) 16:49:54 ID:???
途中送信しちゃった
(defmacro hoge (x y) (list 'cons 'x 'y))
(hoge 'a 'b)

(eval (eval (subst ''b 'y (subst ''a 'x '(list 'cons 'x 'y))))

ってこととかな

128(-_-)さん:2013/06/26(水) 16:59:35 ID:???
あ、でも引数を評価なしで処理するのか

129(-_-)さん:2013/06/26(水) 17:07:53 ID:???
関数を使っての実現じゃ無理そう
マクロ用の処理を入れないとアカンか・・・

130(-_-)さん:2013/06/26(水) 17:13:57 ID:???
マクロ以前に数値や文字列を扱えるようにせんとな・・・
つか純LISPの最小機能しか揃ってない超小規模なやつでも作るのにどんだけ時間かけたんだ・・・
このLISPを拡張していくとなると何年かかるか分からんな・・・

131(-_-)さん:2013/06/26(水) 17:22:48 ID:???
ひとまず機能が増えたら修正しにくくなってしまうような部分を
この小規模LISPの状態で徹底に直していかないとな・・・スケールがでかくなって何が何やら分からんじゃ困るしな・・・

132(-_-)さん:2013/06/26(水) 17:33:31 ID:???
おそろしいことが分かった
returnとかlambda関数とかのブロックを抜ける命令とかあんのかよ・・・そんなもん想定して作ってなかったわ・・・
他にもジャンプ命令くさいのあるし、これは丸ごと作り直さないとどうにもならん・・・
lisp8.jsの拡張とか夢のまた夢だったか・・・orz

133(-_-)さん:2013/06/26(水) 17:39:29 ID:???
> 938 名前:(-_-)さん[sage] 投稿日:2013/06/19(水) 17:43:40 ID:???
> 実際に作ったlispでプログラミングしてるとちょくちょくバグが出てきてやな感じ
>
> >>937
> 両方使おうとしてるのか
> じゃあdefvarを使えるようにしないとダメだな


今更ながらにこのレスの意味を理解した、
Wikipediaの静的スコープを読んでたら、Common Lispは静的スコープと動的スコープを同時に実現できるという記述に今更ながら気づいた・・・

134(-_-)さん:2013/06/26(水) 17:40:27 ID:???
Common Lispは静的スコープ固定だと勘違いしてたのと
静的スコープに対する勘違いもあることに気づいた・・・・・

135(-_-)さん:2013/06/26(水) 17:42:02 ID:???
まだスコープの勘違いがあったとは・・・自分の愚かさに情けないと思うよ・・・うう・・・
>>117の純LISPは完成はしてないってことだな・・・静的スコープの実装ミスが解消されてないんだから・・・

136(-_-)さん:2013/06/26(水) 17:44:43 ID:???
まさかCommon Lispが静的と動的を共存させてたなんて・・・
動的スコープの説明のとこで動的スコープ使うのは古典LISPだけだと勝手に思ってたわ・・・

137(-_-)さん:2013/06/26(水) 17:45:31 ID:???
もう一つ思い至ったが
よくよく考えたら>>117は動的スコープに設定してあるから静的スコープの設計ミスは一応は影響無かったわ

138(-_-)さん:2013/06/26(水) 17:46:35 ID:???
プロセッサ全体を動的スコープにするか静的スコープにするかの切り替え機能を入れてるだけだから
Common Lispとはまた違うわな

139(-_-)さん:2013/06/26(水) 17:48:29 ID:???
defvarで宣言した変数は、宣言したその変数だけ動的スコープな振る舞いをするのな・・・異なるスコープ概念の共存とかプログラマは混乱したりいないのか・・・

140(-_-)さん:2013/06/26(水) 17:50:27 ID:???
あきらかにWikipediaの静的スコープのところを読み間違えてたというか勘違いしてたというか、本当恥ずかしいわ・・・ああ・・・俺ってばセンスのかけらもないって感じ・・・うう・・・

141(-_-)さん:2013/06/26(水) 17:51:33 ID:???
何事においても理解力が悪すぎる・・・
理解力の悪さは本当致命的だわ・・・

142(-_-)さん:2013/06/26(水) 17:54:55 ID:???
静的と動的の共存とか考えただけで混乱してくるわ、ってことは俺の理解がまだ足りないから混乱するってことだよな・・・Common Lisp使いはすげえわ・・・

143(-_-)さん:2013/06/26(水) 17:55:35 ID:???
もし俺がCommon Lispなんかでプログラム組んだらバグだらけの最悪のコードに仕上がりそう・・・

144(-_-)さん:2013/06/26(水) 18:05:34 ID:???
現在実装したlambdaの処理で考えると
(A)動的スコープの変数コンテナ
(B)静的スコープの変数コンテナ
(C)lambda関数で作られたスコープの変数コンテナ
の3種を作って

変数への参照が発生した場合は
(C) → (A) → (B) の順番で変数の有無をチェックする

そのlambda関数内で別のlambda関数を呼び出したときのスコープの変化は・・・
(A)と(C)は親子関係になって子である(C)が新たな(A)となり
(B)はそのlambda関数が捕らえてるスコープの変数コンテナに置き換わって
(C)は新たに変数コンテナが生成される

という具合か

145(-_-)さん:2013/06/26(水) 18:18:37 ID:???
じゃあlambda関数宣言時のクロージャはどのスコープを捕縛すればいいのか
変数単位で捕縛を決めるとなると
lambda関数宣言時にlambda関数のボディ部を精査する必要があるが、ボディ部内で宣言される変数とかも考慮しないといけないし、それは面倒
となると現在のスコープの変数コンテナを捕縛する必要があるが
ボディ内で宣言されている静的スコープの変数は(C)と(B)を辿るわけだが
うーむ、親子関係で父と母がいるみたいに親が2人いるという関係を作ればいいのか?
(C)は(A)とも親子関係だが(B)とも親子関係、なので変数探索は(C)を通して行えばいいという感じか
じゃあ現在のスコープである(C)をlambdaが捕縛したとして
変数検索はどうするんだ・・・?
スコープを抜けるたびに(C)と(A)が親子関係を切っていけばいいのかな
(B)としてロードされたとき(B)は静的な親とは親子関係を継続してるから探索ルートとして有効で
動的な親とは親子関係を切ってるからそちらからの探索はできない、

146(-_-)さん:2013/06/26(水) 18:23:24 ID:???
それとも
existDynamicVaialbe(name)
existLexicalVaiable(name)
という二つのメソッドでも作るか?そのほうがいいか
入口の(C)はexistVariable(name)でメソッドで
(C)が動的親(A)にexistDynamicVariable(name)で問い合わせをして、自身になければそのさらに上の動的親にexistDynamicVariable(name)で再帰的に問い合わせ続けてグローバルまで
静的親(B)にexistLexicalVariabel(name)で問い合わせをして、自身になければさらにその上の静的親にexistLexicalVariable(name)で再帰的に問い合わせ続けてグローバルまで
をすればいいのかな

なんか違うな

147(-_-)さん:2013/06/26(水) 18:27:03 ID:???
ひとまず2度探索することになるから
C.existVariable(name) としたならまず自身の現在スコープ内で変数検索をかけて
DynamicVariables.existName(name) とか動的スコープ変数の名前をリストから問い合わせて
あれば動的親にexistDynamicVariable(name)、無ければ静的親にexistLexicalVariable(name)で問い合わせる
という感じかな・・・?

148(-_-)さん:2013/06/26(水) 18:34:44 ID:???
(C)の現在スコープ内で
lambda関数の宣言が入ったら、(C)はlambda関数呼び出し時に親になる契約をするという感じか
また別のlambda関数の呼び出しが入った場合は(C)はそのタイミングで(C)自身は次の動的親になり、関数から抜けたら子が親を切る
ネストはどうする?
ネストに入ると(C)はそのネストの動的親子・静的親子関係を結ぶけど、ネストから抜けたら動的親子だけ関係を切るという感じか

親子関係は常に子が親を識別する関係で、親側が子を把握するわけではない、
親は子が何人いるかは不明、子からすれば親の人数は動的親と静的親の2人いることになり、
動的親とはすぐに関係を切る、静的親の方はご先祖さまで把握できる、ということか

149(-_-)さん:2013/06/26(水) 18:40:55 ID:???
動的親は常に新しいスコープ直前のスコープと親子関係を結び
静的親はネストか関数かで親の取り方が異なり、ネストなら直前のスコープ、関数なら関数が捕縛するスコープ

150(-_-)さん:2013/06/26(水) 18:43:55 ID:???
そして親なしのスコープはグローバルスコープさんだけ
他はグローバルスコープさんをご先祖様に持つ静的親が常に存在し
グローバルスコープさんをご先祖様に持つ動的親が自身の活動中だけいる

うーむ、うまくまとまらんな

151(-_-)さん:2013/06/26(水) 18:47:18 ID:???
ひとまずCommon Lispのスコープを真似るとしたらこんな感じか

152(-_-)さん:2013/06/26(水) 19:02:07 ID:???

リスト 動的変数名一覧 = new リスト();
スタック 現在のスコープ保持 = new スタック();
変数コンテナ グローバルスコープ = new 変数コンテナ();
変数コンテナ 現在のスコープ = グローバルスコープ;

class 変数コンテナ {
リスト 変数リスト = new リスト();
変数コンテナ 静的親 = null;
変数コンテナ 動的親 = null;
method get(変数名) {
if (変数リスト.exist(変数名)) {
return 変数リスト.get(変数名);
} else if (動的変数名一覧.exist(変数名)) {
return 動的親.get(変数名);
} else {
return 静的親.get(変数名);
}
}
}

method intoNestScope() {
現在のスコープ保持.push(現在のスコープ);
変数コンテナ 新しいスコープ = new 変数コンテナ();
新しいスコープ.静的親 = 現在のスコープ;
新しいスコープ.動的親 = 現在のスコープ;
現在のスコープ = 新しいスコープ
}

method intoFunctionScope(関数) {
現在のスコープ保持.push(現在のスコープ);
変数コンテナ 新しいスコープ = new 変数コンテナ();
新しいスコープ.静的親 = 関数.捕縛スコープ;
新しいスコープ.動的親 = 現在のスコープ
現在のスコープ = 新しいスコープ;
}

mothod outofNestScope() {
現在のスコープ.動的親 = null;
現在のスコープ = 現在のスコープ保持.pop();
}

method outofFunctionScope() {
現在のスコープ.動的親 = null;
現在のスコープ = 現在のスコープ保持.pop();
}


イメージ的にはこんな感じか?

153(-_-)さん:2013/06/26(水) 19:03:30 ID:???
インデントが死んでた


リスト 動的変数名一覧 = new リスト();
スタック 現在のスコープ保持 = new スタック();
変数コンテナ グローバルスコープ = new 変数コンテナ();
変数コンテナ 現在のスコープ = グローバルスコープ;

class 変数コンテナ {
 リスト 変数リスト = new リスト();
 変数コンテナ 静的親 = null;
 変数コンテナ 動的親 = null;
 method get(変数名) {
  if (変数リスト.exist(変数名)) {
   return 変数リスト.get(変数名);
  } else if (動的変数名一覧.exist(変数名)) {
   return 動的親.get(変数名);
  } else {
   return 静的親.get(変数名);
  }
 }
}

method intoNestScope() {
 現在のスコープ保持.push(現在のスコープ);
 変数コンテナ 新しいスコープ = new 変数コンテナ();
 新しいスコープ.静的親 = 現在のスコープ;
 新しいスコープ.動的親 = 現在のスコープ;
 現在のスコープ = 新しいスコープ
}

method intoFunctionScope(関数) {
 現在のスコープ保持.push(現在のスコープ);
 変数コンテナ 新しいスコープ = new 変数コンテナ();
 新しいスコープ.静的親 = 関数.捕縛スコープ;
 新しいスコープ.動的親 = 現在のスコープ
 現在のスコープ = 新しいスコープ;
}

mothod outofNestScope() {
 現在のスコープ.動的親 = null;
 現在のスコープ = 現在のスコープ保持.pop();
}

method outofFunctionScope() {
 現在のスコープ.動的親 = null;
 現在のスコープ = 現在のスコープ保持.pop();
}

154(-_-)さん:2013/06/26(水) 19:04:53 ID:???
あーこれだとグローバルスコープさんで変数を検索する際に ぬるぽ しますねえ

155(-_-)さん:2013/06/26(水) 19:07:25 ID:???
インデント入れても全角文字のコードは読みづらいな・・・日本語プログラミング言語が流行らないわけだわ

156(-_-)さん:2013/06/26(水) 19:13:18 ID:???
コンストラクタのオーバーロードを使えば
変数コンテナのnewのときに関数かネストかを区別できそう
あとはスコープ抜けたときのメソッドも変数コンテナ側につけて
グローバル位置に宣言してる一覧とかグローバルさんを変数コンテナclassのstaticなメンバとして使えばOKな感じか
まぁjavascriptでは無理だろうが

157(-_-)さん:2013/06/26(水) 22:05:26 ID:???
un

158(-_-)さん:2013/06/27(木) 01:02:54 ID:???
あるテキストデータのP文字目からQ文字目において

1byte半角がM種類で総文字数がU文字 (0 <= M <= 256, 0 <= U)
2byte全角がN種類で総文字数がV文字 (0 <= N <= 256, 0 <= V)

0 < (M + N) <= 256
0 < M ⇔ 0 < U
0 = M ⇔ 0 = U
0 < N ⇔ 0 < V
0 = N ⇔ 0 = V
0 < (U + V)

TABLE_SIZE := (M + N) + (M + (N * 2)) > 0
BYTE_SIZE := U + (V * 2) > 0

(BYTE_SIZE - V) + TABLE_SIZE < BYTE_SIZE
→ TABLE_SIZE < V
→ 1 < V / TABLE_SIZE

R := V / TABLE_SIZE

P文字目から数えてRを最大にするQ文字目を探す

159(-_-)さん:2013/06/27(木) 03:19:07 ID:???
The Java? Tutorials
http://docs.oracle.com/javase/tutorial/

JAVA覚えようぜ

160(-_-)さん:2013/06/27(木) 20:03:57 ID:???
ごめん「プログラミング言語を勉強する」という道は既に通ったんだ
新しい言語を覚えるときは既に知ってる知識との差分で済ませられるから3日もあれば出来るようになるし

161(-_-)さん:2013/06/28(金) 17:10:57 ID:???
規制されちった

162(-_-)さん:2013/06/28(金) 19:54:48 ID:???
てひひ

163(-_-)さん:2013/06/28(金) 22:14:15 ID:???
一般的に新聞や雑誌やコンテストに作品(文章や詩歌や絵や音楽やプログラム)を投稿したりするときって、
著作権の一部を新聞社や出版社や主催者側に移譲するなりの約束事項や契約みたいなもんあるじゃん
それで投稿・応募した作品を著作権者の自由にできないこと(自分で頒布や販売とか)多いじゃん、(ひこにゃんなんかいい例)
ideoneとかcodepadやsourceforgeとかgithubとかってそういう事項あったりしないの?

164(-_-)さん:2013/06/28(金) 22:27:28 ID:???
知らんがな
ggrks

165(-_-)さん:2013/06/28(金) 22:31:19 ID:???
避難所まで荒らす気か

166(-_-)さん:2013/06/29(土) 15:51:57 ID:???
コーディング規約って何だ?

167(-_-)さん:2013/06/29(土) 16:00:24 ID:???
分からない用語はググりましょう


新着レスの表示


名前: E-mail(省略可)

※書き込む際の注意事項はこちら

※画像アップローダーはこちら

(画像を表示できるのは「画像リンクのサムネイル表示」がオンの掲示板に限ります)

掲示板管理者へ連絡 無料レンタル掲示板