/* In unified keyword, we include preceding ':' to the name. */ ScmObj Scm_MakeKeyword(ScmString *name) { #if GAUCHE_UNIFY_SYMBOL_KEYWORD /* We could optimize this later. */ ScmObj prefix = Scm_MakeString(":", 1, 1, SCM_STRING_IMMUTABLE); ScmObj sname = Scm_StringAppend2(SCM_STRING(prefix), name); ScmSymbol *s = make_sym(SCM_CLASS_KEYWORD, SCM_STRING(sname), TRUE); Scm_DefineConst(Scm_KeywordModule(), s, SCM_OBJ(s)); return SCM_OBJ(s); #else /*!GAUCHE_UNIFY_SYMBOL_KEYWORD*/ (void)SCM_INTERNAL_MUTEX_LOCK(keywords.mutex); ScmObj r = Scm_HashTableRef(keywords.table, SCM_OBJ(name), SCM_FALSE); (void)SCM_INTERNAL_MUTEX_UNLOCK(keywords.mutex); if (SCM_KEYWORDP(r)) return r; ScmKeyword *k = SCM_NEW(ScmKeyword); SCM_SET_CLASS(k, SCM_CLASS_KEYWORD); k->name = SCM_STRING(Scm_CopyString(name)); (void)SCM_INTERNAL_MUTEX_LOCK(keywords.mutex); r = Scm_HashTableSet(keywords.table, SCM_OBJ(name), SCM_OBJ(k), SCM_DICT_NO_OVERWRITE); (void)SCM_INTERNAL_MUTEX_UNLOCK(keywords.mutex); return r; #endif /*!GAUCHE_UNIFY_SYMBOL_KEYWORD*/ }
/* In unified keyword, we include preceding ':' to the name. */ ScmObj Scm_MakeKeyword(ScmString *name) { #if GAUCHE_KEEP_DISJOINT_KEYWORD_OPTION if (keyword_disjoint_p) { (void)SCM_INTERNAL_MUTEX_LOCK(keywords.mutex); ScmObj r = Scm_HashTableRef(keywords.table, SCM_OBJ(name), SCM_FALSE); (void)SCM_INTERNAL_MUTEX_UNLOCK(keywords.mutex); if (SCM_KEYWORDP(r)) return r; ScmKeyword *k = SCM_NEW(ScmKeyword); SCM_SET_CLASS(k, SCM_CLASS_KEYWORD); k->name = SCM_STRING(Scm_CopyString(name)); (void)SCM_INTERNAL_MUTEX_LOCK(keywords.mutex); r = Scm_HashTableSet(keywords.table, SCM_OBJ(name), SCM_OBJ(k), SCM_DICT_NO_OVERWRITE); (void)SCM_INTERNAL_MUTEX_UNLOCK(keywords.mutex); return r; } #endif /*GAUCHE_KEEP_DISJOINT_KEYWORD_OPTION*/ ScmObj sname = Scm_StringAppend2(&keyword_prefix, name); ScmSymbol *s = make_sym(SCM_CLASS_KEYWORD, SCM_STRING(sname), TRUE); Scm_DefineConst(Scm__GaucheKeywordModule(), s, SCM_OBJ(s)); return SCM_OBJ(s); }
/* In unified keyword, we include preceding ':' to the name. */ ScmObj Scm_MakeKeyword(ScmString *name) { /* We could optimize this later. */ ScmObj prefix = Scm_MakeString(":", 1, 1, SCM_STRING_IMMUTABLE); ScmObj sname = Scm_StringAppend2(SCM_STRING(prefix), name); ScmSymbol *s = make_sym(SCM_CLASS_KEYWORD, SCM_STRING(sname), TRUE); Scm_DefineConst(Scm_KeywordModule(), s, SCM_OBJ(s)); return SCM_OBJ(s); }