mirror of
https://github.com/janet-lang/janet
synced 2024-11-24 17:27:18 +00:00
Add images.
Images are precompiled libraries. They can be created programmatically via the `write-image` function and then loaded with `require` or `import`. They can also be run by the command line tool - you must specify the path to the image without the .jimage extension.
This commit is contained in:
parent
bdf03b4706
commit
9e6b1d1b16
@ -2,6 +2,9 @@
|
|||||||
All notable changes to this project will be documented in this file.
|
All notable changes to this project will be documented in this file.
|
||||||
|
|
||||||
## 0.4.0 - ??
|
## 0.4.0 - ??
|
||||||
|
- `write-image` function creates pre compiled images for janet. These images
|
||||||
|
link to the core library. They can be loaded via require.
|
||||||
|
- Add bracketed tuples as tuple constructor.
|
||||||
- Add partition function to core library.
|
- Add partition function to core library.
|
||||||
- Pre-compile core library into an image for faster startup.
|
- Pre-compile core library into an image for faster startup.
|
||||||
- Add methods to parser values that mirror the api.
|
- Add methods to parser values that mirror the api.
|
||||||
|
@ -1081,6 +1081,33 @@ value, one key will be ignored."
|
|||||||
(if (not= i len) (array/push ret (tuple/slice ind i)))
|
(if (not= i len) (array/push ret (tuple/slice ind i)))
|
||||||
ret)
|
ret)
|
||||||
|
|
||||||
|
###
|
||||||
|
###
|
||||||
|
### IO Helpers
|
||||||
|
###
|
||||||
|
###
|
||||||
|
|
||||||
|
(defn slurp
|
||||||
|
"Read all data from a file with name path
|
||||||
|
and then close the file."
|
||||||
|
[path]
|
||||||
|
(def f (file/open path :r))
|
||||||
|
(if-not f (error (string "could not open file " path)))
|
||||||
|
(def contents (file/read f :all))
|
||||||
|
(file/close f)
|
||||||
|
contents)
|
||||||
|
|
||||||
|
(defn spit
|
||||||
|
"Write contents to a file at path.
|
||||||
|
Can optionally append to the file."
|
||||||
|
[path contents mode &]
|
||||||
|
(default mode :w)
|
||||||
|
(def f (file/open path mode))
|
||||||
|
(if-not f (error (string "could not open file " path " with mode " mode)))
|
||||||
|
(file/write f contents)
|
||||||
|
(file/close f)
|
||||||
|
nil)
|
||||||
|
|
||||||
###
|
###
|
||||||
###
|
###
|
||||||
### Pattern Matching
|
### Pattern Matching
|
||||||
@ -1556,8 +1583,14 @@ value, one key will be ignored."
|
|||||||
@["./:all:.:native:"
|
@["./:all:.:native:"
|
||||||
"./:all:/:name:.:native:"
|
"./:all:/:name:.:native:"
|
||||||
":sys:/:all:.:native:"
|
":sys:/:all:.:native:"
|
||||||
":sys:/:all:/:name:.:native:"
|
":sys:/:all:/:name:.:native:"])
|
||||||
":all:"])
|
|
||||||
|
(def module/image-paths
|
||||||
|
"See doc for module/paths"
|
||||||
|
@["./:all:.jimage"
|
||||||
|
"./:all:.:name:.jimage"
|
||||||
|
":sys:/:all:.jimage"
|
||||||
|
":sys:/:all:/:name:.jimage"])
|
||||||
|
|
||||||
(var module/*syspath*
|
(var module/*syspath*
|
||||||
"The path where globally installed libraries are located.
|
"The path where globally installed libraries are located.
|
||||||
@ -1621,10 +1654,17 @@ value, one key will be ignored."
|
|||||||
(if exit-on-error (os/exit 1))))
|
(if exit-on-error (os/exit 1))))
|
||||||
:source modpath})
|
:source modpath})
|
||||||
(file/close f)
|
(file/close f)
|
||||||
|
(table/setproto newenv nil)
|
||||||
(put module/loading modpath false)
|
(put module/loading modpath false)
|
||||||
(put module/cache modpath newenv)
|
(put module/cache modpath newenv)
|
||||||
(put module/cache path newenv)
|
(put module/cache path newenv)
|
||||||
newenv)
|
newenv)
|
||||||
|
(if-let [imgpath (find fexists (module/find path module/image-paths))]
|
||||||
|
(do
|
||||||
|
# Try image
|
||||||
|
(def imgsource (slurp imgpath))
|
||||||
|
(def img (unmarshal imgsource (env-lookup *env*)))
|
||||||
|
img)
|
||||||
(do
|
(do
|
||||||
# Try native module
|
# Try native module
|
||||||
(def n (find fexists (module/find path module/native-paths)))
|
(def n (find fexists (module/find path module/native-paths)))
|
||||||
@ -1634,10 +1674,19 @@ value, one key will be ignored."
|
|||||||
(native n e)
|
(native n e)
|
||||||
(put module/cache n e)
|
(put module/cache n e)
|
||||||
(put module/cache path e)
|
(put module/cache path e)
|
||||||
e))))
|
e)))))
|
||||||
|
|
||||||
(put _env 'fexists nil)
|
(put _env 'fexists nil)
|
||||||
|
|
||||||
|
(defn write-image
|
||||||
|
"Create an image from the file at path. Writes the output
|
||||||
|
image to a file at out."
|
||||||
|
[path out]
|
||||||
|
(def env (require path))
|
||||||
|
(def img (marshal env (invert (env-lookup _env))))
|
||||||
|
(spit out img)
|
||||||
|
img)
|
||||||
|
|
||||||
(defn import*
|
(defn import*
|
||||||
"Import a module into a given environment table. This is the
|
"Import a module into a given environment table. This is the
|
||||||
functional form of (import ...) that expects and explicit environment
|
functional form of (import ...) that expects and explicit environment
|
||||||
@ -1702,26 +1751,5 @@ value, one key will be ignored."
|
|||||||
(put symbol-set k true))
|
(put symbol-set k true))
|
||||||
(sort (keys symbol-set)))
|
(sort (keys symbol-set)))
|
||||||
|
|
||||||
(defn slurp
|
|
||||||
"Read all data from a file with name path
|
|
||||||
and then close the file."
|
|
||||||
[path]
|
|
||||||
(def f (file/open path :r))
|
|
||||||
(if-not f (error (string "could not open file " path)))
|
|
||||||
(def contents (file/read f :all))
|
|
||||||
(file/close f)
|
|
||||||
contents)
|
|
||||||
|
|
||||||
(defn spit
|
|
||||||
"Write contents to a file at path.
|
|
||||||
Can optionally append to the file."
|
|
||||||
[path contents mode &]
|
|
||||||
(default mode :w)
|
|
||||||
(def f (file/open path mode))
|
|
||||||
(if-not f (error (string "could not open file " path " with mode " mode)))
|
|
||||||
(file/write f contents)
|
|
||||||
(file/close f)
|
|
||||||
nil)
|
|
||||||
|
|
||||||
# Use dynamic *env* from now on
|
# Use dynamic *env* from now on
|
||||||
(put _env '_env nil)
|
(put _env '_env nil)
|
||||||
|
Loading…
Reference in New Issue
Block a user