From afc68e2a551889b464165e011fe81e3949b84d4d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Madeleine=20Sydney=20=C5=9Alaga?= Date: Mon, 18 May 2026 08:41:37 -0600 Subject: [PATCH] string --- app/Gyehoek/ANF/Syntax.hs | 47 +++++++++++++++++++++++++------ app/Gyehoek/Scheme/Syntax.hs | 2 ++ cabal.project | 4 +-- example/ascii-string-literal | Bin 0 -> 16624 bytes example/ascii-string-literal.anf | 4 +++ example/ascii-string-literal.s | 23 +++++++++++++++ example/ascii-string-literal.scm | 1 + example/ascii-string-literal.ssa | 10 +++++++ example/{ => pseudo}/closure.scm | 0 example/{ => pseudo}/t.s | 0 example/{ => pseudo}/t.scm | 0 example/{ => pseudo}/t.ssa | 0 example/string-literal | Bin 0 -> 16600 bytes example/string-literal.anf | 4 +++ example/string-literal.s | 23 +++++++++++++++ example/string-literal.scm | 1 + example/string-literal.ssa | 10 +++++++ play/a.out | Bin 15856 -> 15936 bytes play/string | Bin 0 -> 16624 bytes play/string.anf | 4 +++ play/string.s | 23 +++++++++++++++ play/string.scm | 1 + play/string.ssa | 10 +++++++ play/t | Bin 16176 -> 16520 bytes play/t.anf | 2 +- play/t.s | 6 ++-- play/t.scm | 3 +- play/t.ssa | 15 +++------- play/wtf.s | 31 ++++++++++++++++++++ play/wtf.ssa | 8 ++++++ runtime/gyehoek.c | 47 +++++++++++++++++++++++++++++-- runtime/gyehoek.h | 29 +++++++++++++------ 32 files changed, 270 insertions(+), 38 deletions(-) create mode 100755 example/ascii-string-literal create mode 100644 example/ascii-string-literal.anf create mode 100644 example/ascii-string-literal.s create mode 100644 example/ascii-string-literal.scm create mode 100644 example/ascii-string-literal.ssa rename example/{ => pseudo}/closure.scm (100%) rename example/{ => pseudo}/t.s (100%) rename example/{ => pseudo}/t.scm (100%) rename example/{ => pseudo}/t.ssa (100%) create mode 100755 example/string-literal create mode 100644 example/string-literal.anf create mode 100644 example/string-literal.s create mode 100644 example/string-literal.scm create mode 100644 example/string-literal.ssa create mode 100755 play/string create mode 100644 play/string.anf create mode 100644 play/string.s create mode 100644 play/string.scm create mode 100644 play/string.ssa create mode 100644 play/wtf.s create mode 100644 play/wtf.ssa diff --git a/app/Gyehoek/ANF/Syntax.hs b/app/Gyehoek/ANF/Syntax.hs index 128ae8b..dca3463 100644 --- a/app/Gyehoek/ANF/Syntax.hs +++ b/app/Gyehoek/ANF/Syntax.hs @@ -48,6 +48,8 @@ import Data.InvertibleGrammar.Base ((:-)((:-))) import qualified Gyehoek.Sexp import Control.Lens.Unsound import qualified Data.Bits +import qualified GHC.IO.Encoding as T +import qualified Data.Text.Encoding as T data Val @@ -275,12 +277,36 @@ lowerInt = QBE.ValConst . QBE.CInt . fromIntegral lowerVal - :: forall es. (GenSym :> es) + :: forall es. (GenSym :> es, Writer (Vector QBE.DataDef) :> es) => Val -> (QBE.Val -> Eff es BlockBuilder) -> Eff es BlockBuilder lowerVal (ValLit (LitInt n)) k = k . lowerInt $ n + +lowerVal (ValLit (LitString s)) k = do + rawString <- gensym + r <- gensym + let bs = T.encodeUtf8 s + len = lengthOf each bs + tell . pure $ + QBE.DataDef [] rawString Nothing + [QBE.FieldExtTy QBE.Byte [QBE.String bs]] + Emit (alloc r rawString len) <$> k (QBE.ValTemporary r) + where + alloc r rs len = + [ QBE.Call + (Just (r, QBE.AbiBaseTy QBE.Long)) + (QBE.ValGlobal "scm_from_utf8_string") + Nothing + [ QBE.Arg (QBE.AbiBaseTy QBE.Long) (QBE.ValGlobal rs) + -- N.b. The C function declares this argument as size_t, which + -- /is/ long on my system. + , QBE.Arg (QBE.AbiBaseTy QBE.Long) (lowerInt' len) + ] + [] + ] + lowerVal (ValLit _) k = error "todo" lowerVal (ValVar x) k = k . QBE.ValTemporary . lowerName $ x @@ -303,6 +329,7 @@ lowerArithmetic r p = QBE.BinaryOp r bop x y PrimMul a b -> (QBE.Mul,a,b) _ -> _ +sizeofScm :: Int sizeofScm = 8 lowerCons @@ -417,7 +444,7 @@ lowerCdr r x e k = do <$> lower' e k lowerPrim - :: forall es. (GenSym :> es) + :: forall es. (GenSym :> es, Writer (Vector QBE.DataDef) :> es) => Name -> Prim Val -> Exp -> (QBE.Val -> Eff es BlockBuilder) -> Eff es BlockBuilder @@ -435,7 +462,7 @@ lowerPrim r p e k = PrimWrite x -> lowerWrite r x e k lower' - :: forall es. (GenSym :> es) + :: forall es. (GenSym :> es, Writer (Vector QBE.DataDef) :> es) => Exp -> (QBE.Val -> Eff es BlockBuilder) -> Eff es BlockBuilder @@ -460,7 +487,11 @@ lower' (ExpBegin (x:xs)) k = fold1 <$> traverse low (x:|xs) lower' _ k = _ -lower :: GenSym :> es => QBE.Ident QBE.Label -> Exp -> Eff es QBE.Block +lower + :: (GenSym :> es, Writer (Vector QBE.DataDef) :> es) + => QBE.Ident QBE.Label + -> Exp + -> Eff es QBE.Block lower n e = buildBlock n <$> lower' e (pure . Exit . QBE.Ret . Just) lowerProgram @@ -471,17 +502,17 @@ lowerProgram anfs = -- hack for dev convenience: if there's only one expression, let -- it be the entry point. [e] -> do - b <- lower "start" e + (b,dataDefs) <- runWriter . lower "start" $ e let f = wrapFunction @NonEmpty "main" [b] - pure $ QBE.Program [] [] [f] + pure $ QBE.Program [] (dataDefs ^.. each) [f] _ -> do let low e = do bl <- gensym' "b" fl <- gensym' "f" b <- lower bl e pure $ wrapFunction @NonEmpty fl [b] - fs <- traverse low anfs - pure $ QBE.Program [] [] (fs ^.. traversed) + (fs,dataDefs) <- runWriter $ traverse low anfs + pure $ QBE.Program [] (dataDefs ^.. each) (fs ^.. traversed) wrapFunction :: Foldable1 t diff --git a/app/Gyehoek/Scheme/Syntax.hs b/app/Gyehoek/Scheme/Syntax.hs index a2354ba..61aa494 100644 --- a/app/Gyehoek/Scheme/Syntax.hs +++ b/app/Gyehoek/Scheme/Syntax.hs @@ -38,6 +38,7 @@ data Lit = LitInt Int | LitNil | LitBool Bool + | LitString Text deriving (Show, Generic) data Define @@ -83,6 +84,7 @@ instance SexpIso Lit where $ With (. sexpIso) $ With (. sym "nil") $ With (. sexpIso) + $ With (. sexpIso) $ End instance SexpIso Define where diff --git a/cabal.project b/cabal.project index 48b9e47..ebc155e 100644 --- a/cabal.project +++ b/cabal.project @@ -3,5 +3,5 @@ packages: *.cabal source-repository-package type: git location: https://git.deertopia.net/msyds/qbe-hs.git - tag: ab7cc053a4d58fde841e910f251b8e48b54466ad - --sha256: 0n2jqr6vymlyr0gwzbv3cljhqxnzcq1pzf7m92b16jalkymbcwgy + tag: 64be0096355a8fd23cc1a4910ed5c8e6075aeca9 + --sha256: 0x507fmpyzyvg3f27wss94d7fkrbv6r05jknlphgyi53pscazr9r diff --git a/example/ascii-string-literal b/example/ascii-string-literal new file mode 100755 index 0000000000000000000000000000000000000000..a0f06653863f29a6ece900393f632c8f96124a55 GIT binary patch literal 16624 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 bLb>3*#%M~wQhA^Wb_NE9e_$ShK-Uid&%Y+x literal 0 HcmV?d00001 diff --git a/example/ascii-string-literal.anf b/example/ascii-string-literal.anf new file mode 100644 index 0000000..a25a687 --- /dev/null +++ b/example/ascii-string-literal.anf @@ -0,0 +1,4 @@ +;;; -*- mode:scheme -*- + +(let ((x0 (prim:write "wawa"))) x0) + diff --git a/example/ascii-string-literal.s b/example/ascii-string-literal.s new file mode 100644 index 0000000..38d65f3 --- /dev/null +++ b/example/ascii-string-literal.s @@ -0,0 +1,23 @@ +.data +.balign 8 +.1: + .ascii "wawa" +/* end data */ + +.text +.globl main +main: + pushq %rbp + movq %rsp, %rbp + movl $4, %esi + leaq .1(%rip), %rdi + callq scm_from_utf8_string + movq %rax, %rdi + callq scm_write + leave + ret +.type main, @function +.size main, .-main +/* end function main */ + +.section .note.GNU-stack,"",@progbits diff --git a/example/ascii-string-literal.scm b/example/ascii-string-literal.scm new file mode 100644 index 0000000..81525d1 --- /dev/null +++ b/example/ascii-string-literal.scm @@ -0,0 +1 @@ +(prim:write "wawa") diff --git a/example/ascii-string-literal.ssa b/example/ascii-string-literal.ssa new file mode 100644 index 0000000..2a1f3cd --- /dev/null +++ b/example/ascii-string-literal.ssa @@ -0,0 +1,10 @@ + +data $.1 = +{b "wawa"} +export +function w $main () { +@start + %.2 =l call $scm_from_utf8_string (l $.1, l 4) + %x0 =l call $scm_write (l %.2) + ret %x0 +} \ No newline at end of file diff --git a/example/closure.scm b/example/pseudo/closure.scm similarity index 100% rename from example/closure.scm rename to example/pseudo/closure.scm diff --git a/example/t.s b/example/pseudo/t.s similarity index 100% rename from example/t.s rename to example/pseudo/t.s diff --git a/example/t.scm b/example/pseudo/t.scm similarity index 100% rename from example/t.scm rename to example/pseudo/t.scm diff --git a/example/t.ssa b/example/pseudo/t.ssa similarity index 100% rename from example/t.ssa rename to example/pseudo/t.ssa diff --git a/example/string-literal b/example/string-literal new file mode 100755 index 0000000000000000000000000000000000000000..7530ee0d527868695fd0183bbbc76f33810550de GIT binary patch literal 16600 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 literal 0 HcmV?d00001 diff --git a/example/string-literal.anf b/example/string-literal.anf new file mode 100644 index 0000000..bcdd017 --- /dev/null +++ b/example/string-literal.anf @@ -0,0 +1,4 @@ +;;; -*- mode:scheme -*- + +(let ((x0 (prim:write "안녕하세요"))) x0) + diff --git a/example/string-literal.s b/example/string-literal.s new file mode 100644 index 0000000..68a9c79 --- /dev/null +++ b/example/string-literal.s @@ -0,0 +1,23 @@ +.data +.balign 8 +.1: + .ascii "\354\225\210\353\205\225\355\225\230\354\204\270\354\232\224" +/* end data */ + +.text +.globl main +main: + pushq %rbp + movq %rsp, %rbp + movl $15, %esi + leaq .1(%rip), %rdi + callq scm_from_utf8_string + movq %rax, %rdi + callq scm_write + leave + ret +.type main, @function +.size main, .-main +/* end function main */ + +.section .note.GNU-stack,"",@progbits diff --git a/example/string-literal.scm b/example/string-literal.scm new file mode 100644 index 0000000..70b4480 --- /dev/null +++ b/example/string-literal.scm @@ -0,0 +1 @@ +(prim:write "안녕하세요") diff --git a/example/string-literal.ssa b/example/string-literal.ssa new file mode 100644 index 0000000..6f84a5d --- /dev/null +++ b/example/string-literal.ssa @@ -0,0 +1,10 @@ + +data $.1 = +{b "\354\225\210\353\205\225\355\225\230\354\204\270\354\232\224"} +export +function w $main () { +@start + %.2 =l call $scm_from_utf8_string (l $.1, l 15) + %x0 =l call $scm_write (l %.2) + ret %x0 +} \ No newline at end of file diff --git a/play/a.out b/play/a.out index 114fc129dc0d166200ca8f5e7dab6212c3f251a2..7b7318f41be12e32517e1ccd220e79ef29149d54 100755 GIT binary patch delta 2500 zcmexReV}H7gkXRG0~k1fNd|@k6E&A}9bkj-4zNwUrN^1c2;pT;7G%_S`~l%Gz-R`j z0U$*nZ8LNs3TD`%(i51V{K<`s;+`v@s#ZW%!Ds=fDj3ZH(Zs;QzyQWG6d(d{dh$a? zb)g$jQ3O3%ib+int_UhUV{#yqx*`jdhfb?NOlDA-Jd?>^5tlbIpbpHK%*mV`zz%g5 zD+2=q$n#Jm7(jsmV}mp>GcYiKXpkC^9EfIMXap;Puo)OGrk=~4ypc&}vV#H3WEK_? z#!r(CS;QHYCNr{#GxALiG!kc&1(U*)6IsM3KVnf*D=5m$D@kL>$xKStE6&$5V{rHJ zbaIY2(lgRCg|m$(=dfB#j$%k6UWMF1sWB`#242%p+44MoK zu;^qcmCEE~U|?o2hKg;OIE@YD345@k85m&k3yUEGL5RcxXpF+dKS0w52Q-C2#3#qG z>oGD-?q%0!WSzX1U3~H$b{@_PP_x-57ut$%-XLhfIZ1$<@#bV60W-c$`V0(d6ChSF zFic(`ARTaufq~(_XtF*7!jdZ2{! z{{w#c29UzTP}-x{wh$!QYnnBgTTq5cRDZIjpsbdzJ_7?osdlJGv+XB61_lO?&Zi|j z9^JOz^cWakX#W5I|3%9G|NoD%vg%JR5R_C7_2_)+(QA4|4`j3LQ9TBR9Ux0y-2V6f zKbUp$@a7)D623_s29p$66d9$NtwE^}lq_UE{Qn=qz`$Vh;s5^{1_lP75C8w$Omu@;o4+7zPH09q<4D-+V=(g=Z2+hbAl%V1W)w zYakOq5euSaK?DN>gV*GPy7GcC&?u9Hiq4q)QCFUE!DK-_eWL{+w=pm6w8<_YCkaG<;gSiq60#IwfTm}Y)EntQOg9MuR z4v;R+Ltrxn8Kz9mG*tJz0OpA?z{*mvRt5%!n_z|j1FXOUa~T*I-hkDMGwgt7JD51r zWJM!!MtM+K;~C4yz@We&!N7oKzcnMMq>z9I3rw#QBLjmF6CVRCX~D!jKxRrtLv^8> zmI1Phv3&AFBk}qcMg|5!27ZvWV9n5U$1oYJSCYX1%_WH-8yR>RU=x(@%Cz4$HDA z(aUE@D=sNwNG>W#%}WW^%V&s>cMEd#b&YrRbBT{s8Pb%wddGsHK(X!0Qzu}P*< zn{!Q_87HqZOJX#bENHGT2+Q#>T4i#exxOGQpTp=ClP8+%3&KhR7;QdzqOJVo59R`b zu$&B|`6dfm=nKN~Ka4h*9B84>^#YpfU$9Q@vM}RE}Vd7_oRpaw`Q0|Nt$ zE|`4LN}m(nW|+)rZO#iTTfp>WLl)u53Dydnu&QsywONttkPukeCY8WsuFid7-5uU7It0C$D;xRBVOn{cFG7Jn1B9min fwK*?0s45uE0nx<3!oUE=4-_B*aC-7X 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 B@lyZ* diff --git a/play/t.anf b/play/t.anf index 2ab7790..8f81c6e 100644 --- a/play/t.anf +++ b/play/t.anf @@ -1,4 +1,4 @@ ;;; -*- mode:scheme -*- -(let ((x0 (prim:cons 4 2)) (x1 (prim:cdr x0)) (x2 (prim:* 3 x1)) (x3 (prim:write x2))) x3) +(let ((x0 (prim:cons 4 2)) (x1 (prim:write x0))) x1) diff --git a/play/t.s b/play/t.s index 2f1821f..7ca6047 100644 --- a/play/t.s +++ b/play/t.s @@ -5,9 +5,9 @@ main: movq %rsp, %rbp movl $16, %edi callq GC_malloc - movq $18, (%rax) - movq $10, 8(%rax) - movl $26, %edi + movq %rax, %rdi + movq $18, (%rdi) + movq $10, 8(%rdi) callq scm_write leave ret diff --git a/play/t.scm b/play/t.scm index ba57787..0f24db8 100644 --- a/play/t.scm +++ b/play/t.scm @@ -1,2 +1 @@ -(prim:write (prim:* 3 - (prim:cdr (prim:cons 4 2)))) +(prim:write (prim:cons 4 2)) diff --git a/play/t.ssa b/play/t.ssa index 2b98039..3cc3c6c 100644 --- a/play/t.ssa +++ b/play/t.ssa @@ -2,16 +2,9 @@ export function w $main () { @start %x0 =l call $GC_malloc (l 16) - %.4 =l add %x0, 8 + %.2 =l add %x0, 8 storel 18, %x0 - storel 10, %.4 - %.5 =l add %x0, 8 - %x1 =l loadl %.5 - %.6 =l shr 14, 2 - %.7 =l shr %x1, 2 - %.8 =l mul %.6, %.7 - %.9 =l shl %.8, 2 - %x2 =l add %.9, 2 - %x3 =l call $scm_write (l %x2) - ret %x3 + storel 10, %.2 + %x1 =l call $scm_write (l %x0) + ret %x1 } \ No newline at end of file diff --git a/play/wtf.s b/play/wtf.s new file mode 100644 index 0000000..f5c3363 --- /dev/null +++ b/play/wtf.s @@ -0,0 +1,31 @@ +.data +.balign 8 +fstr: + .ascii "%s" + .byte 0 +/* end data */ + +.data +.balign 8 +str: + .ascii "안녕하세요" + .byte 0 +/* end data */ + +.text +.globl main +main: + pushq %rbp + movq %rsp, %rbp + leaq str(%rip), %rsi + leaq fstr(%rip), %rdi + movl $0, %eax + callq printf + movl $0, %eax + leave + ret +.type main, @function +.size main, .-main +/* end function main */ + +.section .note.GNU-stack,"",@progbits diff --git a/play/wtf.ssa b/play/wtf.ssa new file mode 100644 index 0000000..44fca0e --- /dev/null +++ b/play/wtf.ssa @@ -0,0 +1,8 @@ +data $fstr = { b "%s", b 0 } +data $str = { b "안녕하세요", b 0 } + +export function w $main () { +@start + call $printf (l $fstr, ..., l $str) + ret 0 +} \ No newline at end of file diff --git a/runtime/gyehoek.c b/runtime/gyehoek.c index 09cccd3..96ba5a4 100644 --- a/runtime/gyehoek.c +++ b/runtime/gyehoek.c @@ -2,20 +2,54 @@ #include #include "gyehoek.h" + + +const long scm_tc3_cons = 0; + +const long scm_tc7_obarray = 0x55; +const long scm_tc7_symbol = 0x05; +const long scm_tc7_string = 0x15; + + + SCM scm_newline () { putc ('\n', stdout); return SCM_PACK(NULL); } +static void scm_write_string (SCM x) { + const size_t len = SCM_CELL_WORD (x, 1); + const char *s = (const char *) SCM_UNPACK_POINTER (SCM_CELL_OBJECT (x, 2)); + /* FIXME: this is a very naïve implementation with no escaping. */ + printf ("some unrelated unicode lol: %s\n", "왜 하냐??"); + printf ("\"%.*s\"", (int) len, s); +} + SCM scm_write (SCM x) { if (SCM_IMP (x)) { printf ("%ld", SCM_UNPACK (x) >> 2); + } else if (SCM_CONSP (x)) { + printf ("("); + scm_write (scm_car (x)); + printf (" . "); + scm_write (scm_cdr (x)); + printf (")"); + } else if (SCM_STRINGP (x)) { + scm_write_string (x); } else { printf ("#", SCM_UNPACK (x)); } return SCM_PACK(NULL); } +SCM scm_car (SCM x) { + return SCM_CELL_OBJECT (x, 0); +} + +SCM scm_cdr (SCM x) { + return SCM_CELL_OBJECT (x, 1); +} + SCM scm_words (scm_t_bits word_0, uint32_t n_words) { scm_t_bits *r = GC_malloc (n_words * sizeof (scm_t_bits)); r[0] = word_0; @@ -24,11 +58,18 @@ SCM scm_words (scm_t_bits word_0, uint32_t n_words) { SCM scm_from_utf8_string (const char *str, size_t len) { SCM r = scm_words (scm_tc7_string, 3); - const char *s = GC_malloc (len); SCM_SET_CELL_WORD (r, 1, len); - SCM_SET_CELL_WORD (r, 2, s); + SCM_SET_CELL_WORD (r, 2, str); + printf ("str: %p\n", str); return r; } -SCM scm_from_utf8_symbol (const char *s) { +SCM scm_from_utf8_symbol (const char *s, size_t len) { +} + +SCM scm_cons (SCM car, SCM cdr) { + scm_t_bits *r = GC_malloc (2 * sizeof (scm_t_bits)); + r[0] = SCM_UNPACK (car); + r[1] = SCM_UNPACK (cdr); + return SCM_PACK (r); } diff --git a/runtime/gyehoek.h b/runtime/gyehoek.h index 49302b8..9a33566 100644 --- a/runtime/gyehoek.h +++ b/runtime/gyehoek.h @@ -1,6 +1,7 @@ #ifndef GYEHOEK_H #define GYEHOEK_H +#include #include @@ -38,7 +39,7 @@ typedef union SCM { struct { scm_t_bits n; } n; } SCM; Guile also known as a cons-cell): This is done by first checking that the SCM variable holds a heap object, and second, by checking that tc1==0 holds for the SCM_CELL_TYPE of the SCM variable. */ -#define SCM_I_CONSP(x) (!SCM_IMP (x) && ((1 & SCM_CELL_TYPE (x)) == 0)) +#define SCM_CONSP(x) (!SCM_IMP (x) && ((1 & SCM_CELL_TYPE (x)) == 0)) @@ -49,7 +50,12 @@ typedef union SCM { struct { scm_t_bits n; } n; } SCM; #define SCM_ITAG3(x) (7 & SCM_UNPACK (x)) #define SCM_TYP3(x) (7 & SCM_CELL_TYPE (x)) -#define scm_tc3_cons 0 +/* #define scm_tc3_cons 0 */ +extern const long scm_tc3_cons; + +SCM scm_cons (SCM car, SCM cdr); +SCM scm_car (SCM x); +SCM scm_cdr (SCM x); @@ -64,22 +70,29 @@ typedef union SCM { struct { scm_t_bits n; } n; } SCM; #define SCM_SET_CELL_WORD(x, n, v) \ (SCM_SET_CELL_OBJECT ((x), (n), SCM_PACK (v))) -#define SCM_CELL_TYPE(x) SCM_CELL_WORD (x) +#define SCM_CELL_TYPE(x) SCM_CELL_WORD (x, 0) #define SCM_TYP7(x) (0x7f & SCM_CELL_TYPE (x)) #define SCM_HAS_HEAP_TYPE(x, type, tag) \ (SCM_NIMP (x) && type (x) == (tag)) #define SCM_HAS_TYP7(x, tag) (SCM_HAS_HEAP_TYPE (x, SCM_TYP7, tag)) -#define scm_tc7_obarray 0x55 -#define scm_tc7_symbol 0x05 -#define scm_tc7_string 0x15 +extern const long scm_tc7_obarray; +extern const long scm_tc7_symbol; +extern const long scm_tc7_string; + + + +#define SCM_STRINGP(x) (SCM_TYP7 (x) == scm_tc7_string) SCM scm_words (scm_t_bits word_0, uint32_t n_words); -/* Construct a symbol from a UTF-8 string. */ -SCM scm_from_utf8 (const char *); +/* Construct a Scheme string. */ +SCM scm_from_utf8_string (const char *str, size_t len); + +/* Intern a symbol with a UTF-8 string name. */ +SCM scm_from_utf8_symbol (const char *s, size_t len);