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

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

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とかの出力系とかもそうだし、


新着レスの表示


名前: E-mail(省略可)

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

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

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

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