HELP: bad-superclass
{ $error-description "Thrown if an attempt is made to subclass a class that is not a tuple class, or a tuple class declared " { $link POSTPONE: final } "." } ;
+HELP: ?offset-of-slot
+{ $values { "name" string } { "tuple" tuple } { "n" { $maybe integer } } }
+{ $description "Returns the offset of a tuple slot accessed by " { $snippet "name" } ", or " { $link f } " if no slot with that name." } ;
+
HELP: offset-of-slot
{ $values { "name" string } { "tuple" tuple } { "n" integer } }
-{ $description "Returns the offset of a tuple slot accessed by " { $snippet "name" } "." } ;
+{ $description "Returns the offset of a tuple slot accessed by " { $snippet "name" } "." }
+{ $errors "Throws a " { $link no-slot } " error if no slot with that name." } ;
HELP: get-slot-named
{ $values { "name" string } { "tuple" tuple } { "value" object } }
-{ $description "Returns the " { $snippet "value" } " stored in a tuple slot accessed by " { $snippet "name" } "." } ;
+{ $description "Returns the " { $snippet "value" } " stored in a tuple slot accessed by " { $snippet "name" } "." }
+{ $errors "Throws a " { $link no-slot } " error if no slot with that name." } ;
HELP: set-slot-named
{ $values { "value" object } { "name" string } { "tuple" tuple } }
-{ $description "Stores the " { $snippet "value" } " into a tuple slot accessed by " { $snippet "name" } "." } ;
+{ $description "Stores the " { $snippet "value" } " into a tuple slot accessed by " { $snippet "name" } "." }
+{ $errors "Throws a " { $link no-slot } " error if no slot with that name." } ;
HELP: set-slots
{ $values { "assoc" assoc } { "tuple" tuple } }
ERROR: no-slot name tuple ;
+: ?offset-of-slot ( name tuple -- n/f )
+ class-of all-slots slot-named [ offset>> ] [ f ] if* ;
+
: offset-of-slot ( name tuple -- n )
- 2dup class-of all-slots slot-named
- [ 2nip offset>> ] [ no-slot ] if* ;
+ 2dup ?offset-of-slot [ 2nip ] [ no-slot ] if* ;
: get-slot-named ( name tuple -- value )
[ nip ] [ offset-of-slot ] 2bi slot ;