X-Git-Url: https://thelambdalab.xyz/gitweb/index.cgi?a=blobdiff_plain;f=src%2Fforth.jl;h=89c4c0db15ca3ac12e6e5f35d54ce88897adaa3b;hb=a8d323108d89b2438677598d1b1b592191e72a0b;hp=9439dead46913871d9255834a9272713cad19433;hpb=6cb12b03e2a154214fc60d7c437e650e79fb42e5;p=forth.jl.git diff --git a/src/forth.jl b/src/forth.jl index 9439dea..89c4c0d 100644 --- a/src/forth.jl +++ b/src/forth.jl @@ -16,13 +16,13 @@ primNames = Array{ASCIIString,1}() # Built-in variables nextVarAddr = 1 -H = nextVarAddr; nextVarAddr += 1 -LATEST = nextVarAddr; nextVarAddr += 1 +H = nextVarAddr; nextVarAddr += 1 # Next free memory address +LATEST = nextVarAddr; nextVarAddr += 1 # LFA of latest word in systetm dict RSP0 = nextVarAddr # bottom of RS PSP0 = RSP0 + size_RS # bottom of PS TIB = PSP0 + size_PS # address of terminal input buffer -mem[H] = TIB + size_TIB # location of bottom of dictionary +mem[H] = TIB + size_TIB # location of bottom of dictionary mem[LATEST] = 0 # no previous definition DICT = mem[H] # Save bottom of dictionary as constant @@ -151,18 +151,21 @@ function defExistingVar(name::AbstractString, varAddr::Int64; flags::Int64=0) end))) end -function defNewVar(name::AbstractString, initial::Int64; flags::Int64=0) +function defNewVar(name::AbstractString, initial::Array{Int64,1}; flags::Int64=0) createHeader(name, flags) codeWordAddr = mem[H] varAddr = mem[H] + 1 mem[mem[H]] = DOVAR; mem[H] += 1 - mem[mem[H]] = initial; mem[H] += 1 + mem[mem[H]:(mem[H]+length(initial)-1)] = initial; mem[H] += length(initial) return varAddr, codeWordAddr end +defNewVar(name::AbstractString, initial::Int64; flags::Int64=0) = + defNewVar(name, [initial]; flags=flags) + function defConst(name::AbstractString, val::Int64; flags::Int64=0) createHeader(name, flags) @@ -994,7 +997,14 @@ INCLUDE_CFA = defPrimWord("INCLUDE", () -> begin wordLen = mem[wordAddr-1] word = getString(wordAddr, wordLen) - push!(sources, open(word, "r")) + fname = word + if !isfile(fname) + fname = Pkg.dir("forth","src",word) + if !isfile(fname) + error("No file named $word found in current directory or package source directory.") + end + end + push!(sources, open(fname, "r")) # Clear input buffer mem[NUMTIB] = 0 @@ -1009,8 +1019,8 @@ initialized = false initFileName = nothing if isfile("lib.4th") initFileName = "lib.4th" -elseif isfile(Pkg.dir("forth/src/lib.4th")) - initFileName = Pkg.dir("forth/src/lib.4th") +elseif isfile(Pkg.dir("forth","src", "lib.4th")) + initFileName = Pkg.dir("forth","src","lib.4th") end function run(;initialize=true)