2 * Copyright © 2016 Keith Packard <keithp@keithp.com>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation, either version 2 of the License, or
7 * (at your option) any later version.
9 * This program is distributed in the hope that it will be useful, but
10 * WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * General Public License for more details.
15 #include "ao_scheme.h"
20 builtin_size(void *addr)
23 return sizeof (struct ao_scheme_builtin);
27 builtin_mark(void *addr)
33 builtin_move(void *addr)
38 const struct ao_scheme_type ao_scheme_builtin_type = {
44 #ifdef AO_SCHEME_MAKE_CONST
46 #define AO_SCHEME_BUILTIN_CASENAME
47 #include "ao_scheme_builtin.h"
49 char *ao_scheme_args_name(uint8_t args) {
50 args &= AO_SCHEME_FUNC_MASK;
52 case AO_SCHEME_FUNC_LAMBDA: return ao_scheme_poly_atom(_ao_scheme_atom_lambda)->name;
53 case AO_SCHEME_FUNC_NLAMBDA: return ao_scheme_poly_atom(_ao_scheme_atom_nlambda)->name;
54 case AO_SCHEME_FUNC_MACRO: return ao_scheme_poly_atom(_ao_scheme_atom_macro)->name;
55 default: return "???";
60 #define AO_SCHEME_BUILTIN_ARRAYNAME
61 #include "ao_scheme_builtin.h"
64 ao_scheme_builtin_name(enum ao_scheme_builtin_id b) {
65 if (b < _builtin_last)
66 return ao_scheme_poly_atom(builtin_names[b])->name;
70 static const ao_poly ao_scheme_args_atoms[] = {
71 [AO_SCHEME_FUNC_LAMBDA] = _ao_scheme_atom_lambda,
72 [AO_SCHEME_FUNC_NLAMBDA] = _ao_scheme_atom_nlambda,
73 [AO_SCHEME_FUNC_MACRO] = _ao_scheme_atom_macro,
77 ao_scheme_args_name(uint8_t args)
79 args &= AO_SCHEME_FUNC_MASK;
80 if (args < sizeof ao_scheme_args_atoms / sizeof ao_scheme_args_atoms[0])
81 return ao_scheme_poly_atom(ao_scheme_args_atoms[args])->name;
87 ao_scheme_builtin_write(ao_poly b)
89 struct ao_scheme_builtin *builtin = ao_scheme_poly_builtin(b);
90 printf("%s", ao_scheme_builtin_name(builtin->func));
94 ao_scheme_check_argc(ao_poly name, struct ao_scheme_cons *cons, int min, int max)
98 while (cons && argc <= max) {
100 cons = ao_scheme_cons_cdr(cons);
102 if (argc < min || argc > max)
103 return ao_scheme_error(AO_SCHEME_INVALID, "%s: invalid arg count", ao_scheme_poly_atom(name)->name);
104 return _ao_scheme_bool_true;
108 ao_scheme_arg(struct ao_scheme_cons *cons, int argc)
111 return AO_SCHEME_NIL;
114 return AO_SCHEME_NIL;
115 cons = ao_scheme_cons_cdr(cons);
121 ao_scheme_check_argt(ao_poly name, struct ao_scheme_cons *cons, int argc, int type, int nil_ok)
123 ao_poly car = ao_scheme_arg(cons, argc);
125 if ((!car && !nil_ok) || ao_scheme_poly_type(car) != type)
126 return ao_scheme_error(AO_SCHEME_INVALID, "%s: arg %d invalid type %v", ao_scheme_poly_atom(name)->name, argc, car);
127 return _ao_scheme_bool_true;
131 ao_scheme_do_car(struct ao_scheme_cons *cons)
133 if (!ao_scheme_check_argc(_ao_scheme_atom_car, cons, 1, 1))
134 return AO_SCHEME_NIL;
135 if (!ao_scheme_check_argt(_ao_scheme_atom_car, cons, 0, AO_SCHEME_CONS, 0))
136 return AO_SCHEME_NIL;
137 return ao_scheme_poly_cons(cons->car)->car;
141 ao_scheme_do_cdr(struct ao_scheme_cons *cons)
143 if (!ao_scheme_check_argc(_ao_scheme_atom_cdr, cons, 1, 1))
144 return AO_SCHEME_NIL;
145 if (!ao_scheme_check_argt(_ao_scheme_atom_cdr, cons, 0, AO_SCHEME_CONS, 0))
146 return AO_SCHEME_NIL;
147 return ao_scheme_poly_cons(cons->car)->cdr;
151 ao_scheme_do_cons(struct ao_scheme_cons *cons)
154 if(!ao_scheme_check_argc(_ao_scheme_atom_cons, cons, 2, 2))
155 return AO_SCHEME_NIL;
156 car = ao_scheme_arg(cons, 0);
157 cdr = ao_scheme_arg(cons, 1);
158 return ao_scheme__cons(car, cdr);
162 ao_scheme_do_last(struct ao_scheme_cons *cons)
164 struct ao_scheme_cons *list;
165 if (!ao_scheme_check_argc(_ao_scheme_atom_last, cons, 1, 1))
166 return AO_SCHEME_NIL;
167 if (!ao_scheme_check_argt(_ao_scheme_atom_last, cons, 0, AO_SCHEME_CONS, 1))
168 return AO_SCHEME_NIL;
169 for (list = ao_scheme_poly_cons(ao_scheme_arg(cons, 0));
171 list = ao_scheme_cons_cdr(list))
176 return AO_SCHEME_NIL;
180 ao_scheme_do_length(struct ao_scheme_cons *cons)
182 if (!ao_scheme_check_argc(_ao_scheme_atom_length, cons, 1, 1))
183 return AO_SCHEME_NIL;
184 if (!ao_scheme_check_argt(_ao_scheme_atom_length, cons, 0, AO_SCHEME_CONS, 1))
185 return AO_SCHEME_NIL;
186 return ao_scheme_int_poly(ao_scheme_cons_length(ao_scheme_poly_cons(ao_scheme_arg(cons, 0))));
190 ao_scheme_do_quote(struct ao_scheme_cons *cons)
192 if (!ao_scheme_check_argc(_ao_scheme_atom_quote, cons, 1, 1))
193 return AO_SCHEME_NIL;
194 return ao_scheme_arg(cons, 0);
198 ao_scheme_do_set(struct ao_scheme_cons *cons)
200 if (!ao_scheme_check_argc(_ao_scheme_atom_set, cons, 2, 2))
201 return AO_SCHEME_NIL;
202 if (!ao_scheme_check_argt(_ao_scheme_atom_set, cons, 0, AO_SCHEME_ATOM, 0))
203 return AO_SCHEME_NIL;
205 return ao_scheme_atom_set(ao_scheme_arg(cons, 0), ao_scheme_arg(cons, 1));
209 ao_scheme_do_def(struct ao_scheme_cons *cons)
211 if (!ao_scheme_check_argc(_ao_scheme_atom_def, cons, 2, 2))
212 return AO_SCHEME_NIL;
213 if (!ao_scheme_check_argt(_ao_scheme_atom_def, cons, 0, AO_SCHEME_ATOM, 0))
214 return AO_SCHEME_NIL;
216 return ao_scheme_atom_def(ao_scheme_arg(cons, 0), ao_scheme_arg(cons, 1));
220 ao_scheme_do_setq(struct ao_scheme_cons *cons)
223 if (!ao_scheme_check_argc(_ao_scheme_atom_set21, cons, 2, 2))
224 return AO_SCHEME_NIL;
226 if (ao_scheme_poly_type(name) != AO_SCHEME_ATOM)
227 return ao_scheme_error(AO_SCHEME_INVALID, "set! of non-atom %v", name);
228 if (!ao_scheme_atom_ref(name, NULL))
229 return ao_scheme_error(AO_SCHEME_INVALID, "atom %v not defined", name);
230 return ao_scheme__cons(_ao_scheme_atom_set,
231 ao_scheme__cons(ao_scheme__cons(_ao_scheme_atom_quote,
232 ao_scheme__cons(name, AO_SCHEME_NIL)),
237 ao_scheme_do_cond(struct ao_scheme_cons *cons)
239 ao_scheme_set_cond(cons);
240 return AO_SCHEME_NIL;
244 ao_scheme_do_begin(struct ao_scheme_cons *cons)
246 ao_scheme_stack->state = eval_begin;
247 ao_scheme_stack->sexprs = ao_scheme_cons_poly(cons);
248 return AO_SCHEME_NIL;
252 ao_scheme_do_while(struct ao_scheme_cons *cons)
254 ao_scheme_stack->state = eval_while;
255 ao_scheme_stack->sexprs = ao_scheme_cons_poly(cons);
256 return AO_SCHEME_NIL;
260 ao_scheme_do_write(struct ao_scheme_cons *cons)
262 ao_poly val = AO_SCHEME_NIL;
265 ao_scheme_poly_write(val);
266 cons = ao_scheme_cons_cdr(cons);
270 return _ao_scheme_bool_true;
274 ao_scheme_do_display(struct ao_scheme_cons *cons)
276 ao_poly val = AO_SCHEME_NIL;
279 ao_scheme_poly_display(val);
280 cons = ao_scheme_cons_cdr(cons);
282 return _ao_scheme_bool_true;
286 ao_scheme_math(struct ao_scheme_cons *orig_cons, enum ao_scheme_builtin_id op)
288 struct ao_scheme_cons *cons = cons;
289 ao_poly ret = AO_SCHEME_NIL;
291 for (cons = orig_cons; cons; cons = ao_scheme_cons_cdr(cons)) {
292 ao_poly car = cons->car;
293 uint8_t rt = ao_scheme_poly_type(ret);
294 uint8_t ct = ao_scheme_poly_type(car);
296 if (cons == orig_cons) {
298 if (cons->cdr == AO_SCHEME_NIL) {
301 if (ao_scheme_integer_typep(ct))
302 ret = ao_scheme_integer_poly(-ao_scheme_poly_integer(ret));
303 else if (ct == AO_SCHEME_FLOAT)
304 ret = ao_scheme_float_get(-ao_scheme_poly_number(ret));
307 if (ao_scheme_integer_typep(ct) && ao_scheme_poly_integer(ret) == 1)
309 else if (ao_scheme_number_typep(ct)) {
310 float v = ao_scheme_poly_number(ret);
311 ret = ao_scheme_float_get(1/v);
318 } else if (ao_scheme_integer_typep(rt) && ao_scheme_integer_typep(ct)) {
319 int32_t r = ao_scheme_poly_integer(ret);
320 int32_t c = ao_scheme_poly_integer(car);
327 if (r < AO_SCHEME_MIN_BIGINT || AO_SCHEME_MAX_BIGINT < r)
335 t = (int64_t) r * (int64_t) c;
336 if (t < AO_SCHEME_MIN_BIGINT || AO_SCHEME_MAX_BIGINT < t)
341 if (c != 0 && (r % c) == 0)
346 case builtin_quotient:
348 return ao_scheme_error(AO_SCHEME_DIVIDE_BY_ZERO, "quotient by zero");
349 if (r % c != 0 && (c < 0) != (r < 0))
354 case builtin_remainder:
356 return ao_scheme_error(AO_SCHEME_DIVIDE_BY_ZERO, "remainder by zero");
361 return ao_scheme_error(AO_SCHEME_DIVIDE_BY_ZERO, "modulo by zero");
363 if ((r < 0) != (c < 0))
369 ret = ao_scheme_integer_poly(r);
370 } else if (ao_scheme_number_typep(rt) && ao_scheme_number_typep(ct)) {
373 r = ao_scheme_poly_number(ret);
374 c = ao_scheme_poly_number(car);
388 case builtin_quotient:
389 case builtin_remainder:
391 return ao_scheme_error(AO_SCHEME_INVALID, "non-integer value in integer divide");
395 ret = ao_scheme_float_get(r);
398 else if (rt == AO_SCHEME_STRING && ct == AO_SCHEME_STRING && op == builtin_plus)
399 ret = ao_scheme_string_poly(ao_scheme_string_cat(ao_scheme_poly_string(ret),
400 ao_scheme_poly_string(car)));
402 return ao_scheme_error(AO_SCHEME_INVALID, "invalid args");
408 ao_scheme_do_plus(struct ao_scheme_cons *cons)
410 return ao_scheme_math(cons, builtin_plus);
414 ao_scheme_do_minus(struct ao_scheme_cons *cons)
416 return ao_scheme_math(cons, builtin_minus);
420 ao_scheme_do_times(struct ao_scheme_cons *cons)
422 return ao_scheme_math(cons, builtin_times);
426 ao_scheme_do_divide(struct ao_scheme_cons *cons)
428 return ao_scheme_math(cons, builtin_divide);
432 ao_scheme_do_quotient(struct ao_scheme_cons *cons)
434 return ao_scheme_math(cons, builtin_quotient);
438 ao_scheme_do_modulo(struct ao_scheme_cons *cons)
440 return ao_scheme_math(cons, builtin_modulo);
444 ao_scheme_do_remainder(struct ao_scheme_cons *cons)
446 return ao_scheme_math(cons, builtin_remainder);
450 ao_scheme_compare(struct ao_scheme_cons *cons, enum ao_scheme_builtin_id op)
455 return _ao_scheme_bool_true;
458 for (cons = ao_scheme_cons_cdr(cons); cons; cons = ao_scheme_cons_cdr(cons)) {
459 ao_poly right = cons->car;
461 if (op == builtin_equal) {
463 return _ao_scheme_bool_false;
465 uint8_t lt = ao_scheme_poly_type(left);
466 uint8_t rt = ao_scheme_poly_type(right);
467 if (ao_scheme_integer_typep(lt) && ao_scheme_integer_typep(rt)) {
468 int32_t l = ao_scheme_poly_integer(left);
469 int32_t r = ao_scheme_poly_integer(right);
474 return _ao_scheme_bool_false;
476 case builtin_greater:
478 return _ao_scheme_bool_false;
480 case builtin_less_equal:
482 return _ao_scheme_bool_false;
484 case builtin_greater_equal:
486 return _ao_scheme_bool_false;
491 } else if (lt == AO_SCHEME_STRING && rt == AO_SCHEME_STRING) {
492 int c = strcmp(ao_scheme_poly_string(left),
493 ao_scheme_poly_string(right));
497 return _ao_scheme_bool_false;
499 case builtin_greater:
501 return _ao_scheme_bool_false;
503 case builtin_less_equal:
505 return _ao_scheme_bool_false;
507 case builtin_greater_equal:
509 return _ao_scheme_bool_false;
518 return _ao_scheme_bool_true;
522 ao_scheme_do_equal(struct ao_scheme_cons *cons)
524 return ao_scheme_compare(cons, builtin_equal);
528 ao_scheme_do_less(struct ao_scheme_cons *cons)
530 return ao_scheme_compare(cons, builtin_less);
534 ao_scheme_do_greater(struct ao_scheme_cons *cons)
536 return ao_scheme_compare(cons, builtin_greater);
540 ao_scheme_do_less_equal(struct ao_scheme_cons *cons)
542 return ao_scheme_compare(cons, builtin_less_equal);
546 ao_scheme_do_greater_equal(struct ao_scheme_cons *cons)
548 return ao_scheme_compare(cons, builtin_greater_equal);
552 ao_scheme_do_list_to_string(struct ao_scheme_cons *cons)
554 if (!ao_scheme_check_argc(_ao_scheme_atom_list2d3estring, cons, 1, 1))
555 return AO_SCHEME_NIL;
556 if (!ao_scheme_check_argt(_ao_scheme_atom_list2d3estring, cons, 0, AO_SCHEME_CONS, 1))
557 return AO_SCHEME_NIL;
558 return ao_scheme_string_pack(ao_scheme_poly_cons(ao_scheme_arg(cons, 0)));
562 ao_scheme_do_string_to_list(struct ao_scheme_cons *cons)
564 if (!ao_scheme_check_argc(_ao_scheme_atom_string2d3elist, cons, 1, 1))
565 return AO_SCHEME_NIL;
566 if (!ao_scheme_check_argt(_ao_scheme_atom_string2d3elist, cons, 0, AO_SCHEME_STRING, 0))
567 return AO_SCHEME_NIL;
568 return ao_scheme_string_unpack(ao_scheme_poly_string(ao_scheme_arg(cons, 0)));
572 ao_scheme_do_flush_output(struct ao_scheme_cons *cons)
574 if (!ao_scheme_check_argc(_ao_scheme_atom_flush2doutput, cons, 0, 0))
575 return AO_SCHEME_NIL;
576 ao_scheme_os_flush();
577 return _ao_scheme_bool_true;
581 ao_scheme_do_led(struct ao_scheme_cons *cons)
584 if (!ao_scheme_check_argc(_ao_scheme_atom_led, cons, 1, 1))
585 return AO_SCHEME_NIL;
586 if (!ao_scheme_check_argt(_ao_scheme_atom_led, cons, 0, AO_SCHEME_INT, 0))
587 return AO_SCHEME_NIL;
588 led = ao_scheme_arg(cons, 0);
589 ao_scheme_os_led(ao_scheme_poly_int(led));
594 ao_scheme_do_delay(struct ao_scheme_cons *cons)
597 if (!ao_scheme_check_argc(_ao_scheme_atom_led, cons, 1, 1))
598 return AO_SCHEME_NIL;
599 if (!ao_scheme_check_argt(_ao_scheme_atom_led, cons, 0, AO_SCHEME_INT, 0))
600 return AO_SCHEME_NIL;
601 delay = ao_scheme_arg(cons, 0);
602 ao_scheme_os_delay(ao_scheme_poly_int(delay));
607 ao_scheme_do_eval(struct ao_scheme_cons *cons)
609 if (!ao_scheme_check_argc(_ao_scheme_atom_eval, cons, 1, 1))
610 return AO_SCHEME_NIL;
611 ao_scheme_stack->state = eval_sexpr;
616 ao_scheme_do_apply(struct ao_scheme_cons *cons)
618 if (!ao_scheme_check_argc(_ao_scheme_atom_apply, cons, 2, INT_MAX))
619 return AO_SCHEME_NIL;
620 ao_scheme_stack->state = eval_apply;
621 return ao_scheme_cons_poly(cons);
625 ao_scheme_do_read(struct ao_scheme_cons *cons)
627 if (!ao_scheme_check_argc(_ao_scheme_atom_read, cons, 0, 0))
628 return AO_SCHEME_NIL;
629 return ao_scheme_read();
633 ao_scheme_do_collect(struct ao_scheme_cons *cons)
637 free = ao_scheme_collect(AO_SCHEME_COLLECT_FULL);
638 return ao_scheme_integer_poly(free);
642 ao_scheme_do_nullp(struct ao_scheme_cons *cons)
644 if (!ao_scheme_check_argc(_ao_scheme_atom_led, cons, 1, 1))
645 return AO_SCHEME_NIL;
646 if (ao_scheme_arg(cons, 0) == AO_SCHEME_NIL)
647 return _ao_scheme_bool_true;
649 return _ao_scheme_bool_false;
653 ao_scheme_do_not(struct ao_scheme_cons *cons)
655 if (!ao_scheme_check_argc(_ao_scheme_atom_led, cons, 1, 1))
656 return AO_SCHEME_NIL;
657 if (ao_scheme_arg(cons, 0) == _ao_scheme_bool_false)
658 return _ao_scheme_bool_true;
660 return _ao_scheme_bool_false;
664 ao_scheme_do_typep(int type, struct ao_scheme_cons *cons)
666 if (!ao_scheme_check_argc(_ao_scheme_atom_led, cons, 1, 1))
667 return AO_SCHEME_NIL;
668 if (ao_scheme_poly_type(ao_scheme_arg(cons, 0)) == type)
669 return _ao_scheme_bool_true;
670 return _ao_scheme_bool_false;
674 ao_scheme_do_pairp(struct ao_scheme_cons *cons)
677 if (!ao_scheme_check_argc(_ao_scheme_atom_led, cons, 1, 1))
678 return AO_SCHEME_NIL;
679 v = ao_scheme_arg(cons, 0);
680 if (v != AO_SCHEME_NIL && ao_scheme_poly_type(v) == AO_SCHEME_CONS)
681 return _ao_scheme_bool_true;
682 return _ao_scheme_bool_false;
686 ao_scheme_do_integerp(struct ao_scheme_cons *cons)
688 if (!ao_scheme_check_argc(_ao_scheme_atom_led, cons, 1, 1))
689 return AO_SCHEME_NIL;
690 switch (ao_scheme_poly_type(ao_scheme_arg(cons, 0))) {
692 case AO_SCHEME_BIGINT:
693 return _ao_scheme_bool_true;
695 return _ao_scheme_bool_false;
700 ao_scheme_do_numberp(struct ao_scheme_cons *cons)
702 if (!ao_scheme_check_argc(_ao_scheme_atom_led, cons, 1, 1))
703 return AO_SCHEME_NIL;
704 switch (ao_scheme_poly_type(ao_scheme_arg(cons, 0))) {
706 case AO_SCHEME_BIGINT:
707 case AO_SCHEME_FLOAT:
708 return _ao_scheme_bool_true;
710 return _ao_scheme_bool_false;
715 ao_scheme_do_stringp(struct ao_scheme_cons *cons)
717 return ao_scheme_do_typep(AO_SCHEME_STRING, cons);
721 ao_scheme_do_symbolp(struct ao_scheme_cons *cons)
723 return ao_scheme_do_typep(AO_SCHEME_ATOM, cons);
727 ao_scheme_do_booleanp(struct ao_scheme_cons *cons)
729 return ao_scheme_do_typep(AO_SCHEME_BOOL, cons);
733 ao_scheme_do_procedurep(struct ao_scheme_cons *cons)
735 if (!ao_scheme_check_argc(_ao_scheme_atom_led, cons, 1, 1))
736 return AO_SCHEME_NIL;
737 switch (ao_scheme_poly_type(ao_scheme_arg(cons, 0))) {
738 case AO_SCHEME_BUILTIN:
739 case AO_SCHEME_LAMBDA:
740 return _ao_scheme_bool_true;
742 return _ao_scheme_bool_false;
746 /* This one is special -- a list is either nil or
747 * a 'proper' list with only cons cells
750 ao_scheme_do_listp(struct ao_scheme_cons *cons)
753 if (!ao_scheme_check_argc(_ao_scheme_atom_list3f, cons, 1, 1))
754 return AO_SCHEME_NIL;
755 v = ao_scheme_arg(cons, 0);
757 if (v == AO_SCHEME_NIL)
758 return _ao_scheme_bool_true;
759 if (ao_scheme_poly_type(v) != AO_SCHEME_CONS)
760 return _ao_scheme_bool_false;
761 v = ao_scheme_poly_cons(v)->cdr;
766 ao_scheme_do_set_car(struct ao_scheme_cons *cons)
768 if (!ao_scheme_check_argc(_ao_scheme_atom_led, cons, 2, 2))
769 return AO_SCHEME_NIL;
770 if (!ao_scheme_check_argt(_ao_scheme_atom_led, cons, 0, AO_SCHEME_CONS, 0))
771 return AO_SCHEME_NIL;
772 return ao_scheme_poly_cons(ao_scheme_arg(cons, 0))->car = ao_scheme_arg(cons, 1);
776 ao_scheme_do_set_cdr(struct ao_scheme_cons *cons)
778 if (!ao_scheme_check_argc(_ao_scheme_atom_led, cons, 2, 2))
779 return AO_SCHEME_NIL;
780 if (!ao_scheme_check_argt(_ao_scheme_atom_led, cons, 0, AO_SCHEME_CONS, 0))
781 return AO_SCHEME_NIL;
782 return ao_scheme_poly_cons(ao_scheme_arg(cons, 0))->cdr = ao_scheme_arg(cons, 1);
786 ao_scheme_do_symbol_to_string(struct ao_scheme_cons *cons)
788 if (!ao_scheme_check_argc(_ao_scheme_atom_led, cons, 1, 1))
789 return AO_SCHEME_NIL;
790 if (!ao_scheme_check_argt(_ao_scheme_atom_led, cons, 0, AO_SCHEME_ATOM, 0))
791 return AO_SCHEME_NIL;
792 return ao_scheme_string_poly(ao_scheme_string_copy(ao_scheme_poly_atom(ao_scheme_arg(cons, 0))->name));
796 ao_scheme_do_string_to_symbol(struct ao_scheme_cons *cons)
798 if (!ao_scheme_check_argc(_ao_scheme_atom_led, cons, 1, 1))
799 return AO_SCHEME_NIL;
800 if (!ao_scheme_check_argt(_ao_scheme_atom_led, cons, 0, AO_SCHEME_STRING, 0))
801 return AO_SCHEME_NIL;
803 return ao_scheme_atom_poly(ao_scheme_atom_intern(ao_scheme_poly_string(ao_scheme_arg(cons, 0))));
807 ao_scheme_do_read_char(struct ao_scheme_cons *cons)
810 if (!ao_scheme_check_argc(_ao_scheme_atom_led, cons, 0, 0))
811 return AO_SCHEME_NIL;
813 return ao_scheme_int_poly(c);
817 ao_scheme_do_write_char(struct ao_scheme_cons *cons)
819 if (!ao_scheme_check_argc(_ao_scheme_atom_led, cons, 1, 1))
820 return AO_SCHEME_NIL;
821 if (!ao_scheme_check_argt(_ao_scheme_atom_led, cons, 0, AO_SCHEME_INT, 0))
822 return AO_SCHEME_NIL;
823 putchar(ao_scheme_poly_integer(ao_scheme_arg(cons, 0)));
824 return _ao_scheme_bool_true;
828 ao_scheme_do_exit(struct ao_scheme_cons *cons)
830 if (!ao_scheme_check_argc(_ao_scheme_atom_led, cons, 0, 0))
831 return AO_SCHEME_NIL;
832 ao_scheme_exception |= AO_SCHEME_EXIT;
833 return _ao_scheme_bool_true;
837 ao_scheme_do_current_jiffy(struct ao_scheme_cons *cons)
841 if (!ao_scheme_check_argc(_ao_scheme_atom_led, cons, 0, 0))
842 return AO_SCHEME_NIL;
843 jiffy = ao_scheme_os_jiffy();
844 return (ao_scheme_int_poly(jiffy));
848 ao_scheme_do_current_second(struct ao_scheme_cons *cons)
852 if (!ao_scheme_check_argc(_ao_scheme_atom_led, cons, 0, 0))
853 return AO_SCHEME_NIL;
854 second = ao_scheme_os_jiffy() / AO_SCHEME_JIFFIES_PER_SECOND;
855 return (ao_scheme_int_poly(second));
859 ao_scheme_do_jiffies_per_second(struct ao_scheme_cons *cons)
861 if (!ao_scheme_check_argc(_ao_scheme_atom_led, cons, 0, 0))
862 return AO_SCHEME_NIL;
863 return (ao_scheme_int_poly(AO_SCHEME_JIFFIES_PER_SECOND));
867 ao_scheme_do_vector(struct ao_scheme_cons *cons)
869 return ao_scheme_vector_poly(ao_scheme_list_to_vector(cons));
873 ao_scheme_do_vector_ref(struct ao_scheme_cons *cons)
875 if (!ao_scheme_check_argc(_ao_scheme_atom_vector2dref, cons, 2, 2))
876 return AO_SCHEME_NIL;
877 if (!ao_scheme_check_argt(_ao_scheme_atom_vector2dref, cons, 0, AO_SCHEME_VECTOR, 0))
878 return AO_SCHEME_NIL;
879 return ao_scheme_vector_get(ao_scheme_arg(cons, 0), ao_scheme_arg(cons, 1));
883 ao_scheme_do_vector_set(struct ao_scheme_cons *cons)
885 if (!ao_scheme_check_argc(_ao_scheme_atom_vector2dset21, cons, 3, 3))
886 return AO_SCHEME_NIL;
887 if (!ao_scheme_check_argt(_ao_scheme_atom_vector2dset21, cons, 0, AO_SCHEME_VECTOR, 0))
888 return AO_SCHEME_NIL;
889 return ao_scheme_vector_set(ao_scheme_arg(cons, 0), ao_scheme_arg(cons, 1), ao_scheme_arg(cons, 2));
893 ao_scheme_do_list_to_vector(struct ao_scheme_cons *cons)
895 if (!ao_scheme_check_argc(_ao_scheme_atom_list2d3evector, cons, 1, 1))
896 return AO_SCHEME_NIL;
897 if (!ao_scheme_check_argt(_ao_scheme_atom_list2d3evector, cons, 0, AO_SCHEME_CONS, 0))
898 return AO_SCHEME_NIL;
899 return ao_scheme_vector_poly(ao_scheme_list_to_vector(ao_scheme_poly_cons(ao_scheme_arg(cons, 0))));
903 ao_scheme_do_vector_to_list(struct ao_scheme_cons *cons)
905 if (!ao_scheme_check_argc(_ao_scheme_atom_vector2d3elist, cons, 1, 1))
906 return AO_SCHEME_NIL;
907 if (!ao_scheme_check_argt(_ao_scheme_atom_vector2d3elist, cons, 0, AO_SCHEME_VECTOR, 0))
908 return AO_SCHEME_NIL;
909 return ao_scheme_cons_poly(ao_scheme_vector_to_list(ao_scheme_poly_vector(ao_scheme_arg(cons, 0))));
913 ao_scheme_do_vector_length(struct ao_scheme_cons *cons)
915 if (!ao_scheme_check_argc(_ao_scheme_atom_vector2d3elist, cons, 1, 1))
916 return AO_SCHEME_NIL;
917 if (!ao_scheme_check_argt(_ao_scheme_atom_vector2d3elist, cons, 0, AO_SCHEME_VECTOR, 0))
918 return AO_SCHEME_NIL;
919 return ao_scheme_integer_poly(ao_scheme_poly_vector(ao_scheme_arg(cons, 0))->length);
923 ao_scheme_do_vectorp(struct ao_scheme_cons *cons)
925 return ao_scheme_do_typep(AO_SCHEME_VECTOR, cons);
928 #define AO_SCHEME_BUILTIN_FUNCS
929 #include "ao_scheme_builtin.h"