珍妮特(Janet)是一种用于系统脚本,表达自动化的编程语言,并扩展了用用户脚本功能编写的C ++编写的程序。
珍妮特(Janet)制作了一个良好的系统脚本语言,或者是一种嵌入其他程序的语言。在这方面,就像Lua和Gnu Guile一样。它比LUA具有更多的内置功能和更丰富的核心语言,但比GNU Guile或Python小。但是,嵌入和端口比Python或Guile容易得多。
尝试使用该语言以及运行脚本文件的能力有一个重复。该客户端程序与核心运行时分开,因此Janet可以嵌入其他程序中。在https://janet-lang.org上尝试在浏览器中尝试Janet。
有关所有提供的示例程序,请参见示例目录。
# John Conway's Game of Life
( def- window
( seq [ x :range [ -1 2 ]
y :range [ -1 2 ]
:when ( not ( and ( zero? x ) ( zero? y )))]
[ x y ]))
( defn- neighbors
[[ x y ]]
( map ( fn [[ x1 y1 ]] [( + x x1 ) ( + y y1 )]) window ))
( defn tick
" Get the next state in the Game Of Life. "
[ state ]
( def cell-set ( frequencies state ))
( def neighbor-set ( frequencies ( mapcat neighbors state )))
( seq [ coord :keys neighbor-set
:let [ count ( get neighbor-set coord )]
:when ( or ( = count 3 ) ( and ( get cell-set coord ) ( = count 2 )))]
coord ))
( defn draw
" Draw cells in the game of life from (x1, y1) to (x2, y2) "
[ state x1 y1 x2 y2 ]
( def cellset @{})
( each cell state ( put cellset cell true ))
( loop [ x :range [ x1 ( + 1 x2 )]
:after ( print )
y :range [ y1 ( + 1 y2 )]]
( file/write stdout ( if ( get cellset [ x y ]) " X " " . " )))
( print ))
# Print the first 20 generations of a glider
( var *state* '[( 0 0 ) ( -1 0 ) ( 1 0 ) ( 1 1 ) ( 0 2 )])
( for i 0 20
( print " generation " i )
( draw *state* -7 -7 7 7 )
( set *state* ( tick *state* ))) # A simple TCP echo server using the built-in socket networking and event loop.
( defn handler
" Simple handler for connections. "
[ stream ]
( defer ( :close stream )
( def id ( gensym ))
( def b @" " )
( print " Connection " id " ! " )
( while ( :read stream 1024 b )
( printf " %v -> %v " id b )
( :write stream b )
( buffer/clear b ))
( printf " Done %v! " id )
( ev/sleep 0.5 )))
( net/server " 127.0.0.1 " " 8000 " handler ) # Use the FFI to popup a Windows message box - no C required
( ffi/context " user32.dll " )
( ffi/defbind MessageBoxA :int
[ w :ptr text :string cap :string typ :int ])
( MessageBoxA nil " Hello, World! " " Test " 0 )文档也可以在REPL中本地提供。使用(doc symbol-name)宏获取核心库中符号的API文档。例如,
(doc apply)
显示apply功能的文档。
要获取默认环境中所有绑定的列表,请使用(all-bindings)函数。如果您在卧室中显示绑定的符号,则也可以使用(doc)宏没有参数。
您可以在github或sourcehut上获取源。虽然GitHub存储库是官方存储库,但SourceHut Mirror得到了积极的维护。
Makefile是不可存储的,需要GNU味的品牌。
cd somewhere/my/projects/janet
make
make test
make repl
make install
make install-jpm-git通过运行make help以了解有关可用制造目标的更多信息。
32位Haiku构建说明与类似于Unix的构建说明相同,但是您需要指定替代编译器,例如gcc-x86 。
cd somewhere/my/projects/janet
make CC=gcc-x86
make test
make repl
make install
make install-jpm-git FreeBSD构建说明与类似Unix的构建说明相同,但是您需要gmake进行编译。或者,使用pkg install lang/janet直接安装软件包。
cd somewhere/my/projects/janet
gmake
gmake test
gmake repl
gmake install
gmake install-jpm-git NetBSD构建说明与FreeBSD构建说明相同。或者,使用pkgin install janet直接安装软件包。
cl.exe和link.exe需要在您的路径上),并使用Janet cd目录。build_win进行编译Janet。build_win test以确保一切正常。要构建.msi安装程序可执行文件,除上述步骤外,您还必须:
build_win dist 。现在您应该有一个.msi 。您可以运行build_win install以安装.msi或执行文件本身。
珍妮特(Janet)还为跨平台构建系统梅森(Meson)提供了一个构建文件。尽管Meson具有Python的依赖性,但Meson是一个非常完整的构建系统,可能更方便和灵活地集成到现有管道中。 Meson还提供了比制造或批处理文件更好的IDE集成,以及对交叉补偿的支持。
对于不耐烦的人来说,使用介子建造如下。在下面提供的meson setup的选项模仿Janet的Makefile。
git clone https://github.com/janet-lang/janet.git
cd janet
meson setup build
--buildtype release
--optimization 2
--libdir /usr/local/lib
-Dgit_hash= $( git log --pretty=format: ' %h ' -n 1 )
ninja -C build
# Run the binary
build/janet
# Installation
ninja -C build install珍妮特(Janet)几乎可以在您喜欢的任何环境中被黑客入侵,但是对于IDE爱好者来说,Gnome Builder可能是最好的选择,因为它具有出色的梅森集成。它还可以为Janet的C API提供代码完成,这对于探索非常有用。 vscode,vim,emacs和atom都有珍妮特语言的语法包。
如果您只想尝试该语言,则无需安装任何内容。在这种情况下,您还可以在系统上想要的任何地方移动janet可执行文件并运行它。但是,要进行完整的设置,请参阅介绍以获取更多详细信息。
当二进制援引没有参数的情况下,将启动一个卧式。传递-h标志以显示使用信息。可以使用./janet myscript.janet运行单个脚本。
如果您想探索,则可以通过将命令(all-bindings)输入REPP来打印所有可用宏,功能和常数的列表。
$ janet
Janet 1.7.1-dev-951e10f Copyright (C) 2017-2020 Calvin Rose
janet:1:> (+ 1 2 3)
6
janet:2:> (print "Hello, World!")
Hello, World!
nil
janet:3:> (os/exit)
$ janet -h
usage: janet [options] script args...
Options are:
-h : Show this help
-v : Print the version string
-s : Use raw stdin instead of getline like functionality
-e code : Execute a string of janet
-E code arguments... : Evaluate an expression as a short-fn with arguments
-d : Set the debug flag in the REPL
-r : Enter the REPL after running all scripts
-R : Disables loading profile.janet when JANET_PROFILE is present
-p : Keep on executing if there is a top-level error (persistent)
-q : Hide logo (quiet)
-k : Compile scripts but do not execute (flycheck)
-m syspath : Set system path for loading global modules
-c source output : Compile janet source code into an image
-i : Load the script argument as an image file instead of source code
-n : Disable ANSI color output in the REPL
-l lib : Use a module before processing more arguments
-w level : Set the lint warning level - default is "normal"
-x level : Set the lint error level - default is "none"
-- : Stop handling options
如果安装,您还可以运行man janet以获取使用信息。
Janet可以很容易地嵌入到主机程序中。普通构建将创建一个文件build/janet.c ,它是一个包含所有源到janet的单个C文件。该文件以及src/include/janet.h和src/conf/janetconf.h可以拖动到任何C项目中并将其编译到其中。 Janet应在大多数编译器上使用-std=c99编译,并且需要链接到数学库-lm和动态链接器-ldl ,如果一个人希望能够加载动态模块。如果不需要动态模块,请在编译器选项中添加定义-DJANET_NO_DYNAMIC_MODULES 。
有关更多信息,请参见网站上的嵌入部分。
随时提出问题并加入Janet Zulip实例的讨论
它与没有JIT编译器的大多数解释语言的速度大致相同。紧密,关键的回路可能应该用C或C ++写。由于抑制了慢速面向对象的抽象,并明确使后期结合后,程序往往比使用Python这样的语言要快一点。所有值默认情况下以8字节表示,并在堆上分配,除了数字,尼尔和布尔值外。 PEG引擎是可以有效处理字符串和缓冲数据的专业解释器。
GC很简单且停止世界,但是GC旋钮在核心库中暴露在外,单独的线程具有孤立的堆和垃圾收集器。线程之间共享的数据是参考计数。
YMMV。
它可能存在,可能不存在。如果您想提出一项主要语言功能,请继续并打开一个问题,但由于“不会实施”,它可能会关闭。通常,这样的功能使一个用户酶变得更简单,以使语言更复杂,以牺牲5个用户为代价。
目前,除了https://janet-lang.org上的文档外,当前没有规格。
没有。这里没有缺点细胞。
否。这与Clojure上的表面相似,因为我喜欢Lisps,并且喜欢美学。在内部,珍妮特根本不像克洛杰尔,方案或普通lisp那样。
不。它们是不可变的阵列和散布桌。不要尝试像Clojure的向量和地图一样使用它们,而是它们可以作为桌子键或其他标识符工作。
在某种程度上,是的。但是,这不是推荐的抽象方法,并且性能可能会受到影响。也就是说,表可以用来用遗传和多态性制作可变的对象,其中用关键字实现对象方法。
( def Car @{ :honk ( fn [self msg] ( print " car " self " goes " msg)) })
( def my-car ( table/setproto @{} Car))
( :honk my-car " Beep! " )通常,有几个原因之一:
可能,如果该语言与C具有良好的界面。但是程序员可能需要做一些额外的工作来将Janet的内部内存模型映射到绑定语言的内存模型。珍妮特还使用setjmp / longjmp进行内部非本地回报。现在,这种方法与许多程序员不满意,并且并不总是在其他具有例外或堆栈不伴随的语言中发挥作用。
确保您的终端支持ANSI逃生代码。大多数现代终端都会支持这些,但是一些较旧的终端,Windows控制台或嵌入式终端不会。如果您的终端不支持ANSI逃生代码,请用-n标志运行REPL,从而禁用颜色输出。如果随之而来的是进一步的问题,您也可以尝试-s标志。
珍妮特(Janet)以几乎无所不知且友好的人为的位置命名。