Scallop

ループでEval(その1)

evalを再帰で書くとすぐStackOverflowExceptionで死んじゃうので、ループで書いてみようという試み。 単純に走査するだけのコードを前回のエントリで書いたので、それを使いつつ。 こんな感じ。 using System; using System.Collections.Generic; abstract c…

S式の要素を走査する

再帰とループの2通りの方法でS式(リスト)を走査してみる。ループの方はスタックの使い方これでいいのかよくわからんけど。 using System; using System.Collections.Generic; abstract class SExp { } class Pair : SExp { public SExp Car { get; private…

階乗計算

言語が提供するコールスタックを利用せずに再帰の要領で計算したくなった。特にオチは無い。 using System; using System.Collections.Generic; class App { static public void Main(string[] args) { const int N = 6; //////////////////////////////////…

継続を伴った引数つきgoto

タイトルの実装方法が分からずに、ずっと止まってる。処理系のソースを読めば分かると思うけど、なんか悔しいので、自分で試行錯誤して作りたい。 まず「継続を伴った」に関して。継続渡し形式なんてものを以前に考えたことがある。それは「次に何をすべきか…

環境と継続

現在のsacallopでは、関数適用を次のような(うさん臭い)方法・手順で評価している。 先頭要素のlambda式の評価でクロージャを生成する時、不完全な環境フレーム(名前だけで、値がまだ対応付けられていない)を作って、クロージャに保持させる*1。 引数を…

純Lispにしたい

とりあえず、現時点で純LISPにはなってるみたい?自信ないけど。 http://d.hatena.ne.jp/yagiey/20101203/1291381516 いやいやいや、繰り返しの構文を持たないscallopにおいて関数適用の深さに限りがあるってことは、チューリング完全じゃないよな。ってこと…

scallop

ムラムラしてきたので、なんとなく俺Lisp作り始めた。SICPはもはや積読タワーで埃をかぶってます。 んで、ついでに先日作ったGitHubアカウントでリポジトリ(https://github.com/yagiey/scallop)を公開しておいた。ぼちぼち勉強しながらとりあえずはR5RSに…

手続きオブジェクト

defineを実装して、lambdaやらquoteやらも再定義可能にするには、手続きオブジェクトの内部表現を考えないと駄目だ、という結論に達した。 たとえば、 gosh> car #<subr car> とかいうやつ。 #で始まる値はリテラルで表現できないものらしい(id:yagiey:20090129:12332</subr>…

今後の課題

今回作ったevalだと、defineが無いから名前をつけられない。 defineでテーブルにエントリを追加しなきゃダメだなぁ。 あと、defineでテーブルに追加しても、現時点では以下のものはテーブルから探さずに、決まった処理してるので、再定義ができない。 lambda…

evalできた

evalはちゃんと勉強してから作りたかったけど、やっぱり気になって仕方がないので作ってみた。 データ構造(リストとアトム) 主要な手続き(consやcarやcdrなど) を定義して、あとはThe Little Schemerのvalue(id:yagiey:20081105以降)をそのままC#に移…