جديد الاصدار 0.5 بتفاصيل اكثر

#1
  • تمكين تنفيذ الشفرة المصدرية في المجال الرئيسي، أي خارج الدالات والوحدات.

لم يكن ممكنا في الإصدارات السابقة من الأسس تنفيذ اي امر الا عن طريق الكلمة المفتاحية run او نفذ والتي كانت تسبب الكثير من المشاكل حيث لا يمكن كتابة اي امر تنفيذي في الجذر

المثال التالي كان لا يمكن القيام به في اصدار اقدم من 0.5:
مثال 1

import "Srl/Console.alusus";

use Srl;
Console.print("Hello");

وكان يجب كتابة المثال بالطريقة التالية لينفذ:
مثال 2

import "Srl/Console.alusus";

def ExampleModule : module{
    use Srl;

    def start: function() {
        Console.print("Hello");
    };
};

run ExampleModule.start;

في الاصدار 0.5 اصبح بالامكان كتابتها بطريقة اخرى بالاضافة للطريقة الموجودة في مثال1 هي:
مثال 3

import "Srl/Console.alusus";

module ExampleModule {
    use Srl;

    func start() {
        Console.print("Hello");
    };
};

ExampleModule.start();

  • إضافة مدير للحزم لتمكين المستخدم من تنصيب الاعتماديات مباشرة من GitHub. مدير الحزم ما زال نسخة تجريبية وينقصه بعض المزايا المهمة التي ستأتي في إصدارات لاحقة.

في الاصدار 0.5 قمنا بإضافة مدير الحزم Apm ( بالعربي محا ) لسطر الاوامر والتنفيذ من داخل الأسس يقوم بتثبيت الحزم من GitHub الى مسار ~/.apm مع امكانية تثبيتها في مسار المشروع محليًا.

بعض اوامر Apm

$ apm
Use 'apm help' for help.

$ apm help
 Commands:- 
   apm help                                             list of commands
   apm install <author>/<package>@<release>             install package in `/home/xlmnxp/.apm`
   apm local install <author>/<package>@<release>       install package in `/home/xlmnxp/.apm`

او محا

$ محا 
استخدم 'محا مساعدة' للمساعدة.

$ محا مساعدة
 الاوامر:- 
   محا مساعدة                                           قائمة الاوامر
   استخدم: محا تثبيت <المالك>/<الوحدة>@<الاصدار>        تثبيت الوحدة في `/home/xlmnxp/.apm`
   استخدم: محا محلي تثبيت <المالك>/<الوحدة>@<الاصدار>   تثبيت الوحدة في `/home/xlmnxp/.apm`

من اهم مميزاته الان هي امكانية تثبيت الحزمة عند الاستدعاء مباشرة.
مثال4 ( تثبيت اخر اصدار من مكتبة AGtk ان لم تكن مثبيته مع استدعائها ):

import "Apm.alusus";
Apm.importFile("Alusus/AGtk");

او مثال5 ( تثبيت اصدار معين من مكتبة AGtk ان لم تكن مثبيته مع استدعائها ):

import "Apm.alusus";
Apm.importFile("Alusus/AGtk@0.0.3");

  • تمكين صيغة أقصر لتعريف الدالات والوحدات والماكروهات والأصناف. يمكنك الآن تعريف الدالات باستخدام الأمر دالة لوحده دون الحاجة لكتابة عرف . والأمر نفسه ينطبق على الوحدات والماكروهات وأصناف المستخدم.

كان قبل الاصدار 0.5 يتم تعريف الـدالة والـوحدة ( الـحزمة سابقًا ) و الـماكروة والـصنف بطريقة تعريف متغيير عادي مع اختلاف نوع المتغير واختلافات بسيطة في نحو التعريف.

مثال لطريقة تعريف دالة ووحدة في اصدار قبل 0.5
مثال6

import "Srl/Console.alusus";

def ExampleModule: module {
    use Srl;

    def start: function() {
        Console.print("Hello");
    };
};

run ExampleModule.start;

مثال لتعريفها بالطريقة الجديدة
مثال 7

import "Srl/Console.alusus";

module ExampleModule {
    use Srl;

    func start() {
        Console.print("Hello");
    };
};

ExampleModule.start();

مع العلم ان الآن مع الاصدار 0.5 بامكانك الاختيار بين كلمتان مفتاحيتان للداله هما:-

  • func
  • function

وايضًا الاصدار 0.5 مازال يبقي على دعم طريقة التعريف القديمة


  • إضافات متعددة على مكتبة التنفيذ المعيارية مثل التعامل مع التعبيرات النمطية والقراءة من الشبكة.

قمنا في الاصدار 0.5 بإضافة مكتبة جديدة للتعامل مع الشبكات تستخدم curl تحمل الاسم Net تابعة لمكتبات Srl
مثال 8 ( مثال لجلب ملف وقراءته ثم طباعة محتواه في الطرفية )

import "Srl/Net.alusus";
import "Srl/Console.alusus";

module Main {
  function start {
    def data: ptr;
    def size: Int;
    if Srl.Net.get("https://alusus.org/Downloads/test.txt", data~ptr, size~ptr) {
      Srl.Console.print("%s\n", data);
      Srl.Memory.free(data);
    } else {
      Srl.Console.print("Error!\n");
    };
  };
};

Main.start();

المثال السابق بالعربية
مثال 9

اشمل "مـتم/شـبكة.أسس"؛
اشمل "مـتم/طـرفية.أسس"؛
اشمل "مـتم/ذاكـرة.أسس"؛

وحدة رئـيسي {
  دالة ابدأ {
    عرف بيانات: مؤشر؛
    عرف حجم: صـحيح؛
    عرف الرابط: "https://alusus.org/Downloads/test.txt"؛
    إذا مـتم.شـبكة.هات(الرابط، بيانات~مؤشر، حجم~مؤشر) {
      مـتم.طـرفية.اطبع("%s\ج"، بيانات)؛
      مـتم.ذاكـرة.حرر(بيانات)؛
    } وإلا {
      مـتم.طـرفية.اطبع("فشل\ج")؛
    }؛
  }؛
}؛

رئـيسي.ابدأ()؛

بالإضافة لذلك قمنا بإضافة دالة بسيطة للتعامل مع التعبيرات النمطية ( regex )
مثال 10

import "Srl/Console.alusus";
import "Srl/String.alusus";

Srl.Console.print("regex number from string (\"phone: 050000000\") with pattern (\"([0-9]+)\"): %s\n",
                    Srl.String.regex("([0-9]+)", // pattern
                                    "phone: 050000000", // string
                                    1   // flags
                                    )~cnt.matches(1)~ptr // get first result
                );

المثال السابق بالعربية
مثال 9

اشمل "مـتم/طـرفية.أسس"؛
اشمل "مـتم/مـحارف.أسس"؛

مـتم.طـرفية.اطبع("نمط النص (\"هاتف: 050000000\") بالنمط (\"([0-9]+)\"): %s\ج"،
		مـتم.مـحارف.انمط("([0-9]+)"، // النمط
					"هاتف: 050000000"، // النص
					1 // الاعلام
					)~محتوى.متطابقات(1)~مؤشر // جلب اول نتيجة
			)؛
2 Likes