diff options
author | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-24 00:57:08 +0000 |
---|---|---|
committer | Peter Mikkelsen <petermikkelsen10@gmail.com> | 2022-01-24 00:57:08 +0000 |
commit | eb8e19f2964a2b0803d644c4cc7e15a8201cd46f (patch) | |
tree | 73dacfe72d56e51771daba2a5ae838c2c9a25393 | |
parent | 3c272d5029e7d45e94592bc3828686fd1425e539 (diff) |
Special case assignment to allow assigning to ⍺ if unset, and throw syntax error on assignment to ⍵
-rw-r--r-- | eval.c | 7 | ||||
-rw-r--r-- | lexer.c | 2 |
2 files changed, 7 insertions, 2 deletions
@@ -225,7 +225,11 @@ nameis(Datum left, Datum right) Datum assign(Datum left, Datum right) { - if(left.symbol->setfn != nil) + if(runestrcmp(left.symbol->name, L"⍵") == 0) + throwerror(nil, ESyntax); + else if(runestrcmp(left.symbol->name, L"⍺") == 0 && !left.symbol->undefined) + goto end; + else if(left.symbol->setfn != nil) left.symbol->setfn(right); else{ if(left.symbol->undefined == 0 && left.symbol->value.tag == ArrayTag) @@ -237,6 +241,7 @@ assign(Datum left, Datum right) incref(right.array); /* for the binding */ } } +end: right.shy = 1; if(right.tag == ArrayTag) incref(right.array); /* for the returned array */ @@ -168,7 +168,7 @@ get_digits: }else if(runestrchr(L"⍺⍵", peek)){ Rune name[2] = {peek, 0}; stmt->toks[stmt->ntoks].tag = NameTag; - stmt->toks[stmt->ntoks].symbol = getsym(name, 0); + stmt->toks[stmt->ntoks].symbol = getsym(name, 1); }else if(isalpharune(peek)){ Rune buf[64]; Rune *p = buf; |