開発環境
- 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で今後必要になりそうな、記号を文字列に変換したものを返す手続き(symbol->string)を実装。
参考書籍等
- 計算機プログラムの構造と解釈[第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)
symbol.c
#include "symbol.h"
#include <glib.h>
#include <string.h>
GHashTable *obarray;
data_s symbol_new(char *in) {
char *s = g_hash_table_lookup(obarray, in);
if (!s) {
s = strdup(in);
g_hash_table_insert(obarray, in, s);
}
return (data_s){.type = SYMBOL, .data.symbol = s};
}
void symbol_print(FILE *stream, data_s in) {
fprintf(stream, "%s", in.data.symbol);
}
bool symbol_is_eq(data_s in1, data_s in2) {
return in1.data.symbol == in2.data.symbol;
}
#include "list_operations.h"
#include "boolean.h"
data_s prim_is_symbol(data_s in) {
data_s t = car(in);
return t.type == SYMBOL ? true_data : false_data;
}
data_s prim_symbol2string(data_s in) {
return data_s_new(STRING, car(in).data.symbol);
}
入出力結果(Terminal(kscm), REPL(Read, Eval, Print, Loop))
$ kscheme kscm> symbol->string #<primitive-procedure symbol->string> kscm> (symbol->string 'a) "a" kscm> (symbol->string 'scheme) "scheme" kscm> (symbol->string (quote a)) "a" kscm> (symbol->string (quote scheme)) "scheme" kscm> $
0 コメント:
コメントを投稿