#if !defined(myeval_h)
#include "lispparse.h"
#include "kanji.h"

enum {
  ENTITY_EMPTY = -1,
  ENTITY_ATOM = 0, ENTITY_STRING, ENTITY_INTEGER, ENTITY_CONS,
  ENTITY_ARRAY,
  /* ここからは実際の型として存在しないものになる。*/
  ENTITY_LIST,
} ;

enum {
  SKKLISP_STRING_NORMAL = 0, SKKLISP_STRING_BACKSLASH, 
  SKKLISP_STRING_HEX, SKKLISP_STRING_OCT,
} ;

#ifndef ERR
#define ERR	(-1)
#define NOERR	(0)
#endif

/*
 * conspair を表現する構造体。
 */
struct skkinputlisp_conspair {
  struct skkinputlisp_entity *left ;
  struct skkinputlisp_entity *right ;
} ;

/*
 * 配列を表現する構造体。
 */
struct skkinputlisp_array {
  int length ;
  struct skkinputlisp_entity **array ;
} ;

struct skkinputlisp_entity {
  int type ;			/* 文字列とかリスト型だとかそういうの。*/
  union {
    struct myChar *string ;     /* 文字列 もしくは atom の名前。*/
    struct skkinputlisp_conspair conspair ;
    				/* リストである。cons pair のこともある。*/
    struct skkinputlisp_array array ;
    int integer ;		/* 数値。便利かなあと int でもつ。*/
  } data ;
  unsigned long count ;		/* 参照されている数。*/

  struct skkinputlisp_entity	/* リストにして繋ぐ時に利用する。*/
  *prev, *next ;
} ;

/*
 * skkinputlisp の変数を表現する構造体。
 */
struct skkinputlisp_variable {
  struct myChar *name ;
  struct skkinputlisp_entity *value ;
  struct skkinputlisp_variable *next ;
} ;

/*
 * skkinputlisp の user define 関数を表現する構造体。
 */
struct skkinputlisp_ufunction {
  struct myChar *name ;		/* 名前。*/
  struct conslist *function ;	/* ここに関数の実体が入る。実際にはここを
				   解釈して動作することになる。*/
  struct skkinputlisp_ufunction *next ;
} ;

/*
 * 関数テーブルに利用する。
 */
struct skkinputlisp_function {
  unsigned char *name ;
  struct skkinputlisp_entity *(*func)
    ( struct conslist *top, struct skkinputlisp_variable *vlisttop ) ;
} ;

#endif

