Janet adalah bahasa pemrograman untuk skrip sistem, otomatisasi ekspresif, dan memperluas program yang ditulis dalam C atau C ++ dengan kemampuan skrip pengguna.
Janet membuat bahasa skrip sistem yang baik, atau bahasa untuk disematkan dalam program lain. Ini seperti Lua dan GNU Guile dalam hal itu. Ini memiliki lebih banyak fungsionalitas bawaan dan bahasa inti yang lebih kaya daripada Lua, tetapi lebih kecil dari GNU tipu daya atau Python. Namun, jauh lebih mudah untuk disematkan dan port daripada Python atau tipu daya.
Ada repl untuk mencoba bahasa, serta kemampuan untuk menjalankan file skrip. Program klien ini terpisah dari runtime inti, sehingga Janet dapat tertanam dalam program lain. Coba Janet di browser Anda di https://janet-lang.org.
Lihat Direktori Contoh untuk semua program yang disediakan.
# 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 ) Dokumentasi juga tersedia secara lokal di repl. Gunakan makro (doc symbol-name) untuk mendapatkan dokumentasi API untuk simbol di perpustakaan inti. Misalnya,
(doc apply)
menunjukkan dokumentasi untuk fungsi apply .
Untuk mendapatkan daftar semua binding di lingkungan default, gunakan fungsi (all-bindings) . Anda juga dapat menggunakan makro (doc) tanpa argumen jika Anda berada di simbol REPL TO FOUND Bound.
Anda bisa mendapatkan sumber di GitHub atau SourceHut. Sementara repo GitHub adalah repo resmi, cermin SourceHut dipertahankan secara aktif.
Makefile tidak dapat dipotong dan membutuhkan make rasa GNU.
cd somewhere/my/projects/janet
make
make test
make repl
make install
make install-jpm-git Cari tahu lebih lanjut tentang target membuat target yang tersedia dengan menjalankan make help .
Instruksi build haiku 32-bit sama dengan instruksi build seperti Unix, tetapi Anda perlu menentukan kompiler alternatif, seperti gcc-x86 .
cd somewhere/my/projects/janet
make CC=gcc-x86
make test
make repl
make install
make install-jpm-git Instruksi build freeBSD sama dengan instruksi build seperti unix, tetapi Anda perlu gmake untuk dikompilasi. Atau, instal paket secara langsung dengan pkg install lang/janet .
cd somewhere/my/projects/janet
gmake
gmake test
gmake repl
gmake install
gmake install-jpm-git Instruksi Build NetBSD sama dengan instruksi pembuatan FreeBSD. Atau, instal paket secara langsung dengan pkgin install janet .
cl.exe dan link.exe harus berada di jalur Anda) dan cd ke direktori dengan Janet.build_win untuk mengkompilasi Janet.build_win test untuk memastikan semuanya berfungsi. Untuk membangun penginstal .msi dapat dieksekusi, selain langkah -langkah di atas, Anda harus:
build_win dist . Sekarang Anda harus memiliki .msi . Anda dapat menjalankan build_win install untuk menginstal .msi , atau menjalankan file itu sendiri.
Janet juga memiliki file build untuk Meson, sistem build lintas platform. Meskipun Meson memiliki ketergantungan Python, Meson adalah sistem build yang sangat lengkap yang mungkin lebih nyaman dan fleksibel untuk mengintegrasikan ke dalam pipa yang ada. Meson juga menyediakan integrasi IDE yang jauh lebih baik daripada file Make atau Batch, serta dukungan untuk kompilasi silang.
Untuk yang tidak sabar, membangun dengan meson adalah sebagai berikut. Opsi yang disediakan untuk meson setup di bawah ini meniru 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 installJanet dapat diretas dengan hampir semua lingkungan yang Anda sukai, tetapi untuk pecinta IDE, Gnome Builder mungkin merupakan pilihan terbaik, karena memiliki integrasi meson yang sangat baik. Ini juga menawarkan penyelesaian kode untuk Janet's C API langsung dari kotak, yang sangat berguna untuk dijelajahi. VScode, Vim, Emacs, dan Atom masing -masing memiliki paket sintaks untuk bahasa Janet.
Jika Anda hanya ingin mencoba bahasa, Anda tidak perlu menginstal apa pun. Dalam hal ini Anda juga dapat memindahkan janet yang dapat dieksekusi ke mana pun Anda inginkan di sistem Anda dan menjalankannya. Namun, untuk pengaturan yang lebih lengkap, silakan lihat pengantar untuk lebih jelasnya.
Rept diluncurkan ketika biner dipanggil tanpa argumen. Lewati bendera -h untuk menampilkan informasi penggunaan. Skrip individual dapat dijalankan dengan ./janet myscript.janet .
Jika Anda ingin menjelajah, Anda dapat mencetak daftar semua makro, fungsi, dan konstanta yang tersedia dengan memasukkan perintah (all-bindings) ke dalam 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
Jika diinstal, Anda juga dapat menjalankan man janet untuk mendapatkan informasi penggunaan.
Janet dapat tertanam dalam program host dengan sangat mudah. Bangunan normal akan membuat file build/janet.c , yang merupakan file C tunggal yang berisi semua sumber ke Janet. File ini, bersama dengan src/include/janet.h dan src/conf/janetconf.h , dapat diseret ke proyek C apa pun dan disusun ke dalamnya. Janet harus dikompilasi dengan -std=c99 pada sebagian besar kompiler, dan perlu dihubungkan ke perpustakaan matematika, -lm , dan tautan dinamis, -ldl , jika seseorang ingin dapat memuat modul dinamis. Jika tidak perlu untuk modul dinamis, tambahkan define -DJANET_NO_DYNAMIC_MODULES ke opsi kompiler.
Lihat bagian Embedding di Situs Web untuk informasi lebih lanjut.
Jangan ragu untuk mengajukan pertanyaan dan bergabung dengan diskusi pada instance Janet Zulip
Ini adalah kecepatan yang sama dengan sebagian besar bahasa yang ditafsirkan tanpa kompiler JIT. Loop yang ketat dan kritis mungkin harus ditulis dalam C atau C ++. Program cenderung sedikit lebih cepat daripada dalam bahasa seperti Python karena keputusasaan abstraksi yang berorientasi objek yang lambat dengan banyak pencarian meja hash, dan membuat ikatan akhir eksplisit. Semua nilai dikotak dalam representasi 8-byte secara default dan dialokasikan pada tumpukan, dengan pengecualian angka, nils dan boolean. Mesin PEG adalah interpreter khusus yang dapat secara efisien memproses string dan data buffer.
GC sederhana dan berhenti-dunia, tetapi kenop GC diekspos di perpustakaan inti dan utas terpisah memiliki tumpukan terisolasi dan pengumpul sampah. Data yang dibagi antara utas dihitung referensi.
Ymmv.
Mungkin ada, mungkin tidak. Jika Anda ingin mengusulkan fitur bahasa utama, silakan dan buka masalah, tetapi kemungkinan akan ditutup karena "tidak akan diimplementasikan". Seringkali, fitur -fitur seperti itu membuat satu usecase lebih sederhana dengan mengorbankan 5 orang lain dengan membuat bahasa lebih rumit.
Saat ini tidak ada spesifikasi selain dokumentasi di https://janet-lang.org.
Tidak. Tidak ada sel kontra di sini.
Tidak. Ini mirip dengan Clojure secara dangkal karena saya suka lisps dan saya suka estetika. Secara internal, Janet sama sekali tidak seperti Clojure, Skema, atau Common Lisp.
Tidak. Mereka adalah array abadi dan tabel hash. Jangan mencoba dan menggunakannya seperti vektor dan peta Clojure, sebaliknya mereka bekerja dengan baik sebagai kunci meja atau pengidentifikasi lainnya.
Sampai batas tertentu, ya. Namun, ini bukan metode abstraksi yang disarankan, dan kinerja mungkin menderita. Yang mengatakan, tabel dapat digunakan untuk membuat objek yang dapat berubah dengan pewarisan dan polimorfisme, di mana metode objek diimplementasikan dengan kata kunci.
( def Car @{ :honk ( fn [self msg] ( print " car " self " goes " msg)) })
( def my-car ( table/setproto @{} Car))
( :honk my-car " Beep! " )Biasanya, salah satu dari beberapa alasan:
Mungkin, jika bahasa itu memiliki antarmuka yang baik dengan C. tetapi programmer mungkin perlu melakukan beberapa pekerjaan tambahan untuk memetakan model memori internal Janet dengan bahasa yang terikat. Janet juga menggunakan setjmp / longjmp untuk pengembalian non-lokal secara internal. Pendekatan ini tidak disukai dengan banyak programmer sekarang dan tidak selalu bermain dengan baik dengan bahasa lain yang memiliki pengecualian atau penumpukan stack.
Pastikan terminal Anda mendukung kode pelarian ANSI. Sebagian besar terminal modern akan mendukung ini, tetapi beberapa terminal yang lebih tua, konsol Windows, atau terminal tertanam tidak akan. Jika terminal Anda tidak mendukung kode pelarian ANSI, jalankan replikan dengan bendera -n , yang menonaktifkan output warna. Anda juga dapat mencoba bendera -s jika masalah lebih lanjut terjadi.
Janet dinamai berdasarkan makhluk buatan yang hampir mahatahu dan ramah di tempat yang baik.