Janet هي لغة برمجة لبرمجة البرمجة النصية والأتمتة التعبيرية وتوسيع البرامج المكتوبة في C أو C ++ مع إمكانيات البرمجة النصية للمستخدم.
جانيت تصنع لغة نصية جيدة للنظام ، أو لغة للتضمين في برامج أخرى. إنه مثل لوا وجنو غيل في هذا الصدد. لديها وظائف مدمجة ولغة أساسية أكثر ثراءً من لوا ، ولكنها أصغر من GNU Guile أو Python. ومع ذلك ، من الأسهل بكثير التضمين والميناء من Python أو Guile.
هناك Repl لتجربة اللغة ، وكذلك القدرة على تشغيل ملفات البرنامج النصي. برنامج العميل هذا منفصل عن وقت التشغيل الأساسي ، بحيث يمكن تضمين جانيت في برامج أخرى. جرب جانيت في متصفحك على 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. في حين أن ريبو جيثب هو الريبو الرسمي ، يتم الحفاظ على مرآة المصدر بنشاط.
Makefile غير قابلة للحمل ويتطلب صنع GNU.
cd somewhere/my/projects/janet
make
make test
make repl
make install
make install-jpm-git تعرف على المزيد حول Make Make Advants عن طريق تشغيل make help .
تعتبر تعليمات بناء Haiku 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 إلى الدليل مع جانيت.build_win لتجميع جانيت.build_win test للتأكد من أن كل شيء يعمل. لإنشاء مثبت .msi قابل للتنفيذ ، بالإضافة إلى الخطوات المذكورة أعلاه ، سيكون عليك:
build_win dist . الآن يجب أن يكون لديك .msi . يمكنك تشغيل build_win install لتثبيت .msi ، أو تنفيذ الملف نفسه.
لدى Janet أيضًا ملف إنشاء لـ Meson ، وهو نظام إنشاء منصة. على الرغم من أن Meson يتمتع باعتماد Python ، إلا أن Meson هو نظام بناء كامل للغاية ربما يكون أكثر ملاءمة ومرونة للدمج في خطوط الأنابيب الموجودة. يوفر Meson أيضًا تكامل IDE أفضل بكثير من ملفات Make أو Batch ، بالإضافة إلى دعم التجميع.
بالنسبة للصبر ، فإن البناء مع ميسون هو كما يلي. الخيارات المقدمة 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 ، ربما يكون Builder Gnome هو الخيار الأفضل ، لأنه يحتوي على تكامل ممتاز في ميسون. كما يوفر إكمال الكود لـ Janet's C API مباشرة خارج المربع ، وهو أمر مفيد جدًا للاستكشاف. VSCODE و VIM و EMACs و ATOM لها حزم بناء الجملة للغة جانيت ، على الرغم من.
إذا كنت ترغب فقط في تجربة اللغة ، فلن تحتاج إلى تثبيت أي شيء. في هذه الحالة ، يمكنك أيضًا نقل janet قابلة للتنفيذ أينما تريد على نظامك وتشغيله. ومع ذلك ، لإعداد أكمل ، يرجى الاطلاع على المقدمة لمزيد من التفاصيل.
يتم إطلاق RELP عندما يتم استدعاء الثنائي بدون حجج. مرر العلم -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 واحد يحتوي على جميع المصدر لجانيت. يمكن سحب هذا الملف ، إلى جانب src/include/janet.h و src/conf/janetconf.h ، إلى أي مشروع C وتجميعه فيه. يجب تجميع جانيت باستخدام -std=c99 على معظم المجمعين ، وسيحتاج إلى ربط مكتبة الرياضيات ، -lm ، والرابط الديناميكي ، -ldl ، إذا أراد المرء أن يكون قادرًا على تحميل الوحدات الديناميكية. إذا لم تكن هناك حاجة إلى وحدات ديناميكية ، فأضف define -DJANET_NO_DYNAMIC_MODULES إلى خيارات المترجم.
راجع قسم التضمين على الموقع لمزيد من المعلومات.
لا تتردد في طرح الأسئلة والانضمام إلى المناقشة حول مثيل جانيت زوليب
إنها بنفس سرعة معظم اللغات المفسرة بدون برنامج التحويل البرمجي JIT. من المحتمل أن تتم كتابة الحلقات الضيقة والحرجة في C أو C ++. تميل البرامج إلى أن تكون أسرع قليلاً مما قد تكون في لغة مثل بيثون بسبب تثبيط التجريد البطيء الموجهة للكائنات مع الكثير من عمليات البحث عن طاولة التجزئة ، وجعل الربط الصريح المتأخر. يتم محاذاة جميع القيم في تمثيل 8 بايت افتراضيًا وتخصيصه على الكومة ، باستثناء الأرقام ، NILS و Looleans. محرك PEG هو مترجم متخصص يمكنه معالجة سلسلة السلسلة والبيانات المخزن المؤقت بكفاءة.
GC بسيطة ومتوقفة في العالم ، لكن مقابض GC تتعرض في المكتبة الأساسية ولديها مؤشرات ترابط منفصلة أكوام معزولة وجامعي القمامة. يتم حساب البيانات المشتركة بين المواضيع المرجعية.
ymmv.
قد يكون موجودا ، قد لا. إذا كنت ترغب في اقتراح ميزة لغة رئيسية ، فاستمر وفتح مشكلة ، ولكن من المحتمل أن يتم إغلاقها على أنها "لن تنفذ". في كثير من الأحيان ، تجعل هذه الميزات واحدة أكثر بساطة على حساب 5 آخرين من خلال جعل اللغة أكثر تعقيدًا.
لا يوجد حاليًا المواصفات إلى جانب الوثائق في https://janet-lang.org.
لا. لا توجد خلايا سلبيات هنا.
لا. إنه يشبه Clojure بشكل سطحي لأنني أحب Lasps وأنا أحب الجماليات. داخليا ، جانيت ليست على الإطلاق مثل clojure أو المخطط أو 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 ، فقم بتشغيل REPLA مع علامة -n ، والتي تعطل إخراج اللون. يمكنك أيضًا تجربة علامة -s إذا كانت هناك مشكلات أخرى.
تم تسمية جانيت على اسم كل كلي العلم والودي في مكان جيد.