runtime_cons.c 868 B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <errno.h>
  5. #include "sans.h"
  6. #include "garbagecollector.h"
  7. #include "runtime.h"
  8. sdata bltn_car(sdata ob) {
  9. if (ob.tag == tcons) {
  10. return heap_ref(ob.data.value);
  11. }
  12. else {
  13. log_err("runtime/bltn_car: not a pair\n");
  14. }
  15. }
  16. sdata bltn_cdr(sdata ob) {
  17. if (ob.tag == tcons) {
  18. return heap_ref(ob.data.value + 1);
  19. }
  20. else {
  21. log_err("runtime/bltn_cdr: not a pair\n");
  22. }
  23. }
  24. sdata bltn_cons(sdata car, sdata cdr) {
  25. return cons(car, cdr);
  26. }
  27. void bltn_set_car(sdata ob, sdata x) {
  28. if (ob.tag == tcons) {
  29. heap_set(ob.data.value, x);
  30. }
  31. else {
  32. log_err("runtime/bltn_set_car: not a pair\n");
  33. }
  34. }
  35. void bltn_set_cdr(sdata ob, sdata x) {
  36. if (ob.tag == tcons) {
  37. heap_set(ob.data.value + 1, x);
  38. }
  39. else {
  40. log_err("runtime/bltn_set_cdr: not a pair\n");
  41. }
  42. }