From 4e895c97d01e4ff98fe68f752c177f71dd1a31bc Mon Sep 17 00:00:00 2001 From: Yuichi Nishiwaki Date: Tue, 22 Jul 2014 09:15:16 +0900 Subject: [PATCH] =?UTF-8?q?rewrite=20symbol=3D=3F=20in=20c?= --- piclib/prelude.scm | 13 ------------- src/symbol.c | 20 ++++++++++++++++++++ 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/piclib/prelude.scm b/piclib/prelude.scm index 2a9993cc..114bcffa 100644 --- a/piclib/prelude.scm +++ b/piclib/prelude.scm @@ -609,19 +609,6 @@ (export member assoc) -;;; 6.5. Symbols - -(define (symbol=? . objs) - (let ((sym (car objs))) - (if (symbol? sym) - (every (lambda (x) - (and (symbol? x) - (eq? x sym))) - (cdr objs)) - #f))) - -(export symbol=?) - ;;; 6.6 Characters (define-macro (define-char-transitive-predicate name op) diff --git a/src/symbol.c b/src/symbol.c index 863e41f3..1ebbdc3d 100644 --- a/src/symbol.c +++ b/src/symbol.c @@ -77,6 +77,25 @@ pic_symbol_symbol_p(pic_state *pic) return pic_bool_value(pic_sym_p(v)); } +static pic_value +pic_symbol_symbol_eq_p(pic_state *pic) +{ + size_t argc, i; + pic_value *argv; + + pic_get_args(pic, "*", &argc, &argv); + + for (i = 0; i < argc; ++i) { + if (! pic_sym_p(argv[i])) { + return pic_false_value(); + } + if (! pic_eq_p(argv[i], argv[0])) { + return pic_false_value(); + } + } + return pic_true_value(); +} + static pic_value pic_symbol_symbol_to_string(pic_state *pic) { @@ -109,6 +128,7 @@ void pic_init_symbol(pic_state *pic) { pic_defun(pic, "symbol?", pic_symbol_symbol_p); + pic_defun(pic, "symbol=?", pic_symbol_symbol_eq_p); pic_defun(pic, "symbol->string", pic_symbol_symbol_to_string); pic_defun(pic, "string->symbol", pic_symbol_string_to_symbol); }