aboutsummaryrefslogtreecommitdiffstats
path: root/miniscm
diff options
context:
space:
mode:
authorGravatar Peter McGoron 2024-09-08 10:10:12 -0400
committerGravatar Peter McGoron 2024-09-08 10:10:12 -0400
commit85e38a2b19ad3f36132aa733b11a0901736a99a5 (patch)
tree7f05f41d37ed0a3704763066ea11ab3dd69a4a27 /miniscm
parentminiscm: add string-ref (diff)
miniscm: add better support for immutable strings, and refactor to use real strings
Diffstat (limited to '')
-rw-r--r--miniscm/init.scm20
-rw-r--r--miniscm/miniscm.c12
2 files changed, 27 insertions, 5 deletions
diff --git a/miniscm/init.scm b/miniscm/init.scm
index 1803388..725c7d0 100644
--- a/miniscm/init.scm
+++ b/miniscm/init.scm
@@ -90,10 +90,10 @@
;;; Emulation of mutable strings.
-(define string-ref list-ref)
-(define string-set! list-set!)
-(define string list)
-(define (string->list x) x)
+(define mutable-string-ref list-ref)
+(define mutable-string-set! list-set!)
+(define mutable-string list)
+(define (mutable-string->list x) x)
(define list<=>
(lambda (x y <=>)
@@ -139,6 +139,18 @@
((f (car l)) #t)
(else (any f (cdr l))))))
+(define string->list
+ (lambda (str)
+ (let ((len (string-length str)))
+ (letrec ((loop
+ (lambda (i lst)
+ (if (= i len)
+ (reverse lst)
+ (loop (+ i 1)
+ (cons (string-ref str i)
+ lst))))))
+ (loop 0)))))
+
(macro
cond-expand
(lambda (body)
diff --git a/miniscm/miniscm.c b/miniscm/miniscm.c
index e2b062d..7500ad2 100644
--- a/miniscm/miniscm.c
+++ b/miniscm/miniscm.c
@@ -1216,6 +1216,7 @@ register pointer a, b;
#define OP_CHAR2INT 111
#define OP_STRINGREF 112
+#define OP_STRINGLEN 113
static FILE *tmpfp;
static int tok;
@@ -1977,6 +1978,13 @@ register short op;
}
s_return(mk_char_c(strvalue(x)[ivalue(y)]));
+
+ case OP_STRINGLEN:
+ if (!isstring(car(args))) {
+ Error_0("string-length -- argument must be string");
+ }
+
+ s_return(mk_number(strlen(strvalue(car(args)))));
}
}
@@ -2481,7 +2489,8 @@ pointer (*dispatch_table[])() = {
opexe_7, /* OP_WRITEOUT */
opexe_2, /* OP_CHAR2INT */
- opexe_4 /* OP_STRINGREF */
+ opexe_4, /* OP_STRINGREF */
+ opexe_4 /* OP_STRINGLEN */
};
@@ -2642,6 +2651,7 @@ init_procs()
mk_proc(OP_CHAR2INT, "char->integer");
mk_proc(OP_STRINGREF, "string-ref");
+ mk_proc(OP_STRINGLEN, "string-length");
}