したらばTOP ■掲示板に戻る■ 全部 1-100 最新50 | |
レス数が1スレッドの最大レス数(1000件)を超えています。残念ながら投稿することができません。

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

1(-_-)さん:2013/02/26(火) 04:49:59 ID:GABg0f3o
プログラミングの話題のスレ

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

412(-_-)さん:2013/06/03(月) 21:26:19 ID:MoMBPcbY
N88-BASICとかの行番号付きBASICって内部的にどういうふうにコードを保持してるんだろう
普通は行番号は10単位くらいあけて書くし6万行分のコード保存用の配列を用意してるってわけじゃないだろうし
リスト構造で前後を繋いでるのなら挿入は楽そうだけどGOTOとかのジャンプ命令が大変そうだし
行番号順に並べる必要あるからハッシュテーブルじゃなさそうだし
木構造で管理してんのかな、だとしたら何木だろう

413(-_-)さん:2013/06/03(月) 21:27:23 ID:MoMBPcbY
もしかしてヒープ構造とかか?

414(-_-)さん:2013/06/03(月) 21:27:58 ID:MoMBPcbY
あるいはB木とかかな

415(-_-)さん:2013/06/03(月) 21:30:34 ID:MoMBPcbY
B木はやはりジャンプが不利か
ヒープ構造ならジャンプ有利にはなるけど行番号ソートがやや手間だがヒープで実現するのが一番しっくりくるか

416(-_-)さん:2013/06/03(月) 21:31:44 ID:MoMBPcbY
いやまてまて、ヒープはジャンプ有利とはいえないか、ジャンプ先の探索手間はリスト構造よりは圧倒的優位かもしれが
ヒープが配列で実現できるからといって飛び飛び番号順だし木構造と探索は大差ないか

417(-_-)さん:2013/06/03(月) 21:33:12 ID:???
しかし木構造だと深くなると行番号順の実効そのものに影響が大きそうだし、やはりヒープか

418(-_-)さん:2013/06/03(月) 21:34:32 ID:???
ギャップバッファってのがある
テキストエディタでよく使われる効率の良いアルゴリズムだけど普通に連結リストだと思う
gotoは別の形で保持しとけばいいし

419(-_-)さん:2013/06/03(月) 21:34:46 ID:???
行番号と配列のマッピングするとなると6万行分の配列を用意するか、ハッシュテーブルを使うかすれば探索コストは落ちるだろうけど
あの古いPC上で運用するとなるとメモリ制限からしてハッシュテーブルでも使ってるのだろうか

420(-_-)さん:2013/06/03(月) 21:36:11 ID:MoMBPcbY
>>418
>ギャップバッファ
おおサンクス
これ調べてみる

421(-_-)さん:2013/06/03(月) 21:38:10 ID:???
>>420
CとかでBASIC作ろうとしてるなら行単位連結リストでいいと思うよ
さっきも行ったようにジャンプは別にテーブル用意しとくのが得策だと思う

422(-_-)さん:2013/06/03(月) 23:29:16 ID:MoMBPcbY
>>421
ヒントありがと
参考にする

423(-_-)さん:2013/06/03(月) 23:38:30 ID:???
なんか難しそうな話してんな

424(-_-)さん:2013/06/04(火) 02:06:13 ID:???
ハイレベルすぎるは

425(-_-)さん:2013/06/04(火) 02:26:15 ID:???
これを難しいとか言う奴はどういうことしてるんだろう

426(-_-)さん:2013/06/04(火) 02:29:04 ID:???
言語そのものを作るってのはかなり趣味の濃いとこじゃねの

427(-_-)さん:2013/06/04(火) 02:42:27 ID:???
GCの実装のバグが直せないから寝れない

>>426
それ以前の問題な気がする

428(-_-)さん:2013/06/04(火) 03:10:40 ID:???
データ構造とかの話は入門書などに書いてある範疇からは超えてる

429(-_-)さん:2013/06/04(火) 03:17:46 ID:???
新しい言語はライブラリが豊富だから細かいことは気にせず楽ちんに色々作れる

430(-_-)さん:2013/06/04(火) 03:18:05 ID:???
×新しい言語
○最近の言語

431(-_-)さん:2013/06/04(火) 03:25:22 ID:???
Cを投げ捨ててpythonとかjavaで書きたいけどここで逃げるわけにはいかない

432(-_-)さん:2013/06/04(火) 04:01:36 ID:???
pythonみたいなスクリプト系とかjavaとかはプラットフォーム依存度が低いから扱いやすそう
cはプラットフォーム依存度とかどこのコンパイラかでかなり違うというのが面倒そう

433(-_-)さん:2013/06/04(火) 04:30:13 ID:???
GCってメモリ管理も作るとかすげえな

434(-_-)さん:2013/06/04(火) 10:07:50 ID:08fb02X6
そういえばこんなスレあったっけ

435(-_-)さん:2013/06/04(火) 18:22:48 ID:???
>>434
お前さては>>1だな

436(-_-)さん:2013/06/05(水) 13:18:39 ID:MgzJvtPc
違うよ、昔ヒキ板(本家)にこういうスレあったっけって思ったんだ
確かに時期的にこのスレの>>1でもおかしくはないな

437(-_-)さん:2013/06/05(水) 15:57:49 ID:???
んだ

438(-_-)さん:2013/06/05(水) 15:58:28 ID:dYjSMzwU
今はmciSendStringを使ったMP3プレーヤーでも作ってみようかと挑戦中

439(-_-)さん:2013/06/05(水) 16:00:12 ID:dYjSMzwU
Windowsね

440(-_-)さん:2013/06/05(水) 16:35:10 ID:???
本スレ書き込めねぇ…

441(-_-)さん:2013/06/05(水) 16:41:24 ID:???
無慈悲な規制

442(-_-)さん:2013/06/05(水) 17:09:12 ID:???
書き込みたいことがあるならこっちに書き込めばいいと思うよ

443(-_-)さん:2013/06/06(木) 15:16:06 ID:???
mciSendStringなかなか面白いけどVB6から使うのはやや不便かな

444(-_-)さん:2013/06/06(木) 15:29:32 ID:???
いい加減VB6なんて捨てたら

445(-_-)さん:2013/06/06(木) 16:06:52 ID:???
せっかく買ったもんだから減価償却したいし

446(-_-)さん:2013/06/08(土) 17:27:14 ID:???
Cでlispインタプリタ作るの挫折してJavaで作りなおしたら3日で完成した
今までの苦労は何だったんだ

447(-_-)さん:2013/06/08(土) 17:38:31 ID:???
Shell32.dllメモ
ShellオブジェクトのFolderクラスのメソッドGetDetailsOfの第一引数にNull(?)を渡すと第二引数に対応するプロパティ名が取得できた

448(-_-)さん:2013/06/08(土) 17:41:46 ID:???
Shell32.dllメモ
ShellFolderItemクラスのExtendedPropertyに指定するプロパティ名は日本語プロパティ名の指定では取得できなかった
また英語でも取得できないものがいくつかあった

449(-_-)さん:2013/06/08(土) 17:44:26 ID:???
結局Cを投げ捨てちゃったのか

450(-_-)さん:2013/06/08(土) 20:09:03 ID:???
lispって引数を再帰的にリストとして処理してけばいいんしょ

451(-_-)さん:2013/06/08(土) 20:15:41 ID:???
違うよ
一つ目の引数を関数として評価したあと2つ目以降の引数を評価したものを一つ目で出来た関数に渡すんだよ

452(-_-)さん:2013/06/08(土) 21:04:48 ID:???
3日で作るとかこのレベルかね

純LISP - Wikipedia
https://ja.wikipedia.org/wiki/%E7%B4%94LISP

453(-_-)さん:2013/06/08(土) 21:09:14 ID:???
S-expression - Wikipedia, the free encyclopedia
https://en.wikipedia.org/wiki/S-expression

ようはS式のツリー構造で順番で処理してけばいいんしょ

たぶんきっと簡単に作れそう

454(-_-)さん:2013/06/08(土) 21:11:43 ID:???
ん?なんで(A B C)は(A . (B . (C nil)))で(A . (B . C))じゃないんだ?

455(-_-)さん:2013/06/08(土) 21:15:37 ID:???
プログラミング言語NuでLispプログラミング 〜S式の使い方〜 (1/3):CodeZine
http://codezine.jp/article/detail/4835

ツリー構造じゃなくリスト構造ぽい?

456(-_-)さん:2013/06/08(土) 21:19:16 ID:???
知らんがな

457(-_-)さん:2013/06/08(土) 21:21:42 ID:???
リストプロセッサーの略がLispなんだからリスト構造

458(-_-)さん:2013/06/08(土) 21:34:26 ID:???
>>452
純LISP + 評価前にマクロと準クォートの展開、エラー検出、文字列型、loopとreturnで繰り返し出来るようにしたよー
>>453
作る前は簡単だと思うけど思わぬところで詰まって鬱にならないように気をつけたほうがいいと思う

459(-_-)さん:2013/06/08(土) 22:25:29 ID:???
>>452
これcond、quote 、lambda、defineが何なのか説明してないとか説明不足すぎだんろ

460(-_-)さん:2013/06/08(土) 22:28:20 ID:???
>>452
これの説明つかわれてるatom[(A B)]とかの表記ってM式か、なんで日本語WikipediaにはM式の説明がないんだよ

461(-_-)さん:2013/06/08(土) 22:38:41 ID:???
>>454
(A . (B . C)) は (A (B C)) を表す

462(-_-)さん:2013/06/08(土) 22:46:43 ID:???
ドット カッコが連続して表示されてるところだけ省略されるから(A B . C)

463(-_-)さん:2013/06/08(土) 22:55:18 ID:???
うむ

464(-_-)さん:2013/06/08(土) 23:03:27 ID:???
むずかしいな

465(-_-)さん:2013/06/08(土) 23:12:36 ID:???
何使って作ってるの?

466(-_-)さん:2013/06/09(日) 01:00:43 ID:???
Scheme(Lisp)の日本語解説

http://people.csail.mit.edu/jaffer/r5rsj_toc.html

467(-_-)さん:2013/06/09(日) 01:01:47 ID:???
Revised(5) Report on the Algorithmic Language Scheme - 7. 標準手続き
http://people.csail.mit.edu/jaffer/r5rsj_8.html#SEC60

468(-_-)さん:2013/06/09(日) 01:06:11 ID:???
>>465
これから純Lispを作る
どの言語で作るかはまだ決めてない
手持ちの環境は Visual Basic(VS2010), C#(VS2010), C++(VS2010, Borland, Watcom), Java7, ActionScript(Flex SDK), Perl(Strawberry), PHP は揃えた
ほかにブラウザで使えるJavaScript, JScript, VBScript、MS Office付属のVBA がある

469(-_-)さん:2013/06/09(日) 01:31:42 ID:???
The LISP Programming System
http://www-formal.stanford.edu/jmc/recursive/node4.html

これのとおりに実装すりゃいいのかな

470(-_-)さん:2013/06/09(日) 01:37:16 ID:???
先にlisp処理系入れてみてcons,car,cdrで遊んでみればいいと思う

471(-_-)さん:2013/06/09(日) 03:00:04 ID:???
ひとまず分かったこと
lispは難しい

472(-_-)さん:2013/06/09(日) 04:22:57 ID:???
こんなかんじか

function hoge(str, list){
 var i, c, s, newlist, t = 0;
 /** t
  *  0 一つ目の要素の読み取り開始前段階
  *  1 一つ目の要素はシンボルで読み取り中
  *  2 一つ目の要素はリスト
  *  3 一つ目の要素を登録完了
  *  4 一つ目の要素と二つ目の要素を繋ぐ'.'読み取り前段階
  *  5 二つ目の要素の読み取り開始前段階
  *  6 二つ目の要素はシンボルで読み取り中
  *  7 二つ目の要素はリスト
  **/
 for (i = 0; i < str.length; i++) {
  c = str.charAt(i);
  if (c == '(') {
   if (t == 0) { //一つ目の要素はリスト
    newlist = new Array();
    i += hoge(str.substring(i + 1), newlist);
    t = 2;
   } else if (t == 4) { // . の省略、二つ目の要素はリスト(そのリストの一つ目の要素がリスト)
    newlist = new Array();
    i += hoge(str.substring(i), newlist);
    t = 7;
   } else {
    throw new SyntaxError();
   }
  
  } 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 は空のリストになる
    throw new SyntaxError();
   }
   return i + 1;
  
  } else if (c == ' ') {
   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 {
    throw new SyntaxError();
   }
   
  } else if (c == '.') {
   if (t == 3) { //このリストは略式でない
    t = 4;
   } else {
    throw new SyntaxError();
   }
   
  } else {
   if (t == 0) { //一つ目の要素のシンボル開始
    s = c;
    t = 1;
   } else if ((t == 1) || (t == 6)) { //シンボル文字が続く
    s += c;
   } else if (t == 4) { // . が省略されてるので二つ目の要素はリスト(そのリストの一つ目の要素がシンボル)
    newlist = new Array();
    i += hoge(str.substring(i), newlist);
    t = 7;
   } else if (t == 5) { //二つ目の要素のシンボル開始
    s = c;
    t = 6;
   } else {
    throw new SyntaxError();
   }
  }
 }
 return i;
}

list = new Array();
try {
 hoge(str.replace(/\./," . ").replace(/ +/,' '), list);
 list = list[0]; //listの最初要素が分解したものとなる
} catch(SyntaxError se) {
 alert('Syntax Error!');
 list = null;
}

473(-_-)さん:2013/06/09(日) 04:26:13 ID:???
試してないから動くか知らんけど
分解したあとは順次処理してけばOKやろ

474(-_-)さん:2013/06/09(日) 04:31:51 ID:???
ああ最後のほうミスってるな
for文抜けたあとの return i; は間違いだわ
>>472は無しな

475(-_-)さん:2013/06/09(日) 04:50:14 ID:???
修正版

function hoge(str, p, list){
 var i, c, s, newlist, t = 0;
 /** t
  *  0 一つ目の要素の読み取り開始前段階
  *  1 一つ目の要素はシンボルで読み取り中
  *  2 一つ目の要素はリスト
  *  3 一つ目の要素を登録完了
  *  4 一つ目の要素と二つ目の要素を繋ぐ'.'読み取り前段階
  *  5 二つ目の要素の読み取り開始前段階
  *  6 二つ目の要素はシンボルで読み取り中
  *  7 二つ目の要素はリスト
  **/
 if ((p == 0) && (str.charAt(0) != '(')) {
  throw new SyntaxError();
 }
 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 == 4) { // . の省略、二つ目の要素はリスト(そのリストの一つ目の要素がリスト)
    newlist = new Array();
    i += hoge(str, i, newlist);
    t = 7;
   } else {
    throw new SyntaxError();
   }
  
  } 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 は空のリストになる
    throw new SyntaxError();
   }
   return i + 1;
  
  } else if (c == ' ') {
   if (p == 0) { //一番外側の括弧である必要があり構文エラー
    throw new SyntaxError();
   }
   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 {
    throw new SyntaxError();
   }
   
  } else if (c == '.') {
   if (t == 3) { //このリストは略式でない
    t = 4;
   } else {
    throw new SyntaxError();
   }
   
  } else {
   if (t == 0) { //一つ目の要素のシンボル開始
    s = c;
    t = 1;
   } else if ((t == 1) || (t == 6)) { //シンボル文字が続く
    s += c;
   } else if (t == 4) { // . が省略されてるので二つ目の要素はリスト(そのリストの一つ目の要素がシンボル)
    newlist = new Array();
    i += hoge(str, i, newlist);
    t = 7;
   } else if (t == 5) { //二つ目の要素のシンボル開始
    s = c;
    t = 6;
   } else {
    throw new SyntaxError();
   }
  }
 }
 if (p != 0) { //再帰呼び出しで文字列を読み取り終わってしまっている
  throw new SyntaxError();
 }
 if (t != 2) { //このエラーは発生しないはず
  throw new UnknownError();
 }
 list[0] = newlist;
 return i;
}

476(-_-)さん:2013/06/09(日) 04:50:31 ID:???
修正版つづき

list = new Array();
try {
 hoge(str.replace(/\./," . ").replace(/ +/," ").replace(/ $/,""), 0, list);
 list = list[0]; //listの最初要素が分解したものとなる
} catch(SyntaxError se) {
 alert('Syntax Error!');
 list = null;
}

477(-_-)さん:2013/06/09(日) 04:52:36 ID:???
あー、今気づいた、>>475-476も無しね
致命的なミスがあるわ

478(-_-)さん:2013/06/09(日) 05:18:21 ID:???
たしかにlisp難しいね

479(-_-)さん:2013/06/09(日) 05:18:42 ID:???
パーサー(?)ってので手こずって俺ダメぽ

480(-_-)さん:2013/06/09(日) 05:34:46 ID:???
もう眠いから修正は明日にするわ、おやすみ

481(-_-)さん:2013/06/09(日) 13:10:05 ID:???
このhogeがパーサーの部分を実装してるのだとしたら
字句解析とそれを内部データでS式を表現するreadに分けるべきだと思う

482(-_-)さん:2013/06/09(日) 14:49:33 ID:???
昨夜気づいた問題を修正した版

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;
}

483(-_-)さん:2013/06/09(日) 14:51:01 ID:???
続き テスト用メソッド


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;
 }
}

484(-_-)さん:2013/06/09(日) 15:02:31 ID:???
>>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;
}

485(-_-)さん:2013/06/09(日) 15:03:31 ID:???
>>481
そこらへんはまぁよく分からんから
動作したもん勝ちでしょみたいなスタンスで行ってる

486(-_-)さん:2013/06/09(日) 15:05:13 ID:???
このスパゲッティはちゃんと動くの?

487(-_-)さん:2013/06/09(日) 15:11:59 ID:???
>>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;
}

488(-_-)さん:2013/06/09(日) 15:15:55 ID:???
書き忘れた、テスト用の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>

489(-_-)さん:2013/06/09(日) 15:17:10 ID:???
lisp3.jsの3は
lispのメモをlisp.txt,list2.txt,list3.txtときて
lisp3.txtにコード書いてたから名前修正してlisp3.jsになった

490(-_-)さん:2013/06/09(日) 15:19:28 ID:???
lisp.txtには以前調べたCommon Lispの一部の文法や関数がメモしてあって
lisp2.txtには純Lispの関数と特別式についてメモしてある
んでlisp3.txtにコードをつらつら書いてて>>475-476の時点までは未テストのlisp3.txtだった

491(-_-)さん:2013/06/09(日) 15:21:24 ID:???
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;
 }

492(-_-)さん:2013/06/09(日) 15:22:54 ID:???
testメソッドは今んとこ改行を考慮してないから改行を入れたりするとSyntax Errorになる

493(-_-)さん:2013/06/09(日) 15:24:45 ID:???
予定としてはひとまず
hoge2にcondとlambdaとlabelを追加するけど
labelがいわゆる変数ってやつなのかな、ググっても出てこんかった
defineと同義ならそれでいんだけど

494(-_-)さん:2013/06/09(日) 15:26:46 ID:???
ちなみに思いつきで書いてるからメソッド名や変数名が簡易になってるけど、まぁあとで修正すべきとこかもね(可読性のために)
hoge内の有限オートマトン(ってやつ?)に使ってる t に代入する値も本来はenumみたいな定数群を用意してやるべきだし

495(-_-)さん:2013/06/09(日) 15:28:21 ID:???
まあ動けばいいよ

496(-_-)さん:2013/06/09(日) 15:54:07 ID:???
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;
}

497(-_-)さん:2013/06/09(日) 15:56:38 ID:???
あとは変数の問題が出てくるlambdaとlabelか
スコープとかいう問題とか処理大変そうだな
風呂入ってくる

498(-_-)さん:2013/06/09(日) 16:00:12 ID:???
何か適当なLispを使ったことなく想像だけで作ってるから動作がどの程度あってるか分からんが、まぁ趣味だしどうでもいいか

499(-_-)さん:2013/06/09(日) 16:02:35 ID:???
lispってリスト構造かと思ったら2分木な処理になってもうた

500(-_-)さん:2013/06/09(日) 16:05:23 ID:???
condの処理が少々おかしいのか?
あとtenkaiとtenkai2も足りない処理があってエラーになってもうた

501(-_-)さん:2013/06/09(日) 16:08:02 ID:???
修正版 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;
}

502(-_-)さん:2013/06/09(日) 16:09:47 ID:???
そういや大文字小文字の区別ってあったっけか?まぁそう難しい処理でもないから問題ないけど
んじゃ一区切りついたから風呂入ってくるわ

503(-_-)さん:2013/06/09(日) 16:19:07 ID:???
大文字小文字は区別ないか、ならhoge内でlistに登録するときに一括大文字変換しとくか

504(-_-)さん:2013/06/09(日) 16:22:10 ID:???
hoge内の
list[0] = s; → list[0] = s.toUpperCase();
list[1] = s; → list[1] = s.toUpperCase();
に置き換え
lisp3.jsのファイル内全体で"nil"を"NIL"に置き換えた

505(-_-)さん:2013/06/09(日) 16:23:42 ID:???
あとhoge2内の関数名識別のところ
s == "atom" とかを s == "ATOM" に置き変えた

506(-_-)さん:2013/06/09(日) 16:27:12 ID:???
さっさと風呂に入るか、暗くなっちまうな

507(-_-)さん:2013/06/09(日) 18:12:12 ID:???
さて風呂から上がったが、家事の一部を任されてるのでそれをサボったら激おこぷんぷん丸されるので作業はまたあとで・・・

508(-_-)さん:2013/06/09(日) 18:29:37 ID:???
変数を導入するにあたり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");

509(-_-)さん:2013/06/09(日) 18:34:48 ID:???
しかし、この変更で大幅な修正が必要になってくるな、最初から管理クラス作ってからやればよかったんだけど
面倒だったから後回しにしたのがダメだったぽ

510(-_-)さん:2013/06/09(日) 18:37:40 ID:???
ちなみにこの仮名ListDataは戻り値等にも使う
new ListData(fQuote, "func")
とか
new ListData(list, "lambda")
とか
new ListData(null, "error")
などとしたりして戻り値の状態も管理できるようにする予定

511(-_-)さん:2013/06/09(日) 18:39:10 ID:???
コード読むの面倒だから聞くけどドット記法はどうしてる?
(cons a b)でbがアトムなら(a . b)になるけどリストでS式を表現してたらこれ面倒じゃない?




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