したらば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/

2(-_-)さん:2013/06/20(木) 04:00:54 ID:???
あとこれ、日本語フォルダ名の下に移動するとダメみたいね

3(-_-)さん:2013/06/20(木) 04:02:41 ID:???
>>1
関連スレこれ忘れてた

プログラミング雑談 2013 Ver4.00
http://ikura.2ch.net/test/read.cgi/hikky/1366742736/

4(-_-)さん:2013/06/20(木) 04:04:55 ID:???
しかしjarファイルの中身すごいファイル数だね・・・これは大変だわ作るの

5(-_-)さん:2013/06/20(木) 04:28:40 ID:???
うーん、reversi.lispをちゃんと動くようにするのはちょいと無理かなあ・・・どこをどうすればいいのかサッパリ
あと純lispの論文読んでても思ったけど閉じ括弧とかが読み書きの上で曲者だねlispって
pythonのタブインデントのブロックとは大逆的な可読性の悪さがあるように思う
ただ演算子の優先順位とか覚える必要ないから計算式を記述するならlispのほうが間違いのない計算式を再現できそうだけど

6(-_-)さん:2013/06/20(木) 04:38:49 ID:???
まぁタブインデントのブロックもあまりにもネストさせすぎると可読性が悪そうだが
タブサイズを2文字くらいだとブロックの区切りが微妙そうだし4文字だと超入れ子で読みにくそう
まぁPythonなんて書いたことも読んだことも無いから知らんけど

7(-_-)さん:2013/06/20(木) 04:42:07 ID:???
そういや純lispを直そうと思ってたのにすっかり忘れてたわ(笑)
また明日にするか、もう寝る寝る、おやすみ

8(-_-)さん:2013/06/20(木) 13:02:44 ID:???
lispの可読性に関してはemacsかそれに似たエディタを使えばほとんど解決するんだけどね

9(-_-)さん:2013/06/20(木) 13:11:46 ID:???
エディタ次第か

10(-_-)さん:2013/06/20(木) 13:12:26 ID:???
正直VB6のブロック構造のほうが可読性高いんじゃないかと思えてくる

11(-_-)さん:2013/06/20(木) 13:13:13 ID:???
ただVB6はIF文とかFOR文のブロック構造でスコープは発生しないけどね

12(-_-)さん:2013/06/20(木) 13:20:18 ID:???
動的スコープと静的スコープをなんとか作りあげた
ちょろっと変更するだけで足りたわ

(label x (quote 0)) (label a (lambda () x)) (label b (lambda () (cond ((label x (quote 1)) (a))))) (b) (a)
静的スコープに設定すると (b) => 0, (a) => 0
動的スコープに設定すると (b) => 1, (a) => 0
と昨日、改めて認識したとおりの結果になってホッとしたわ・・・
これでまた静的スコープやら動的スコープやらの認識間違いしてたらもう死にたいレベル・・・

13(-_-)さん:2013/06/20(木) 13:24:18 ID:???
最初の(label x (quote 0))を抜いた
(label a (lambda () x)) (label b (lambda () (cond ((label x (quote 1)) (a))))) (b) (a)
でHPにアップしてあるスコープを間違った作りの純LISPでテストした結果と
今手元にあるやつで動的・静的の両方でテストしたやつでやはり結果が違った、
間違ってた奴 (b) => 1, (a) => Error
直した奴:静的 (b) => Error, (a) => Error
直した奴:動的 (b) => 1, (a) => Error

14(-_-)さん:2013/06/20(木) 13:25:46 ID:???
こうしてみると一見動的スコープのように見えるのに最初に(label x (quote 0))を入れると
(label x (quote 0)) (label a (lambda () x)) (label b (lambda () (cond ((label x (quote 1)) (a))))) (b) (a)
間違ってた奴 (b) => 0, (a) => 0
直した奴:静的 (b) => 0, (a) => 0
直した奴:動的 (b) => 1, (a) => 0
と今度は静的スコープのように挙動するという・・・

15(-_-)さん:2013/06/20(木) 13:30:58 ID:???
今回の変数管理の作り直しで変数の設定方法を3種類に増やしたんだが
グローバルスコープへの変数設定、バインドされてるところへの上書き(バインドされてない場合の挙動3種)、カレントスコープへの変数設定
最初LABELの挙動をバインドされてる変数の上書きにしたらアカンかったわwスコープの確認にならなくってw
だからlabelの仕様はバインド無関係にカレントスコープへの書き込みにしたのだが

16(-_-)さん:2013/06/20(木) 13:31:43 ID:???
今レス書き込んでて気づいたが、bに引数でxを取るようにすれば解決したんじゃないかと思い始めたw

17(-_-)さん:2013/06/20(木) 13:33:13 ID:???
(label x (quote 0)) (label a (lambda () x)) (label b (lambda (x) (a))) (b (quote 1)) (a)
あんのジョーだった・・・orz

18(-_-)さん:2013/06/20(木) 13:37:01 ID:???
さて、問題はLABELの仕様をどうするかだな
戻り値を名前にするか設定値にするか、と
変数を設定する位置、常にグローバルへの書き込みか、カレントスコープへの書き込みか、バインドしてるスコープへの上書きか
バインドしてるスコープへの上書きでバインドされてない場合はグローバルとカレントのどちらのスコープへ新規に書き込むか
まぁ純LISPでなければそれぞれに特別式を定義してやればいいんだろうけどね

19(-_-)さん:2013/06/20(木) 13:40:00 ID:???
今回のテストコードの動作具合からして、常にカレントスコープへの変数設定のほうが良さそうかな
LABELの戻り値は変数名かな、現存のLISP系の実装はどれも名前返すみたいだし

20(-_-)さん:2013/06/20(木) 14:31:55 ID:???
labelの戻り値は値のほうが色々と応用が効きそう
setqは値を戻り値として返すんだけど
(while (< (setq i (+ i 1)) 10) ...)というコードかけるから結構便利だし

21(-_-)さん:2013/06/20(木) 14:32:37 ID:???
まあ関数を定義する特殊形式としてみたら名前を返すほうがいいかな

22Lilin:2013/06/20(木) 14:33:33 ID:HUnQu8lU
ん?一人か?
こっちのほうがまともそうだな。

23(-_-)さん:2013/06/20(木) 15:18:58 ID:???
>>20-21
よくよく考えたら、論文のほうはLABELは値を返すみたいだったし、やっぱりそのように変更するよ
アドバイスありがとう

24(-_-)さん:2013/06/20(木) 15:19:18 ID:???
>>22
Lilinは何か作ってるの?

25(-_-)さん:2013/06/20(木) 15:51:00 ID:???
Special Formを特別式と読んでるサイトで始めにLISPについて勉強したから
Wikipediaでは特殊形式と書いてあって、2種類の呼び方があるのかと思ってたけど
そのサイトだけの固有の呼び方ぽいね、これからはちゃんと特殊形式って呼ぶわ

26(-_-)さん:2013/06/20(木) 16:39:15 ID:orUJmIzs
lilin久しぶりに見たな
skypeはしてるの?

27(-_-)さん:2013/06/21(金) 17:13:49 ID:???
純LISPのソースを整形とかしてたら、色々と問題点があることに気づいた・・・しにたい・・・orz

28(-_-)さん:2013/06/21(金) 17:18:34 ID:???
あと名前付けの一貫性に欠ける・・・名前付け基準をせっていしないとダメかも・・・

29(-_-)さん:2013/06/21(金) 18:29:25 ID:???
OracleのJava7u25が来てるとのこと

30(-_-)さん:2013/06/21(金) 18:29:41 ID:???
誤爆

31(-_-)さん:2013/06/21(金) 19:51:38 ID:???
gitの全機能の1割も使ってない気がして
gitからsubversionに移行するものいいかなと考える今日この頃

32(-_-)さん:2013/06/21(金) 20:28:34 ID:???
公開の共同プロジェクトやってんのか

33(-_-)さん:2013/06/21(金) 20:33:12 ID:???
いや、個人で
だからpush,pullとか使わないしもっと低機能でわかりやすいのがいいかなと思った

34(-_-)さん:2013/06/21(金) 20:36:17 ID:???
共同開発って難しそうだな
仕様とかちゃんと事前に決めて
ここ俺作るからこの部分おまえ作ってみたいにちゃんと割り振らないといけないだろうし
設計がしっかりしてないとうまく動かなさそう

35(-_-)さん:2013/06/21(金) 20:36:48 ID:???
>>33
個人でも使えたのか、ああいうのって何がどう便利なの?

36(-_-)さん:2013/06/21(金) 20:57:18 ID:???
開発言語のコンパイラとかインタプリタとか配布してるサイトのデモやサンプルのコードやソースをちゃんと試したりしてるやついる?
あれってちゃんとひととおり見ればかなり能力アップしそう?

37(-_-)さん:2013/06/21(金) 21:17:01 ID:???
>>35
RPGのセーブ機能みたいなもの
それよりももっと便利で前回のデータとの差分を見たりセーブしたときにメッセージを書いて思い出しやすくできる

38(-_-)さん:2013/06/22(土) 00:07:07 ID:???
差分見られるのか
それは便利そうだな

39(-_-)さん:2013/06/22(土) 00:08:34 ID:???
自前でdiffとか作ってみたいとは思ったことあるが
原理が難しすぎて俺には無理だわ
そもdiffアプリなんて無料でそこらじゅうにあるわけだから
自前で作る必要もないっちゃないんだがな

40(-_-)さん:2013/06/22(土) 15:39:21 ID:???
(define a 'b)
(define f (lambda (x . y) (cons x y)))
としたとき
(f a a a . a) ってどういう結果になるの?リストの末尾がNILになってないからエラー?

41(-_-)さん:2013/06/22(土) 15:44:45 ID:???
(define a 'b)
(define f (lambda (x . y) (cons x y)))
としたとき
(f a a a . a)これは下のいずれかになると予想してんだけど、よく分からんちん
・エラー
・(B B B . B)
・(B A A . A)

42(-_-)さん:2013/06/22(土) 15:46:42 ID:???
仮引数にドットリストを渡すことがおかしいと思うの

43(-_-)さん:2013/06/22(土) 15:50:43 ID:???
なんか日本語がおかしかったな
仮引数の中にドットを入れること自体がおかしいと思う
gaucheだとエラーが出た

44(-_-)さん:2013/06/22(土) 16:19:26 ID:???
>>42-43
教えてくれてありがとう
どうやら仮引数のドットはScheme固有の書式のようだね
Common LispとEmacs Lispでは(x &rest y)と書くとのことなので改めて質問する
(define a 'b)
(define f (lambda (x &rest y) (cons x y)))
としたとき
(f a a a . a) ってどういう結果になる?

4544:2013/06/22(土) 16:32:40 ID:???
あ、答え自分で見つけられた、大丈夫、ありがとう

46(-_-)さん:2013/06/22(土) 16:34:44 ID:???
lispの勉強が足りなかった
consセル(ペア)とかいうのとリストは定義が別だということを今知った

47(-_-)さん:2013/06/22(土) 16:40:37 ID:???
最後がNILで終わるものだけが"リスト"として定義されるわけね、

48(-_-)さん:2013/06/22(土) 17:38:26 ID:???
俺は面倒だったから仮引数のドット以降は切り捨てたリストとして扱ってる
これエラー出したほうがいいんだな

49(-_-)さん:2013/06/22(土) 21:13:22 ID:???
lispコードを書いたときにうっかりミスで仮引数の指定を間違うことがありうるのなら必要かもね
でもlisp用のエディタというのを使うのなら間違いはそうそう起きないかもね
他の人たちに広く公開するのであれば確実に必要だろうけど

50(-_-)さん:2013/06/23(日) 05:52:29 ID:???
純LISPのバグ取りや修正や整形や手直しの傍ら
evalについても色々自分で考えながらやってんだけど
evalを自分で考えだすのはちょっと難易度高そうだわ
(cons (label a (cons (label b 'xx) (label c 'yy)) (cons (cons a b) c))
みたいなバカみたいなコードあったらどう処理すりゃいいのかとか
そもIBM704でlabelがトップレベルでしか使えない特殊形式だとかいう制限とかありゃ気にならんのだが
仕様は知らんしなあ・・・他の一般LISPとはだいぶ仕様がかけなれてそうだし
(なにせ普及LISP方言にLABELという同様動作をする関数名がないし・・・

51(-_-)さん:2013/06/23(日) 05:57:47 ID:???
>(なにせ普及LISP方言にLABELという同様動作をする関数名がないし・・・
日本語間違った
同様動作するLABELという名前の関数が存在しない、と言いたかった
まぁ普及LISP方言ではDEFINEという名前に変わってるらしいが
方言というくらいに仕様がまちまちすぎるのもやっかいだ
SchemeとCommonLispとEmacsLispでそれぞれ仕様違うし・・・
本当やっかいだわ,
まぁLISPに限った話じゃないけどな
ECMAScriptだって実装によって違い大きいし
JScriptとJavaScriptでは違うしな・・・

自然言語でも日本語も英語とか方言だらけだしな
英語なんかイギリス英語とアメリカ英語で違うし、

人工言語と自然言語、方言のややこしさではどちらのほうが上だろうか

52(-_-)さん:2013/06/23(日) 05:59:13 ID:???
IBM704のLISPの仕様は論文をちゃんと読み込めば
eval再現するくらいなんだから仕様通りに再現してんだろうけど
(でなけりゃチューリング完全にならないやん)

53(-_-)さん:2013/06/23(日) 06:02:40 ID:???
でもやっぱ英語は理解の壁があるわ・・・
プログラミング言語も自然言語も
語彙力とかそういうのが根底に必要だわな・・・
アプリ作りたくても実現する機能に何のライブラリのどのクラスやメソッド使えばいいとか、それは所謂自然言語の語彙力とかそういうもんに相当すると思うわ
知らなきゃ使えないという
人が使ってるのをググって調べることは出来てもその人が使ってる部分しか知ることができないかもしれないしね

54(-_-)さん:2013/06/23(日) 06:08:22 ID:???
ひとまず、自分で最後までevalを考えてみるか
大した文章量あるわけじゃないから頑張って英語論文を読み解くか
どっちがいいだろうなあ・・・
効率や利益などを考えると後者のほうが圧倒的にお得なのは分かるんだがな
でも前者のほうはパズルや数学の問題を解くみたいな感じの面白さ楽しさがあるんだよね
とは言え大雑把とはいえ論文を少し読んだから、前者の方法でも完全に自力で解いたってことにはならんのだけどね
すでに論文からたくさんのヒントを得てしまっている
細かい部分をちゃんと読んでないから直接的な答えにならないだけであって・・・という感じ

55(-_-)さん:2013/06/23(日) 06:10:52 ID:???
論文を読んでなかったらLABELの再現方法なんぞ全く見当もつかなかったろうしな
evalも引数を2つに分けるという発想すら至らなかっただろうな
本当、俺は脳みそレベルからして低いわ

56(-_-)さん:2013/06/23(日) 06:11:58 ID:???
自分の脳みそバカレベルを考慮するなら
おとなしく辞書片手に論文を読むのが一番賢いやり方なんだろうなあ・・・

57(-_-)さん:2013/06/23(日) 06:13:08 ID:???
発想力が足りなさすぎる
発想力というのは知識や経験などで培うものだからね
長年ヒキってる俺は経験不足だし、勉強嫌いでもあったから知識も不足
何もかもが足りないわ・・・

58(-_-)さん:2013/06/23(日) 15:46:09 ID:???
ひとまず前に論文をさらっと読んだとき変数の実現アイデアぽいのを読み取ったので
おそらくかなりの劣化バージョンだが変数の実現コードを書いてみた


;変数のリスト
; ((ING . c) . (((1 2 3) . b) . (((x y z) . a) . (末尾NILの純リストならNILでもなんでも))))

;findvar 変数リストargsに変数名symbolがあればT、なければNILを返す
(label findvar (lambda (args symbol)
(cond
((not (atom args)) (cond
((not (atom (car args))) (cond
((atom (cdar args)) (cond
((eq (cdar args) symbol) (quote T))
((quote t) (findvar (cdr args) symbol))))
((quote t) (quote NIL))))
((quote t) (quote NIL))))
((quote t) (quote NIL)))))

;repvar 変数リストargsに変数名symbolがあれば一番手前にあるその変数の値をvalueに置き換えた変数リストを返す、なければ元の変数リストをそのまま返す
(label repvar (lambda (args symbol value)
(cond
((not (atom args)) (cond
((not (atom (car args))) (cond
((atom (cdar args)) (cond
((eq (cdar args) symbol) (cons (cons value symbol) (cdr args)))
((quote t) (cons (car args) (repvar (cdr args) symbol value)))))
((quote t) args)))
((quote t) args)))
((quote t) args))))

;delvar 変数リストargsに変数名symbolがあれば一番手前にあるその名の変数を削除した変数リストを返す、なければ元の変数リストをそのまま返す
(label delvar (lambda (args symbol)
(cond
((not (atom args)) (cond
((not (atom (car args))) (cond
((atom (cdar args)) (cond
((eq (cdar args) symbol) (cdr args))
((quote t) (cons (car args) (delvar (cdr args) symbol)))))
((quote t) args)))
((quote t) args)))
((quote t) args))))

;addvar 変数リストargsの一番手前に変数名symbol値valueの変数を追加する
(label addvar (lambda (args symbol value)
(cons (cons value symbol) args)))

;setvar 変数リストargsに変数名symbolがあれば値をvalueに置き換える、なければ新しく追加する
(label setvar (lambda (args symbol value)
(cond
((findvar args symbol) (repvar args symbol value))
((quote t) (addvar args symbol value)))))

;getvar 変数リストargsに変数名symbolがあれば一番手前にあるその変数の値を返す、なければシンボルERRORを返す
(label getvar (lambda (args symbol)
(cond
((not (atom args)) (cond
((not (atom (car args))) (cond
((atom (cdar args)) (cond
((eq (cdar args) symbol) (caar args))
((quote t) (getvar (cdr args) symbol))))
((quote t) (quote ERROR))))
((quote t) (quote ERROR))))
((quote t) (quote ERROR)))))

59(-_-)さん:2013/06/23(日) 15:53:53 ID:???
論文のをさらっと読んだ感じだと
(eval e a) は
evalの引数を渡す部分のaに変数を追加していって再帰的に呼び出してるくさいので俺もそういう風に再現を考えてんだが
よくよく思えばこの変数の実現方法なら(eval c)という引数ひとつでもできそうな気がしてこなくもない
ていうかこれの実現にlabelを使えば変数をストックしておく変数を用意しとけば足りそうなのに引数として渡してるところを見ると
labelはトップレベルでしか使えないってことなのか、何らかの内側では宣言できないってことなのかな

60(-_-)さん:2013/06/23(日) 15:55:30 ID:???
(cons (label a 'unko) a)
みたいな入れ子のlabelはエラーなのもしれんな・・・こればっかはIBM704のLISPの仕様書でも公開されてんと分からんな・・・

61(-_-)さん:2013/06/23(日) 16:07:02 ID:???
しかしプログラムとして考えたときにlabelのようなものを入れ子で使えないシステムなんて使い勝手悪そうだし
やはり仕様を知るにはちゃんとしっかりと論文を読み解くしかないんだろうなあ・・・英語やだなあ・・・

62(-_-)さん:2013/06/23(日) 16:56:28 ID:???
common lispのdefun, schemeのdefineはトップレベル以外でも使えるしlabelもそれでいいんじゃないの

63(-_-)さん:2013/06/23(日) 18:06:20 ID:???
情報ありがと
やっぱトップレベル以外でも使えるのが普通だよね・・・・つまり再現難易度が高い・・・・トップレベルのみだったらevalも簡単になりそうなんだけど・・・むずいんだな

64(-_-)さん:2013/06/23(日) 18:21:12 ID:???
ちょろっと試したら>>58のコード欠陥だらけじゃないか・・・作り直しだ・・・orz

65(-_-)さん:2013/06/23(日) 18:24:21 ID:???
いや、後部につける純リストの引数を工夫すれば解決はするんだけどね・・・ようはevalでのlabelやlambdaの仮引数の実装の仕方次第・・・

66(-_-)さん:2013/06/23(日) 18:28:11 ID:???
evalの関数内で変数の管理に変数を使わないのはevalの外で同名変数使ってたらアウトになるからなのかな
(label vars (addvar vars 'a 'value))
とか変数管理する変数作っちゃえばeval簡単に解決しそうなのに

67(-_-)さん:2013/06/23(日) 18:29:37 ID:???
さすが大学の論文として発表されるだけあるわ・・・・やはり俺レベルじゃ次元が足りないのか
チューリング完全の証明レベルたけえ

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のやり方はバインド変数の書き換えじゃないと成り立たない考え方だったな・・・ナンテコッタイ


新着レスの表示


名前: E-mail(省略可)

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

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

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

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