+===eq===
+ (eq STRING STRING...) -> 1 or NIL
+ (string-eq STRING STRING...) -> 1 or NIL
+
+全てのSTRINGが同じ時、1を返す。
+
+*/
+//#AFUNC eq ml_string_eq
+//#AFUNC string-eq ml_string_eq
+//#WIKIFUNC eq
+//#WIKIFUNC string-eq
+MNode* ml_string_eq (MNode* cell, MlEnv* mlenv) {
+ MNode* arg = cell->cdr ();
+ ustring v1, v2;
+
+ if (! arg)
+ throw (uErrorWrongNumber);
+
+ v1 = eval_str (arg->car (), mlenv);
+ nextNode (arg);
+ while (arg) {
+ v2 = eval_str (arg->car (), mlenv);
+ if (v1 == v2) {
+ } else {
+ return newMNode_bool (false);
+ }
+ nextNode (arg);
+ }
+ return newMNode_bool (true);
+}
+
+/*DOC:
+===ne===
+ (ne STRING STRING) -> 1 or NIL
+ (string-ne STRING STRING) -> 1 or NIL
+
+STRINGが異なる時、1を返す。
+
+*/
+//#AFUNC ne ml_string_ne
+//#AFUNC string-ne ml_string_ne
+//#WIKIFUNC ne
+//#WIKIFUNC string-ne
+MNode* ml_string_ne (MNode* cell, MlEnv* mlenv) {
+ MNode* arg = cell->cdr ();
+ ustring v1, v2;
+
+ if (! arg)
+ throw (uErrorWrongNumber);
+
+ v1 = eval_str (arg->car (), mlenv);
+ nextNode (arg);
+ if (! arg)
+ throw (uErrorWrongNumber);
+ v2 = eval_str (arg->car (), mlenv);
+ nextNode (arg);
+ if (arg)
+ throw (uErrorWrongNumber);
+
+ return newMNode_bool (v1 != v2);
+}
+
+//#AFUNC lt ml_string_lt
+//#AFUNC string-lt ml_string_lt
+//#WIKIFUNC lt
+//#WIKIFUNC string-lt
+MNode* ml_string_lt (MNode* cell, MlEnv* mlenv) {
+ MNode* arg = cell->cdr ();
+ ustring v1, v2;
+
+ if (! arg)
+ throw (uErrorWrongNumber);
+ v1 = eval_str (arg->car (), mlenv);
+ nextNodeNonNil (arg);
+ v2 = eval_str (arg->car (), mlenv);
+ nextNode (arg);
+ if (arg)
+ throw (uErrorWrongNumber);
+
+ return newMNode_bool (v1 < v2);
+}
+
+//#AFUNC le ml_string_le
+//#AFUNC string-le ml_string_le
+//#WIKIFUNC le
+//#WIKIFUNC string-le
+MNode* ml_string_le (MNode* cell, MlEnv* mlenv) {
+ MNode* arg = cell->cdr ();
+ ustring v1, v2;
+
+ if (! arg)
+ throw (uErrorWrongNumber);
+ v1 = eval_str (arg->car (), mlenv);
+ nextNodeNonNil (arg);
+ v2 = eval_str (arg->car (), mlenv);
+ nextNode (arg);
+ if (arg)
+ throw (uErrorWrongNumber);
+
+ return newMNode_bool (v1 <= v2);
+}
+
+//#AFUNC gt ml_string_gt
+//#AFUNC string-gt ml_string_gt
+//#WIKIFUNC gt
+//#WIKIFUNC string-gt
+MNode* ml_string_gt (MNode* cell, MlEnv* mlenv) {
+ MNode* arg = cell->cdr ();
+ ustring v1, v2;
+
+ if (! arg)
+ throw (uErrorWrongNumber);
+ v1 = eval_str (arg->car (), mlenv);
+ nextNodeNonNil (arg);
+ v2 = eval_str (arg->car (), mlenv);
+ nextNode (arg);
+ if (arg)
+ throw (uErrorWrongNumber);
+
+ return newMNode_bool (v1 > v2);
+}
+
+//#AFUNC ge ml_string_ge
+//#AFUNC string-ge ml_string_ge
+//#WIKIFUNC ge
+//#WIKIFUNC string-ge
+MNode* ml_string_ge (MNode* cell, MlEnv* mlenv) {
+ MNode* arg = cell->cdr ();
+ ustring v1, v2;
+
+ if (! arg)
+ throw (uErrorWrongNumber);
+ v1 = eval_str (arg->car (), mlenv);
+ nextNodeNonNil (arg);
+ v2 = eval_str (arg->car (), mlenv);
+ nextNode (arg);
+ if (arg)
+ throw (uErrorWrongNumber);
+
+ return newMNode_bool (v1 >= v2);
+}
+
+/*DOC:
+===emptyp===
+ (emptyp TEXT...) -> 1 or NIL
+
+文字列TEXTの長さが0の時、1を返す。
+
+*/
+//#AFUNC emptyp ml_emptyp
+//#WIKIFUNC emptyp
+MNode* ml_emptyp (MNode* cell, MlEnv* mlenv) {
+ MNode* arg = cell->cdr ();
+ ustring u;
+
+ if (! arg)
+ throw (uErrorWrongNumber);
+
+ while (arg) {
+ u = eval_str (arg->car (), mlenv);
+ nextNode (arg);
+ if (u.size () > 0)
+ return newMNode_bool (false);
+ }
+ return newMNode_bool (true);
+}
+
+/*DOC:
+===not-emptyp===
+ (not-emptyp TEXT...) -> 1 or NIL
+
+文字列TEXTの長さが0でない時、1を返す。
+
+*/
+//#AFUNC not-emptyp ml_not_emptyp
+//#WIKIFUNC not-emptyp
+MNode* ml_not_emptyp (MNode* cell, MlEnv* mlenv) {
+ MNode* arg = cell->cdr ();
+ ustring u;
+
+ if (! arg)
+ throw (uErrorWrongNumber);
+
+ while (arg) {
+ u = eval_str (arg->car (), mlenv);
+ nextNode (arg);
+ if (u.size () == 0)
+ return newMNode_bool (false);
+ }
+ return newMNode_bool (true);
+}
+
+/*DOC: