2015年6月30日火曜日

開発環境

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

Land of Schemeで必要になった、 read 手続き、read-line 手続きを実装。(read-line 手続きは、readline library を利用)

参考書籍等

kscheme

コード(BBEdit, Emacs)

prim_io_procedures.c

#include "prim_io_procedures.h"

#include "list_operations.h"
#include "empty.h"
#include "undef.h"
data_s prim_io_write(data_s in) {
  if (cdr(in).type == EMPTY)
    data_s_print(stdout, car(in));
  else
    data_s_print(cadr(in).data.output_port.port, car(in));
  return undef_data;
}

#include "string.h"
data_s prim_io_display(data_s in) {
  data_s t = car(in);
  if (cdr(in).type == EMPTY) {
    if (t.type == STRING)
      string_display(stdout, t.data.str);
    else
      data_s_print(stdout, t);
  } else {
    if (t.type == STRING) {
      string_display(cadr(in).data.output_port.port, t.data.str);
    } else
      data_s_print(cadr(in).data.output_port.port, t);
  }
  return undef_data;
}

data_s prim_io_newline(data_s in) {
  if (in.type == EMPTY)
    fprintf(stdout, "\n");
  else
    fprintf(car(in).data.output_port.port, "\n");
  return undef_data;
}

data_s prim_io_open_input_file(data_s in) {
  return data_s_new(PORT_INPUT_TEXT, car(in).data.str);
}
data_s prim_io_open_output_file(data_s in) {
  return data_s_new(PORT_OUTPUT_TEXT, car(in).data.str);
}
data_s prim_io_open_binary_output_file(data_s in) {
  return data_s_new(PORT_OUTPUT_BINARY, car(in).data.str);
}

#include "port_output_text.h"
#include "port_output_binary.h"
#include "none.h"
data_s prim_io_close_port(data_s in) {
  data_s t = car(in);
  if (t.type == PORT_INPUT_TEXT)
    return port_output_text_close(t);
  if (t.type == PORT_OUTPUT_BINARY)
    return port_output_binary_close(t);
  return none_data;
}
data_s prim_io_close_output_port(data_s in) {
  data_s t = car(in);
  if (t.type == PORT_INPUT_TEXT)
    return port_output_text_close(t);
  if (t.type == PORT_OUTPUT_BINARY)
    return port_output_binary_close(t);

  return none_data;
}

#include <readline/readline.h>
data_s prim_io_readline(data_s in) {
  char *line = NULL;
  if (in.type == EMPTY) line = readline("");
  return data_s_new(STRING, line);
}

#include "kread.h"
data_s prim_io_read(data_s in) {
  data_s out;
  if (in.type == EMPTY) out = kread(stdin);
  return out;
}

入出力結果(Terminal(kscm), REPL(Read, Eval, Print, Loop))

$ kscheme 
kscm> (read)
Scheme
Scheme
kscm> (read-line)
Scheme
"Scheme"
kscm> (define a (read))
kscheme
kscm> (symbol? a)
#t
kscm> (define a (read))
"kscheme"
kscm> a
"kscheme"
kscm> (symbol? a)
#f
kscm> (define a (read-line))
kamimura
kscm> (symbol? a)
#f
kscm> a
"kamimura"
kscm> $

0 コメント:

コメントを投稿