Post Scarcity
A prototype for a post scarcity programming environment
Loading...
Searching...
No Matches
consspaceobject.h
Go to the documentation of this file.
1/*
2 * consspaceobject.h
3 *
4 * Declarations common to all cons space objects.
5 *
6 *
7 * (c) 2017 Simon Brooke <simon@journeyman.cc>
8 * Licensed under GPL version 2.0, or, at your option, any later version.
9 */
10
11#ifndef __psse_consspaceobject_h
12#define __psse_consspaceobject_h
13
14#include <stdbool.h>
15#include <stdint.h>
16#include <stdio.h>
17/*
18 * wide characters
19 */
20#include <wchar.h>
21#include <wctype.h>
22
23#include "io/fopen.h"
24// #include "memory/conspage.h"
25
26
27/**
28 * The length of a tag, in bytes.
29 */
30#define TAGLENGTH 4
31
32/*
33 * tag values, all of which must be 4 bytes. Must not collide with vector space
34 * tag values
35 */
36
37/**
38 * An ordinary cons cell:
39 */
40#define CONSTAG "CONS"
41
42/**
43 * The string `CONS`, considered as an `unsigned int`.
44 * @todo tag values should be collected into an enum.
45 */
46#define CONSTV 1397641027
47
48/**
49 * An exception. TODO: we need a means of dealing with different classes of
50 * exception, and we don't have one yet.
51 */
52#define EXCEPTIONTAG "EXEP"
53
54/**
55 * The string `EXEP`, considered as an `unsigned int`.
56 */
57#define EXCEPTIONTV 1346721861
58
59/**
60 * An unallocated cell on the free list - should never be encountered by a Lisp
61 * function.
62 */
63#define FREETAG "FREE"
64
65/**
66 * The string `FREE`, considered as an `unsigned int`.
67 */
68#define FREETV 1162170950
69
70/**
71 * An ordinary Lisp function - one whose arguments are pre-evaluated.
72 * \see LAMBDATAG for interpretable functions.
73 * \see SPECIALTAG for functions whose arguments are not pre-evaluated.
74 */
75#define FUNCTIONTAG "FUNC"
76
77/**
78 * The string `FUNC`, considered as an `unsigned int`.
79 */
80#define FUNCTIONTV 1129207110
81
82/**
83 * An integer number (bignums are integers).
84 */
85#define INTEGERTAG "INTR"
86
87/**
88 * The string `INTR`, considered as an `unsigned int`.
89 */
90#define INTEGERTV 1381256777
91
92/**
93 * A keyword - an interned, self-evaluating string.
94 */
95#define KEYTAG "KEYW"
96
97/**
98 * The string `KEYW`, considered as an `unsigned int`.
99 */
100#define KEYTV 1465468235
101
102/**
103 * A lambda cell. Lambdas are the interpretable (source) versions of functions.
104 * \see FUNCTIONTAG.
105 */
106#define LAMBDATAG "LMDA"
107
108/**
109 * The string `LMDA`, considered as an `unsigned int`.
110 */
111#define LAMBDATV 1094995276
112
113/**
114 * A loop exit is a special kind of exception which has exactly the same
115 * payload as an exception.
116 */
117#define LOOPTAG "LOOP"
118
119/**
120 * The string `LOOX`, considered as an `unsigned int`.
121 */
122#define LOOPTV 1347374924
123
124/**
125 * @brief Tag for a lazy cons cell.
126 *
127 * A lazy cons cell is like a cons cell, but lazy.
128 *
129 */
130#define LAZYCONSTAG "LZYC"
131
132/**
133 * @brief Tag for a lazy string cell.
134 *
135 * A lazy string cell is like a string cell, but lazy.
136 *
137 */
138#define LAZYSTRTAG "LZYS"
139
140/**
141 * @brief Tag for a lazy worker cell.
142 *
143 * A lazy
144 *
145 */
146#define LAZYWRKRTAG "WRKR"
147
148/**
149 * The special cons cell at address {0,0} whose car and cdr both point to
150 * itself.
151 */
152#define NILTAG "NIL "
153
154/**
155 * The string `NIL `, considered as an `unsigned int`.
156 */
157#define NILTV 541870414
158
159/**
160 * An nlambda cell. NLambdas are the interpretable (source) versions of special
161 * forms. \see SPECIALTAG.
162 */
163#define NLAMBDATAG "NLMD"
164
165/**
166 * The string `NLMD`, considered as an `unsigned int`.
167 */
168#define NLAMBDATV 1145916494
169
170/**
171 * A rational number, stored as pointers two integers representing dividend
172 * and divisor respectively.
173 */
174#define RATIOTAG "RTIO"
175
176/**
177 * The string `RTIO`, considered as an `unsigned int`.
178 */
179#define RATIOTV 1330205778
180
181/**
182 * An open read stream.
183 */
184#define READTAG "READ"
185
186/**
187 * The string `READ`, considered as an `unsigned int`.
188 */
189#define READTV 1145128274
190
191/**
192 * A real number, represented internally as an IEEE 754-2008 `binary64`.
193 */
194#define REALTAG "REAL"
195
196/**
197 * The string `REAL`, considered as an `unsigned int`.
198 */
199#define REALTV 1279346002
200
201/**
202 * A special form - one whose arguments are not pre-evaluated but passed as
203 * provided.
204 * \see NLAMBDATAG.
205 */
206#define SPECIALTAG "SPFM"
207
208/**
209 * The string `SPFM`, considered as an `unsigned int`.
210 */
211#define SPECIALTV 1296453715
212
213/**
214 * A string of characters, organised as a linked list.
215 */
216#define STRINGTAG "STRG"
217
218/**
219 * The string `STRG`, considered as an `unsigned int`.
220 */
221#define STRINGTV 1196577875
222
223/**
224 * A symbol is just like a string except not self-evaluating.
225 */
226#define SYMBOLTAG "SYMB"
227
228/**
229 * The string `SYMB`, considered as an `unsigned int`.
230 */
231#define SYMBOLTV 1112365395
232
233/**
234 * A time stamp.
235 */
236#define TIMETAG "TIME"
237
238/**
239 * The string `TIME`, considered as an `unsigned int`.
240 */
241#define TIMETV 1162692948
242
243/**
244 * The special cons cell at address {0,1} which is canonically different
245 * from NIL.
246 */
247#define TRUETAG "TRUE"
248
249/**
250 * The string `TRUE`, considered as an `unsigned int`.
251 */
252#define TRUETV 1163219540
253
254/**
255 * A pointer to an object in vector space.
256 */
257#define VECTORPOINTTAG "VECP"
258
259/**
260 * The string `VECP`, considered as an `unsigned int`.
261 */
262#define VECTORPOINTTV 1346585942
263
264/**
265 * An open write stream.
266 */
267#define WRITETAG "WRIT"
268
269/**
270 * The string `WRIT`, considered as an `unsigned int`.
271 */
272#define WRITETV 1414091351
273
274/**
275 * a cons pointer which points to the special NIL cell
276 */
277#define NIL (struct cons_pointer){ 0, 0}
278
279/**
280 * a cons pointer which points to the special T cell
281 */
282#define TRUE (struct cons_pointer){ 0, 1}
283
284/**
285 * the maximum possible value of a reference count
286 */
287#define MAXREFERENCE 4294967295
288
289/**
290 * a macro to convert a tag into a number
291 */
292#define tag2uint(tag) ((uint32_t)*tag)
293
294/**
295 * given a cons_pointer as argument, return the cell.
296 */
297#define pointer2cell(pointer) ((conspages[pointer.page]->cell[pointer.offset]))
298
299/**
300 * true if `conspoint` points to the special cell NIL, else false
301 * (there should only be one of these so it's slightly redundant).
302 */
303#define nilp(conspoint) (check_tag(conspoint,NILTV))
304
305/**
306 * true if `conspoint` points to a cons cell, else false
307 */
308#define consp(conspoint) (check_tag(conspoint,CONSTV))
309
310/**
311 * true if `conspoint` points to an exception, else false
312 */
313#define exceptionp(conspoint) (check_tag(conspoint,EXCEPTIONTV))
314
315/**
316 * true if `conspoint` points to a function cell, else false
317 */
318#define functionp(conspoint) (check_tag(conspoint,FUNCTIONTV))
319
320/**
321 * true if `conspoint` points to a keyword, else false
322 */
323#define keywordp(conspoint) (check_tag(conspoint,KEYTV))
324
325/**
326 * true if `conspoint` points to a Lambda binding cell, else false
327 */
328#define lambdap(conspoint) (check_tag(conspoint,LAMBDATV))
329
330/**
331 * true if `conspoint` points to a loop recursion, else false.
332 */
333#define loopp(conspoint) (check_tag(conspoint,LOOPTV))
334
335/**
336 * true if `conspoint` points to a special form cell, else false
337 */
338#define specialp(conspoint) (check_tag(conspoint,SPECIALTV))
339
340/**
341 * true if `conspoint` points to a string cell, else false
342 */
343#define stringp(conspoint) (check_tag(conspoint,STRINGTV))
344
345/**
346 * true if `conspoint` points to a symbol cell, else false
347 */
348#define symbolp(conspoint) (check_tag(conspoint,SYMBOLTV))
349
350/**
351 * true if `conspoint` points to an integer cell, else false
352 */
353#define integerp(conspoint) (check_tag(conspoint,INTEGERTV))
354
355/**
356 * true if `conspoint` points to a rational number cell, else false
357 */
358#define ratiop(conspoint) (check_tag(conspoint,RATIOTV))
359
360/**
361 * true if `conspoint` points to a read stream cell, else false
362 */
363#define readp(conspoint) (check_tag(conspoint,READTV))
364
365/**
366 * true if `conspoint` points to a real number cell, else false
367 */
368#define realp(conspoint) (check_tag(conspoint,REALTV))
369
370/**
371 * true if `conspoint` points to some sort of a number cell,
372 * else false
373 */
374#define numberp(conspoint) (check_tag(conspoint,INTEGERTV)||check_tag(conspoint,RATIOTV)||check_tag(conspoint,REALTV))
375
376/**
377 * true if `conspoint` points to a sequence (list, string or, later, vector),
378 * else false.
379 */
380#define sequencep(conspoint) (check_tag(conspoint,CONSTV)||check_tag(conspoint,STRINGTV)||check_tag(conspoint,SYMBOLTV))
381
382/**
383 * true if `conspoint` points to a vector pointer, else false.
384 */
385#define vectorpointp(conspoint) (check_tag(conspoint,VECTORPOINTTV))
386
387/**
388 * true if `conspoint` points to a write stream cell, else false.
389 */
390#define writep(conspoint) (check_tag(conspoint,WRITETV))
391
392#define streamp(conspoint) (check_tag(conspoint,READTV)||check_tag(conspoint,WRITETV))
393
394/**
395 * true if `conspoint` points to a true cell, else false
396 * (there should only be one of these so it's slightly redundant).
397 * Also note that anything that is not NIL is truthy.
398 */
399#define tp(conspoint) (check_tag(conspoint,TRUETV))
400
401/**
402 * true if `conspoint` points to a time cell, else false.
403 */
404#define timep(conspoint) (check_tag(conspoint,TIMETV))
405
406/**
407 * true if `conspoint` points to something that is truthy, i.e.
408 * anything but NIL.
409 */
410#define truep(conspoint) (!check_tag(conspoint,NILTV))
411
412/**
413 * An indirect pointer to a cons cell
414 */
416 /** the index of the page on which this cell resides */
417 uint32_t page;
418 /** the index of the cell within the page */
419 uint32_t offset;
420};
421
422/*
423 * number of arguments stored in a stack frame
424 */
425#define args_in_frame 8
426
427/**
428 * A stack frame. Yes, I know it isn't a cons-space object, but it's defined
429 * here to avoid circularity. \todo refactor.
430 */
432 /** the previous frame. */
434 /** first 8 arument bindings. */
436 /** list of any further argument bindings. */
438 /** the function to be called. */
440 /** the number of arguments provided. */
441 int args;
442};
443
444/**
445 * payload of a cons cell.
446 */
448 /** Contents of the Address Register, naturally. */
450 /** Contents of the Decrement Register, naturally. */
452};
453
454/**
455 * Payload of an exception.
456 * Message should be a Lisp string; frame should be a pointer to an (unfreed) stack frame.
457 */
459 /** The payload: usually a Lisp string but in practice anything printable will do. */
461 /** pointer to the (unfreed) stack frame in which the exception was thrown. */
463};
464
465/**
466 * Payload of a function cell.
467 * source points to the source from which the function was compiled, or NIL
468 * if it is a primitive.
469 * executable points to a function which takes a pointer to a stack frame
470 * (representing its stack frame) and a cons pointer (representing its
471 * environment) as arguments and returns a cons pointer (representing its
472 * result).
473 */
475 /**
476 * pointer to metadata (e.g. the source from which the function was compiled).
477 */
479 /** pointer to a function which takes a cons pointer (representing
480 * its argument list) and a cons pointer (representing its environment) and a
481 * stack frame (representing the previous stack frame) as arguments and returns
482 * a cons pointer (representing its result).
483 * \todo check this documentation is current!
484 */
485 struct cons_pointer ( *executable ) ( struct stack_frame *,
486 struct cons_pointer,
487 struct cons_pointer );
488};
489
490/**
491 * payload of a free cell. For the time being identical to a cons cell,
492 * but it may not be so in future.
493 */
497};
498
499/**
500 * payload of an integer cell. An integer is in principle a sequence of cells;
501 * only 60 bits (+ sign bit) are actually used in each cell. If the value
502 * exceeds 60 bits, the least significant 60 bits are stored in the first cell
503 * in the chain, the next 60 in the next cell, and so on. Only the value of the
504 * first cell in any chain should be negative.
505 *
506 * \todo Why is this 60, and not 64 bits?
507 */
509 /** the value of the payload (i.e. 60 bits) of this cell. */
511 /** the next (more significant) cell in the chain, or `NIL` if there are no
512 * more. */
514};
515
516/**
517 * payload for lambda and nlambda cells.
518 */
520 /** the arument list */
522 /** the body of the function to be applied to the arguments. */
524};
525
526/**
527 * payload for ratio cells. Both `dividend` and `divisor` must point to integer cells.
528 */
530 /** a pointer to an integer representing the dividend */
532 /** a pointer to an integer representing the divisor. */
534};
535
536/**
537 * payload for a real number cell. Internals of this liable to change to give 128 bits
538 * precision, but I'm not sure of the detail.
539 */
541 /** the value of the number */
542 long double value;
543};
544
545/**
546 * Payload of a special form cell. Currently identical to the payload of a
547 * function cell.
548 * \see function_payload
549 */
551 /**
552 * pointer to the source from which the special form was compiled, or NIL
553 * if it is a primitive.
554 */
556 /** pointer to a function which takes a cons pointer (representing
557 * its argument list) and a cons pointer (representing its environment) and a
558 * stack frame (representing the previous stack frame) as arguments and returns
559 * a cons pointer (representing its result). */
560 struct cons_pointer ( *executable ) ( struct stack_frame *,
561 struct cons_pointer,
562 struct cons_pointer );
563};
564
565/**
566 * payload of a read or write stream cell.
567 */
569 /** the stream to read from or write to. */
571 /** metadata on the stream (e.g. its file attributes if a file, its HTTP
572 * headers if a URL, etc). Expected to be an association, or nil. Not yet
573 * implemented. */
575};
576
577/**
578 * payload of a string cell. At least at first, only one UTF character will
579 * be stored in each cell. The doctrine that 'a symbol is just a string'
580 * didn't work; however, the payload of a symbol or keyword cell is identical
581 * to the payload of a string cell, except that a keyword may store a hash
582 * of its own value in the padding.
583 */
585 /** the actual character stored in this cell */
586 wint_t character;
587 /** a hash of the string value, computed at store time. */
588 uint32_t hash;
589 /** the remainder of the string following this character. */
591};
592
593/**
594 * The payload of a time cell: an unsigned 128 bit value representing micro-
595 * seconds since the estimated date of the Big Bang (actually, for
596 * convenience, 14Bn years before 1st Jan 1970 (the UNIX epoch))
597 */
599 unsigned __int128 value;
600};
601
602/**
603 * payload of a vector pointer cell.
604 */
606 /** the tag of the vector-space object. NOTE that the vector space object
607 * should itself have the identical tag. */
608 union {
609 /** the tag (type) of the vector-space object this cell
610 * points to, considered as bytes. */
611 char bytes[TAGLENGTH];
612 /** the tag considered as a number */
613 uint32_t value;
615 /** unused padding to word-align the address */
616 uint32_t padding;
617 /** the address of the actual vector space
618 * object (\todo will change when I actually
619 * implement vector space) */
620 void *address;
621};
622
623/**
624 * an object in cons space.
625 */
627 union {
628 /** the tag (type) of this cell,
629 * considered as bytes */
630 char bytes[TAGLENGTH];
631 /** the tag considered as a number */
632 uint32_t value;
634 /** the count of the number of references to this cell */
635 uint32_t count;
636 /** cons pointer to the access control list of this cell */
638 union {
639 /**
640 * if tag == CONSTAG
641 */
642 struct cons_payload cons;
643 /**
644 * if tag == EXCEPTIONTAG || tag == LOOPTAG
645 */
646 struct exception_payload exception;
647 /**
648 * if tag == FREETAG
649 */
650 struct free_payload free;
651 /**
652 * if tag == FUNCTIONTAG
653 */
654 struct function_payload function;
655 /**
656 * if tag == INTEGERTAG
657 */
658 struct integer_payload integer;
659 /**
660 * if tag == LAMBDATAG or NLAMBDATAG
661 */
662 struct lambda_payload lambda;
663 /**
664 * if tag == NILTAG; we'll treat the special cell NIL as just a cons
665 */
666 struct cons_payload nil;
667 /**
668 * if tag == RATIOTAG
669 */
670 struct ratio_payload ratio;
671 /**
672 * if tag == READTAG || tag == WRITETAG
673 */
674 struct stream_payload stream;
675 /**
676 * if tag == REALTAG
677 */
678 struct real_payload real;
679 /**
680 * if tag == SPECIALTAG
681 */
682 struct special_payload special;
683 /**
684 * if tag == STRINGTAG || tag == SYMBOLTAG
685 */
686 struct string_payload string;
687 /**
688 * if tag == TIMETAG
689 */
690 struct time_payload time;
691 /**
692 * if tag == TRUETAG; we'll treat the special cell T as just a cons
693 */
694 struct cons_payload t;
695 /**
696 * if tag == VECTORPTAG
697 */
700};
701
702bool check_tag( struct cons_pointer pointer, uint32_t value );
703
704struct cons_pointer inc_ref( struct cons_pointer pointer );
705
706struct cons_pointer dec_ref( struct cons_pointer pointer );
707
708struct cons_pointer c_type( struct cons_pointer pointer );
709
710struct cons_pointer c_car( struct cons_pointer arg );
711
712struct cons_pointer c_cdr( struct cons_pointer arg );
713
714int c_length( struct cons_pointer arg );
715
716struct cons_pointer make_cons( struct cons_pointer car,
717 struct cons_pointer cdr );
718
719struct cons_pointer make_exception( struct cons_pointer message,
720 struct cons_pointer frame_pointer );
721
722struct cons_pointer make_function( struct cons_pointer src,
723 struct cons_pointer ( *executable )
724 ( struct stack_frame *,
725 struct cons_pointer,
726 struct cons_pointer ) );
727
728struct cons_pointer c_string_to_lisp_keyword( wchar_t *symbol );
729
730struct cons_pointer make_lambda( struct cons_pointer args,
731 struct cons_pointer body );
732
733struct cons_pointer make_nlambda( struct cons_pointer args,
734 struct cons_pointer body );
735
737 struct cons_pointer ( *executable )
738 ( struct stack_frame *,
739 struct cons_pointer,
740 struct cons_pointer ) );
741
742struct cons_pointer make_string_like_thing( wint_t c, struct cons_pointer tail,
743 uint32_t tag );
744
745struct cons_pointer make_string( wint_t c, struct cons_pointer tail );
746
747struct cons_pointer make_symbol_or_key( wint_t c, struct cons_pointer tail,
748 uint32_t tag );
749
750#define make_symbol(c, t) (make_symbol_or_key( c, t, SYMBOLTV))
751
752#define make_keyword(c, t) (make_symbol_or_key( c, t, KEYTV))
753
755 struct cons_pointer metadata );
756
758 struct cons_pointer metadata );
759
760struct cons_pointer c_string_to_lisp_string( wchar_t *string );
761
762struct cons_pointer c_string_to_lisp_symbol( wchar_t *symbol );
763
764#endif
struct cons_pointer divisor
a pointer to an integer representing the divisor.
struct cons_pointer more
list of any further argument bindings.
uint32_t hash
a hash of the string value, computed at store time.
int args
the number of arguments provided.
#define args_in_frame
union cons_space_object::@2 tag
union cons_space_object::@3 payload
uint32_t page
the index of the page on which this cell resides
struct cons_pointer make_exception(struct cons_pointer message, struct cons_pointer frame_pointer)
Construct an exception cell.
struct cons_pointer body
the body of the function to be applied to the arguments.
struct cons_pointer make_lambda(struct cons_pointer args, struct cons_pointer body)
Construct a lambda (interpretable source) cell.
struct cons_pointer make_symbol_or_key(wint_t c, struct cons_pointer tail, uint32_t tag)
Construct a symbol or keyword from the character c and this tail.
struct cons_pointer make_special(struct cons_pointer src, struct cons_pointer(*executable)(struct stack_frame *, struct cons_pointer, struct cons_pointer))
struct cons_pointer dividend
a pointer to an integer representing the dividend
struct cons_pointer c_string_to_lisp_keyword(wchar_t *symbol)
Return a lisp keyword representation of this wide character string.
struct cons_pointer c_cdr(struct cons_pointer arg)
Implementation of cdr in C.
struct cons_pointer make_string_like_thing(wint_t c, struct cons_pointer tail, uint32_t tag)
Construct a string from this character (which later will be UTF) and this tail.
struct cons_pointer meta
metadata on the stream (e.g.
URL_FILE * stream
the stream to read from or write to.
struct cons_pointer cdr
Contents of the Decrement Register, naturally.
struct cons_pointer args
the arument list
union vectorp_payload::@1 tag
the tag of the vector-space object.
#define TAGLENGTH
The length of a tag, in bytes.
int c_length(struct cons_pointer arg)
Implementation of length in C.
struct cons_pointer access
cons pointer to the access control list of this cell
struct cons_pointer frame
pointer to the (unfreed) stack frame in which the exception was thrown.
struct cons_pointer make_string(wint_t c, struct cons_pointer tail)
Construct a string from the character c and this tail.
struct cons_pointer previous
the previous frame.
bool check_tag(struct cons_pointer pointer, uint32_t value)
True if the value of the tag on the cell at this pointer is this value, or, if the tag of the cell is...
uint32_t count
the count of the number of references to this cell
uint32_t offset
the index of the cell within the page
struct cons_pointer make_function(struct cons_pointer src, struct cons_pointer(*executable)(struct stack_frame *, struct cons_pointer, struct cons_pointer))
Construct a cell which points to an executable Lisp function.
struct cons_pointer make_write_stream(URL_FILE *output, struct cons_pointer metadata)
Construct a cell which points to a stream open for writing.
struct cons_pointer c_string_to_lisp_string(wchar_t *string)
Return a lisp string representation of this wide character string.
long double value
the value of the number
struct cons_pointer inc_ref(struct cons_pointer pointer)
increment the reference count of the object at this cons pointer.
struct cons_pointer function
the function to be called.
uint32_t padding
unused padding to word-align the address
void * address
the address of the actual vector space object (
struct cons_pointer make_read_stream(URL_FILE *input, struct cons_pointer metadata)
Construct a cell which points to a stream open for reading.
struct cons_pointer payload
The payload: usually a Lisp string but in practice anything printable will do.
int64_t value
the value of the payload (i.e.
struct cons_pointer c_string_to_lisp_symbol(wchar_t *symbol)
Return a lisp symbol representation of this wide character string.
struct cons_pointer c_car(struct cons_pointer arg)
Implementation of car in C.
wint_t character
the actual character stored in this cell
struct cons_pointer c_type(struct cons_pointer pointer)
Get the Lisp type of the single argument.
struct cons_pointer make_nlambda(struct cons_pointer args, struct cons_pointer body)
Construct an nlambda (interpretable source) cell; to a lambda as a special form is to a function.
struct cons_pointer arg[args_in_frame]
first 8 arument bindings.
struct cons_pointer dec_ref(struct cons_pointer pointer)
Decrement the reference count of the object at this cons pointer.
unsigned __int128 value
struct cons_pointer car
Contents of the Address Register, naturally.
struct cons_pointer make_cons(struct cons_pointer car, struct cons_pointer cdr)
Construct a cons cell from this pair of pointers.
payload of a cons cell.
An indirect pointer to a cons cell.
an object in cons space.
Payload of an exception.
payload of a free cell.
payload of an integer cell.
payload for lambda and nlambda cells.
payload for ratio cells.
payload for a real number cell.
A stack frame.
payload of a read or write stream cell.
payload of a string cell.
The payload of a time cell: an unsigned 128 bit value representing micro- seconds since the estimated...
payload of a vector pointer cell.
Payload of a function cell.
struct cons_pointer meta
pointer to metadata (e.g.
struct cons_pointer(* executable)(struct stack_frame *, struct cons_pointer, struct cons_pointer)
pointer to a function which takes a cons pointer (representing its argument list) and a cons pointer ...
Payload of a special form cell.
struct cons_pointer meta
pointer to the source from which the special form was compiled, or NIL if it is a primitive.
struct cons_pointer(* executable)(struct stack_frame *, struct cons_pointer, struct cons_pointer)
pointer to a function which takes a cons pointer (representing its argument list) and a cons pointer ...
#define vectorp(conspoint)
Definition vectorspace.h:50