aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--compiler/elymasAsm.ey13
-rw-r--r--compiler/elymasAsmLib.ey11
-rw-r--r--compiler/elymasGlobal.ey522
-rw-r--r--compiler/standard.ey34
-rw-r--r--interpreter/ElymasGlobal.pm12
-rw-r--r--notes7
6 files changed, 402 insertions, 197 deletions
diff --git a/compiler/elymasAsm.ey b/compiler/elymasAsm.ey
index f6743b2..6b75cb8 100644
--- a/compiler/elymasAsm.ey
+++ b/compiler/elymasAsm.ey
@@ -354,6 +354,11 @@
/and %21 defAsmAddq
/and /four defAsmAddImm
+ { ==off
+ %E8
+ off imm32
+ } /callqRel32 deff
+
{ ==lbl
%E8
lbl labelRel32
@@ -572,6 +577,14 @@
/js _ %78 defJmpRel8 %88 defJmpRel32
/jz _ %74 defJmpRel8 %84 defJmpRel32
+ { ==reg
+ reg bit64assert
+
+ reg regno %07 gt { 1 /none /none reg rex } rep
+ %FF
+ /four reg modrm11
+ } /jmpqReg deff
+
{ ==reg ==mem ==idx ==scale ==disp
reg bit32assert
mem bit64assert
diff --git a/compiler/elymasAsmLib.ey b/compiler/elymasAsmLib.ey
index b1783ff..a002430 100644
--- a/compiler/elymasAsmLib.ey
+++ b/compiler/elymasAsmLib.ey
@@ -758,9 +758,14 @@
# rdi -> address of scope on the heap
# rsi -> address of element name on the heap
# rax <- address of element on the heap (0 if nonexistant)
- # rdx <- 0 if element is passive
- # 1 if element is active
- # 2 if element is quote-active
+ # rdx <- %xy
+ # y 0 eq if element is passive
+ # y 1 eq if element is active
+ # y 2 eq if element is quote-active
+ # x 1 band if element is static
+ # x 2 band if element is type constant
+ # x 4 band if element is constant
+ # x 8 band if element is deep constant
# rcx <- address of entry (i.e. where rax was loaded from)
[[
@retryWithParent
diff --git a/compiler/elymasGlobal.ey b/compiler/elymasGlobal.ey
index fb731a2..633d6ab 100644
--- a/compiler/elymasGlobal.ey
+++ b/compiler/elymasGlobal.ey
@@ -103,184 +103,187 @@
:retn
] /ey? defv
- { ==activation
- # create a new entry in the current scope for the given name
- # mark that entry's default action according to activation
- # 0 -> name, string
- # 1 -> object
- [[
- 8 /r15 :subqImm8Reg
- /r15 :popqMem
+ # create a new entry in the current scope for the given name
+ # mark that entry's default action according to activation
+ # 0 -> activation
+ # 1 -> name, string
+ # 2 -> object
+ [[
+ 8 /r15 :subqImm8Reg
+ /r15 :popqMem
- /rdi :popqReg
-
- /rax :popqReg # CHECK this is just sanity checking
- /rax :pushqReg
- /rax /rax :testqRegReg
- /realObject :jnzLbl8
- "trying to store zero object address" ::outputError
- :ud2
- @realObject # CHECK end of checking
+ 8 /r15 :subqImm8Reg
+ /r15 :popqMem # /r15 now points to activation
- # search for name in nametable
- ::currentScope /rax :movqImmReg
- /rax /rbx :movqMemReg # rbx == start of scope in heap
- 8 /rbx /rdx :movqMemDisp8Reg # rdx == start of nametable in heap
- 8 /rbx /rsi :movqMemDisp8Reg # rsi == start of nametable in heap
- 8 /rsi /rsi :addqMemDisp8Reg # rsi == end of nametable in heap (according to fill)
+ /rdi :popqReg
+
+ /rax :popqReg # CHECK this is just sanity checking
+ /rax :pushqReg
+ /rax /rax :testqRegReg
+ /realObject :jnzLbl8
+ "trying to store zero object address" ::outputError
+ :ud2
+ @realObject # CHECK end of checking
- @nameSearch
- 16 /rdx :addqImm8Reg
+ # search for name in nametable
+ ::currentScope /rax :movqImmReg
+ /rax /rbx :movqMemReg # rbx == start of scope in heap
+ 8 /rbx /rdx :movqMemDisp8Reg # rdx == start of nametable in heap
+ 8 /rbx /rsi :movqMemDisp8Reg # rsi == start of nametable in heap
+ 8 /rsi /rsi :addqMemDisp8Reg # rsi == end of nametable in heap (according to fill)
- # rsi: end of nametable
- # rdx: current element of nametable
+ @nameSearch
+ 16 /rdx :addqImm8Reg
- /rdx /rsi :cmpqRegReg
- /nameUndefined :jbeLbl8
+ # rsi: end of nametable
+ # rdx: current element of nametable
- /rdx :pushqReg
- /rsi :pushqReg
- /rdi :pushqReg
- /rcx :pushqReg
- /rdx /rsi :movqMemReg
- ::internalStringEqualsCode _ len dearray
- /rcx :popqReg
- /rdi :popqReg
- /rsi :popqReg
- /rdx :popqReg
- /rax /rax :testqRegReg
- /nameOffsetKnown :jnzLbl8
-
- # if not exists, insert
- @nameUndefined
- 8 /rbx /rdx :movqMemDisp8Reg # rdx == start of nametable in heap
- /rdx /eax :movlMemReg # add memory length to obtain memory end
- /rax /rdx :addqRegReg
-
- /rsi /rdx :cmpqRegReg
- /enlargeNameTable :jbeLbl8
-
- # insert into name table
- @insertIntoNameTable
- /rdi /rsi :movqRegMem
- activation 8 /rsi :movqImm32MemDisp8 # set default activation mode
- 8 /rbx /rdx :movqMemDisp8Reg # rdx == start of nametable in heap
- 16 8 /rdx :addqImm8MemDisp8 # increment fill
- /rsi /rdx :movqRegReg
- /nameOffsetKnown :jmpLbl8
-
- @enlargeNameTable
- # if name table is already full, double size
- 8 /rbx /rdx :movqMemDisp8Reg # rdx == start of nametable in heap
- /rdi :pushqReg
- /rdx :pushqReg
- /rdx /edi :movlMemReg # load current length
- /rdi /rdi :addqRegReg
+ /rdx /rsi :cmpqRegReg
+ /nameUndefined :jbeLbl8
- ::internalAllocate /rax :movqImmReg
- /rax :callqReg
- %30 7 /rax :orbImmMemDisp8 # set type
- /rdx :popqReg
- 8 /rdx /rcx :movqMemDisp8Reg
- /rcx 8 /rax :movqRegMemDisp8 # copy fill
+ /rdx :pushqReg
+ /rsi :pushqReg
+ /rdi :pushqReg
+ /rcx :pushqReg
+ /rdx /rsi :movqMemReg
+ ::internalStringEqualsCode _ len dearray
+ /rcx :popqReg
+ /rdi :popqReg
+ /rsi :popqReg
+ /rdx :popqReg
+ /rax /rax :testqRegReg
+ /nameOffsetKnown :jnzLbl8
- 16 /rdx /rsi :leaqMemDisp8Reg
- 16 /rax /rdi :leaqMemDisp8Reg
- 16 /rcx :subqImm8Reg
- 3 /rcx :shrqImm8Reg
- :reprcx :movsq # copy content
+ # if not exists, insert
+ @nameUndefined
+ 8 /rbx /rdx :movqMemDisp8Reg # rdx == start of nametable in heap
+ /rdx /eax :movlMemReg # add memory length to obtain memory end
+ /rax /rdx :addqRegReg
- # rax == enlarged name table on heap
-
- /rax 8 /rbx :movqRegMemDisp8 # switch scope to new name table
+ /rsi /rdx :cmpqRegReg
+ /enlargeNameTable :jbeLbl8
- # insert into name table
- /rsi :popqReg
- /rsi /rdi :xchgqRegReg
- /insertIntoNameTable :jmpLbl8
-
- @nameOffsetKnown
- 8 /rbx /rdx :subqMemDisp8Reg # substract name table address
- 16 /rdx :subqImm8Reg # substract name table header size
- /rdx :shrq1Reg # divide by 2 to get offset within scope
-
- # rdx == offset in scope
- # top of stack: the object to store
-
- # update
- # if fits within main area, fine
- 32 /rdx :addqImm8Reg # add scope header size
- /edx /rbx :cmplRegMem
- /inDataArea :jaLbl8
-
- # update within extension area
- /rbx /edx :sublMemReg # substract scope length
- 24 /rbx /rdi :movqMemDisp8Reg # load extension area pointer
- 8 /rdx :addqImm8Reg # add extension area header length
-
- # if extension area is non-existent, create
- /rdi /rdi :testqRegReg
- /extensionAreaExists :jnzLbl8
-
- /rdx :pushqReg
- INITIALEXTENSIONSIZE /rdi :movqImmReg
- ::internalAllocate /rax :movqImmReg
- /rax :callqReg
- /rdx :popqReg
+ # insert into name table
+ @insertIntoNameTable
+ /rdi /rsi :movqRegMem
+ /r15 /rax :movqMemReg
+ 8 /rax /rax :movqMemDisp8Reg # load int value
+ /rax 8 /rsi :movqRegMemDisp8 # set default activation mode
+ 8 /rbx /rdx :movqMemDisp8Reg # rdx == start of nametable in heap
+ 16 8 /rdx :addqImm8MemDisp8 # increment fill
+ /rsi /rdx :movqRegReg
+ /nameOffsetKnown :jmpLbl8
- %40 7 /rax :orbImmMemDisp8 # set type
+ @enlargeNameTable
+ # if name table is already full, double size
+ 8 /rbx /rdx :movqMemDisp8Reg # rdx == start of nametable in heap
+ /rdi :pushqReg
+ /rdx :pushqReg
+ /rdx /edi :movlMemReg # load current length
+ /rdi /rdi :addqRegReg
- /rax /rdi :movqRegReg
- /rdi 24 /rbx :movqRegMemDisp8 # store new extension area
- /inExtensionArea :jmpLbl8
+ ::internalAllocate /rax :movqImmReg
+ /rax :callqReg
+ %30 7 /rax :orbImmMemDisp8 # set type
+ /rdx :popqReg
+ 8 /rdx /rcx :movqMemDisp8Reg
+ /rcx 8 /rax :movqRegMemDisp8 # copy fill
- @extensionAreaExists
+ 16 /rdx /rsi :leaqMemDisp8Reg
+ 16 /rax /rdi :leaqMemDisp8Reg
+ 16 /rcx :subqImm8Reg
+ 3 /rcx :shrqImm8Reg
+ :reprcx :movsq # copy content
- # if extension area is full, double size
- /edx /rdi :cmplRegMem
- /inExtensionArea :jaLbl8
+ # rax == enlarged name table on heap
+
+ /rax 8 /rbx :movqRegMemDisp8 # switch scope to new name table
- # indeed full
- /rdi :pushqReg
- /rdx :pushqReg
- /rdi /edi :movlMemReg
- /rdi /rdi :addqRegReg
- ::internalAllocate /rax :movqImmReg
- /rax :callqReg
- /rdx :popqReg
- /rdi :popqReg
+ # insert into name table
+ /rsi :popqReg
+ /rsi /rdi :xchgqRegReg
+ /insertIntoNameTable :jmpLbl8
+
+ @nameOffsetKnown
+ 8 /rbx /rdx :subqMemDisp8Reg # substract name table address
+ 16 /rdx :subqImm8Reg # substract name table header size
+ /rdx :shrq1Reg # divide by 2 to get offset within scope
- %40 7 /rax :orbImmMemDisp8 # set type
+ # rdx == offset in scope
+ # top of stack: the object to store
- /rdi /rsi :movqRegReg
- /rax /rdi :movqRegReg
- /rdi 24 /rbx :movqRegMemDisp8 # store new extension area
+ # update
+ # if fits within main area, fine
+ 32 /rdx :addqImm8Reg # add scope header size
+ /edx /rbx :cmplRegMem
+ /inDataArea :jaLbl8
- /rdi :pushqReg
- /rsi /ecx :movlMemReg # load length as copy count
- 8 /rsi :addqImm8Reg
- 8 /rdi :addqImm8Reg
+ # update within extension area
+ /rbx /edx :sublMemReg # substract scope length
+ 24 /rbx /rdi :movqMemDisp8Reg # load extension area pointer
+ 8 /rdx :addqImm8Reg # add extension area header length
- 8 /rcx :subqImm8Reg # substract header length
- 3 /rcx :shrqImm8Reg
- :reprcx :movsq # copy content
- /rdi :popqReg
+ # if extension area is non-existent, create
+ /rdi /rdi :testqRegReg
+ /extensionAreaExists :jnzLbl8
- @inExtensionArea
- /rdi /rbx :movqRegReg
+ /rdx :pushqReg
+ INITIALEXTENSIONSIZE /rdi :movqImmReg
+ ::internalAllocate /rax :movqImmReg
+ /rax :callqReg
+ /rdx :popqReg
- @inDataArea
+ %40 7 /rax :orbImmMemDisp8 # set type
- /rax :popqReg
- /rax /rbx /rdx :movqRegMemIndex # save entry pointer
+ /rax /rdi :movqRegReg
+ /rdi 24 /rbx :movqRegMemDisp8 # store new extension area
+ /inExtensionArea :jmpLbl8
- /r15 :pushqMem
- 8 /r15 :addqImm8Reg
- :retn
- ]]
- } 0 -101* /eydefv defv
- 1 -101* /eydeff defv
- 2 -01* /eydefq defv
+ @extensionAreaExists
+
+ # if extension area is full, double size
+ /edx /rdi :cmplRegMem
+ /inExtensionArea :jaLbl8
+
+ # indeed full
+ /rdi :pushqReg
+ /rdx :pushqReg
+ /rdi /edi :movlMemReg
+ /rdi /rdi :addqRegReg
+ ::internalAllocate /rax :movqImmReg
+ /rax :callqReg
+ /rdx :popqReg
+ /rdi :popqReg
+
+ %40 7 /rax :orbImmMemDisp8 # set type
+
+ /rdi /rsi :movqRegReg
+ /rax /rdi :movqRegReg
+ /rdi 24 /rbx :movqRegMemDisp8 # store new extension area
+
+ /rdi :pushqReg
+ /rsi /ecx :movlMemReg # load length as copy count
+ 8 /rsi :addqImm8Reg
+ 8 /rdi :addqImm8Reg
+
+ 8 /rcx :subqImm8Reg # substract header length
+ 3 /rcx :shrqImm8Reg
+ :reprcx :movsq # copy content
+ /rdi :popqReg
+
+ @inExtensionArea
+ /rdi /rbx :movqRegReg
+
+ @inDataArea
+
+ /rax :popqReg
+ /rax /rbx /rdx :movqRegMemIndex # save entry pointer
+
+ 8 /r15 :addqImm8Reg
+ /r15 :pushqMem
+ 8 /r15 :addqImm8Reg
+ :retn
+ ]] /eydef defv
# assign to a scope variable
# 0 -> name to assign to
@@ -994,11 +997,14 @@
/unresolved :jzLbl8
/rax :pushqReg
- 0 /rdx :cmpqImm8Reg
+ /rdx /rcx :movqRegReg
+ %0F /cl :andbImmReg
+
+ 0 /cl :cmpbImmReg
/inactive :jzLbl8
- 1 /rdx :cmpqImm8Reg
+ 1 /cl :cmpbImmReg
/active :jzLbl8
- 2 /rdx :cmpqImm8Reg
+ 2 /cl :cmpbImmReg
/active :jzLbl8
"invalid activation mode in internalExecuteIdentifierUnquoted" ::outputError
@@ -1022,6 +1028,130 @@
8 /r15 :addqImm8Reg
:retn
]] /internalExecuteIdentifierUnquoted defv
+
+ # resolve identifier without quoting considerations and act accordingly
+ # after resolving it, patch the given code block to more efficiently call the name next time
+ # 0 -> address of code block
+ # 1 -> identifier to resolve
+ [[
+ 8 /r15 :subqImm8Reg
+ /r15 :popqMem
+
+ 8 /r15 :subqImm8Reg
+ /r15 :popqMem # store code block
+
+ 8 /r15 :subqImm8Reg
+ /r15 :popqMem # store identifier
+
+ # scope resolution
+ ::currentScope /rdi :movqImmReg
+ /rdi /rdi :movqMemReg
+ /r15 /rsi :movqMemReg
+
+ ::internalResolve /rax :movqImmReg
+ /rax :callqReg
+
+ /rax /rax :testqRegReg
+ /unresolved :jzLbl8
+ /rax :pushqReg
+
+ %40 /dl :testbImmReg
+ /patchConstant :jnzLbl8
+
+ /rdx /rcx :movqRegReg
+ %0F /cl :andbImmReg
+
+ 0 /cl :cmpbImmReg
+ /inactive :jzLbl8
+ 1 /cl :cmpbImmReg
+ /active :jzLbl8
+ 2 /cl :cmpbImmReg
+ /active :jzLbl8
+
+ "invalid activation mode in internalExecuteIdentifierUnquotedAndPatchLateResolve" ::outputError
+ :ud2
+
+ @unresolved
+ "unresolved name in internalExecuteIdentifierUnquotedAndPatchLateResolve: " ::outputError
+ /r15 /rdi :movqMemReg
+ ::internalDumpErrorString /rax :movqImmReg
+ /rax :callqReg
+ :ud2
+
+ @active
+ |ey* /rax :movqImmReg
+ /rax :callqReg
+
+ @inactive
+ @done
+
+ 16 /r15 :addqImm8Reg
+ /r15 :pushqMem
+ 8 /r15 :addqImm8Reg
+ :retn
+
+ @patchConstant
+ %0F /dl :testbImmReg
+ /patchConstantPassive :jzLbl32
+ %01 /dl :testbImmReg
+ /patchConstantActive :jnzLbl32
+ %02 /dl :testbImmReg
+ /patchConstantQuoted :jnzLbl8
+
+ "invalid activation mode in internalExecuteIdentifierUnquotedAndPatchLateResolve@patchConstant" ::outputError
+ :ud2
+
+ @patchConstantQuoted
+ "quote activation mode in internalExecuteIdentifierUnquotedAndPatchLateResolve@patchConstant" ::outputError
+ :ud2
+
+ @patchConstantActive
+ 8 /r15 /rdi :movqMemDisp8Reg
+ 8 /rdi :addqImm8Reg
+
+ [
+ /rbx :popqReg
+ /rax :movqImmOOBReg
+ ] ::loadToRdi
+ /rdi :popqMem
+ 8 /rdi :addqImm8Reg
+ [
+ /rax :pushqReg
+ /rbx :pushqReg
+ |ey* /rax :movqImmReg
+ /rax :jmpqReg
+ ] ::loadToRdi
+
+ 8 /r15 /rdi :movqMemDisp8Reg
+ 8 /rdi :addqImm8Reg
+
+ 16 /r15 :addqImm8Reg
+ /r15 :pushqMem
+ 8 /r15 :addqImm8Reg
+ /rdi :jmpqReg # continue with freshly patched code
+
+ @patchConstantPassive
+ 8 /r15 /rdi :movqMemDisp8Reg
+ 8 /rdi :addqImm8Reg
+
+ [
+ /rax :movqImmOOBReg
+ ] ::loadToRdi
+ /rdi :popqMem
+ 8 /rdi :addqImm8Reg
+ [
+ /rax :pushqReg
+ :retn
+ ] ::loadToRdi
+
+ 8 /r15 /rdi :movqMemDisp8Reg
+ 8 /rdi :addqImm8Reg
+
+ 16 /r15 :addqImm8Reg
+ /r15 :pushqMem
+ 8 /r15 :addqImm8Reg
+ /rdi :jmpqReg # continue with freshly patched code
+ ]] /internalExecuteIdentifierUnquotedAndPatchLateResolve defv
> { defv }' ::allocateOffsetStruct
<
@@ -1044,16 +1174,16 @@
/rax /rax :testqRegReg
/unresolved :jzLbl8
- 0 /rdx :cmpqImm8Reg
- /inactiveJump :jzLbl8
- 1 /rdx :cmpqImm8Reg
+ /rdx /rcx :movqRegReg
+ %0F /cl :andbImmReg
+
+ 0 /cl :cmpbImmReg
+ /inactive :jzLbl32
+ 1 /cl :cmpbImmReg
/active :jzLbl8
- 2 /rdx :cmpqImm8Reg
+ 2 /cl :cmpbImmReg
/quoteActive :jzLbl8
- @inactiveJump
- /inactive :jmpLbl32
-
"invalid activation mode in internalExecuteIdentifier" ::outputError
:ud2
@@ -1114,7 +1244,12 @@
[
/rax :pushqReg
- internalExecuteIdentifierUnquoted /rax :movqImmReg
+ 0 :callqRel32
+ /rax :popqReg
+ # 16 bytes code here, header length, and code block header
+ 16 ::unscopingFunctionHeader len add 8 add /rax :subqImm8Reg
+ /rax :pushqReg
+ internalExecuteIdentifierUnquotedAndPatchLateResolve /rax :movqImmReg
/rax :callqReg
] ::unscopingFunctionFooter cat ::loadToRdi
@@ -1135,6 +1270,43 @@
> { defv }' ::allocateOffsetStruct
<
+ # predefining defv, deff, defq # TODO think about moving this to standard(Client) one day
+ # 0 -> name, string
+ # 1 -> object
+ { ==activation
+ [[
+ 8 /r15 :subqImm8Reg
+ /r15 :popqMem
+
+ 16 /rdi :movqImmReg
+ ::internalAllocate /rax :movqImmReg
+ /rax :callqReg
+ /rax :pushqReg
+ activation /rdx :movqImmReg
+ /rdx 8 /rax :movqRegMemDisp8
+
+ eydef /rax :movqImmReg
+ /rax :callqReg
+
+ /r15 :pushqMem
+ 8 /r15 :addqImm8Reg
+ :retn
+ ]]
+ } %00 -101* /eydefv defv
+ %01 -101* /eydeff defv
+ %02 -101* /eydefq defv
+ %10 -101* /eydefvs defv
+ %11 -101* /eydeffs defv
+ %20 -101* /eydefvt defv
+ %21 -101* /eydefft defv
+ %30 -101* /eydefvst defv
+ %31 -101* /eydeffst defv
+ %70 -101* /eydefvc defv
+ %71 -101* /eydeffc defv
+ %F0 -101* /eydefvd defv
+ %F1 -101* /eydeffd defv
+ --
+
# concatenate two functions
# 0 -> function g
# 1 -> function f
@@ -1421,10 +1593,10 @@
/unresolved :jzLbl8
/rax :pushqReg
- 0 /rdx :cmpqImm8Reg
+ %0F /dl :testbImmReg
/inactive :jzLbl8
- 1 /rdx :cmpqImm8Reg
- /active :jzLbl8
+ %01 /dl :testbImmReg
+ /active :jnzLbl8
"invalid activation mode in ." ::outputError
:ud2
@@ -2086,13 +2258,13 @@
::currentScope /rdi :movqImmReg
/rax /rdi :movqRegMem
- globalFunctions keys eydeff { | }' createScopeEntries
- globalFunctions2 keys eydeff { | }' createScopeEntries
- globalFunctions3 keys eydeff { | }' createScopeEntries
+ globalFunctions keys eydeffd { | }' createScopeEntries
+ globalFunctions2 keys eydeffd { | }' createScopeEntries
+ globalFunctions3 keys eydeffd { | }' createScopeEntries
globalMacros keys eydefq { | }' createScopeEntries
- globalT11t1Functions keys eydeff t11t1 { | }' createTypedScopeEntries
- globalT1t1Functions keys eydeff t1t1 { | }' createTypedScopeEntries
- globalTaat1Functions keys eydeff taat1 { | }' createTypedScopeEntries
+ globalT11t1Functions keys eydeffd t11t1 { | }' createTypedScopeEntries
+ globalT1t1Functions keys eydeffd t1t1 { | }' createTypedScopeEntries
+ globalTaat1Functions keys eydeffd taat1 { | }' createTypedScopeEntries
] :execute
{ ==name
diff --git a/compiler/standard.ey b/compiler/standard.ey
index 90b611d..dd2353f 100644
--- a/compiler/standard.ey
+++ b/compiler/standard.ey
@@ -1,5 +1,7 @@
-|defv "==" deff
-|deff "=*" deff
+|defvst "==" deffd
+|deffst "=*" deffd
+|defvc "==:" deffd
+|deffc "=*:" deffd
{ "}" | *
{ /f deff /x defv
@@ -7,10 +9,10 @@
} quoted { } { * } ? *
} "}_" defq
-{ deff }' " globalDeff" deff # this is not for public usage
+{ deffst }' " globalDeff" deffd # this is not for public usage
{
- { -01 < /o defv { o -01 . } > -12 } quoted { } { * } ? *
- quoted { |deff } " globalDeff" | ? *
+ { -01 < ==o { o -01 . } > -12 } quoted { } { * } ? *
+ quoted { |deffst } " globalDeff" | ? *
} /via defq
{ -1110 ; ==f =*a len _
@@ -19,21 +21,21 @@
1 -102 range f each
}' { "fold on empty array" die }'
? *
-} /fold deff
+} /fold deffd
{ _ =*a len
[ 1 -1202 1 add range { -110 sub a -01 }' each -- ] # TODO: rethink this one, seems overly complicated
-} /reverse deff
+} /reverse deffd
-{ |or fold } /any deff
-{ |and fold } /all deff
+{ |or fold } /any deffd
+{ |and fold } /all deffd
{ =*p {
[ -01 { _ p { } { -- } ? * } each ]
-} } /engrep deff
+} } /engrep deffd
-{ engrep * } /grep deff
-{ -110 ; engrep |dom -20*1* } /indices deff
+{ engrep * } /grep deffd
+{ -110 ; engrep |dom -20*1* } /indices deffd
{ =*p _ =*a len ==l
1 neg ==r
@@ -45,21 +47,21 @@
1 add
} loop --
r
-} /index deff
+} /index deffd
{
not { "Assertion failure" die } rep
-} /assert deff
+} /assert deffd
{ ==s
[ s keys { s -01 . } each ]
-} /values deff
+} /values deffd
{ _ =*conds len ==max
0 ==i { i max lt } {
i conds { i 1 add conds * max =i } { } ? *
i 2 add =i
} loop
-} /conds deff
+} /conds deffd
# vim: syn=elymas
diff --git a/interpreter/ElymasGlobal.pm b/interpreter/ElymasGlobal.pm
index 1cf8227..321a10d 100644
--- a/interpreter/ElymasGlobal.pm
+++ b/interpreter/ElymasGlobal.pm
@@ -659,6 +659,18 @@ sub installGlobal1IntFunction {
}, ['func', $name, ['int'], ['int']], 'active'];
}
+# TODO: maybe support optimization semantics in the interpreter as well one day
+$globalScope->{'defvs'} = $globalScope->{'defv'};
+$globalScope->{'deffs'} = $globalScope->{'deff'};
+$globalScope->{'defvt'} = $globalScope->{'defv'};
+$globalScope->{'defft'} = $globalScope->{'deff'};
+$globalScope->{'defvst'} = $globalScope->{'defv'};
+$globalScope->{'deffst'} = $globalScope->{'deff'};
+$globalScope->{'defvc'} = $globalScope->{'defv'};
+$globalScope->{'deffc'} = $globalScope->{'deff'};
+$globalScope->{'defvd'} = $globalScope->{'defv'};
+$globalScope->{'deffd'} = $globalScope->{'deff'};
+
sub installGlobal2IntFunction {
my ($name, $code) = @_;
diff --git a/notes b/notes
index b59aa41..8edbc5d 100644
--- a/notes
+++ b/notes
@@ -75,7 +75,7 @@ A->int A->int add -> A->int
= Characters =
-!: <open>
+!: co-routines and threads
": string quote
#: line comment
$: <open>
@@ -238,9 +238,10 @@ Main problem: How do we find out if the names mean what we believe they do?
=== Name Properties ===
* [d] deeply constant: objects referenced (indirectly) from this name can be assumed constant (constant implied)
* [c] constant: the object reference of this name can be assumed constant (code constant and static implied)
-* [t] code / type constant: the final code block (not function) reference and function type can be assumed constant
+* [t] code / type constant: the function type can be assumed constant (including whether this function has no captured scope)
* [s] static: the path from local scope to where the name resolves can be assumed constant
the name index within the scope can be assumed constant
+ the activation level can be assumed constant
* [] dynamic: nothing can be assumed
* [v] inactive: push value
* [f] active: execute unless quoted
@@ -252,7 +253,7 @@ Main problem: How do we find out if the names mean what we believe they do?
| f | deff | deffs | defft | deffst | deffc | deffd |
| q | defq | | | | | |
+---+------+-------+-------+--------+-------+-------+
-* defaults: |defvst "==" deffd |deffst "=*" deffd
+* defaults: |defvs "==" deffd |deffs "=*" deffd
* it is possible to globally turn checking (after dynamic resolution) on
== Sticky Resolution ==