aboutsummaryrefslogtreecommitdiff
path: root/builtin.h
diff options
context:
space:
mode:
authorTeddy <ted.sybil@gmail.com>2013-08-02 20:51:05 +0800
committerTeddy <ted.sybil@gmail.com>2013-08-02 20:51:05 +0800
commitaf2da07be7d3f8a936640ef92b0692710a22e0d4 (patch)
tree4a93b65ea8514f7d647638c32a007f524bb1076f /builtin.h
parent1ec3b9d8e1ff352069a1356c4d59f53c7fc64e61 (diff)
transfering the implementation language to C++
Diffstat (limited to 'builtin.h')
-rw-r--r--builtin.h129
1 files changed, 129 insertions, 0 deletions
diff --git a/builtin.h b/builtin.h
new file mode 100644
index 0000000..a4468ae
--- /dev/null
+++ b/builtin.h
@@ -0,0 +1,129 @@
+#ifndef BUILTIN_H
+#define BUILTIN_H
+
+#include "model.h"
+#include <string>
+
+using std::string;
+
+/** @class BoolObj
+ * Booleans
+ */
+class BoolObj: public EvalObj {
+ private:
+ bool val; /**< true for #t, false for #f */
+ public:
+ BoolObj(bool);
+ bool is_true(); /**< Override EvalObj `is_true()` */
+#ifdef DEBUG
+ string _debug_repr();
+#endif
+ string ext_repr();
+};
+
+/** @class IntObj
+ * A simple implementation of integers
+ * Will be removed in the future
+ */
+class IntObj: public NumberObj {
+ private:
+ int val;
+ public:
+ IntObj(int);
+#ifdef DEBUG
+ string _debug_repr();
+#endif
+ string ext_repr();
+};
+
+/** @class FloatObj
+ * Floating point numbers
+ */
+class FloatObj: public NumberObj {
+ private:
+ double val;
+ public:
+ FloatObj(double);
+#ifdef DEBUG
+ string _debug_repr();
+#endif
+ string ext_repr();
+};
+
+
+/** @class SpecialOptIf
+ * The implementation of `if` operator
+ */
+class SpecialOptIf: public SpecialOptObj {
+ private:
+ unsigned char state; /**< 0 for prepared, 1 for pre_called */
+ /**
+ * The evaluator will call this after the <condition> exp is evaluated.
+ * And this function tells the evaluator which of <consequence> and
+ * <alternative> should be evaluted. */
+ void pre_call(ArgList *arg_list, Cons *pc,
+ Environment *envt);
+ /** The system will call this again after the desired result is
+ * evaluated, so just return it to let the evaluator know the it's the
+ * answer.
+ */
+ EvalObj *post_call(ArgList *arg_list, Cons *pc,
+ Environment *envt);
+ public:
+ SpecialOptIf();
+ void prepare(Cons *pc);
+ Cons *call(ArgList *arg_list, Environment * &envt,
+ Continuation * &cont, FrameObj ** &top_ptr);
+#ifdef DEBUG
+ string _debug_repr();
+#endif
+ string ext_repr();
+};
+
+/** @class SpecialOptLambda
+ * The implementation of `lambda` operator
+ */
+class SpecialOptLambda: public SpecialOptObj {
+ public:
+ SpecialOptLambda();
+ void prepare(Cons *pc);
+ Cons *call(ArgList *arg_list, Environment * &envt,
+ Continuation * &cont, FrameObj ** &top_ptr);
+
+#ifdef DEBUG
+ string _debug_repr();
+#endif
+ string ext_repr();
+};
+
+/** @class SpecialOptDefine
+ * The implementation of `define` operator
+ */
+class SpecialOptDefine: public SpecialOptObj {
+ public:
+ SpecialOptDefine();
+ void prepare(Cons *pc);
+ Cons *call(ArgList *arg_list, Environment * &envt,
+ Continuation * &cont, FrameObj ** &top_ptr);
+#ifdef DEBUG
+ string _debug_repr();
+#endif
+ string ext_repr();
+};
+
+/** @class SpecialOptSet
+ * The implementation of `set!` operator
+ */
+class SpecialOptSet: public SpecialOptObj {
+ public:
+ SpecialOptSet();
+ void prepare(Cons *pc);
+ Cons *call(ArgList *arg_list, Environment * &envt,
+ Continuation * &cont, FrameObj ** &top_ptr);
+#ifdef DEBUG
+ string _debug_repr();
+#endif
+ string ext_repr();
+};
+
+#endif