レス数が1スレッドの最大レス数(1000件)を超えています。残念ながら投稿することができません。
ヒッキープログラミングスレ
プログラミングの話題のスレ
質問・相談
初心者からプロまで
プログラミングに関することなら何でもOK
俺のは効率悪いけどあんま複雑に管理したくないから
(a . b) は list[0] = "a" , list[1] = "b" という感じにデータとして扱ってるけど
(a b) は (a . (b . nil)) の list[0] = "a", list[1][0] = "b", list[1][1] = "nil" という構造になるから
ちゃんと(a . b) ≠ (a b) にはなってるはずだよ(そんなたくさんテストしてないから分からんけど)
つまり俺の場合(a b)のままで管理しない正式表記の(a . (b . nil))という形式で管理してるから(a . b)という形は問題にならない
>>516 で二分木って書いたけど正確に言うとリスト構造でも2分木構造でもないな、2分木に似たツリー構造という感じで
最初からリストの終わりにnilを入れておく構造にしておけばよかっただな
今更それは無理だから>>519 でいくけど
どうでもいいことだけど>>516 にミスtenkai2は第二引数に0を渡す必要があったw忘れてた
今更無理ってことはかなり複雑な形なのか
>>526
一回やってみたけど挫折した
関数の引数に(a . b)で渡す場合を考えると色々と詰まるところがあった
自分も晒したほうがいいかな
晒されても俺っちはアドバイスできる次元じゃないし
変数処理より先にQUOTEの省略形式の ' に対応した
でもまぁ晒したいんなら晒してもいいんでね
人のコード読むのは結構勉強になるし
プログラミングコード貼り付けスレ part1
http://jbbs.livedoor.jp/bbs/read.cgi/internet/13109/1370769621/
コマンドライン引数で指定したテキストファイルの内容を行単位でシャッフルするwsfスクリプト書いたった
>>508 の置き換えに結構手こずった、時間かかりすぎたわ
LABELは入れたけどスコープがちゃんとしてるかはちょっと分からない
とLAMBDAを入れるにあたってちょっと疑問にあたったわ
そういうのはマクロ定義できるようにしたあとに初期化ファイル読み込めるようにしてそこで定義したほうがいいと思う
labelとかletとか
LAMBDAの壁ってのは先日LAMBDAを調べたときにでた引数の数の問題
引数は単純なリストで構成されるのかと思ったけど
LAMBDAの説明の箇所に
((LAMBDA (X Y . Z) Z) 3 4 5 6) -> (5 6)
みたいな説明があって、ここらへんがよくわからんね
引数の文字の数と実際に並べた引数の数が違う場合がどうなるのかさっぱりだ
てっきり同数でないとエラーが出るもんだと思ってたけど(実装とか使ったことないし)
これって(QUOTE 'a 'b)とか(CONS 'A 'B 'C 'D)とかも出来るってことなのかね
そうなってくるとちょっと作り変えなきゃならないわ
(+ A B C D)が(+ (+ (+A B) C) D)的な挙動するってのは知ってるけど
よーわからんから、ひとまず制作は一時中断して徹底的に調べる作業になるわ
>>535
今んとこブラウザ上での実装だからjavascirptで外部ファイル読み込む方法は何か難しそうだな
ああまぁ外部設定ファイルというのもウェブ上にアップすればXMLHTTPで読みだせなくもないけど
マクロは想定してない作りになってるから
純LISPにマクロってあったかわからんけど
C言語のマクロってコンパイラのプリプロセッサが展開するみたいなやつなんかな
純lispならlabelsとかもいらないだろ
あとコード貼るならhttp://ideone.com とかのほうが良さそう
オーケー、マクロはあとでこれで調べるわ(まぁこれSchemeの仕様だけど)
Revised(5) Report on the Algorithmic Language Scheme - 5. 式
http://people.csail.mit.edu/jaffer/r5rsj_6.html #SEC40
>>540
オーケー俺勘違いしてた
Wikipediaの最小のLISPと純LISPをごっちゃに考えてた
LABELじゃなくDEFINEか
まぁ名前変えるだけだから大差なけどね
なんかwikipediaでもschemeとlispの仕様がごっちゃになってるな
schemeだと(define (f arg ...) body ...)は(define f (lambda (arg ...) body ...)の糖衣構文で
(defun f (arg ...) body ...)はlispの構文だよ
なるほどdesu、wikipeidaはlisp方言がごっちゃになってるのか、所詮はボランティア編集ってことか
ああそうだった何でDEFINEじゃなくLABELて名前で関数作ってたかというと
↓の論文がLABELという名前使ってたからだったようだ今LAMBDAのため見直したら気づいた
Recursive Functions of Symbolic Expressions
http://www-formal.stanford.edu/jmc/recursive/node3.html
先日読んだこともすっかり忘れてる、やべえわ俺・・・
まぁいいや、ひとまず>>546 の論文の仕様にしたがって書いてく、引数の数のとりかたは論文にしたがってやってみるわ
ひとまず論文通りにするめるにあたってさっきDEFINEに変更した名前をもういちどLABELに戻した
>>536 についてだけど
lambdaの引数のドットの後の一つの変数に残りの仮引数が全部リストで入れられる
ちなみにドットの後には引数がひとつしか置けない
consの定義にはそれがないから(cons 'a 'b 'c)とかは無理
+は引数の数を全部足しあわせた結果になる
なぜかというと(3 4 5 6)は(3 4 . (5 6))で
これと(x y . z)が組み合わさるとx -> 3, y -> 4, z -> (5 6)と割り振られることになる
>>549
ありがと
そうゆうことか
>>549-550
説明サンクス
つまり仮引数のリストの構造どおりに実引数の部分が処理されるってことね
しかしWikpediaの記載に信頼がおけないとすると
Wikipediaの純LISPのページはどのLISP方言使った話なのか分からんとアカンな
もう面倒だから残念無念で純LISP制作やめるとするかな・・・
でも結構時間かけたし、色々アドバイスもらったし、一応あと作るのはLAMBDAくらいだから最後までやってみるか・・・
wikipediaの純lispの説明に関しては間違ってるところがないから大丈夫
>>555
検証ありがとう
正しいなら安心して取り組めるわ
>>541 をちょろちょろっと読んでるうちに感じたこととしては
今作っている純LISPは本当は設計からやり直さないとダメぽいな
うまく純LISPとして動作すればよいのだが・・・このペースだと一応の完成にあと1週間はかかりそう
ここ数日すっかり純LISPとmciSendStringのMP3プレーヤーの制作とネット麻雀三昧で小遣いサイトからのメールがたんまり溜まってしまったよ・・・今はそちらを先に処理したい
lambdaをどうやって作るかはだいたいイメージすることはできたけど
lambdaに関係ない他の問題が発生した
eqとcondだ,この2つについてもう一度調べなおす必要がでてきた・・・
はぁ・・・lispの一般的な仕様をよく調べずとりかかったのがマズったわ
lambdaは思ってたほど難しくなさそうとイメージできたからいいけど
無知は思考だけではどうにもならん、また調べる作業か・・・1日にlispに割ける時間はせいぜい多くて3〜4時間だってのに・・・
Common LispのEQの仕様読むの疲れた・・・英語能力が中卒レベルなのがアダになった
Google翻訳とヤフー辞書とスペースアルクを駆使してなんとかEQの仕様を理解した
同じメモリを参照してるならTrueにしろってことか、わかってきたぞ
英語資料にこだわる必要はあるのか
俺は日本語資料だけで済ませてるけど
condは実装によって仕様が結構異なるようだな・・・
純lispの論文のはCommon LispともSchemeとも仕様が違うようだな
前者は条件式のみの定義の場合、および全条件が偽の場合は戻り値は未定義で
後者らは条件式ののみの定義の場合は条件式の結果を、全条件が偽の場合はCommon LispがNILでSchemeが未定義かな
Common Lispは最後は(T nil)を指定するのが望ましくてSchemeはelse節といのがある、ということか
まぁひとまず純lisp論文のほう準拠で作ってくことにしますかね・・・
論文のほうはまた別のlispのようだね、他ではdefineという名前のがlabelとう名前になってるし
>>562
俺の検索能力の無さが原因、仕方なしに英語資料を読んでる、まぁ英語力もアップするだろうし、プログラミングは英語文献が大半だし、我慢のしどころってとこかな・・・
純lispの論文で使われているlispはIBM 704というマシンに搭載されてたlispのようだな、IBM 704は約60年前のマシンか・・・すごいなlispの歴史は
ああ、IBM 704自体は60年前のマシンだがlispが実装されたのはもう少し後のことなのか、んでもってlispが最初に乗せられたマシンなのか、すごいな
今はやりの大衆言語は何十年も前にすでにLispが通った道っていうのがすごいね
しかも型指定してコンパイルすれば速度がC並になるししなくてもそこら辺の言語よりは十分速い
構文はリストとアトムで簡潔、マクロを使えば無限に構文を定義できる、どんな時代にも対応できる全ての言語の頂点の最強の言語
しかし人気がない
ひとまず
EQはCommon Lispの仕様に則って同一メモリ参照ならTrue、それ以外はFalse (っていうか純LISPの論文からじゃEQの仕様が分からん)
CONDは純LISP論文のIBM 704の仕様に則って作ることにした
IBM704のCONDは条件式と対応する戻り値式が1対1だけど
Common LispとかSchemeは戻り値式は好きなだけ並べていいという感じだし煩雑になりそうだからやめる
っていうかCommon LispとかSchemeのCONDはマクロだしね・・・IBM704のCONDはマクロかどうかは知らんが他の関数と特別式では再現できないからたぶん特別式だと思う
>>567
人気ないのは構文の可読性が悪いってとこだろうな
ひとまず、時間的に任されてる家事のほうをやらねばならない、つかlispに時間かけすぎたわ・・・今日のlisp時間は終わりだ、はぁ・・・作業が遅々として進まん、ヒキニートだのに時間が足りんとは
Common LispとかSchemeのCONDがマクロなのはCONDの条件処理が効率や使い勝手が悪いってことなんだろうな、
効率や使い勝手のいい条件処理の特別式があればCONDは必要ないが、他のlispと合わせるために一応CONDを用意したってところか、しかもマクロ再現という
というかif定義した後マクロでcond定義したほうが楽だからね
つまりCONDは要らない子って感じか
いや、そんなことはない
(if pred1 expr1
(if pred2 expr2
...
と字下げが深くなるからcondのほうがいい時のほうが多い気がする
なるほど、そういう需要はあるのかCONDは要る子だったか
純LISPの論文よく読んだらEQの定義がちゃんと書いてあった、同じシンボルならT、それ以外はFと、なのでこっち採用する。
html5 でゲームを作るなら
enchant.js これが良いらしいね
ただツールをhmtl5で作るとなるとよく解からん
html5でツールか
グラフ描いたりとかかな
そういやhtml5ってスマホがメインの技術か
firefox OS 積んだスマホがKDDIから出る予定らしい
そこで何かが変わるかも
どんどん新しい技術が投入されてくんだな・・・おいつけそうにない
な、なんとか純LISPが一応の完成をした・・・
簡単なテスト処理として
(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)))))))
がちゃんと動いた・・・
これの動作のために一番手こずったバグがcondを処理するメソッド内で変数宣言の忘れでおかしな動作になってたw
あとは
使いやすい形態にまとめるのと
もうちっと見やすいコードに整形してくのと
くらいすれば完成としていいかな
まぁちゃんと純LISPとして正常動作してるかevalを書いてチューリング完全性再現してるか試すというのもあるけど
論文どおりにeval書いてけば難しくはないだろうけど、かなり広い範囲の英語を読まねばならん・・・
自分でeval処理を考えて再現するってのも面白いだろうけど
今回作ったlisp3.jsをうまくまとめたら
今度はちゃんとしたリスト構造のlispを作ってみようかな(そのほうがコンピュータぽいし)
今回のは二分木ぽいツリー構造で処理しちゃってるし
リスト構造だとマシン語みたいにプログラムカウンタとかをスタックに上げるとかそういう処理が必要そうだな
インタプリッタぽく字句解析しながらその場で処理するとかがいいかな
今回は2分木ぽい構造にしちゃったことでやや複雑化した感がぬぐえない
昔のコンピュータに乗るくらいだからすごく単調単純な構造で作れるはずなんだよね
すなわち今回俺が作り上げたlispたんはすごく無駄の多いバカlispということで・・・
tarai関数でベンチマークしよう
tarai関数ね、純lisp用のtarai関数を考えるのが大変そう・・・
結構簡単だと思うけど
(label tarai (x y z)
(cond ((<= x y) y)
(t (tarai (- x 1) y z)
(tarai (- y 1) z x)
(tarai (- z 1) x y))))
こんな感じじゃないの?
うわミスった
(label tarai (x y z)
(cond ((<= x y) y)
(t (tarai (tarai (- x 1) y z)
(tarai (- y 1) z x)
(tarai (- z 1) x y)))))
こうか
そういえば不等式実装してないのか
それなら難しいかも
不等式どころか数値とかいう概念がないからね、種別がシンボルとリストだけだし
数値の概念がないので足し算引き算もない
純LISPはチューリング完全をテストするための必要最小限しかないから
そう言えばそうか
強引に足し算を作ってみた
(label add1 (lambda (x) (cond ((atom x) (cond ((eq x '0) '1) ((eq x '1) '2) ((eq x '2) '3) ((eq x '3) '4) ((eq x '4) '6) ((eq x '5) '6) ((eq x '6) '7) ((eq x '7) '8) ((eq x '8) '9) ((eq x '9) '(0 . 1)) ('T 'nil))) ('T (cons (cond ((atom (add1 (car x))) (add1 (car x))) ('T (car (add1 (car x))))) (cond ((atom (add1 (car x))) (cdr x)) ('T (add1 (cdr x)))))))))
(add1 (add1 (add1 '(7 9 . 9))))
一箇所間違えてたw
((eq x '4) '6) → ((eq x '4) '5)
足し算といっても1を加算するだけだけどw
リスト構造と言う考え方を少ししてみたら
>>518 氏が問題視してたとこがやっとわかった
ようはC言語の文字列みたいに処理の最後にnull(nil)が来ることで処理を打ち切るのだとしたら
(A . B)みたいなリストはやたらと扱いにくい、つかリストの終わりが発見できないのな
IBM704ってのはどう解決してたんだろうか
ああ、1文字ずつ処理を続ければnilじゃなく閉じ括弧で判断すればいいのかな、ドットの有無で何らかのフラグとか立てておけばよさそうだし
俺がやったみたいに全部読み込んで変換してじゃ昔のマシンじゃメモリ不足だろうしね
前も行ったけど字句解析と構文解析を混ぜて考えないほうがいいよ
先頭のトークンを取り出してそれが括弧かアトムかで処理をしていくのがいいと思う
他の人の実装見てもそんな感じだったし
なるほど、括弧の情報を残してリスト化するのか、そういう発想に至らなかったわ
他の人の実装みたりとか勉強熱心だね、
ひとまず純lisp作りにとりかかっておきながら
パーサとか字句解析とか構文解析などこれらの単語の意味が分からないので
ググってくるは
今回みたいな一連のコードからプログラム起こす処理なんて初めてやったことだし
無知すぎてアドバイスすら理解してない自分が情けない(´・ω・`)
自分で使っておきながらSyntax Errorの意味すら知らんかったりする
N88-BASICで遊んでた頃よく出てきたエラーメッセージだから何となく使ってみただけ
おけおけ、分かった、パーサって構文解析って意味なのか、字句解析のほうだと勘違いしてた、
字句解析はスキャナやトークナイザって言うのね、
>>482 で書いたhoge関数はパーサじゃなくてスキャナやトークナイザってやつのほうだったよ
日本語も外来語も難しす
> 自分で使っておきながらSyntax Errorの意味すら知らんかったりする
直訳すればすぐにわかるだろww
というかN88-BASICの頃からプログラミングやってんのか大先輩だな
構文解析のほうは>>484 で書いたhoge2関数のほうね
つまり一応はアドバイス通りに字句解析と構文解析は分離してたは
よかったよかった
>>607
先日書いた通り英語力が壊滅的なので語彙力がない
まぁ英和辞書使えば分かるだろうけど面倒だったし、特に広く公開するフリーソフトにするわけでもないし
そこらへんはテキトーでいいかなと
ちなみにN88-BASICが使えるパソコンが家にあっただけで
N88-BASIC全盛期にやってたわけじゃないよw
N88-BASICで遊んでたころはWindows98とかWindowsMEとかWindows2000が出てた頃だから
過去人や老人ってわけじゃないよw
まぁまだあの時期はベーマガにN88BASICのプログラム投稿とかまだまだあったけどほとんどVBに成り代わっていったなあ
それでも10年くらいやり始めた年が違うよ
3年前にハローワールドで喜んでたくらいだし
当時は型の古い廃棄予定のパソコンを貰ってきて遊んでたから
時代はWindows98とかMEの時代だったのにWindows3.1だったからねあのパソコンw
ベーマガ掲載の投稿プログラムをちょろちょろ試すくらいしかしてなかったな
しょぼいのやってたときもプログラミング歴として加算してもよいのかねwそんなこと言ったら小4のときから学校のクラブでロゴライター2使ってたし
初めてプログラミングに関わったときからの時間なら単純に20年経過になるけど、だからといって年数分のレベルがあるかというとそうではないしなw
日本は能力主義じゃなく変な年歴主義なのはどうかと思うがプログラミングのスキルやレベルなら>>612 のほうがかなり高いと思うよw
いや、lisp処理系がうまく作れるかどうかだけだからそういう判断はできないよ
web関連はさっぱりだしGUIはtcl/tkのラッパーとjavaのswing少しくらいしか使えないしMP3プレーヤーも作れない
俺はこの人生でプログラミングをやりこんできたわけじゃないしね
最近は純lisp作りに夢中になってたせいで毎日のようにやってたけど
多くて2〜3か月に1回くらいの頻度で思いつきを形にしようとして途中で飽きるを繰り返してきてるし
実質的な能力でいえばプログラミング歴1年くらいの人にも劣ると思ってるわw
この純lispもちゃんと仕上げるかどうかは飽きるか否かにかかってるしねw
たぶんまた日が経つとパーサの意味を忘れてると思うわ
>>615
俺っちvb6を使ってるからgui開発はかなり楽ちんな言語だし
mp3プレーヤーなんてmciSendStringでの作り方紹介してるサイトのコピペだけで作れるし
javaのswingなんてhello world表示するの作っただけで途中で投げちゃったわw
web関連も俺っちも詳しくないからかなり酷い作りになってるの多いしね
外部ライブラリ拾ってきて使うのあんま好きじゃないからjavascriptのライブラリのjQueryとか使ったことすらないしw
純lispは完成したんじゃないの
気に障ったのなら謝る
スマートフォン版
掲示板管理者へ連絡
無料レンタル掲示板