レス数が1スレッドの最大レス数(1000件)を超えています。残念ながら投稿することができません。
ヒッキープログラミングスレ
プログラミングの話題のスレ
質問・相談
初心者からプロまで
プログラミングに関することなら何でもOK
>>421
ヒントありがと
参考にする
なんか難しそうな話してんな
ハイレベルすぎるは
これを難しいとか言う奴はどういうことしてるんだろう
言語そのものを作るってのはかなり趣味の濃いとこじゃねの
GCの実装のバグが直せないから寝れない
>>426
それ以前の問題な気がする
データ構造とかの話は入門書などに書いてある範疇からは超えてる
新しい言語はライブラリが豊富だから細かいことは気にせず楽ちんに色々作れる
×新しい言語
○最近の言語
Cを投げ捨ててpythonとかjavaで書きたいけどここで逃げるわけにはいかない
pythonみたいなスクリプト系とかjavaとかはプラットフォーム依存度が低いから扱いやすそう
cはプラットフォーム依存度とかどこのコンパイラかでかなり違うというのが面倒そう
GCってメモリ管理も作るとかすげえな
そういえばこんなスレあったっけ
>>434
お前さては>>1 だな
違うよ、昔ヒキ板(本家)にこういうスレあったっけって思ったんだ
確かに時期的にこのスレの>>1 でもおかしくはないな
んだ
今はmciSendStringを使ったMP3プレーヤーでも作ってみようかと挑戦中
Windowsね
本スレ書き込めねぇ…
無慈悲な規制
書き込みたいことがあるならこっちに書き込めばいいと思うよ
mciSendStringなかなか面白いけどVB6から使うのはやや不便かな
いい加減VB6なんて捨てたら
せっかく買ったもんだから減価償却したいし
Cでlispインタプリタ作るの挫折してJavaで作りなおしたら3日で完成した
今までの苦労は何だったんだ
Shell32.dllメモ
ShellオブジェクトのFolderクラスのメソッドGetDetailsOfの第一引数にNull(?)を渡すと第二引数に対応するプロパティ名が取得できた
Shell32.dllメモ
ShellFolderItemクラスのExtendedPropertyに指定するプロパティ名は日本語プロパティ名の指定では取得できなかった
また英語でも取得できないものがいくつかあった
結局Cを投げ捨てちゃったのか
lispって引数を再帰的にリストとして処理してけばいいんしょ
違うよ
一つ目の引数を関数として評価したあと2つ目以降の引数を評価したものを一つ目で出来た関数に渡すんだよ
3日で作るとかこのレベルかね
純LISP - Wikipedia
https://ja.wikipedia.org/wiki/%E7%B4%94LISP
S-expression - Wikipedia, the free encyclopedia
https://en.wikipedia.org/wiki/S-expression
ようはS式のツリー構造で順番で処理してけばいいんしょ
たぶんきっと簡単に作れそう
ん?なんで(A B C)は(A . (B . (C nil)))で(A . (B . C))じゃないんだ?
プログラミング言語NuでLispプログラミング 〜S式の使い方〜 (1/3):CodeZine
http://codezine.jp/article/detail/4835
ツリー構造じゃなくリスト構造ぽい?
知らんがな
リストプロセッサーの略がLispなんだからリスト構造
>>452
純LISP + 評価前にマクロと準クォートの展開、エラー検出、文字列型、loopとreturnで繰り返し出来るようにしたよー
>>453
作る前は簡単だと思うけど思わぬところで詰まって鬱にならないように気をつけたほうがいいと思う
>>452
これcond、quote 、lambda、defineが何なのか説明してないとか説明不足すぎだんろ
>>452
これの説明つかわれてるatom[(A B)]とかの表記ってM式か、なんで日本語WikipediaにはM式の説明がないんだよ
>>454
(A . (B . C)) は (A (B C)) を表す
ドット カッコが連続して表示されてるところだけ省略されるから(A B . C)
うむ
むずかしいな
何使って作ってるの?
Scheme(Lisp)の日本語解説
http://people.csail.mit.edu/jaffer/r5rsj_toc.html
Revised(5) Report on the Algorithmic Language Scheme - 7. 標準手続き
http://people.csail.mit.edu/jaffer/r5rsj_8.html #SEC60
>>465
これから純Lispを作る
どの言語で作るかはまだ決めてない
手持ちの環境は Visual Basic(VS2010), C#(VS2010), C++(VS2010, Borland, Watcom), Java7, ActionScript(Flex SDK), Perl(Strawberry), PHP は揃えた
ほかにブラウザで使えるJavaScript, JScript, VBScript、MS Office付属のVBA がある
The LISP Programming System
http://www-formal.stanford.edu/jmc/recursive/node4.html
これのとおりに実装すりゃいいのかな
先にlisp処理系入れてみてcons,car,cdrで遊んでみればいいと思う
ひとまず分かったこと
lispは難しい
こんなかんじか
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;
}
試してないから動くか知らんけど
分解したあとは順次処理してけばOKやろ
ああ最後のほうミスってるな
for文抜けたあとの return i; は間違いだわ
>>472 は無しな
修正版
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;
}
修正版つづき
list = new Array();
try {
hoge(str.replace(/\./," . ").replace(/ +/," ").replace(/ $/,""), 0, list);
list = list[0]; //listの最初要素が分解したものとなる
} catch(SyntaxError se) {
alert('Syntax Error!');
list = null;
}
あー、今気づいた、>>475-476 も無しね
致命的なミスがあるわ
たしかにlisp難しいね
パーサー(?)ってので手こずって俺ダメぽ
もう眠いから修正は明日にするわ、おやすみ
このhogeがパーサーの部分を実装してるのだとしたら
字句解析とそれを内部データでS式を表現するreadに分けるべきだと思う
昨夜気づいた問題を修正した版
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) にはなってるはずだよ(そんなたくさんテストしてないから分からんけど)
スマートフォン版
掲示板管理者へ連絡
無料レンタル掲示板