string-cmp and string-cmp-ic added
This commit is contained in:
@@ -89,7 +89,6 @@ utils/local_install.sh
|
|||||||
|
|
||||||
#### Language
|
#### Language
|
||||||
- string functions
|
- string functions
|
||||||
- compare - needed for sorting, cmp ignore case
|
|
||||||
- regexp match, regexp tokens
|
- regexp match, regexp tokens
|
||||||
|
|
||||||
#### Performance
|
#### Performance
|
||||||
|
|||||||
@@ -134,6 +134,8 @@
|
|||||||
|`(string-len str)`|Returns string length|`>>> (string-len "abcdef") => 6`|String manipulation|
|
|`(string-len str)`|Returns string length|`>>> (string-len "abcdef") => 6`|String manipulation|
|
||||||
|`(string-substr str pos len)`|Returns substring from str starting at pos with len. If pos is negative returns substring from the end of string. First character is on pos 0|`>>> (string-substr "ABCD" -2 2) => "CD"`|String manipulation|
|
|`(string-substr str pos len)`|Returns substring from str starting at pos with len. If pos is negative returns substring from the end of string. First character is on pos 0|`>>> (string-substr "ABCD" -2 2) => "CD"`|String manipulation|
|
||||||
|`(string-find str lookup pos)`|Returns position of lookup in str starting on position. First char index is 0. If not found returns nil|`>>> (string-find " long long int;" "long" 2) => 6`|String manipulation|
|
|`(string-find str lookup pos)`|Returns position of lookup in str starting on position. First char index is 0. If not found returns nil|`>>> (string-find " long long int;" "long" 2) => 6`|String manipulation|
|
||||||
|
|`(string-cmp str1 str2)`|Compares two strings. Returns 0 where strangs are equal; < 0 when the value of the first character that does not match is lower in the compared string, or all compared characters match but the compared string is shorter.; >0 when the value of the first character that does not match is greater in the compared string, or all compared characters match but the compared string is longer.|`>>> (string-cmp "aaa" "xaa") => -23`|String manipulation|
|
||||||
|
|`(string-cmp-ic str1 str2)`|Compares two strings ignoring case. Returns 0, < 0, > 0.|`>>> (string-cmp-ic "aaa" "AaA") => 0`|String manipulation|
|
||||||
|`(int value)`|Cast an item to an int|`>>> (int 3.41) => 3`|Type casting|
|
|`(int value)`|Cast an item to an int|`>>> (int 3.41) => 3`|Type casting|
|
||||||
|`(float value)`|Cast item to a float|`>>> (int 3.41) => 3.14`|Type casting|
|
|`(float value)`|Cast item to a float|`>>> (int 3.41) => 3.14`|Type casting|
|
||||||
|`(string value)`|Cast int or float item to a string|`>>> (string 3.14) => "3.14"`|Type casting|
|
|`(string value)`|Cast int or float item to a string|`>>> (string 3.14) => "3.14"`|Type casting|
|
||||||
|
|||||||
18
ml.cpp
18
ml.cpp
@@ -184,6 +184,10 @@ std::vector<std::string> MlValue::get_used_atoms() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool MlValue::is_nil() const {
|
||||||
|
return type == NIL;
|
||||||
|
}
|
||||||
|
|
||||||
bool MlValue::is_builtin() const {
|
bool MlValue::is_builtin() const {
|
||||||
return type == BUILTIN;
|
return type == BUILTIN;
|
||||||
}
|
}
|
||||||
@@ -1857,6 +1861,19 @@ MlValue string_find(std::vector<MlValue> args, MlEnvironment &env) {
|
|||||||
return pos == -1 ? MlValue::nil() : MlValue((long) pos);
|
return pos == -1 ? MlValue::nil() : MlValue((long) pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MlValue string_cmp(std::vector<MlValue> args, MlEnvironment &env) {
|
||||||
|
eval_args(args, env);
|
||||||
|
|
||||||
|
if (args.size() != 2)
|
||||||
|
throw MlError(MlValue("string-cmp", string_cmp), env, args.size() > 2 ? TOO_MANY_ARGS : TOO_FEW_ARGS);
|
||||||
|
|
||||||
|
if ( (args[0].is_nil() || (args[0].is_list() && args[0].as_list().empty())) ||
|
||||||
|
(args[1].is_nil() || (args[1].is_list() && args[1].as_list().empty())) )
|
||||||
|
return MlValue::nil();
|
||||||
|
|
||||||
|
|
||||||
|
return MlValue((long)args[0].as_string().compare(args[1].as_string()));
|
||||||
|
}
|
||||||
|
|
||||||
// trims characters " \n\r\t" from left or right or both ends of a string
|
// trims characters " \n\r\t" from left or right or both ends of a string
|
||||||
MlValue string_rltrim(std::vector<MlValue> args, MlEnvironment &env) {
|
MlValue string_rltrim(std::vector<MlValue> args, MlEnvironment &env) {
|
||||||
@@ -2240,6 +2257,7 @@ std::map<const std::string, Builtin> builtin_funcs
|
|||||||
std::make_pair("string-len", builtin::string_len),
|
std::make_pair("string-len", builtin::string_len),
|
||||||
std::make_pair("string-substr", builtin::string_substr),
|
std::make_pair("string-substr", builtin::string_substr),
|
||||||
std::make_pair("string-find", builtin::string_find),
|
std::make_pair("string-find", builtin::string_find),
|
||||||
|
std::make_pair("string-cmp", builtin::string_cmp),
|
||||||
|
|
||||||
// Casting operations
|
// Casting operations
|
||||||
std::make_pair("int", builtin::cast_to_int),
|
std::make_pair("int", builtin::cast_to_int),
|
||||||
|
|||||||
1
ml.h
1
ml.h
@@ -141,6 +141,7 @@ public:
|
|||||||
// Evaluate this value as lisp code.
|
// Evaluate this value as lisp code.
|
||||||
MlValue eval(MlEnvironment &env);
|
MlValue eval(MlEnvironment &env);
|
||||||
|
|
||||||
|
bool is_nil() const;
|
||||||
bool is_builtin() const;
|
bool is_builtin() const;
|
||||||
bool is_macro() const;
|
bool is_macro() const;
|
||||||
bool is_number() const;
|
bool is_number() const;
|
||||||
|
|||||||
@@ -26,6 +26,8 @@
|
|||||||
(defn string-downcase (str)
|
(defn string-downcase (str)
|
||||||
(string-case str "lower"))
|
(string-case str "lower"))
|
||||||
|
|
||||||
|
(defn string-cmp-ic (a b)
|
||||||
|
(string-cmp (string-upcase a) (string-upcase b)))
|
||||||
|
|
||||||
(defn string-join (lst sep)
|
(defn string-join (lst sep)
|
||||||
(do
|
(do
|
||||||
|
|||||||
@@ -101,6 +101,8 @@
|
|||||||
(ut::define-test "result of (string-find \" long long int;\" \" \")" '(ut::assert-equal 0 (string-find " long long int;" " ")))
|
(ut::define-test "result of (string-find \" long long int;\" \" \")" '(ut::assert-equal 0 (string-find " long long int;" " ")))
|
||||||
(ut::define-test "result of (string-find \" long long int;\" \"o\")" '(ut::assert-equal 2 (string-find " long long int;" "o")))
|
(ut::define-test "result of (string-find \" long long int;\" \"o\")" '(ut::assert-equal 2 (string-find " long long int;" "o")))
|
||||||
(ut::define-test "result of (string-find \" long long int;\" \"float\")" '(ut::assert-nil (string-find " long long int;" "float")))
|
(ut::define-test "result of (string-find \" long long int;\" \"float\")" '(ut::assert-nil (string-find " long long int;" "float")))
|
||||||
|
(ut::define-test "result of (string-cmp \"aaa\" \"aaa\")" '(ut::assert-equal 0 (string-cmp "aaa" "aaa")))
|
||||||
|
(ut::define-test "result of (string-cmp-ic \"aaa\" \"AaA\")" '(ut::assert-equal 0 (string-cmp-ic "aaa" "AaA")))
|
||||||
|
|
||||||
(ut::define-test "result of (is-pos? -1)" '(ut::assert-false (is-pos? -1)))
|
(ut::define-test "result of (is-pos? -1)" '(ut::assert-false (is-pos? -1)))
|
||||||
(ut::define-test "result of (is-neg? -1)" '(ut::assert-true (is-neg? -1)))
|
(ut::define-test "result of (is-neg? -1)" '(ut::assert-true (is-neg? -1)))
|
||||||
|
|||||||
Reference in New Issue
Block a user