diff options
| author | 2024-09-08 10:10:12 -0400 | |
|---|---|---|
| committer | 2024-09-08 10:10:12 -0400 | |
| commit | 85e38a2b19ad3f36132aa733b11a0901736a99a5 (patch) | |
| tree | 7f05f41d37ed0a3704763066ea11ab3dd69a4a27 /miniscm | |
| parent | miniscm: 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.scm | 20 | ||||
| -rw-r--r-- | miniscm/miniscm.c | 12 |
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"); } |
