From 1fe353a40d91af2d1ab3f3532f731d9541a31689 Mon Sep 17 00:00:00 2001 From: MaximeBarniaudy Date: Mon, 13 May 2024 14:36:42 +0900 Subject: [PATCH] Add an intern primitive for symbol creation --- minproto.leg | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/minproto.leg b/minproto.leg index 0d64fca..aa9721f 100644 --- a/minproto.leg +++ b/minproto.leg @@ -2384,6 +2384,22 @@ oop prim_eval(oop func, oop self, oop args, oop env) return result; } +oop prim_intern(oop func, oop self, oop args, oop env) +{ + int argc = _get(args, Object,isize); + oop *indexed = _get(args, Object,indexed); + oop result = nil; + + if (argc != 1) { + fatal("intern: invalid number of arguments"); + } + if (getType(indexed[0]) != String) { + fatal("intern: argument is not of type String, got %s instead", getTypeName(indexed[0])); + } + + return intern(_get(indexed[0], String, value)); +} + oop prim_print(oop func, oop self, oop args, oop env) { int argc = _get(args, Object,isize); @@ -2615,6 +2631,7 @@ int main(int argc, char **argv) _set(intern("chr" ), Symbol,value, newPrimitive(prim_chr)); _set(intern("readfile" ), Symbol,value, newPrimitive(prim_readfile)); _set(intern("exit" ), Symbol,value, newPrimitive(prim_exit)); + _set(intern("intern" ), Symbol,value, newPrimitive(prim_intern)); Object_put(pObject, intern("new"), newPrimitive(prim_new )); Object_put(pObject, intern("push"), newPrimitive(prim_push ));