OSDN Git Service

delete functions of vector and table.
authorvisor <visor@users.sourceforge.jp>
Tue, 31 Mar 2015 14:13:49 +0000 (23:13 +0900)
committervisor <visor@users.sourceforge.jp>
Tue, 31 Mar 2015 14:13:49 +0000 (23:13 +0900)
lib/ml.cc
lib/ml.h
modules/ml-texp.cc
modules/ml-texp.h

index 16d44b9..de1604a 100644 (file)
--- a/lib/ml.cc
+++ b/lib/ml.cc
@@ -220,6 +220,21 @@ void  MNode::vectorPut (size_t pos, MNode* e) {
     vector->put (pos, e);
 }
 
+MNode*  MNode::vectorDel (size_t from, size_t to) {
+    if (type != MC_VECTOR)
+       throw (uErrorWrongType );
+    MNode*  ans = vector->get (from);
+    size_t  n = vector->size ();
+    ++ to;
+    if (from < to) {
+       for (; to < n; ++ from, ++ to) {
+           vector->put (from, vector->get (to));
+       }
+       vector->resize (from);
+    }
+    return ans;
+}
+
 void  MNode::vectorPush (MNode* e) {
     if (type != MC_VECTOR)
        throw (uErrorWrongType );
@@ -250,6 +265,14 @@ void  MNode::tablePut (const ustring& name, MNode* e) {
     table->setVar (name, e);
 }
 
+MNode*  MNode::tableDel (const ustring& name) {
+    if (type != MC_TABLE)
+       throw (uErrorWrongType );
+    MNode*  ans = table->getVar (name);
+    table->eraseVar (name);
+    return ans;
+}
+
 double  MNode::to_double () {
     switch (type) {
     case MNode::MC_NIL:
index e7651b6..e876bec 100644 (file)
--- a/lib/ml.h
+++ b/lib/ml.h
@@ -158,11 +158,13 @@ class  MNode {
     MNode*  vectorGet (size_t pos);
     size_t  vectorSize ();
     void  vectorPut (size_t pos, MNode* e);
+    MNode*  vectorDel (size_t from, size_t to);
     void  vectorPush (MNode* e);
     MNode*  vectorPop ();
     void  vectorResize (size_t pos);
     MNode*  tableGet (const ustring& name);
     void  tablePut (const ustring& name, MNode* e);
+    MNode*  tableDel (const ustring& name);
     double  to_double ();
     int  to_int () {
        return (int)to_double ();
index 639615a..49cacab 100644 (file)
@@ -145,6 +145,39 @@ MNode*  ml_vector_put (MNode* cell, MlEnv* mlenv) {
 }
 
 /*DOC:
+===vector-del===
+ (vector-del VECTOR FROM [TO]) -> VALUE
+
+*/
+//#AFUNC       vector-del      ml_vector_del
+//#WIKIFUNC    vector-del
+MNode*  ml_vector_del (MNode* cell, MlEnv* mlenv) {
+    MNode*  arg = cell->cdr ();
+    MNodePtr  vec;
+    int  from, to;
+
+    if (! arg)
+       throw (uErrorWrongNumber);
+    vec = eval (arg->car (), mlenv);
+    nextNodeNonNil (arg);
+    from = eval_int (arg->car (), mlenv);
+    nextNode (arg);
+    if (arg) {
+       to = eval_int (arg->car (), mlenv);
+       nextNode (arg);
+    } else {
+       to = from;
+    }
+    if (arg)
+       throw (uErrorWrongNumber);
+
+    if (! isVector (vec ()))
+       throw (uErrorWrongType);
+
+    return vec ()->vectorDel (from, to);
+}
+
+/*DOC:
 ===vector-push===
  (vector-push VECTOR VALUE) -> VALUE
 
@@ -539,6 +572,32 @@ MNode*  ml_table_put (MNode* cell, MlEnv* mlenv) {
 }
 
 /*DOC:
+===table-del===
+ (table-del TABLE NAME) -> VALUE
+
+*/
+//#AFUNC       table-del       ml_table_del
+//#WIKIFUNC    table-del
+MNode*  ml_table_del (MNode* cell, MlEnv* mlenv) {
+    MNode*  arg = cell->cdr ();
+    MNodePtr  tbl;
+    ustring  name;
+
+    if (! arg)
+       throw (uErrorWrongNumber);
+    tbl = eval (arg->car (), mlenv);
+    nextNodeNonNil (arg);
+    name = eval_str (arg->car (), mlenv);
+    nextNode (arg);
+    if (arg)
+       throw (uErrorWrongNumber);
+
+    if (! isTable (tbl ()))
+       throw (uErrorWrongType);
+    return tbl ()->tableDel (name);
+}
+
+/*DOC:
 ===table-append===
  (table-append TABLE1 TABLE2...) -> TABLE1
 
index 755407e..bd845ad 100644 (file)
@@ -82,6 +82,7 @@ MNode*  ml_vector_get (MNode* cell, MlEnv* mlenv);
 MNode*  ml_vector_back (MNode* cell, MlEnv* mlenv);
 MNode*  ml_vector_size (MNode* cell, MlEnv* mlenv);
 MNode*  ml_vector_put (MNode* cell, MlEnv* mlenv);
+MNode*  ml_vector_del (MNode* cell, MlEnv* mlenv);
 MNode*  ml_vector_push (MNode* cell, MlEnv* mlenv);
 MNode*  ml_vector_pop (MNode* cell, MlEnv* mlenv);
 MNode*  ml_vector_append (MNode* cell, MlEnv* mlenv);
@@ -93,6 +94,7 @@ MNode*  ml_vector_each (MNode* cell, MlEnv* mlenv);
 MNode*  ml_table (MNode* cell, MlEnv* mlenv);
 MNode*  ml_table_get (MNode* cell, MlEnv* mlenv);
 MNode*  ml_table_put (MNode* cell, MlEnv* mlenv);
+MNode*  ml_table_del (MNode* cell, MlEnv* mlenv);
 MNode*  ml_table_append (MNode* cell, MlEnv* mlenv);
 MNode*  ml_table_to_list (MNode* cell, MlEnv* mlenv);
 MNode*  ml_table_eval (MNode* cell, MlEnv* mlenv);