#こんにちは。たまたま最近ひっかかったんですが、
#Gauche 0.9.1で、 (string-byte-set! (string-copy "あ") 0 1) とやると、
#*** ERROR: end argument out of range: 3 to
#と、エラーになります。
#バグのような気がするので、とりあえずご報告までに。
#ちょっとソース追った限りでは、 collection.h の SCM_CHECK_START_END マクロでこのエラーメッセージを出してるみたいでした。
#そのチェックがバイト単位か文字単位かを区別してないのが原因のようです
#確かstring-byte-set!は当初Cで実装してたのを途中でSchemeによる実装に変えたんで、変える前は引っかかってなかったのかも。
#--- a/src/string.c
+++ b/src/string.c
@@ -770,7 +770,7 @@ ScmObj Scm_StringReplaceBody(ScmString *str, const ScmStringBody *newbody)
static ScmObj substring(const ScmStringBody *xb, int start, int end,
int byterange)
{
- int len = SCM_STRING_BODY_LENGTH(xb);
+ int len = byterange? SCM_STRING_BODY_SIZE(xb) : SCM_STRING_BODY_LENGTH(xb);
int flags = SCM_STRING_BODY_FLAGS(xb) & ~SCM_STRING_IMMUTABLE;
SCM_CHECK_START_END(start, end, len);
#とりあえずこれでいいかな。
#おお、早いですね。ありがとうございます。