* tests/syntax.test: Added tests for unmemoization.
[bpt/guile.git] / libguile / keywords.c
CommitLineData
cc95e00a 1/* Copyright (C) 1995,1996,1997,1998,1999,2000,2001, 2003, 2004 Free Software Foundation, Inc.
fca75708 2 *
73be1d9e
MV
3 * This library is free software; you can redistribute it and/or
4 * modify it under the terms of the GNU Lesser General Public
5 * License as published by the Free Software Foundation; either
6 * version 2.1 of the License, or (at your option) any later version.
fca75708 7 *
73be1d9e
MV
8 * This library is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11 * Lesser General Public License for more details.
fca75708 12 *
73be1d9e
MV
13 * You should have received a copy of the GNU Lesser General Public
14 * License along with this library; if not, write to the Free Software
15 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
16 */
1bbd0b84 17
1bbd0b84 18
fca75708
MD
19\f
20
13070bd3
DH
21#include <string.h>
22
a0599745
MD
23#include "libguile/_scm.h"
24#include "libguile/ports.h"
25#include "libguile/root.h"
26#include "libguile/smob.h"
00ffa0e7 27#include "libguile/hashtab.h"
a0599745
MD
28
29#include "libguile/validate.h"
30#include "libguile/keywords.h"
cc95e00a
MV
31#include "libguile/strings.h"
32
fca75708
MD
33\f
34
92c2555f 35scm_t_bits scm_tc16_keyword;
e841c3e0 36
fca75708 37static int
e81d98ec 38keyword_print (SCM exp, SCM port, scm_print_state *pstate SCM_UNUSED)
fca75708 39{
bab246f3
DH
40 SCM symbol = SCM_KEYWORDSYM (exp);
41
fca75708 42 scm_puts ("#:", port);
cc95e00a
MV
43 scm_print_symbol_name (scm_i_symbol_chars (symbol) + 1,
44 scm_i_symbol_length (symbol) - 1,
ca314021 45 port);
bab246f3 46 scm_remember_upto_here_1 (symbol);
fca75708
MD
47 return 1;
48}
49
a1ec6916 50SCM_DEFINE (scm_make_keyword_from_dash_symbol, "make-keyword-from-dash-symbol", 1, 0, 0,
1bbd0b84 51 (SCM symbol),
872e0c72 52 "Make a keyword object from a @var{symbol} that starts with a dash.")
1bbd0b84 53#define FUNC_NAME s_scm_make_keyword_from_dash_symbol
fca75708 54{
86d31dfe 55 SCM keyword;
fca75708 56
cc95e00a
MV
57 SCM_ASSERT (scm_is_symbol (symbol)
58 && ('-' == scm_i_symbol_chars(symbol)[0]),
1bbd0b84 59 symbol, SCM_ARG1, FUNC_NAME);
fca75708
MD
60
61 SCM_DEFER_INTS;
86d31dfe 62 keyword = scm_hashq_ref (scm_keyword_obarray, symbol, SCM_BOOL_F);
7888309b 63 if (scm_is_false (keyword))
fca75708 64 {
54778cd3 65 SCM_NEWSMOB (keyword, scm_tc16_keyword, SCM_UNPACK (symbol));
86d31dfe 66 scm_hashq_set_x (scm_keyword_obarray, symbol, keyword);
fca75708
MD
67 }
68 SCM_ALLOW_INTS;
86d31dfe 69 return keyword;
fca75708 70}
1bbd0b84 71#undef FUNC_NAME
fca75708 72
430a6cc3
MD
73SCM
74scm_c_make_keyword (char *s)
75{
cc95e00a
MV
76 char *buf;
77 size_t len;
78 SCM string, symbol;
85db4a2c 79
cc95e00a
MV
80 len = strlen (s) + 1;
81 string = scm_i_make_string (len, &buf);
430a6cc3
MD
82 buf[0] = '-';
83 strcpy (buf + 1, s);
cc95e00a 84 symbol = scm_string_to_symbol (string);
85db4a2c 85 return scm_make_keyword_from_dash_symbol (symbol);
430a6cc3
MD
86}
87
3b3b36dd 88SCM_DEFINE (scm_keyword_p, "keyword?", 1, 0, 0,
da4a1dba 89 (SCM obj),
1e6808ea
MG
90 "Return @code{#t} if the argument @var{obj} is a keyword, else\n"
91 "@code{#f}.")
1bbd0b84 92#define FUNC_NAME s_scm_keyword_p
fca75708 93{
7888309b 94 return scm_from_bool (SCM_KEYWORDP (obj));
fca75708 95}
1bbd0b84 96#undef FUNC_NAME
fca75708
MD
97
98
3b3b36dd 99SCM_DEFINE (scm_keyword_dash_symbol, "keyword-dash-symbol", 1, 0, 0,
da4a1dba 100 (SCM keyword),
872e0c72
NJ
101 "Return the dash symbol for @var{keyword}.\n"
102 "This is the inverse of @code{make-keyword-from-dash-symbol}.")
1bbd0b84 103#define FUNC_NAME s_scm_keyword_dash_symbol
fca75708 104{
22a52da1
DH
105 SCM_VALIDATE_KEYWORD (1, keyword);
106 return SCM_KEYWORDSYM (keyword);
fca75708 107}
1bbd0b84 108#undef FUNC_NAME
fca75708
MD
109
110
111
112void
113scm_init_keywords ()
114{
e841c3e0
KN
115 scm_tc16_keyword = scm_make_smob_type ("keyword", 0);
116 scm_set_smob_mark (scm_tc16_keyword, scm_markcdr);
117 scm_set_smob_print (scm_tc16_keyword, keyword_print);
f5f2dcff 118
231a4ea8 119 scm_keyword_obarray = scm_c_make_hash_table (0);
a0599745 120#include "libguile/keywords.x"
fca75708
MD
121}
122
89e00824
ML
123
124/*
125 Local Variables:
126 c-file-style: "gnu"
127 End:
128*/