mes_init.c 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349
  1. /* -*-comment-start: "//";comment-end:""-*-
  2. * GNU Mes --- Maxwell Equations of Software
  3. * Copyright © 2016,2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
  4. * Copyright © 2019 Jeremiah Orians
  5. *
  6. * This file is part of GNU Mes.
  7. *
  8. * GNU Mes is free software; you can redistribute it and/or modify it
  9. * under the terms of the GNU General Public License as published by
  10. * the Free Software Foundation; either version 3 of the License, or (at
  11. * your option) any later version.
  12. *
  13. * GNU Mes is distributed in the hope that it will be useful, but
  14. * WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  16. * GNU General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public License
  19. * along with GNU Mes. If not, see <http://www.gnu.org/licenses/>.
  20. */
  21. #include "mes.h"
  22. /* Imported functions */
  23. struct cell* builtin_and(struct cell* args);
  24. struct cell* builtin_append(struct cell* args);
  25. struct cell* builtin_apply(struct cell* args);
  26. struct cell* builtin_ash(struct cell* args);
  27. struct cell* builtin_booleanp(struct cell* args);
  28. struct cell* builtin_car(struct cell* args);
  29. struct cell* builtin_cdr(struct cell* args);
  30. struct cell* builtin_char_alphabetic(struct cell* args);
  31. struct cell* builtin_char_numeric(struct cell* args);
  32. struct cell* builtin_char_to_number(struct cell* args);
  33. struct cell* builtin_char_whitespace(struct cell* args);
  34. struct cell* builtin_chareq(struct cell* args);
  35. struct cell* builtin_charp(struct cell* args);
  36. struct cell* builtin_close(struct cell* args);
  37. struct cell* builtin_command_line(struct cell* args);
  38. struct cell* builtin_cons(struct cell* args);
  39. struct cell* builtin_current_error_port(struct cell* args);
  40. struct cell* builtin_current_input_port(struct cell* args);
  41. struct cell* builtin_current_output_port(struct cell* args);
  42. struct cell* builtin_definedp(struct cell* args);
  43. struct cell* builtin_display(struct cell* args);
  44. struct cell* builtin_display_error(struct cell* args);
  45. struct cell* builtin_div(struct cell* args);
  46. struct cell* builtin_eofp (struct cell* args);
  47. struct cell* builtin_eq(struct cell* args);
  48. struct cell* builtin_equal(struct cell* args);
  49. struct cell* builtin_eqv(struct cell* args);
  50. struct cell* builtin_freecell(struct cell* args);
  51. struct cell* builtin_get_env(struct cell* args);
  52. struct cell* builtin_halt(struct cell* args);
  53. struct cell* builtin_intp(struct cell* args);
  54. struct cell* builtin_keyword_to_symbol(struct cell* args);
  55. struct cell* builtin_keywordp(struct cell* args);
  56. struct cell* builtin_list(struct cell* args);
  57. struct cell* builtin_list_length(struct cell* args);
  58. struct cell* builtin_list_to_string(struct cell* args);
  59. struct cell* builtin_list_to_symbol(struct cell* args);
  60. struct cell* builtin_list_to_vector(struct cell* args);
  61. struct cell* builtin_listeq(struct cell* args);
  62. struct cell* builtin_listp(struct cell* args);
  63. struct cell* builtin_logand(struct cell* args);
  64. struct cell* builtin_lognot(struct cell* args);
  65. struct cell* builtin_logor(struct cell* args);
  66. struct cell* builtin_make_record(struct cell* args);
  67. struct cell* builtin_make_record_type(struct cell* args);
  68. struct cell* builtin_make_string(struct cell* args);
  69. struct cell* builtin_make_vector(struct cell* args);
  70. struct cell* builtin_mod(struct cell* args);
  71. struct cell* builtin_not(struct cell* args);
  72. struct cell* builtin_number_to_char(struct cell* args);
  73. struct cell* builtin_number_to_string(struct cell* args);
  74. struct cell* builtin_numeq(struct cell* args);
  75. struct cell* builtin_numge(struct cell* args);
  76. struct cell* builtin_numgt(struct cell* args);
  77. struct cell* builtin_numle(struct cell* args);
  78. struct cell* builtin_numlt(struct cell* args);
  79. struct cell* builtin_open_read(struct cell* args);
  80. struct cell* builtin_open_write(struct cell* args);
  81. struct cell* builtin_or(struct cell* args);
  82. struct cell* builtin_port_filename(struct cell* args);
  83. struct cell* builtin_primitive_eval(struct cell* args);
  84. struct cell* builtin_primitive_load(struct cell* args);
  85. struct cell* builtin_primitivep(struct cell* args);
  86. struct cell* builtin_procedurep(struct cell* args);
  87. struct cell* builtin_prod(struct cell* args);
  88. struct cell* builtin_read_byte(struct cell* args);
  89. struct cell* builtin_record_accessor(struct cell* args);
  90. struct cell* builtin_record_constructor(struct cell* args);
  91. struct cell* builtin_record_modifier(struct cell* args);
  92. struct cell* builtin_record_predicate(struct cell* args);
  93. struct cell* builtin_record_type_descriptor(struct cell* args);
  94. struct cell* builtin_record_type_fields(struct cell* args);
  95. struct cell* builtin_record_type_name(struct cell* args);
  96. struct cell* builtin_record_typep(struct cell* args);
  97. struct cell* builtin_recordp(struct cell* args);
  98. struct cell* builtin_rem(struct cell* args);
  99. struct cell* builtin_reverse(struct cell* args);
  100. struct cell* builtin_set_current_error_port(struct cell* args);
  101. struct cell* builtin_set_current_input_port(struct cell* args);
  102. struct cell* builtin_set_current_output_port(struct cell* args);
  103. struct cell* builtin_setcar(struct cell* args);
  104. struct cell* builtin_setcdr(struct cell* args);
  105. struct cell* builtin_string_append(struct cell* args);
  106. struct cell* builtin_string_index(struct cell* args);
  107. struct cell* builtin_string_ref(struct cell* args);
  108. struct cell* builtin_string_set(struct cell* args);
  109. struct cell* builtin_string_size(struct cell* args);
  110. struct cell* builtin_string_to_keyword(struct cell* args);
  111. struct cell* builtin_string_to_list(struct cell* args);
  112. struct cell* builtin_string_to_number(struct cell* args);
  113. struct cell* builtin_string_to_symbol(struct cell* args);
  114. struct cell* builtin_stringeq(struct cell* args);
  115. struct cell* builtin_stringp(struct cell* args);
  116. struct cell* builtin_sub(struct cell* args);
  117. struct cell* builtin_substring(struct cell* args);
  118. struct cell* builtin_sum(struct cell* args);
  119. struct cell* builtin_symbol_to_string(struct cell* args);
  120. struct cell* builtin_ttyname(struct cell* args);
  121. struct cell* builtin_vector_length(struct cell* args);
  122. struct cell* builtin_vector_ref(struct cell* args);
  123. struct cell* builtin_vector_set(struct cell* args);
  124. struct cell* builtin_vector_to_list(struct cell* args);
  125. struct cell* builtin_vectoreq(struct cell* args);
  126. struct cell* builtin_vectorp(struct cell* args);
  127. struct cell* builtin_write(struct cell* args);
  128. struct cell* builtin_write_error(struct cell* args);
  129. struct cell* builtin_xor(struct cell* args);
  130. struct cell* equal(struct cell* a, struct cell* b);
  131. struct cell* make_prim(void* fun);
  132. struct cell* make_string(char* a, int length);
  133. struct cell* make_sym(char* name);
  134. struct cell* nullp(struct cell* args);
  135. struct cell* pairp(struct cell* args);
  136. struct cell* portp(struct cell* args);
  137. struct cell* symbolp(struct cell* args);
  138. void spinup(struct cell* sym, struct cell* prim)
  139. {
  140. all_symbols = make_cons(sym, all_symbols);
  141. g_env = make_cons(make_cons(sym, prim), g_env);
  142. }
  143. /*** Initialization ***/
  144. void init_sl3()
  145. {
  146. /* Special symbols */
  147. nil = make_sym("()");
  148. cell_t = make_sym("#t");
  149. cell_f = make_sym("#f");
  150. cell_dot = make_sym(".");
  151. quote = make_sym("quote");
  152. quasiquote = make_sym("quasiquote");
  153. unquote = make_sym("unquote");
  154. unquote_splicing = make_sym("unquote-splicing");
  155. cell_unspecified = make_sym("*unspecified*");
  156. s_if = make_sym("if");
  157. s_when = make_sym("when");
  158. s_case = make_sym("case");
  159. s_else = make_sym("else");
  160. s_cond = make_sym("cond");
  161. s_lambda = make_sym("lambda");
  162. s_macro = make_sym("macro");
  163. s_and = make_sym("and");
  164. s_or = make_sym("or");
  165. s_define = make_sym("define");
  166. s_define_macro = make_sym("define-macro");
  167. s_setb = make_sym("set!");
  168. s_begin = make_sym("begin");
  169. s_let = make_sym("let");
  170. s_while = make_sym("while");
  171. /* Globals of interest */
  172. all_symbols = make_cons(nil, nil);
  173. g_env = nil;
  174. /* Add Eval Specials */
  175. spinup(nil, nil);
  176. spinup(cell_t, cell_t);
  177. spinup(cell_f, cell_f);
  178. spinup(cell_dot, cell_dot);
  179. spinup(quote, quote);
  180. spinup(quasiquote, quasiquote);
  181. spinup(unquote, unquote);
  182. spinup(unquote_splicing, unquote_splicing);
  183. spinup(cell_unspecified, cell_unspecified);
  184. spinup(s_if, s_if);
  185. spinup(s_when, s_when);
  186. spinup(s_case, s_case);
  187. spinup(s_else, s_else);
  188. spinup(s_cond, s_cond);
  189. spinup(s_lambda, s_lambda);
  190. spinup(s_macro, s_macro);
  191. spinup(s_or, s_or);
  192. spinup(s_and, s_and);
  193. spinup(s_define, s_define);
  194. spinup(s_define_macro, s_define_macro);
  195. spinup(s_setb, s_setb);
  196. spinup(s_begin, s_begin);
  197. spinup(s_let, s_let);
  198. spinup(s_while, s_while);
  199. /* Add Primitive Specials */
  200. /* checking type */
  201. spinup(make_sym("char?"), make_prim(builtin_charp));
  202. spinup(make_sym("eof-object?"), make_prim(builtin_eofp));
  203. spinup(make_sym("list?"), make_prim(builtin_listp));
  204. spinup(make_sym("number?"), make_prim(builtin_intp));
  205. spinup(make_sym("boolean?"), make_prim(builtin_booleanp));
  206. spinup(make_sym("null?"), make_prim(nullp));
  207. spinup(make_sym("pair?"), make_prim(pairp));
  208. spinup(make_sym("port?"), make_prim(portp));
  209. spinup(make_sym("primitive?"), make_prim(builtin_primitivep));
  210. spinup(make_sym("procedure?"), make_prim(builtin_procedurep));
  211. spinup(make_sym("string?"), make_prim(builtin_stringp));
  212. spinup(make_sym("symbol?"), make_prim(symbolp));
  213. spinup(make_sym("vector?"), make_prim(builtin_vectorp));
  214. spinup(make_sym("defined?"), make_prim(builtin_definedp));
  215. /* Comparisions */
  216. spinup(make_sym("<"), make_prim(builtin_numlt));
  217. spinup(make_sym("<="), make_prim(builtin_numle));
  218. spinup(make_sym("="), make_prim(builtin_numeq));
  219. spinup(make_sym(">"), make_prim(builtin_numgt));
  220. spinup(make_sym(">="), make_prim(builtin_numge));
  221. spinup(make_sym("char=?"), make_prim(builtin_chareq));
  222. spinup(make_sym("string=?"), make_prim(builtin_stringeq));
  223. spinup(make_sym("eq?"), make_prim(builtin_eq));
  224. spinup(make_sym("eqv?"), make_prim(builtin_eqv));
  225. spinup(make_sym("equal?"), make_prim(builtin_equal));
  226. /* Math */
  227. spinup(make_sym("*"), make_prim(builtin_prod));
  228. spinup(make_sym("+"), make_prim(builtin_sum));
  229. spinup(make_sym("-"), make_prim(builtin_sub));
  230. spinup(make_sym("ash"), make_prim(builtin_ash));
  231. spinup(make_sym("logand"), make_prim(builtin_logand));
  232. spinup(make_sym("logior"), make_prim(builtin_logor));
  233. spinup(make_sym("lognot"), make_prim(builtin_lognot));
  234. spinup(make_sym("logxor"), make_prim(builtin_xor));
  235. spinup(make_sym("modulo"), make_prim(builtin_mod));
  236. spinup(make_sym("quotient"), make_prim(builtin_div));
  237. spinup(make_sym("remainder"), make_prim(builtin_rem));
  238. /* Files */
  239. spinup(make_sym("open-input-file"), make_prim(builtin_open_read));
  240. spinup(make_sym("open-output-file"), make_prim(builtin_open_write));
  241. spinup(make_sym("close-port"), make_prim(builtin_close));
  242. spinup(make_sym("set-current-output-port"), make_prim(builtin_set_current_output_port));
  243. spinup(make_sym("set-current-input-port"), make_prim(builtin_set_current_input_port));
  244. spinup(make_sym("set-current-error-port"), make_prim(builtin_set_current_error_port));
  245. spinup(make_sym("current-output-port"), make_prim(builtin_current_output_port));
  246. spinup(make_sym("current-input-port"), make_prim(builtin_current_input_port));
  247. spinup(make_sym("current-error-port"), make_prim(builtin_current_error_port));
  248. spinup(make_sym("display"), make_prim(builtin_display));
  249. spinup(make_sym("display-error"), make_prim(builtin_display_error));
  250. spinup(make_sym("write"), make_prim(builtin_write));
  251. spinup(make_sym("read-char"), make_prim(builtin_read_byte));
  252. spinup(make_sym("primitive-load"), make_prim(builtin_primitive_load));
  253. spinup(make_sym("ttyname"), make_prim(builtin_ttyname));
  254. spinup(make_sym("port-filename"), make_prim(builtin_port_filename));
  255. /* Deal with Records */
  256. spinup(make_sym("make-record-type"), make_prim(builtin_make_record_type));
  257. spinup(make_sym("record-type-name"), make_prim(builtin_record_type_name));
  258. spinup(make_sym("record-type-fields"), make_prim(builtin_record_type_fields));
  259. spinup(make_sym("record-type?"), make_prim(builtin_record_typep));
  260. spinup(make_sym("record?"), make_prim(builtin_recordp));
  261. spinup(make_sym("record-type-descriptor"), make_prim(builtin_record_type_descriptor));
  262. /* Dealing with Lists */
  263. spinup(make_sym("list"), make_prim(builtin_list));
  264. spinup(make_sym("append"), make_prim(builtin_append));
  265. spinup(make_sym("length"), make_prim(builtin_list_length));
  266. spinup(make_sym("list->string"), make_prim(builtin_list_to_string));
  267. spinup(make_sym("list->vector"), make_prim(builtin_list_to_vector));
  268. spinup(make_sym("list->symbol"), make_prim(builtin_list_to_symbol));
  269. /* Deal with Vectors */
  270. spinup(make_sym("make-vector"), make_prim(builtin_make_vector));
  271. spinup(make_sym("vector-length"), make_prim(builtin_vector_length));
  272. spinup(make_sym("vector-set!"), make_prim(builtin_vector_set));
  273. spinup(make_sym("vector-ref"), make_prim(builtin_vector_ref));
  274. spinup(make_sym("vector->list"), make_prim(builtin_vector_to_list));
  275. /* Deal with Strings */
  276. spinup(make_sym("make-string"), make_prim(builtin_make_string));
  277. spinup(make_sym("string->list"), make_prim(builtin_string_to_list));
  278. spinup(make_sym("string-length"), make_prim(builtin_string_size));
  279. spinup(make_sym("string-index"), make_prim(builtin_string_index));
  280. spinup(make_sym("string-ref"), make_prim(builtin_string_ref));
  281. spinup(make_sym("string->number"), make_prim(builtin_string_to_number));
  282. spinup(make_sym("string->symbol"), make_prim(builtin_string_to_symbol));
  283. spinup(make_sym("substring"), make_prim(builtin_substring));
  284. spinup(make_sym("string-set!"), make_prim(builtin_string_set));
  285. spinup(make_sym("string-append"), make_prim(builtin_string_append));
  286. /* Deal with symbols */
  287. spinup(make_sym("symbol->string"), make_prim(builtin_symbol_to_string));
  288. /* Deal with keywords */
  289. spinup(make_sym("keyword?"), make_prim(builtin_keywordp));
  290. spinup(make_sym("keyword->symbol"), make_prim(builtin_keyword_to_symbol));
  291. spinup(make_sym("string->keyword"), make_prim(builtin_string_to_keyword));
  292. /* Deal with numbers */
  293. spinup(make_sym("number->string"), make_prim(builtin_number_to_string));
  294. spinup(make_sym("integer->char"), make_prim(builtin_number_to_char));
  295. /* Deal with Chars */
  296. spinup(make_sym("char->integer"), make_prim(builtin_char_to_number));
  297. spinup(make_sym("char-whitespace?"), make_prim(builtin_char_whitespace));
  298. spinup(make_sym("char-alphabetic?"), make_prim(builtin_char_alphabetic));
  299. spinup(make_sym("char-numeric?"), make_prim(builtin_char_numeric));
  300. /* Deal with logicals */
  301. spinup(make_sym("not"), make_prim(builtin_not));
  302. /* Deal with environment */
  303. spinup(make_sym("getenv"), make_prim(builtin_get_env));
  304. spinup(make_sym("command-line"), make_prim(builtin_command_line));
  305. /* Lisp classics */
  306. spinup(make_sym("cons"), make_prim(builtin_cons));
  307. spinup(make_sym("car"), make_prim(builtin_car));
  308. spinup(make_sym("cdr"), make_prim(builtin_cdr));
  309. spinup(make_sym("reverse"), make_prim(builtin_reverse));
  310. spinup(make_sym("set-car!"), make_prim(builtin_setcar));
  311. spinup(make_sym("set-cdr!"), make_prim(builtin_setcdr));
  312. spinup(make_sym("apply"), make_prim(builtin_apply));
  313. spinup(make_sym("primitive-eval"), make_prim(builtin_primitive_eval));
  314. spinup(make_sym("exit"), make_prim(builtin_halt));
  315. /* MES unique */
  316. spinup(make_sym("core:free_mem"), make_prim(builtin_freecell));
  317. spinup(make_sym("%version"), make_string("0.19", 4));
  318. spinup(make_sym("vector=?"), make_prim(builtin_vectoreq));
  319. spinup(make_sym("list=?"), make_prim(builtin_listeq));
  320. spinup(make_sym("core:make-record"), make_prim(builtin_make_record));
  321. spinup(make_sym("core:record-predicate"), make_prim(builtin_record_predicate));
  322. spinup(make_sym("core:record-accessor"), make_prim(builtin_record_accessor));
  323. spinup(make_sym("core:record-modifier"), make_prim(builtin_record_modifier));
  324. spinup(make_sym("core:record-constructor"), make_prim(builtin_record_constructor));
  325. }