レス数が1スレッドの最大レス数(1000件)を超えています。残念ながら投稿することができません。
ヒッキープログラミングスレ
プログラミングの話題のスレ
質問・相談
初心者からプロまで
プログラミングに関することなら何でもOK
昨夜気づいた問題を修正した版
function hoge(str, p, list){
var i, c, s, newlist, t = 0, e = 0;
/** t
* 0 一つ目の要素の読み取り開始前段階
* 1 一つ目の要素はシンボルで読み取り中
* 2 一つ目の要素はリスト
* 3 一つ目の要素を登録完了
* 4 一つ目の要素と二つ目の要素を繋ぐ'.'読み取り前段階
* 5 二つ目の要素の読み取り開始前段階
* 6 二つ目の要素はシンボルで読み取り中
* 7 二つ目の要素はリスト
**/
for (i = p; i < str.length; i++) {
c = str.charAt(i);
if (c == '(') {
if (t == 0) { //一つ目の要素はリスト
newlist = new Array(); i = hoge(str, i + 1, newlist); t = 2;
} else if (t == 3) { // . の省略、二つ目の要素はリスト(そのリストの一つ目の要素がリスト)
newlist = new Array(); i = hoge(str, i, newlist) - 1; t = 7;
} else if (t == 5) { //二つ目の要素はリスト
newlist = new Array(); i = hoge(str, i + 1, newlist); t = 7;
} else {
alert("error char '(' t=" + t); return str.length + 10;
}
} else if (c == ')') {
if (t == 1) { //要素が一つしかない(要素はシンボル)
list[0] = s; list[1] = "nil";
} else if (t == 2) { //要素が一つしかない(要素はリスト)
list[0] = newlist; list[1] = "nil";
} else if (t == 6) { //二つ目の要素(シンボル)の登録
list[1] = s;
} else if (t == 7) { //二つ目の要素(リスト)の登録
list[1] = newlist;
} else if (t != 0) { // t==0 は空のリストになる
alert("error char ')' t=" + t); return str.length + 10;
}
return i;
} else if (c == ' ') {
if (p == 0) { //一番外側の括弧である必要があり構文エラー
alert("error char ' ' t=" + t + " (p == 0)"); return -1;
}
if (t == 1) { //一つ目の要素
list[0] = s; t = 3;
} else if (t == 2) { //一つ目の要素はリスト
list[0] = newlist; t = 3;
} else if (t == 4) { //次にくるのは2つ目の要素
t = 5;
} else {
alert("error char ' ' t=" + t); return str.length + 10;
}
} else if (c == '.') {
if (t == 3) { //このリストは略式でない
t = 4;
} else {
alert("error char '.' t=" + t); return str.length + 10;
}
} else {
if (t == 0) { //一つ目の要素のシンボル開始
s = c; t = 1;
} else if ((t == 1) || (t == 6)) { //シンボル文字が続く
s += c;
} else if (t == 3) { // . が省略されてるので二つ目の要素はリスト(そのリストの一つ目の要素がシンボル)
newlist = new Array(); i = hoge(str, i, newlist) - 1; t = 7;
} else if (t == 5) { //二つ目の要素のシンボル開始
s = c; t = 6;
} else {
alert("error char '"+c+"' t=" + t); return str.length + 10;
}
}
}
if (p != 0) { //再帰呼び出しで文字列を読み取り終わってしまっている
return -1;
}
if (i > str.length + 1) {
return -1;
}
if (t == 1) {
list[0] = s;
} else if (t == 2) {
list[0] = newlist;
} else {
return -1;
}
return i;
}
続き テスト用メソッド
function tenkai(list) {
var s1, s2;
if (typeof(list) == "string") {
return list;
} else if (typeof(list) == "number") {
return -1;
}
if (list[1]) {
s1 = tenkai(list[0]);
s2 = tenkai(list[1]);
if ((typeof(s1) == "string") && (typeof(s2) == "string")) {
return "(" + s1 + " . " + s2 + ")";
}
}
return -1;
}
function test() {
var str = document.all.f.t.value;
var list = new Array();
var s;
str = str.replace(/\./g," . ").replace(/ +/g," ").replace(/ $/,"");
document.all.f.t.value = str;
if (hoge(str, 0, list) >= 0) {
s = tenkai(list[0]);
document.getElementById('abc').innerHTML = typeof(s) == "number" ? "Syntax Error" : s;
document.getElementById('efg').innerHTML = tenkai(hoge2(list[0]));
} else {
alert('Syntax Error!');
return;
}
}
>>483 にあるhoge2はこれ
function hoge2(list) {
var s, temp;
if (typeof(list) == "string") {
return list; //まだちゃんと処理してない
}
if (list[0]) {
if (list[1]) {
if (typeof(list[0]) == "string") { s = list[0]; } else { s = hoge2(list[0]); }
if (s == "atom") { return fAtom(list[1]);
} else if (s == "eq") { return fEq(list[1]);
} else if (s == "car") { return fCar(list[1]);
} else if (s == "cdr") { return fCdr(list[1]);
} else if (s == "cons") { return fCons(list[1]);
} else if (s == "quote") { return fQuote(list[1]);
} else { temp = new Array(); temp[0] = s; temp[1] = hoge2(list[1]); return temp; //まだちゃんと処理してない
}
}
} else {
return "nil";
}
return -1;
}
function getArgs(list, n, argc) {
if (list) {
if (typeof(list) != "string") {
if (list[1]) {
argc[n - 1] = hoge2(list[0]);
if (n == 1) {
if (list[1] == "nil") {
return true;
}
} else {
return getArgs(list[1], n - 1, argc);
}
}
}
}
return false;
}
function fAtom(list) {
var argc = new Array();
if (getArgs(list, 1, argc)) {
return typeof(argc[0]) == "string" ? "T" : "nil";
}
return -1;
}
function fEq(list) {
var argc = new Array();
if (getArgs(list, 2, argc)) {
if ((typeof(argc[0]) == "string") && (typeof(argc[1]) == "string")) {
return argc[0] == argc[1] ? "T" : "nil";
}
}
return -1;
}
function fCar(list) {
var temp, argc = new Array();
if (getArgs(list, 1, argc)) {
if (typeof(argc[0]) != "string") {
temp = argc[0];
if (temp[1]) {
return temp[0];
}
}
}
return -1;
}
function fCdr(list) {
var temp, argc = new Array();
if (getArgs(list, 1, argc)) {
if (typeof(argc[0]) != "string") {
temp = argc[0];
if (temp[1]) {
return temp[1];
}
}
}
return -1;
}
function fCons(list) {
var argc = new Array();
if (getArgs(list, 2, argc)) {
return argc.reverse();
}
return -1;
}
function fQuote(list) {
if (typeof(list) != "string") {
if (list[1]) {
if (list[1] == "nil") {
return list[0];
}
}
}
return -1;
}
>>481
そこらへんはまぁよく分からんから
動作したもん勝ちでしょみたいなスタンスで行ってる
このスパゲッティはちゃんと動くの?
>>486
さあ?hogeとtenkaiはテストしたけどhoge2は途中だから正常に動作はしないよ
省略形表示のtenkai2
function tenkai2(list, n) {
var s1, s2;
if (typeof(list) == "string") {
return list;
} else if (typeof(list) == "number") {
return -1;
}
if (list[1]) {
s1 = tenkai2(list[0], 0);
if (list[1] == "nil") {
if (typeof(s1) == "string") {
if (n == 0) {
return "(" + s1 + ")";
} else {
return s1;
}
}
}
if (typeof(list[1]) == "string") {
s2 = tenkai2(list[1], 1);
if ((typeof(s1) == "string") && (typeof(s2) == "string")) {
if (n == 0) {
return "(" + s1 + " . " + s2 + ")";
} else {
return s1 + " . " + s2;
}
}
} else {
s2 = tenkai2(list[1], 1);
if ((typeof(s1) == "string") && (typeof(s2) == "string")) {
if (n == 0) {
return "(" + s1 + " " + s2 + ")";
} else {
return s1 + " " + s2;
}
}
}
}
return -1;
}
書き忘れた、テスト用のhtml
<html>
<head><title>test</title>
<script type="text/javascript" src="lisp3.js"></script>
</head>
<body>
<form name="f">
<textarea name="t" cols="80" rows="10">((a . b) (c d))</textarea><br>
<input type="button" value="excute" onclick="test();">
</form>
<div id="abc"></div>
<div id="abc2"></div>
<div id="efg"></div>
<div id="efg2"></div>
</body>
</html>
lisp3.jsの3は
lispのメモをlisp.txt,list2.txt,list3.txtときて
lisp3.txtにコード書いてたから名前修正してlisp3.jsになった
lisp.txtには以前調べたCommon Lispの一部の文法や関数がメモしてあって
lisp2.txtには純Lispの関数と特別式についてメモしてある
んでlisp3.txtにコードをつらつら書いてて>>475-476 の時点までは未テストのlisp3.txtだった
tenkai2も使ったtestメソッド
function test() {
var str = document.all.f.t.value;
var list = new Array();
var s;
str = str.replace(/\./g," . ").replace(/ +/g," ").replace(/ $/,"");
document.all.f.t.value = str;
if (hoge(str, 0, list) >= 0) {
s = tenkai(list[0]);
document.getElementById('abc').innerHTML = typeof(s) == "number" ? "Syntax Error" : s;
s = tenkai2(list[0], 0);
document.getElementById('abc2').innerHTML = typeof(s) == "number" ? "Syntax Error" : s;
s = tenkai(hoge2(list[0]));
document.getElementById('efg').innerHTML = typeof(s) == "number" ? "Syntax Error" : s;
s = tenkai2(hoge2(list[0]), 0);
document.getElementById('efg2').innerHTML = typeof(s) == "number" ? "Syntax Error" : s;
} else {
alert('Syntax Error!');
return;
}
testメソッドは今んとこ改行を考慮してないから改行を入れたりするとSyntax Errorになる
予定としてはひとまず
hoge2にcondとlambdaとlabelを追加するけど
labelがいわゆる変数ってやつなのかな、ググっても出てこんかった
defineと同義ならそれでいんだけど
ちなみに思いつきで書いてるからメソッド名や変数名が簡易になってるけど、まぁあとで修正すべきとこかもね(可読性のために)
hoge内の有限オートマトン(ってやつ?)に使ってる t に代入する値も本来はenumみたいな定数群を用意してやるべきだし
まあ動けばいいよ
cond追加
function hoge2(list) {
var s, temp;
if (typeof(list) == "string") {
return list;
}
if (list[0]) {
if (list[1]) {
if (typeof(list[0]) == "string") {
s = list[0];
} else {
s = hoge2(list[0]);
}
if (s == "atom") {
return fAtom(list[1]);
} else if (s == "eq") {
return fEq(list[1]);
} else if (s == "car") {
return fCar(list[1]);
} else if (s == "cdr") {
return fCdr(list[1]);
} else if (s == "cons") {
return fCons(list[1]);
} else if (s == "quote") {
return fQuote(list[1]);
} else if (s == "cond") {
return fCond(list[1]);
} else {
temp = new Array();
temp[0] = s;
temp[1] = hoge2(list[1]);
return temp;
}
}
} else {
return "nil";
}
return -1;
}
function fCond(list) {
var temp, s, argc = new Array();
if (typeof(list) != "string") {
if (list[1]) {
if (typeof(list[0]) == "string") {
return hoge2(list[0]);
} else {
temp = list[0];
if (temp[1]) {
s = hoge2(temp[0]);
if (s != "nil") {
if (getArgs(temp[1], 1, argc)) {
return argc[0];
}
} else {
return fCond(list[1]);
}
}
}
}
} else {
return hoge2(list);
}
return -1;
}
あとは変数の問題が出てくるlambdaとlabelか
スコープとかいう問題とか処理大変そうだな
風呂入ってくる
何か適当なLispを使ったことなく想像だけで作ってるから動作がどの程度あってるか分からんが、まぁ趣味だしどうでもいいか
lispってリスト構造かと思ったら2分木な処理になってもうた
condの処理が少々おかしいのか?
あとtenkaiとtenkai2も足りない処理があってエラーになってもうた
修正版 tenkai tenkai2
function tenkai(list) {
var s1, s2;
if (typeof(list) == "string") {
return list;
} else if (typeof(list) == "number") {
return -1;
}
if (list[0]) {
if (list[1]) {
s1 = tenkai(list[0]);
s2 = tenkai(list[1]);
if ((typeof(s1) == "string") && (typeof(s2) == "string")) {
return "(" + s1 + " . " + s2 + ")";
}
}
} else {
return "nil";
}
return -1;
}
function tenkai2(list, n) {
var s1, s2;
if (typeof(list) == "string") {
return list;
} else if (typeof(list) == "number") {
return -1;
}
if (list[0]) {
if (list[1]) {
s1 = tenkai2(list[0], 0);
if (list[1] == "nil") {
if (typeof(s1) == "string") {
if (n == 0) {
return "(" + s1 + ")";
} else {
return s1;
}
}
}
if (typeof(list[1]) == "string") {
s2 = tenkai2(list[1], 1);
if ((typeof(s1) == "string") && (typeof(s2) == "string")) {
if (n == 0) {
return "(" + s1 + " . " + s2 + ")";
} else {
return s1 + " . " + s2;
}
}
} else {
s2 = tenkai2(list[1], 1);
if ((typeof(s1) == "string") && (typeof(s2) == "string")) {
if (n == 0) {
return "(" + s1 + " " + s2 + ")";
} else {
return s1 + " " + s2;
}
}
}
}
} else {
return "nil";
}
return -1;
}
そういや大文字小文字の区別ってあったっけか?まぁそう難しい処理でもないから問題ないけど
んじゃ一区切りついたから風呂入ってくるわ
大文字小文字は区別ないか、ならhoge内でlistに登録するときに一括大文字変換しとくか
hoge内の
list[0] = s; → list[0] = s.toUpperCase();
list[1] = s; → list[1] = s.toUpperCase();
に置き換え
lisp3.jsのファイル内全体で"nil"を"NIL"に置き換えた
あとhoge2内の関数名識別のところ
s == "atom" とかを s == "ATOM" に置き変えた
さっさと風呂に入るか、暗くなっちまうな
さて風呂から上がったが、家事の一部を任されてるのでそれをサボったら激おこぷんぷん丸されるので作業はまたあとで・・・
変数を導入するにあたりlistに直にstringやarrayを代入してきたけど
構造体のような管理する何が代入されてるかクラスを作る予定
イメージとしてはこんな感じ
function ListData(data, type) {
this.getType = function () { return type; };
this.getData = function () { return data; };
}
list[0] = new ListData(s.toUpperCase(), "symbol");
list[1] = new ListData(newlist, "list");
しかし、この変更で大幅な修正が必要になってくるな、最初から管理クラス作ってからやればよかったんだけど
面倒だったから後回しにしたのがダメだったぽ
ちなみにこの仮名ListDataは戻り値等にも使う
new ListData(fQuote, "func")
とか
new ListData(list, "lambda")
とか
new ListData(null, "error")
などとしたりして戻り値の状態も管理できるようにする予定
コード読むの面倒だから聞くけどドット記法はどうしてる?
(cons a b)でbがアトムなら(a . b)になるけどリストでS式を表現してたらこれ面倒じゃない?
まぁ実際に組んでみないとどのような不都合や不可能があるか分からんから、ここまではまだイメージの段階
変数管理用のクラス作って、"("が来るたび(スコープに入るたび)に子インスタンスを作って
変数参照が来たら現状スコープに変数の有無を問い合わせそのインスタンスになければそのインスタンスが親インスタンスに問い合わせを行うような感じで作ってみようと
最親のインスタンスはグローバルスコープに相当するのでそこで変数が無ければエラー
>>511
hogeメソッドで(cons a b)を (cons . (a . (b . nil)))に処理してこれを
list[0] = "cons" 、で list[1] に (a . (b . nil)) をhogeで再帰処理したリストに
全部書くと list[1][0] = "a" , list[1][1][0] = "b" , list[1][1][1] = "nil" という感じのリストになる
処理結果も同じ構造にしてある
例えば この場合の cons は list[1][0] と list[1][1][0] で構成される新しいリスト kekkaとするなら
kekka[0] = list[1][0] , kekka[1] = list[1][1][0] を作って戻り値として返す
tenkaiはこのlistの構造のデータを . 使った表現にするのでこの例なら
tenkai(list) は listの構造を順に調べ (cons . (a . (b . nil))) を出力
tenkai(kekka) も同様にして (a . b) と出力する
consの処理は>>484 のfConsに書いてある
javascriptは変数の型とか無いからかなり自由に代入していっちゃってるけど
他の言語で書くならけっこう考慮しないといけない部分
ちなみに>>513 のlist, kekkaを略式表記の tenkai2 で処理したら
tenkai2(list) は (cons a b)
tenkai2(kekka) は (a . b)
になる
tenkaiやtenkai2はこのリストの構造(正確には2分木になるのだが)で処理されるので
tenkai(list[0]) は cons
tenkai(list[1]) は (a . (b . nil))
tenkai2(list[1]) は (a b)
になる
tenkai と tenkai2 は人間が読むために文字列に直すメソッドね
(cons a (cons b nil))は(a b) になって (cons a b)は(a . b)になるぞ
つまり(a b)≠(a . b)
俺が言いたいのは(a . b)をどうやって管理するかだけどこれはcar, cdrの値を持ったデータでやるのがいい
しかしそれだとリストの後ろに値を追加するときやリストの要素数が欲しい時に線形探索になって効率の悪いからどうかと思う
そこでlistを使うんだけどこれだと(a b c)は{a, b, c}みたいに表せばいいけどそれだと(a . b)が表しにくい
これが俺が抱えてる問題点なんだ
とりあえず{atom1 dot atom2}という形で動くようにした
>>518
効率の話はちょいと分からん>>485 のスタンスなので
計算コストは大きいだろうけど長大なlispプログラムを作るって実行させるわけでもないし
俺のは効率悪いけどあんま複雑に管理したくないから
(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ってスマホがメインの技術か
スマートフォン版
掲示板管理者へ連絡
無料レンタル掲示板