2015年7月8日水曜日

開発環境

Schemeの処理系(解釈系、評価器、レジスタ計算機を翻訳した命令列中心のより、もう少しC言語の特性を使った書き方をしたもの(label, gotoではなく、関数を呼び出すとか))を少しずつ書き進めてめていくことに。

Land of Schemeで今後必要になりそうな、記号を文字列に変換したものを返す手続き(symbol->string)を実装。

参考書籍等

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 コメント:

コメントを投稿