1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-04-29 19:30:36 +02:00

Deprecate symbol properties.

* libguile/strings.c (scm_i_make_symbol): Remove 'props' argument.  Use
3 words instead of 'scm_double_cell'.
* libguile/strings.h: Adjust accordingly.
* libguile/symbols.c (scm_i_str2symbol, scm_i_str2uninterned_symbol):
Likewise.
(scm_symbol_fref, scm_symbol_pref, scm_symbol_fset_x,
scm_symbol_pset_x): Move to...
* libguile/deprecated.c: ... here.  Rewrite in terms of object
properties.
(symbol_function_slot, symbol_property_slot): New variables.
* libguile/symbols.h (SCM_SYMBOL_FUNC, SCM_SET_SYMBOL_FUNC)
(SCM_SYMBOL_PROPS, SCM_SET_SYMBOL_PROPS)
(scm_symbol_fref, scm_symbol_pref, scm_symbol_fset_x)
(scm_symbol_pset_x): Move to...
* libguile/deprecated.h: ... here.  Mark declarations as 'SCM_DEPRECATED'.
* module/system/base/types.scm (cell->object): Remove 'props' field for
%TC7-SYMBOL.
* doc/ref/api-data.texi (Symbol Props): Remove.
* NEWS: Update.
This commit is contained in:
Ludovic Courtès 2022-02-04 10:41:44 +01:00
parent 2ebf039707
commit 8e2e2ceb17
9 changed files with 87 additions and 150 deletions

8
NEWS
View file

@ -175,6 +175,14 @@ SCM_SET_ARRAY_CONTIGUOUS_FLAG, SCM_CLR_ARRAY_CONTIGUOUS_FLAG,
SCM_I_ARRAY_CONTP preprocessor interfaces, as they were internal and
there is no longer a sensible way of using them.
** Deprecate symbol properties
Symbols used to have a "function slot" and a "property slot", inherited
from Emacs Lisp and early Lisps, which one would access with
'symbol-pref', 'symbol-fref', 'symbol-pset!', and 'symbol-fset!'. These
procedures have been discouraged in favor of object properties; they are
now deprecated. This saves a few words of memory per symbol.
* Bug fixes
** Fix compilation of (ash x N), where N is a literal, at -O1 and below

View file

@ -1,6 +1,6 @@
@c -*-texinfo-*-
@c This is part of the GNU Guile Reference Manual.
@c Copyright (C) 1996, 1997, 2000-2004, 2006-2017, 2019-2020
@c Copyright (C) 1996, 1997, 2000-2004, 2006-2017, 2019-2020, 2022
@c Free Software Foundation, Inc.
@c See the file guile.texi for copying conditions.
@ -4657,7 +4657,6 @@ which more below (@pxref{Symbol Variables}).
* Symbol Keys:: Symbols as lookup keys.
* Symbol Variables:: Symbols as denoting variables.
* Symbol Primitives:: Operations related to symbols.
* Symbol Props:: Function slots and property lists.
* Symbol Read Syntax:: Extended read syntax for symbols.
* Symbol Uninterned:: Uninterned symbols.
@end menu
@ -5028,84 +5027,6 @@ so. Uniqueness can be guaranteed by instead using uninterned symbols
and read back in.
@node Symbol Props
@subsubsection Function Slots and Property Lists
In traditional Lisp dialects, symbols are often understood as having
three kinds of value at once:
@itemize @bullet
@item
a @dfn{variable} value, which is used when the symbol appears in
code in a variable reference context
@item
a @dfn{function} value, which is used when the symbol appears in
code in a function name position (i.e.@: as the first element in an
unquoted list)
@item
a @dfn{property list} value, which is used when the symbol is given as
the first argument to Lisp's @code{put} or @code{get} functions.
@end itemize
Although Scheme (as one of its simplifications with respect to Lisp)
does away with the distinction between variable and function namespaces,
Guile currently retains some elements of the traditional structure in
case they turn out to be useful when implementing translators for other
languages, in particular Emacs Lisp.
Specifically, Guile symbols have two extra slots, one for a symbol's
property list, and one for its ``function value.'' The following procedures
are provided to access these slots.
@deffn {Scheme Procedure} symbol-fref symbol
@deffnx {C Function} scm_symbol_fref (symbol)
Return the contents of @var{symbol}'s @dfn{function slot}.
@end deffn
@deffn {Scheme Procedure} symbol-fset! symbol value
@deffnx {C Function} scm_symbol_fset_x (symbol, value)
Set the contents of @var{symbol}'s function slot to @var{value}.
@end deffn
@deffn {Scheme Procedure} symbol-pref symbol
@deffnx {C Function} scm_symbol_pref (symbol)
Return the @dfn{property list} currently associated with @var{symbol}.
@end deffn
@deffn {Scheme Procedure} symbol-pset! symbol value
@deffnx {C Function} scm_symbol_pset_x (symbol, value)
Set @var{symbol}'s property list to @var{value}.
@end deffn
@deffn {Scheme Procedure} symbol-property sym prop
From @var{sym}'s property list, return the value for property
@var{prop}. The assumption is that @var{sym}'s property list is an
association list whose keys are distinguished from each other using
@code{equal?}; @var{prop} should be one of the keys in that list. If
the property list has no entry for @var{prop}, @code{symbol-property}
returns @code{#f}.
@end deffn
@deffn {Scheme Procedure} set-symbol-property! sym prop val
In @var{sym}'s property list, set the value for property @var{prop} to
@var{val}, or add a new entry for @var{prop}, with value @var{val}, if
none already exists. For the structure of the property list, see
@code{symbol-property}.
@end deffn
@deffn {Scheme Procedure} symbol-property-remove! sym prop
From @var{sym}'s property list, remove the entry for property
@var{prop}, if there is one. For the structure of the property list,
see @code{symbol-property}.
@end deffn
Support for these extra slots may be removed in a future release, and it
is probably better to avoid using them. For a more modern and Schemely
approach to properties, see @ref{Object Properties}.
@node Symbol Read Syntax
@subsubsection Extended Read Syntax for Symbols

View file

@ -41,6 +41,7 @@
#include "gc.h"
#include "gsubr.h"
#include "modules.h"
#include "objprop.h"
#include "procprop.h"
#include "srcprop.h"
#include "srfi-4.h"
@ -677,6 +678,57 @@ scm_copy_tree (SCM obj)
return scm_call_1 (scm_c_public_ref ("ice-9 copy-tree", "copy-tree"), obj);
}
/* Symbol properties. */
SCM_SYMBOL (symbol_function_slot, "symbol-function-slot");
SCM_SYMBOL (symbol_property_slot, "symbol-property-slot");
SCM_DEFINE (scm_symbol_fref, "symbol-fref", 1, 0, 0,
(SCM s),
"Return the contents of the symbol @var{s}'s @dfn{function slot}.")
#define FUNC_NAME s_scm_symbol_fref
{
SCM_VALIDATE_SYMBOL (1, s);
return scm_object_property (s, symbol_function_slot);
}
#undef FUNC_NAME
SCM_DEFINE (scm_symbol_pref, "symbol-pref", 1, 0, 0,
(SCM s),
"Return the @dfn{property list} currently associated with the\n"
"symbol @var{s}.")
#define FUNC_NAME s_scm_symbol_pref
{
SCM result;
SCM_VALIDATE_SYMBOL (1, s);
result = scm_object_property (s, symbol_property_slot);
return scm_is_false (result) ? SCM_EOL : result;
}
#undef FUNC_NAME
SCM_DEFINE (scm_symbol_fset_x, "symbol-fset!", 2, 0, 0,
(SCM s, SCM val),
"Change the binding of the symbol @var{s}'s function slot.")
#define FUNC_NAME s_scm_symbol_fset_x
{
SCM_VALIDATE_SYMBOL (1, s);
return scm_set_object_property_x (s, symbol_function_slot, val);
}
#undef FUNC_NAME
SCM_DEFINE (scm_symbol_pset_x, "symbol-pset!", 2, 0, 0,
(SCM s, SCM val),
"Change the binding of the symbol @var{s}'s property slot.")
#define FUNC_NAME s_scm_symbol_pset_x
{
SCM_VALIDATE_SYMBOL (1, s);
return scm_set_object_property_x (s, symbol_property_slot, val);
}
#undef FUNC_NAME

View file

@ -144,6 +144,16 @@ SCM_DEPRECATED SCM scm_make_srcprops (long line, int col, SCM filename,
SCM_DEPRECATED SCM scm_copy_tree (SCM obj);
#define SCM_SYMBOL_FUNC(x) (scm_symbol_fref (x))
#define SCM_SET_SYMBOL_FUNC(x,f) (scm_symbol_fset_x (x, f))
#define SCM_SYMBOL_PROPS(x) (scm_symbol_pref (x))
#define SCM_SET_SYMBOL_PROPS(x,p) (scm_symbol_pset_x (x, p))
SCM_DEPRECATED SCM scm_symbol_fref (SCM s);
SCM_DEPRECATED SCM scm_symbol_pref (SCM s);
SCM_DEPRECATED SCM scm_symbol_fset_x (SCM s, SCM val);
SCM_DEPRECATED SCM scm_symbol_pset_x (SCM s, SCM val);
SCM_DEPRECATED SCM scm_dynamic_unlink (SCM obj);
/* Each bignum is just an mpz_t stored in a double cell starting at word 1. */

View file

@ -760,16 +760,19 @@ scm_i_string_set_x (SCM str, size_t p, scm_t_wchar chr)
#define SYMBOL_STRINGBUF SCM_CELL_OBJECT_1
SCM
scm_i_make_symbol (SCM name, scm_t_bits flags,
unsigned long hash, SCM props)
scm_i_make_symbol (SCM name, scm_t_bits flags, unsigned long hash)
{
SCM buf;
SCM buf, symbol;
size_t length = STRING_LENGTH (name);
name = scm_i_substring_copy (name, 0, length);
buf = STRING_STRINGBUF (name);
return scm_double_cell (scm_tc7_symbol | flags, SCM_UNPACK (buf),
(scm_t_bits) hash, SCM_UNPACK (props));
symbol = scm_words (scm_tc7_symbol | flags, 3);
SCM_SET_CELL_WORD_1 (symbol, SCM_UNPACK (buf));
SCM_SET_CELL_WORD_2 (symbol, hash);
return symbol;
}
/* Returns the number of characters in SYM. This may be different

View file

@ -1,7 +1,7 @@
#ifndef SCM_STRINGS_H
#define SCM_STRINGS_H
/* Copyright 1995-1998,2000-2001,2004-2006,2008-2011,2013,2015-2019
/* Copyright 1995-1998,2000-2001,2004-2006,2008-2011,2013,2015-2019,2022
Free Software Foundation, Inc.
This file is part of Guile.
@ -250,7 +250,7 @@ SCM_INTERNAL void scm_i_string_set_x (SCM str, size_t p, scm_t_wchar chr);
/* internal functions related to symbols. */
SCM_INTERNAL SCM scm_i_make_symbol (SCM name, scm_t_bits flags,
unsigned long hash, SCM props);
unsigned long hash);
SCM_INTERNAL const char *scm_i_symbol_chars (SCM sym);
SCM_INTERNAL const scm_t_wchar *scm_i_symbol_wide_chars (SCM sym);
SCM_INTERNAL size_t scm_i_symbol_length (SCM sym);

View file

@ -1,4 +1,4 @@
/* Copyright 1995-1998,2000-2001,2003-2004,2006,2009,2011,2013,2015,2018
/* Copyright 1995-1998,2000-2001,2003-2004,2006,2009,2011,2013,2015,2018,2022
Free Software Foundation, Inc.
This file is part of Guile.
@ -247,8 +247,7 @@ scm_i_str2symbol (SCM str)
else
{
/* The symbol was not found, create it. */
symbol = scm_i_make_symbol (str, 0, raw_hash,
scm_cons (SCM_BOOL_F, SCM_EOL));
symbol = scm_i_make_symbol (str, 0, raw_hash);
/* Might return a different symbol, if another one was interned at
the same time. */
@ -264,8 +263,7 @@ scm_i_str2uninterned_symbol (SCM str)
{
size_t raw_hash = scm_i_string_hash (str);
return scm_i_make_symbol (str, SCM_I_F_SYMBOL_UNINTERNED,
raw_hash, scm_cons (SCM_BOOL_F, SCM_EOL));
return scm_i_make_symbol (str, SCM_I_F_SYMBOL_UNINTERNED, raw_hash);
}
SCM_DEFINE (scm_symbol_p, "symbol?", 1, 0, 0,
@ -421,52 +419,6 @@ SCM_DEFINE (scm_symbol_hash, "symbol-hash", 1, 0, 0,
}
#undef FUNC_NAME
SCM_DEFINE (scm_symbol_fref, "symbol-fref", 1, 0, 0,
(SCM s),
"Return the contents of the symbol @var{s}'s @dfn{function slot}.")
#define FUNC_NAME s_scm_symbol_fref
{
SCM_VALIDATE_SYMBOL (1, s);
return SCM_CAR (SCM_CELL_OBJECT_3 (s));
}
#undef FUNC_NAME
SCM_DEFINE (scm_symbol_pref, "symbol-pref", 1, 0, 0,
(SCM s),
"Return the @dfn{property list} currently associated with the\n"
"symbol @var{s}.")
#define FUNC_NAME s_scm_symbol_pref
{
SCM_VALIDATE_SYMBOL (1, s);
return SCM_CDR (SCM_CELL_OBJECT_3 (s));
}
#undef FUNC_NAME
SCM_DEFINE (scm_symbol_fset_x, "symbol-fset!", 2, 0, 0,
(SCM s, SCM val),
"Change the binding of the symbol @var{s}'s function slot.")
#define FUNC_NAME s_scm_symbol_fset_x
{
SCM_VALIDATE_SYMBOL (1, s);
scm_set_car_x (SCM_CELL_OBJECT_3 (s), val);
return SCM_UNSPECIFIED;
}
#undef FUNC_NAME
SCM_DEFINE (scm_symbol_pset_x, "symbol-pset!", 2, 0, 0,
(SCM s, SCM val),
"Change the binding of the symbol @var{s}'s property slot.")
#define FUNC_NAME s_scm_symbol_pset_x
{
SCM_VALIDATE_SYMBOL (1, s);
scm_set_cdr_x (SCM_CELL_OBJECT_3 (s), val);
return SCM_UNSPECIFIED;
}
#undef FUNC_NAME
SCM
scm_from_locale_symbol (const char *sym)
{

View file

@ -1,7 +1,7 @@
#ifndef SCM_SYMBOLS_H
#define SCM_SYMBOLS_H
/* Copyright 1995-1998,2000-2001,2003-2004,2006,2008,2010-2011,2018
/* Copyright 1995-1998,2000-2001,2003-2004,2006,2008,2010-2011,2018,2022
Free Software Foundation, Inc.
This file is part of Guile.
@ -80,10 +80,6 @@ SCM_SNARF_INIT(c_name = scm_from_utf8_symbol (scheme_name))
/* Older spellings; don't use in new code.
*/
#define SCM_SYMBOLP(x) (scm_is_symbol (x))
#define SCM_SYMBOL_FUNC(x) (scm_symbol_fref (x))
#define SCM_SET_SYMBOL_FUNC(x,f) (scm_symbol_fset_x (x, f))
#define SCM_SYMBOL_PROPS(x) (scm_symbol_pref (x))
#define SCM_SET_SYMBOL_PROPS(x,p) (scm_symbol_pset_x (x, p))
#define SCM_SYMBOL_HASH(x) (scm_i_symbol_hash (x))
#define SCM_SYMBOL_INTERNED_P(x) (scm_i_symbol_is_interned (x))
@ -100,11 +96,6 @@ SCM_API SCM scm_symbol_to_string (SCM s);
SCM_API SCM scm_string_to_symbol (SCM s);
SCM_API SCM scm_string_ci_to_symbol (SCM s);
SCM_API SCM scm_symbol_fref (SCM s);
SCM_API SCM scm_symbol_pref (SCM s);
SCM_API SCM scm_symbol_fset_x (SCM s, SCM val);
SCM_API SCM scm_symbol_pset_x (SCM s, SCM val);
SCM_API SCM scm_symbol_hash (SCM s);
SCM_API SCM scm_gensym (SCM prefix);

View file

@ -1,5 +1,5 @@
;;; 'SCM' type tag decoding.
;;; Copyright (C) 2014, 2015, 2017, 2018 Free Software Foundation, Inc.
;;; Copyright (C) 2014, 2015, 2017, 2018, 2022 Free Software Foundation, Inc.
;;;
;;; This library is free software; you can redistribute it and/or modify it
;;; under the terms of the GNU Lesser General Public License as published by
@ -397,7 +397,7 @@ using BACKEND."
(address->inferior-struct address
(- vtable-address %tc3-struct)
backend))
(((_ & #x7f = %tc7-symbol) buf hash props)
(((_ & #x7f = %tc7-symbol) buf hash)
(match (cell->object buf backend)
(($ <stringbuf> string)
(string->symbol string))))