Carp/core/String.carp

60 lines
1.9 KiB
Plaintext
Raw Normal View History

2017-06-26 12:15:03 +03:00
(defmodule String
2017-10-20 18:00:47 +03:00
(register = (Fn [&String &String] Bool))
(register /= (Fn [&String &String] Bool))
(register append (Fn [String String] String)) ;; TODO: should take a &String as its second argument?
(register delete (Fn [String] ()))
(register copy (Fn [&String] String))
(register count (Fn [&String] Int))
(register duplicate (Fn [&String] String))
(register cstr (Fn [&String] (Ptr Char)))
(register str (Fn [&String] String))
(register chars (Fn [&String] (Array Char)))
(register from-chars (Fn [(Array Char)] String))
2017-10-20 18:00:47 +03:00
(defn repeat [n inpt]
(let [str ""]
(do
(for [i 0 n]
(set! &str &(append @str @inpt)))
@str)))
2017-12-04 00:30:48 +03:00
;; A temporary version of this function, until we have some nicer way to write it
(defn split-by [s separators]
(let [len (count &s)
result (the (Array String) [])
cs (chars &s)
word @""]
(do
(for [i 0 len]
(let [c (Array.nth &cs i)]
2017-12-04 00:30:48 +03:00
(do
(if (Int.< 0 (Array.element-count &(the (Array Char) @&separators) @c))
(if (= 0 (String.count &word))
2017-12-04 00:30:48 +03:00
() ;; no word
(do (set! &result (Array.push-back @&result @&word))
2017-12-04 00:30:48 +03:00
(set! &word @"")))
(set! &word (append @&word (from-chars [@c])))))))
;; Some sweet code duplication for the final word:
(if (= 0 (String.count &word))
2017-12-04 00:30:48 +03:00
()
(do (set! &result (Array.push-back @&result @&word))
2017-12-04 00:30:48 +03:00
(set! &word @"")))
result)))
(defn words [s]
(split-by s [\space \tab]))
(defn lines [s]
(split-by s [\newline]))
2017-06-26 12:15:03 +03:00
)
2017-10-20 18:00:47 +03:00
(defdynamic string-join- [strs]
(if (= (count strs) 0)
'(String.copy "")
2017-10-20 18:00:47 +03:00
(list 'String.append (car strs) (string-join- (cdr strs)))))
(defmacro string-join [:rest strs]
(string-join- strs))