開発環境
- 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ではなく、関数を呼び出すとか))を少しずつ書き進めてめていくことに。
Land of Schemeで、リダイレクトでファイルの内容を読み込ませる方法だと、対話的に入力(read 手続き、read-line 手続き)を受けつけることができないから、コマンドライン引数でファイルをが指定された場合は、その内容を読み込んで評価するように実装。
参考書籍等
- 計算機プログラムの構造と解釈[第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)
main.c
#include "data.h"
#include "list_operations.h"
#include "stack.h"
#include <string.h>
#include <errno.h>
#include "stopif.h"
#include "environment.h"
#include "evaluator.h"
#include "repl.h"
int main(int args, char **argv) {
data_s memory[2][memory_size];
cars = memory[0];
cdrs = memory[1];
char memory_markers[memory_size];
memset(memory_markers, 0, sizeof(memory_markers));
markers = memory_markers;
data_s_fns_init();
global_environment = setup_environment();
eval_fns_init();
FILE *in_fh;
if (args > 1) {
in_fh = fopen(argv[1], "r");
Stopif(!in_fh, exit(1), "%s", strerror(errno));
} else
in_fh = stdin;
read_eval_print_loop(in_fh);
}
repl.c
#include "repl.h"
#include "stack.h"
#include "kread.h"
#include "evaluator.h"
#include "environment.h"
#include "data.h"
static void print_result();
void read_eval_print_loop(FILE *in) {
if (in == stdin)
while (1) {
initialize_stack();
printf("kscm> ");
expr = data_s_free(expr);
expr = kread(in);
env = global_environment;
eval_dispatch();
print_result();
}
else {
initialize_stack();
expr = kread(in);
env = global_environment;
eval_dispatch();
print_result();
}
}
static void print_result() {
if (val.type != NONE) {
data_s_print(stdout, val);
printf("\n");
}
}
入出力結果(Terminal(kscm), REPL(Read, Eval, Print, Loop))
$ kscheme sample.scm 入力1: Scheme Scheme Scheme 入力2: C言語 C言語 "C言語" done $
0 コメント:
コメントを投稿