2015年7月2日木曜日

開発環境

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

Land of Schemeで、リダイレクトでファイルの内容を読み込ませる方法だと、対話的に入力(read 手続き、read-line 手続き)を受けつけることができないから、コマンドライン引数でファイルをが指定された場合は、その内容を読み込んで評価するように実装。

参考書籍等

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

コメントを投稿