開発環境
- OS X Yosemite - Apple, Ubuntu (OS)
- Emacs (CUI)、BBEdit - Bare Bones Software, Inc. (GUI) (Text Editor)
- C (プログラミング言語)
- Clang/LLVM (コンパイラ, Xcode - Apple)
Schemeの処理系(解釈系、評価器、レジスタ計算機を翻訳した命令列中心のより、もう少しC言語の特性を使った書き方をしたもの(label, gotoではなく、関数を呼び出すとか))を少しずつ書き進めてめていくことに。
SICPで必要になった、 apply 手続きを実装。(可変長引数の手続きを扱えるようにするための、define の ドット末尾記法のサポートをどう実装するかは迷い中。)
参考書籍等
- 計算機プログラムの構造と解釈[第2版]
- Structure and Interpretation of Computer Programs (原書)
- R7RSHomePage – Scheme Working Groups
- Head First C ―頭とからだで覚えるCの基本
- 21st Century C: C Tips from the New School
- プログラミング言語C 第2版 ANSI規格準拠
- プログラミング言語Cアンサー・ブック 第2版
- C実践プログラミング 第3版
kscheme
コード(BBEdit, Emacs)
procedure_apply.c
#include "procedure_apply.h"
#include <string.h>
data_s procedure_apply_new(char *in) {
return (data_s){.type = APPLY, .data.proc_name = strdup(in)};
}
void procedure_apply_print(FILE *stream, data_s in) {
fprintf(stream, "#<primitive-procedure %s>", in.data.proc_name);
}
bool is_apply(data_s in) { return in.type == APPLY; }
apply.c
#include "apply.h"
#include "primitive_procedure.h"
#include "procedure.h"
#include "evaluator.h"
static void primitive_apply();
static void compound_apply();
#include "symbol.h"
#include "list_operations.h"
#include "procedure_apply.h"
void apply_dispatch() {
if (is_apply(proc)) {
proc = car(argl);
argl = cadr(argl);
apply_dispatch();
} else if (is_primitive_procedure(proc))
primitive_apply();
else if (is_procedure(proc))
compound_apply();
}
#include "stack.h"
static void primitive_apply() {
data_s_free(val);
val = apply_primitive_procedure(proc, argl);
}
#include "environment.h"
#include "sequence.h"
#include "list_operations.h"
#include "environment.h"
static void compound_apply() {
unev = data_s_free(unev);
unev = car(proc);
env = caddr(proc);
env = extend_environment(unev, argl, env);
unev = cadr(proc);
ev_sequence();
}
入出力結果(Terminal(kscm), REPL(Read, Eval, Print, Loop))
$ kscheme kscm> (apply + '(5 10)) 15 kscm> (apply + (list 5 10)) 15 kscm> (apply * '(5 10)) 50 kscm> (apply append '(() (1 2) (3 4 5) (6 7 8 9) (10))) (1 2 3 4 5 6 7 8 9 10) kscm> (apply (lambda (x y) (+ x y)) '(5 10)) 15 kscm> (apply (lambda (x) (+ x 1)) '(1)) 2 kscm> $
0 コメント:
コメントを投稿