Janet은 시스템 스크립팅, 표현 자동화 및 사용자 스크립팅 기능을 사용하여 C 또는 C ++로 작성된 확장 프로그램을위한 프로그래밍 언어입니다.
Janet은 좋은 시스템 스크립팅 언어 또는 다른 프로그램에 포함시킬 언어를 만듭니다. 그 점에서 Lua와 Gnu Guile과 같습니다. LUA보다 더 많은 내장 기능과 더 풍부한 핵심 언어가 있지만 GNU Guile 또는 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 Repo는 공식 리포지어이지만 SourceHut 미러는 적극적으로 유지됩니다.
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 실행하십시오.build_win test 실행하여 모든 것이 작동하는지 확인하십시오. .msi 설치 프로그램 실행 가능을 구축하려면 위의 단계 외에도 다음을 수행해야합니다.
build_win dist 실행하십시오. 이제 .msi 가 있어야합니다. build_win install 실행하여 .msi 설치하거나 파일 자체를 실행할 수 있습니다.
Janet에는 크로스 플랫폼 빌드 시스템 인 Meson의 빌드 파일도 있습니다. Meson은 파이썬 의존성을 가지고 있지만 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 installJanet은 당신이 좋아하는 거의 모든 환경으로 해킹 될 수 있지만, IDE 애호가에게는 Gnome Builder가 아마도 우수한 Meson 통합을 가지고 있기 때문에 아마도 최선의 선택 일 것입니다. 또한 Janet의 C API에 대한 코드 완료를 제공하며, 이는 탐색에 매우 유용합니다. VSCODE, VIM, EMACS 및 ATOM은 각각 Janet 언어에 대한 구문 패키지를 가지고 있습니다.
언어를 시험해 보려면 아무것도 설치할 필요가 없습니다. 이 경우 시스템에서 원하는 곳에서 janet 실행 파일을 이동하여 실행할 수도 있습니다. 그러나 전체 설정을 보려면 자세한 내용은 소개를 참조하십시오.
인수없이 바이너리가 호출되면 대체가 시작됩니다. -h 플래그를 전달하여 사용 정보를 표시하십시오. ./janet myscript.janet 으로 개별 스크립트를 실행할 수 있습니다.
탐색하려는 경우 Repl에 명령 (all-bindings) 입력하여 사용 가능한 모든 매크로, 기능 및 상수의 목록을 인쇄 할 수 있습니다.
$ 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 로 컴파일해야하며 동적 모듈을로드하려면 Math Library, -lm 및 Dynamic Linker ( -ldl 에 연결해야합니다. 동적 모듈이 필요하지 않은 경우 정의 -DJANET_NO_DYNAMIC_MODULES 컴파일러 옵션에 추가하십시오.
자세한 내용은 웹 사이트의 임베딩 섹션을 참조하십시오.
Janet Zulip 인스턴스에 대한 질문을하고 토론에 참여하십시오.
JIT 컴파일러가없는 대부분의 해석 언어와 거의 같은 속도입니다. 단단하고 중요한 루프는 아마도 C 또는 C ++로 작성해야합니다. 프로그램은 많은 해시 테이블 조회로 느린 객체 지향적 추상화의 낙담과 늦은 바인딩을 명시 적으로 만들기 때문에 Python과 같은 언어보다 약간 빠른 경향이 있습니다. 모든 값은 기본적으로 8 바이트 표현으로 박스되어 있으며 숫자, 닐 및 부울을 제외하고 힙에 할당됩니다. PEG 엔진은 스트링 및 버퍼 데이터를 효율적으로 처리 할 수있는 특수 통역사입니다.
GC는 간단하고 세지가 있지만 GC 손잡이는 핵심 라이브러리에 노출되며 별도의 스레드에는 고립 된 힙과 쓰레기 수집기가 있습니다. 스레드간에 공유되는 데이터는 참조 계수입니다.
YMMV.
존재할 수도 있습니다. 주요 언어 기능을 제안하려면 계속해서 문제를 열지 만 "구현되지 않을 것"으로 폐쇄 될 수 있습니다. 종종 이러한 특징은 언어를 더 복잡하게 만들어 5 명을 희생하여 하나의 usecase를 더 간단하게 만듭니다.
https://janet-lang.org의 문서 외에는 현재 사양이 없습니다.
아니요. 여기에는 단점이 없습니다.
아니요. Lisps를 좋아하고 미학을 좋아하기 때문에 Clojure와 피상적으로 비슷합니다. 내부적으로 Janet은 Clojure, Scheme 또는 Common 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의 내부 메모리 모델을 바운드 언어의 내부 메모리 모델에 매핑하기 위해 추가 작업을 수행해야 할 수도 있습니다. Janet은 또한 내부적으로 비 로컬 리턴에 setjmp / longjmp 사용합니다. 이 접근법은 현재 많은 프로그래머에게 유리하지 않으며 예외 나 스택-불합등이있는 다른 언어와 항상 잘 작동하지는 않습니다.
터미널이 ANSI 탈출 코드를 지원하는지 확인하십시오. 대부분의 현대 터미널은 이들을 지원하지만 일부 오래된 터미널, 창문 콘솔 또는 내장 터미널은 그렇지 않습니다. 터미널이 ANSI 탈출 코드를 지원하지 않으면 -n 플래그로 대체를 실행하여 색상 출력을 비활성화하십시오. 추가 문제가 발생하면 -s 플래그를 시도 할 수도 있습니다.
Janet은 거의 전능하고 친근한 인공적인 존재의 이름을 따서 명명되었습니다.