summaryrefslogtreecommitdiff
path: root/modules/language/python/string.scm
diff options
context:
space:
mode:
Diffstat (limited to 'modules/language/python/string.scm')
-rw-r--r--modules/language/python/string.scm144
1 files changed, 144 insertions, 0 deletions
diff --git a/modules/language/python/string.scm b/modules/language/python/string.scm
new file mode 100644
index 0000000..c68b9ae
--- /dev/null
+++ b/modules/language/python/string.scm
@@ -0,0 +1,144 @@
+(define-module (language python string)
+ #:use-module (oop goops)
+ #:use-module (oop pf-objects)
+ #:use-module (ice-9 match)
+ #:use-module (parser stis-parser)
+ #:export (py-format))
+
+(define-syntax-rule (aif it p x y) (let ((it p)) (if it x y)))
+
+(define-syntax-rule (define-py (f n o . u) code ...)
+ (begin
+ (define-method (f (o <string>) . u) code ...)
+ (define-method (f (o <p>) . l) (apply (ref o 'n) l))))
+
+#|
+(define-py (py-capitalize capitalize o)
+ (string-capitalize o))
+
+(define-py (py-center center o w . l)
+ (let* ((ws (if (pair? l)
+ (car (string->list (car l)))
+ #\space))
+ (n (string-length o))
+ (w (if (< w n) n w))
+ (d (- w n))
+ (e (floor-quotient (- w n) / 2))
+ (s (make-string w #\space)))
+ (let lp ((i 0) (j e))
+ (if (< i n)
+ (begin
+ (string-set! s j (string-ref o i))
+ (lp (+ i 1) (+ j 1)))))
+ s))
+
+
+
+;py-decode
+;py-encode
+(define-py (py-endswith endswith o (suff <string>) . l)
+ (let ((n (string-length o))
+ (ns (string-length suff))
+ (f (lambda (x) (< x 0) (+ n x) x)))
+ (call-with-values (lambda ()
+ (match l
+ (() (values 0 n ))
+ ((x) (values (f x) n ))
+ ((x y) (values (f x) (f y)))))
+ (lambda (start end)
+ (string-suffix? o suff start end)))))
+
+(define-py (py-expandtabs expandtabs s . l)
+ (let* ((tabsize (match l (() 8) ((x) x)))
+ (u (string->list (make-string tabsize #\space)))
+ (n (string-length s)))
+ (let lp ((l (string->list s)) (r '()))
+ (if (pair? l)
+ (let ((x (car l)))
+ (if (eq? x #\tab)
+ (lp (cdr l) (append u r))
+ (lp (cdr l) (cons x r))))
+ (list->string (reverse r))))))
+
+(define-py (py-find find s sub . l)
+ (let ((f (lambda (x) (< x 0) (+ n x) x)))
+ (call-with-values (lambda ()
+ (match l
+ (() (values 0 n ))
+ ((x) (values (f x) n ))
+ ((x y) (values (f x) (f y)))))
+ (lambda (start end)
+ (aif it (string-contains s sub start end)
+ it
+ -1)))))
+|#
+
+(define i (f-list #:i (mk-token (f+ (f-reg! "[0-9]")))))
+(define s (f-list #:s (mk-token (f+ (f-not! (f-tag "}"))))))
+(define e (f-list #:e (f-and (f-tag "}") f-true)))
+(define tagbody (f-or! e i s))
+
+(define tag (f-seq "{" tagbody "}"))
+(define nontag (f-list #:str (mk-token (f+ (f-or! (f-tag "{{")
+ (f-not! tag))))))
+(define e (ff* (f-or! tag nontag)))
+
+(define (compile x args kwargs)
+ (let lp ((l x) (r '()) (u '()) (i 0))
+ (match l
+ (((#:str x) . l)
+ (lp l (cons x r) u i))
+ (((#:i x) . l)
+ (lp l (cons "~a" r) (cons (list-ref args (string->number x)) u) i))
+ (((#:s x) . l)
+ (lp l (cons "~a" r) (cons (hash-ref kwargs x 'None) u) i))
+ (((#:e) . l)
+ (lp l (cons "~a" r) (cons (list-ref args i) u) (+ i 1)))
+ (()
+ (apply format #f (string-join (reverse r) "") (reverse u))))))
+
+(define-py (py-format format s . l)
+ (call-with-values
+ (lambda ()
+ (let lp ((l l) (args '()) (kwargs (make-hash-table)))
+ (match l
+ (((? keyword? key) x . l)
+ (hash-set! kwargs (symbol->string (keyword->symbol key)) x)
+ (lp l args kwargs))
+ ((x . l)
+ (lp l (cons x args) kwargs))
+ (()
+ (values (reverse args) kwargs)))))
+ (lambda (args kwargs)
+ (compile (parse s e) args kwargs))))
+
+#|
+py-isalnum
+py-isalpha
+py-isdigit
+py-islower
+py-isspace
+py-istitle
+py-isupper
+py-join
+py-ljust
+py-lower
+py-lstrip
+py-partition
+py-replace
+py-rfind
+py-rindex
+py-rjust
+py-rpartition
+py-rsplit
+py-rstrip
+py-split
+py-splitlines
+py-startswith
+py-strip
+py-swapcase
+py-title
+py-translate
+py-upper
+py-zfill
+|#