Джанет - это язык программирования для системных сценариев, выразительной автоматизации и расширения программ, написанных в C или C ++ с возможностями пользовательских сценариев.
Джанет делает хороший язык сценариев системного сценария или язык, чтобы встроить другие программы. Это как Луа и Гну -Гил в этом отношении. Он имеет более встроенную функциональность и более богатый основной язык, чем LUA, но меньше, чем GNU Guile или Python. Тем не менее, встраивать и порт гораздо проще, чем Python или Phile.
Существует реплика для опробования языка, а также возможность запускать файлы сценариев. Эта клиентская программа отделена от основной среды выполнения, поэтому Джанет может быть встроена в другие программы. Попробуйте Джанет в своем браузере по адресу 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 для символов в библиотеке Core. Например,
(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 должны быть на вашем пути) и cd в каталог с Джанет.build_win , чтобы скомпилировать Джанет.build_win test , чтобы убедиться, что все работает. Чтобы создать исполняемый файл установщика .msi , в дополнение к вышеуказанным шагам, вам нужно будет:
build_win dist . Теперь у вас должен быть .msi . Вы можете запустить build_win install для установки .msi или выполнить сам файл.
Джанет также имеет файл сборки для Meson, кроссплатформенную систему сборки. Хотя Meson имеет зависимость от питона, Meson - это очень полная система сборки, которая, возможно, более удобна и гибкая для интеграции в существующие трубопроводы. Meson также обеспечивает гораздо лучшую интеграцию IDE, чем файлы Make или пакетов, а также поддержку межкомпиляции.
Для нетерпеливо строительство с мезоном выглядит следующим образом. Параметры, предоставленные для meson setup ниже, подражают 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Джанет может быть взломана практически с любой средой, которая вам нравится, но для любителей IDE, Gnome Builder, вероятно, является лучшим вариантом, так как она имеет отличную мезонную интеграцию. Он также предлагает завершение кода для API Джанет C прямо из коробки, что очень полезно для изучения. VSCODE, VIM, EMACS и ATOM имеют синтаксисные пакеты для языка Джанет.
Если вы просто хотите попробовать язык, вам не нужно ничего устанавливать. В этом случае вы также можете перенести исполняемый файл janet , где бы вы ни хотите в своей системе, и запустить его. Тем не менее, для более полной настройки, пожалуйста, см. Введение для получения более подробной информации.
Реплика запускается, когда двоичный файл вызывается без аргументов. Пропустите флаг -h , чтобы отобразить информацию об использовании. Отдельные сценарии можно запустить с ./janet myscript.janet .
Если вы хотите изучить, вы можете распечатать список всех доступных макросов, функций и константов, введя команду (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 , чтобы получить информацию об использовании.
Джанет может быть очень легко встроена в хост -программу. Нормальная сборка создаст build/janet.c , который представляет собой единый файл C, который содержит весь источник для Джанет. Этот файл, наряду с src/include/janet.h и src/conf/janetconf.h , может быть связан в любой проект C и составлена в него. Джанет должна быть составлена с -std=c99 на большинстве компиляторов, и должна быть связана с математической библиотекой, -lm и динамическим линкером, -ldl , если кто -то хочет иметь возможность загружать динамические модули. Если нет необходимости в динамических модулях, добавьте определение -DJANET_NO_DYNAMIC_MODULES в параметры компилятора.
См. Раздел «Встроенный» на веб -сайте для получения дополнительной информации.
Не стесняйтесь задавать вопросы и присоединиться к обсуждению экземпляра Джанет Зулип
Это примерно такая же скорость, что и большинство интерпретируемых языков без компилятора JIT. Тесные критические петли, вероятно, должны быть записаны в C или C ++. Программы, как правило, немного быстрее, чем они были бы на таком языке, как Python из-за разочарования медленной объектно-ориентированной абстракции с большим количеством хэшабных поисков, а также явным поздним связыванием. Все значения вставлены в 8-байтовом представлении по умолчанию и выделены на кучу, за исключением чисел, нильс и логических. Двигатель PEG - это специализированный интерпретатор, который может эффективно обрабатывать строки и буферные данные.
GC прост и останавливается в мире, но ручки GC обнажаются в библиотеке ядра, а отдельные потоки имеют изолированные кучи и коллекционеры мусора. Данные, которые передаются между потоками, подсчитываются.
YMMV.
Это может существовать, это не может. Если вы хотите предложить основную языковую функцию, продолжайте и откройте проблему, но она, вероятно, будет закрыта как «не будет реализовать». Часто такие функции облегчают использование за счет 5 других, что делает язык более сложным.
В настоящее время нет спецификации, кроме документации по адресу https://janet-lang.org.
Неа. Здесь нет клеток.
Нет. Это похоже на Clojure поверхностно, потому что мне нравятся Lisps, и мне нравятся эстетика. Внутренне Джанет совсем не похожа на 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., но программист может понадобиться выполнить дополнительную работу, чтобы отобразить модель внутренней памяти Джанет с моделью связанного языка. Джанет также использует setjmp / longjmp для нелокальных возвратов внутри. Этот подход сейчас не пользуется многими программистами и не всегда хорошо играет с другими языками, которые имеют исключения или невозможность.
Убедитесь, что ваш терминал поддерживает коды побега ANSI. Большинство современных терминалов будут поддерживать их, но некоторые старые терминалы, консоли Windows или встроенные терминалы не будут. Если ваш терминал не поддерживает коды побега ANSI, запустите реплику с флагом -n , который отключает выходные данные. Вы также можете попробовать флаг -s если возникают дальнейшие проблемы.
Джанет названа в честь почти всеведущего и дружелюбного искусственного существа в хорошем месте.