Janet เป็นภาษาการเขียนโปรแกรมสำหรับการเขียนสคริปต์ระบบระบบอัตโนมัติที่แสดงออกและการขยายโปรแกรมที่เขียนใน C หรือ C ++ พร้อมความสามารถในการเขียนสคริปต์ของผู้ใช้
เจเน็ตทำภาษาสคริปต์ระบบที่ดีหรือภาษาที่ฝังอยู่ในโปรแกรมอื่น ๆ มันเหมือนกับ Gnu Guile ในเรื่องนั้น มันมีฟังก์ชั่นในตัวและภาษาหลักที่สมบูรณ์กว่า Lua แต่เล็กกว่า GNU Guile หรือ Python อย่างไรก็ตามมันง่ายต่อการฝังและพอร์ตมากกว่า Python หรือ Guile
มี REPL สำหรับลองใช้ภาษารวมถึงความสามารถในการเรียกใช้ไฟล์สคริปต์ โปรแกรมไคลเอนต์นี้แยกจากรันไทม์หลักดังนั้นเจเน็ตสามารถฝังในโปรแกรมอื่น ๆ ลอง Janet ในเบราว์เซอร์ของคุณที่ https://janet-lang.org
ดูไดเรกทอรีตัวอย่างสำหรับโปรแกรมตัวอย่างทั้งหมดที่ให้ไว้
# 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) โดยไม่มีอาร์กิวเมนต์หากคุณอยู่ใน REPL เพื่อแสดงสัญลักษณ์ที่ถูกผูกไว้
คุณสามารถรับแหล่งที่มาของ GitHub หรือ SourceHut ในขณะที่ GitHub repo เป็น repo อย่างเป็นทางการ แต่ Mirror SourceHut ได้รับการดูแลอย่างแข็งขัน
MakeFile นั้นไม่สามารถพกพาได้และต้องใช้ GNU รส
cd somewhere/my/projects/janet
make
make test
make repl
make install
make install-jpm-git ค้นหาข้อมูลเพิ่มเติมเกี่ยวกับเป้าหมายที่มีอยู่โดยการทำงาน make help
คำแนะนำในการสร้างไฮกุ 32 บิตเหมือนกับคำแนะนำการสร้างแบบ 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 จำเป็นต้องอยู่บนเส้นทางของคุณ) และ cd ไปยังไดเรกทอรีกับ Janetbuild_win เพื่อรวบรวม Janetbuild_win test เพื่อให้แน่ใจว่าทุกอย่างทำงานได้ ในการสร้างอุปกรณ์ติดตั้ง .msi นอกเหนือจากขั้นตอนข้างต้นคุณจะต้อง:
build_win dist ตอนนี้คุณควรมี .msi คุณสามารถเรียกใช้ build_win install เพื่อติดตั้ง .msi หรือเรียกใช้ไฟล์เอง
เจเน็ตยังมีไฟล์บิลด์สำหรับ Meson ซึ่งเป็นระบบบิลด์ข้ามแพลตฟอร์ม แม้ว่า Meson จะมีการพึ่งพา Python แต่ Meson เป็นระบบบิลด์ที่สมบูรณ์แบบซึ่งอาจจะสะดวกและยืดหยุ่นมากขึ้นสำหรับการรวมเข้ากับท่อที่มีอยู่ Meson ยังให้การรวม IDE ที่ดีกว่าไฟล์ Make หรือ Batch รวมถึงการสนับสนุนสำหรับการรวบรวมข้าม
สำหรับความอดทนการสร้างด้วย meson มีดังนี้ ตัวเลือกที่มีให้กับ meson setup ด้านล่างเลียนแบบ MakeFile ของ Janet
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เจเน็ตสามารถถูกแฮ็กได้ด้วยสภาพแวดล้อมที่คุณชอบ แต่สำหรับคนรัก IDE ผู้สร้าง Gnome อาจเป็นตัวเลือกที่ดีที่สุดเนื่องจากมีการรวม Meson ที่ยอดเยี่ยม นอกจากนี้ยังมีรหัสให้เสร็จสิ้นสำหรับ C API ของ Janet ทันทีซึ่งเป็นประโยชน์มากสำหรับการสำรวจ VSCODE, VIM, EMACS และอะตอมแต่ละชุดมีแพ็คเกจไวยากรณ์สำหรับภาษาเจเน็ต
หากคุณต้องการลองใช้ภาษาคุณไม่จำเป็นต้องติดตั้งอะไรเลย ในกรณีนี้คุณสามารถย้ายการดำเนินการของ janet ได้ทุกที่ที่คุณต้องการในระบบของคุณและเรียกใช้ อย่างไรก็ตามสำหรับการตั้งค่าที่สมบูรณ์ยิ่งขึ้นโปรดดูคำแนะนำสำหรับรายละเอียดเพิ่มเติม
REPL เปิดตัวเมื่อมีการเรียกใช้ไบนารีโดยไม่มีข้อโต้แย้ง ส่งธง -h เพื่อแสดงข้อมูลการใช้งาน สคริปต์ส่วนบุคคลสามารถเรียกใช้กับ ./janet myscript.janet
หากคุณกำลังมองหาการสำรวจคุณสามารถพิมพ์รายการของมาโครฟังก์ชั่นและค่าคงที่ทั้งหมดที่มีอยู่ทั้งหมดโดยป้อนคำสั่ง (all-bindings) ลงใน Repl
$ 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 เพื่อรับข้อมูลการใช้งาน
เจเน็ตสามารถฝังอยู่ในโปรแกรมโฮสต์ได้อย่างง่ายดายมาก บิลด์ปกติจะสร้างไฟล์ build/janet.c ซึ่งเป็นไฟล์ C เดียวที่มีแหล่งที่มาทั้งหมดไปยัง Janet ไฟล์นี้พร้อมกับ src/include/janet.h และ src/conf/janetconf.h สามารถลากลงในโครงการ C ใด ๆ และรวบรวมไว้ Janet ควรรวบรวมด้วย -std=c99 ในคอมไพเลอร์ส่วนใหญ่และจะต้องเชื่อมโยงกับไลบรารีคณิตศาสตร์ -lm และตัวเชื่อมโยงแบบไดนามิก -ldl หากต้องการโหลดโมดูลไดนามิก หากไม่จำเป็นต้องใช้โมดูลแบบไดนามิกให้เพิ่ม define -DJANET_NO_DYNAMIC_MODULES ลงในตัวเลือกคอมไพเลอร์
ดูส่วนการฝังบนเว็บไซต์สำหรับข้อมูลเพิ่มเติม
อย่าลังเลที่จะถามคำถามและเข้าร่วมการอภิปรายในอินสแตนซ์ของ Janet Zulip
มันเป็นความเร็วเท่ากันกับภาษาที่ตีความมากที่สุดโดยไม่มีคอมไพเลอร์ JIT ลูปที่สำคัญควรเขียนใน C หรือ C ++ โปรแกรมมีแนวโน้มที่จะเร็วกว่าที่พวกเขาจะอยู่ในภาษาเช่น Python เนื่องจากความท้อแท้ของนามธรรมเชิงวัตถุช้าที่มีการค้นหาแบบแฮชตารางจำนวนมากและทำให้การผูกมัดช้า ค่าทั้งหมดจะถูกบรรจุในการแสดง 8 ไบต์โดยค่าเริ่มต้นและจัดสรรบนฮีปยกเว้นตัวเลข NILS และ BOOLEANS เอ็นจิ้น PEG เป็นล่ามพิเศษที่สามารถประมวลผลสตริงและข้อมูลบัฟเฟอร์ได้อย่างมีประสิทธิภาพ
GC นั้นง่ายและหยุดยั้งโลก แต่ลูกบิด GC ถูกเปิดเผยในห้องสมุดหลักและเธรดแยกต่างหากมีกองแยกและนักสะสมขยะ ข้อมูลที่ใช้ร่วมกันระหว่างเธรดจะถูกนับอ้างอิง
ymmv.
มันอาจจะมีอยู่มันอาจไม่ หากคุณต้องการเสนอคุณสมบัติภาษาที่สำคัญให้ไปข้างหน้าและเปิดปัญหา แต่จะปิดเป็น "จะไม่ใช้" บ่อยครั้งที่คุณสมบัติดังกล่าวทำให้การใช้หนึ่งครั้งง่ายขึ้นด้วยค่าใช้จ่ายของอีก 5 คนโดยทำให้ภาษามีความซับซ้อนมากขึ้น
ปัจจุบันยังไม่มีข้อมูลจำเพาะนอกเหนือจากเอกสารที่ https://janet-lang.org
ไม่. ไม่มีเซลล์ CONS ที่นี่
ไม่มันคล้ายกับ Clojure ผิวเผินเพราะฉันชอบ Lisps และฉันชอบสุนทรียศาสตร์ ภายในเจเน็ตไม่เหมือน Clojure โครงการหรือ LISP ทั่วไป
ไม่พวกเขาเป็นอาร์เรย์ที่ไม่เปลี่ยนรูปและตารางแฮช อย่าพยายามใช้พวกเขาเช่นเวกเตอร์และแผนที่ของ Clojure แทนพวกเขาทำงานได้ดีเช่นปุ่มตารางหรือตัวระบุอื่น ๆ
ในระดับหนึ่งใช่ อย่างไรก็ตามมันไม่ใช่วิธีการที่แนะนำของนามธรรมและประสิทธิภาพอาจประสบ ที่กล่าวว่าตารางสามารถใช้ในการสร้างวัตถุที่ไม่แน่นอนด้วยการสืบทอดและ polymorphism โดยที่วิธีการวัตถุถูกนำไปใช้กับคำหลัก
( 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 สำหรับการส่งคืนที่ไม่ใช่ท้องถิ่นภายใน วิธีการนี้ไม่ได้รับความนิยมกับโปรแกรมเมอร์จำนวนมากในขณะนี้และไม่ได้เล่นได้ดีกับภาษาอื่น ๆ ที่มีข้อยกเว้นหรือการไม่ จำกัด สแต็ก
ตรวจสอบให้แน่ใจว่าเทอร์มินัลของคุณรองรับรหัส Escape ANSI เทอร์มินัลที่ทันสมัยส่วนใหญ่จะรองรับสิ่งเหล่านี้ แต่ขั้วที่เก่ากว่าบางตัวคอนโซล Windows หรือเทอร์มินัลที่ฝังตัวจะไม่ หากเทอร์มินัลของคุณไม่รองรับรหัส Escape ANSI ให้เรียกใช้ REPL ด้วยการตั้งค่าสถานะ -n ซึ่งปิดใช้งานเอาต์พุตสี นอกจากนี้คุณยังสามารถลองใช้ธง -s หากมีปัญหาเพิ่มเติม
เจเน็ตได้รับการตั้งชื่อตามสิ่งประดิษฐ์ที่เป็นมิตรและเป็นมิตรในสถานที่ที่ดี