@@ -1526,6 +1526,22 @@ CL_DEFUN Symbol_sp core__gensym_quick(SimpleBaseString_sp prefix,
15261526 return Symbol_O::create (name);
15271527}
15281528
1529+ CL_DEFUN Symbol_sp core__gensym_quick_char (SimpleCharacterString_sp prefix,
1530+ size_t suffix) {
1531+ size_t prefixlen = prefix->length ();
1532+ size_t suffixlen = (suffix < 2 ) ? 1 : std::ceil (std::log10 (suffix));
1533+ auto name = SimpleCharacterString_O::make (prefixlen + suffixlen);
1534+ for (size_t i = 0 ; i < prefixlen; ++i)
1535+ (*name)[i] = (*prefix)[i];
1536+ for (size_t j = prefixlen + suffixlen - 1 ; j >= prefixlen; --j) {
1537+ auto div = std::div (suffix, 10 );
1538+ (*name)[j] = div.rem + ' 0' ;
1539+ suffix = div.quot ;
1540+ }
1541+ return Symbol_O::create (name);
1542+
1543+ }
1544+
15291545CL_LAMBDA (&optional (x " G" ));
15301546CL_DECLARE ();
15311547CL_DOCSTRING (R"dx( See CLHS gensym)dx" );
@@ -1543,6 +1559,13 @@ CL_DEFUN Symbol_sp cl__gensym(T_sp x) {
15431559 Symbol_sp result = core__gensym_quick (gc::As_unsafe<SimpleBaseString_sp>(x), fcounter);
15441560 cl::_sym_STARgensym_counterSTAR->setf_symbolValue (Integer_O::create (1 + fcounter));
15451561 return result;
1562+ } else if (gc::IsA<SimpleCharacterString_sp>(x)
1563+ && counter.fixnump () && counter.unsafe_fixnum () >= 0 ) {
1564+ // other fast path
1565+ gctools::Fixnum fcounter = counter.unsafe_fixnum ();
1566+ Symbol_sp result = core__gensym_quick_char (gc::As_unsafe<SimpleCharacterString_sp>(x), fcounter);
1567+ cl::_sym_STARgensym_counterSTAR->setf_symbolValue (Integer_O::create (1 + fcounter));
1568+ return result;
15461569 }
15471570 String_sp sx = gc::As_unsafe<String_sp>(x);
15481571 StrNs_sp ss = gc::As_unsafe<StrNs_sp>(core__make_vector (sx->element_type (),16 ,true ,clasp_make_fixnum (0 )));
0 commit comments