يعمل هذا المستند كمرجع موحّد لمستندات واجهة برمجة التطبيقات الخاصة بلغة التعبير العادي (CEL). تعرض هذه الصفحة جميع وحدات الماكرو والمعاملات والدوال العادية، مع توضيح تواقيعها وسلوكياتها وحالة توفّرها في جميع حِزم CEL الرسمية.
لمزيد من التفاصيل حول سلوك اللغة ومواصفاتها، يُرجى الرجوع إلى تعريف لغة CEL.
إصدارات الحزمة
يستند هذا المستند المرجعي إلى الإصدارات التالية من حِزم CEL:
- CEL Go:
v0.30.0(والإصدارات الأحدث) - CEL C++:
v0.16.0 - CEL Java:
v0.13.1 - CEL Python:
v0.1.3 - CEL C: لقطة تطوير (لم يتم إصدارها)
مرايا GitHub
يتم عرض عمليات التنفيذ الرسمية للغة CEL على GitHub ضمن مؤسسة cel-expr:
1. وحدات الماكرو الأساسية
هذه وحدات ماكرو مضمّنة يتم توسيعها في وقت الترجمة البرمجية.
| وحدة الماكرو | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
has(container.field) |
تختبر هذه الدالة ما إذا كان حقل معيّن متوفّرًا في رسالة أو مفتاح في خريطة. التوقيعات: has(container.field) -> boolأمثلة: has(request.auth.claims.email) |
✓ | ✓ | ✓ | ✓ | ✓ |
list.all(var, predicate) |
تختبر هذه الدالة ما إذا كانت جميع العناصر في القائمة تستوفي شرطًا معيّنًا. التوقيعات: list.all(var, predicate) -> boolأمثلة: [1, 2, 3].all(x, x > 0) // true |
✓ | ✓ | ✓ | ✓ | ✓¹ |
list.exists(var, predicate) |
تختبر هذه الدالة ما إذا كان عنصر واحد على الأقل في القائمة يستوفي شرطًا. التوقيعات: list.exists(var, predicate) -> boolأمثلة: [1, 2, 3].exists(x, x > 2) // true |
✓ | ✓ | ✓ | ✓ | ✓¹ |
list.exists_one(var, predicate) |
تختبر هذه الدالة ما إذا كان عنصر واحد فقط في القائمة يستوفي شرطًا معيّنًا. التوقيعات: list.exists_one(var, predicate) -> boolأمثلة: [1, 2, 3].exists_one(x, x == 2) // true |
✓ | ✓ | ✓ | ✓ | ✓¹ |
list.filter(var, predicate) |
تفلتر هذه الدالة عناصر القائمة وفقًا لدالة منطقية. التوقيعات: list.filter(var, predicate) -> listأمثلة: [1, 2, 3].filter(x, x > 1) // [2, 3] |
✓ | ✓ | ✓ | ✓ | ✓¹ |
list.map(var, transform) |
تحوّل كل عنصر في القائمة باستخدام تعبير. التوقيعات: list.map(var, transform) -> listأمثلة: [1, 2, 3].map(x, x * 2) // [2, 4, 6] |
✓ | ✓ | ✓ | ✓ | ✓¹ |
list.map(var, filter, transform) |
تحويل عناصر القائمة التي تستوفي شرط الفلتر. التوقيعات: list.map(var, filter, transform) -> listأمثلة: [1, 2, 3].map(x, x > 1, x * 2) // [4, 6] |
✓ | ✓ | ✓ | ✓ | ✓¹ |
¹ يتم توفير الدعم في وقت تشغيل C لأنّه يتم توسيع وحدات الماكرو إلى عبارات أثناء التجميع بواسطة المجمّع المضيف.
2. عوامل التشغيل الأساسية
| عامل التشغيل | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
الحساب (+، -، *، /، %) |
العمليات الحسابية العادية النفي (-x) والهوية (+x). يمكن دمج القوائم (list + list) في Go وC++ وJava وPython.التواقيع: T + T -> TT - T -> TT * T -> TT / T -> TT % T -> T-T -> T+T -> Tlist + list -> listأمثلة: 1 + 2 * 3 // 7[1] + [2] // [1, 2] |
✓ | ✓ | ✓ | ✓ | ✓² |
المقارنة (==، !=، <، <=، >، >=) |
المقارنة العادية تكون المقارنات الرقمية غير متجانسة (مثل 1 == 1.0).التوقيعات: T == T -> boolT != T -> boolT < T -> boolT <= T -> boolT > T -> boolT >= T -> boolأمثلة: x < 42.01 == 1.0 // true |
✓ | ✓ | ✓ | ✓ | ✓ |
المنطقية (!، &&، ||، ? :) |
Logical NOT وAND وOR وTernary Conditional استخدِم التقييم المختصر. التواقيع: !bool -> boolbool && bool -> boolbool || bool -> boolbool ? T : T -> Tأمثلة: x > 0 ? "positive" : "non-positive" |
✓ | ✓ | ✓ | ✓ | ✓ |
الفهرسة ([]) |
الوصول إلى عنصر في قائمة حسب الفهرس أو مفتاح البحث في خريطة التوقيعات: list[int] -> Tmap[K] -> Vأمثلة: tags[0]users['john'] |
✓ | ✓ | ✓ | ✓ | ✓ |
الاشتراك (in) |
للتحقّق مما إذا كان العنصر في قائمة أو المفتاح في خريطة التوقيعات: T in list -> boolK in map -> boolأمثلة: 'admin' in roles |
✓ | ✓ | ✓ | ✓ | ✓ |
² لا تتوافق عملية ربط القوائم (list + list) مع وقت تشغيل C،
على الرغم من أنّ عوامل التشغيل الحسابية الأخرى متوافقة.
3- الوظائف الأساسية
الدوال العامة ودوال السلاسل
| الوظيفة | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
size |
تعرض هذه الدالة حجم سلسلة (أحرف) أو وحدات بايت أو قائمة أو خريطة. التوقيعات: size(T) -> int (حيث T هي string أو bytes أو list أو map)أمثلة: size("hello") // 5 |
✓ | ✓ | ✓ | ✓ | ✓ |
contains |
تعرض هذه الدالة ما إذا كانت السلسلة النصية تتضمّن سلسلة فرعية. التوقيعات: string.contains(string) -> boolأمثلة: "hello".contains("ell") // true |
✓ | ✓ | ✓ | ✓ | ✓ |
startsWith |
تعرِض ما إذا كانت السلسلة تبدأ بالبادئة. التواقيع: string.startsWith(string) -> boolأمثلة: "hello".startsWith("he") // true |
✓ | ✓ | ✓ | ✓ | ✓ |
endsWith |
تعرِض هذه الدالة ما إذا كانت السلسلة تنتهي باللاحقة. التوقيعات: string.endsWith(string) -> boolأمثلة: "hello".endsWith("lo") // true |
✓ | ✓ | ✓ | ✓ | ✓ |
matches |
تعرض هذه الدالة ما إذا كانت السلسلة تطابق التعبير العادي RE2. التوقيعات: string.matches(string) -> boolأمثلة: "123".matches(r"^\d+$") // true |
✓ | ✓ | ✓ | ✓ | ✓ |
وظائف أداة اختيار التاريخ والوقت
تستخرج هذه الدوال مكوّنات من google.protobuf.Timestamp أو google.protobuf.Duration.
| الوظيفة | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
getFullYear |
تعرض هذه الدالة السنة المكوّنة من 4 أرقام. التوقيعات: timestamp.getFullYear([tz]) -> intأمثلة: timestamp("2026-07-23T00:00:00Z").getFullYear() // 2026 |
✓ | ✓ | ✓ | ✓ | ✗ |
getMonth |
تعرض هذه الدالة الشهر (من 0 إلى 11). التوقيعات: timestamp.getMonth([tz]) -> intأمثلة: timestamp("2026-07-23T00:00:00Z").getMonth() // 6 |
✓ | ✓ | ✓ | ✓ | ✗ |
getDayOfMonth |
تعرض هذه الدالة اليوم من الشهر (من 1 إلى 31). التوقيعات: timestamp.getDayOfMonth([tz]) -> intأمثلة: timestamp("2026-07-23T00:00:00Z").getDayOfMonth() // 23 |
✓ | ✓ | ✓ | ✓ | ✗ |
getDayOfWeek |
تعرض هذه الدالة اليوم من الأسبوع (0 = الأحد). التوقيعات: timestamp.getDayOfWeek([tz]) -> intأمثلة: timestamp("2026-07-23T00:00:00Z").getDayOfWeek() // 4 |
✓ | ✓ | ✓ | ✓ | ✗ |
getDayOfYear |
تعرض هذه الدالة اليوم من السنة (من 0 إلى 365). التوقيعات: timestamp.getDayOfYear([tz]) -> intأمثلة: timestamp("2026-07-23T00:00:00Z").getDayOfYear() // 203 |
✓ | ✓ | ✓ | ✓ | ✗ |
getHours |
تعرض هذه الدالة الساعات (من 0 إلى 23). التوقيعات: timestamp.getHours([tz]) -> intduration.getHours() -> intأمثلة: duration("1h30m").getHours() // 1 |
✓ | ✓ | ✓ | ✓ | ✗ |
getMinutes |
تعرِض هذه الدالة الدقائق (من 0 إلى 59). التوقيعات: timestamp.getMinutes([tz]) -> intduration.getMinutes() -> intأمثلة: duration("1h30m").getMinutes() // 30 |
✓ | ✓ | ✓ | ✓ | ✗ |
getSeconds |
تعرِض هذه الدالة الثواني (من 0 إلى 59). التوقيعات: timestamp.getSeconds([tz]) -> intduration.getSeconds() -> intأمثلة: duration("1h30m45s").getSeconds() // 45 |
✓ | ✓ | ✓ | ✓ | ✗ |
getMilliseconds |
تعرض هذه الدالة الملّي ثانية (من 0 إلى 999). التوقيعات: timestamp.getMilliseconds([tz]) -> intduration.getMilliseconds() -> intأمثلة: duration("1.5s").getMilliseconds() // 500 |
✓ | ✓ | ✓ | ✓ | ✗ |
تحويل الأنواع
| نوع الاستهداف | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
bool |
تحويل إلى قيمة منطقية التوقيعات: bool(bool) -> boolbool(string) -> boolأمثلة: bool("true") // true |
✓ | ✓ | ✓ | ✓ | ✓ |
bytes |
تحويل إلى وحدات بايت التوقيعات: bytes(bytes) -> bytesbytes(string) -> bytesأمثلة: bytes("hello") // b"hello" |
✓ | ✓ | ✓ | ✓ | ✓ |
double |
تحويل إلى عدد فاصل عائم للدقة المزدوجة التواقيع: double(double) -> doubledouble(int) -> doubledouble(uint) -> doubledouble(string) -> doubleأمثلة: double(1) // 1.0 |
✓ | ✓ | ✓ | ✓ | ✓ |
duration |
تحويل إلى مدة التوقيعات: duration(duration) -> durationduration(string) -> durationأمثلة: duration("1.5s") // 1.5s duration |
✓ | ✓ | ✓ | ✓ | ✓ |
int |
تحويل إلى عدد صحيح بعلامة 64 بت التوقيعات: int(int) -> intint(uint) -> intint(double) -> int (يتم التقريب إلى صفر)int(string) -> intint(timestamp) -> int (الثواني منذ بداية الحقبة)أمثلة: int(1.5) // 1 |
✓ | ✓ | ✓ | ✓ | ✓ |
string |
تحويل إلى سلسلة التواقيع: string(T) -> string (متوافق مع bool وint وuint وdouble وbytes وtimestamp وduration)أمثلة: string(1.5) // "1.5" |
✓ | ✓ | ✓ | ✓ | ✓ |
timestamp |
تحويل إلى طابع زمني التوقيعات: timestamp(timestamp) -> timestamptimestamp(string) -> timestamp (RFC3339)أمثلة: timestamp("2026-07-23T00:00:00Z") |
✓ | ✓ | ✓ | ✓ | ✓ |
uint |
تحويل إلى عدد صحيح غير موقّع 64 بت التواقيع: uint(uint) -> uintuint(int) -> uintuint(double) -> uintuint(string) -> uintأمثلة: uint(1) // 1u |
✓ | ✓ | ✓ | ✓ | ✓ |
dyn |
تحويل القيمة إلى نوع ديناميكي للتحقّق من النوع التوقيعات: dyn(T) -> dynأمثلة: dyn([1, "two"]) |
✓ | ✓ | ✓ | ✓ | ✗ |
type |
تعرض هذه الدالة نوع القيمة. التوقيعات: type(T) -> typeأمثلة: type(1) // int |
✓ | ✓ | ✓ | ✓ | ✗ |
4. الإضافات (المكتبات)
مكتبة الروابط
| الوظيفة | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
cel.bind |
يربط هذا الإجراء متغيّرًا محليًا لتجنُّب التقييم المكرّر. التوقيعات: cel.bind(varName, initExpr, resultExpr) -> Tأمثلة: cel.bind(x, a + b, x * x) |
✓ (الإصدار 0.15.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
كيفية التفعيل
- القيمة: مرِّر القيمة
ext.Bindings()إلىcel.NewEnv(). - C++: أضِف
BindingsCompilerLibrary()إلىCompilerBuilder. (تتم معالجة وقت التشغيل تلقائيًا). - Java: أضِف
CelExtensions.bindings()إلىCelCompilerوCelRuntime. - Python: استورِد
cel_expr_python.ext.ext_bindingsواستخدِمExtBindings()فيcel.NewEnv(extensions=[...]).
مكتبة برامج الترميز
| الوظيفة | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
base64.encode |
ترميز وحدات البايت إلى سلسلة base64 التوقيعات: base64.encode(bytes) -> stringأمثلة: base64.encode(b"hello") // "aGVsbG8=" |
✓ (الإصدار 0.6.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
base64.decode |
يفكّ ترميز سلسلة base64 إلى وحدات بايت. يُظهر هذا الإجراء خطأً عند إدخال بيانات غير صالحة. التوقيعات: base64.decode(string) -> bytesأمثلة: base64.decode("aGVsbG8=") // b"hello" |
✓ (الإصدار 0.6.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
json.encode |
تحوّل قيمة CEL إلى سلسلة JSON. التوقيعات: json.encode(dyn) -> stringأمثلة: json.encode([1, 2]) // "[1,2]" |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
كيفية التفعيل
- القيمة: مرِّر القيمة
ext.Encoders()إلىcel.NewEnv(). - C++:
- المجمّع: أضِف
EncodersCompilerLibrary()إلىCompilerBuilder. - وقت التشغيل: الاتصال بالرقم
RegisterEncodersFunctions()علىFunctionRegistry
- المجمّع: أضِف
- Java: أضِف
CelExtensions.encoders()إلى أدوات إنشاءCelCompilerوCelRuntime. - Python: استورِد
cel_expr_python.ext.ext_encodersواستخدِمExtEncoders()فيcel.NewEnv(extensions=[...]).
مكتبة الرياضيات
| الوظيفة | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
math.greatest |
تعرض هذه الدالة أكبر وسيط رقمي (أو قائمة بالأرقام). التوقيعات: math.greatest(arg, ...) -> Tالأمثلة: math.greatest(1, 3, 2) // 3 |
✓ (الإصدار 0.13.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
math.least |
تعرض هذه الدالة أصغر الوسيطات الرقمية (أو قائمة الأرقام). التوقيعات: math.least(arg, ...) -> Tأمثلة: math.least([1, 3, 2]) // 1 |
✓ (الإصدار 0.13.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
math.abs |
القيمة المطلقة التوقيعات: math.abs(T) -> T (متوافق مع int وuint وdouble)أمثلة: math.abs(-1) // 1 |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
math.sqrt |
الجذر التربيعي التواقيع: math.sqrt(T) -> double (يتوافق مع int وuint وdouble)أمثلة: math.sqrt(9) // 3.0 |
✓ (الإصدار 0.25.1) | ✓ (الإصدار 0.12.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.1.1) | ✗ |
math.bitAnd |
استخدام AND على مستوى البت. التواقيع: math.bitAnd(T, T) -> T (متوافق مع int وuint)أمثلة: math.bitAnd(5, 3) // 1 |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
math.bitOr |
استخدام OR على مستوى البت. التواقيع: math.bitOr(T, T) -> T (متوافق مع int وuint)أمثلة: math.bitOr(5, 3) // 7 |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
math.bitXor |
عملية XOR على مستوى البتات التوقيعات: math.bitXor(T, T) -> T (متوافق مع int وuint)أمثلة: math.bitXor(5, 3) // 6 |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
math.bitNot |
استخدام NOT على مستوى البت. التواقيع: math.bitNot(T) -> T (متوافق مع int وuint)أمثلة: math.bitNot(1) // -2 |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
math.bitShiftLeft |
إزاحة بتية إلى اليسار التواقيع: math.bitShiftLeft(T, int) -> T (متوافق مع int وuint)أمثلة: math.bitShiftLeft(1, 2) // 4 |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
math.bitShiftRight |
إزاحة بتية إلى اليمين التواقيع: math.bitShiftRight(T, int) -> T (متوافق مع int وuint)أمثلة: math.bitShiftRight(4, 2) // 1 |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
math.ceil |
تقريب السقف التواقيع: math.ceil(double) -> doubleأمثلة: math.ceil(1.2) // 2.0 |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
math.floor |
التقريب إلى أقرب عدد صحيح أصغر التوقيعات: math.floor(double) -> doubleأمثلة: math.floor(1.8) // 1.0 |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
math.round |
التقريب إلى أقرب عدد صحيح التوقيعات: math.round(double) -> doubleأمثلة: math.round(1.5) // 2.0 |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
math.trunc |
التقريب إلى أقرب عدد صحيح (باتجاه الصفر). التوقيعات: math.trunc(double) -> doubleأمثلة: math.trunc(-1.8) // -1.0 |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
math.isInf |
للتحقّق ممّا إذا كانت القيمة المضاعفة موجبة أو سالبة. التوقيعات: math.isInf(double) -> boolأمثلة: math.isInf(1.0/0.0) // true |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
math.isNaN |
تتحقّق هذه الدالة ممّا إذا كانت القيمة المزدوجة NaN. التوقيعات: math.isNaN(double) -> boolأمثلة: math.isNaN(0.0/0.0) // true |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
math.isFinite |
تتحقّق هذه الدالة مما إذا كان الرقم المزدوج محدودًا. التوقيعات: math.isFinite(double) -> boolأمثلة: math.isFinite(1.2) // true |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
math.sign |
تعرض هذه الدالة إشارة القيمة (-1 أو 0 أو 1). التوقيعات: math.sign(T) -> T (متوافقة مع int وuint وdouble)أمثلة: math.sign(-42) // -1 |
✓ (الإصدار 0.21.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
كيفية التفعيل
- القيمة: مرِّر القيمة
ext.Math()إلىcel.NewEnv(). - C++:
- المجمّع: أضِف
MathCompilerLibrary()إلىCompilerBuilder. - وقت التشغيل: الاتصال بالرقم
RegisterMathExtensionFunctions()علىFunctionRegistry
- المجمّع: أضِف
- Java: أضِف
CelExtensions.math()إلى أدوات إنشاءCelCompilerوCelRuntime. - Python: استورِد
cel_expr_python.ext.ext_mathواستخدِمExtMath()فيcel.NewEnv(extensions=[...]).
Protos Library
| الوظيفة | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
proto.getExt |
يحصل على حقل إضافة proto2 أو القيمة التلقائية إذا لم يتم ضبطه. التواقيع: proto.getExt(msg, extName) -> Tأمثلة: proto.getExt(msg, google.api.expr.test.int32_ext) |
✓ (الإصدار 0.13.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
proto.hasExt |
تتحقّق هذه الدالة مما إذا تم ضبط حقل إضافة proto2. التوقيعات: proto.hasExt(msg, extName) -> boolأمثلة: proto.hasExt(msg, google.api.expr.test.int32_ext) |
✓ (الإصدار 0.13.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
كيفية التفعيل
- القيمة: مرِّر القيمة
ext.Protos()إلىcel.NewEnv(). - C++: أضِف
ProtoExtCompilerLibrary()إلىCompilerBuilder. (تتم معالجة وقت التشغيل تلقائيًا). - Java: أضِف
CelExtensions.protos()إلى أدوات الإنشاءCelCompilerوCelRuntime. - Python: استورِد
cel_expr_python.ext.ext_protoواستخدِمExtProto()فيcel.NewEnv(extensions=[...]).
مكتبة القوائم
| الوظيفة | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
distinct |
تعرض هذه الدالة عناصر مميزة. التوقيعات: list.distinct() -> listأمثلة: [1, 2, 2].distinct() // [1, 2] |
✓ (الإصدار 0.22.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.1.1) | ✗ |
flatten |
تعمل هذه الدالة على تسوية القوائم المتداخلة. التوقيعات: list.flatten([depth]) -> listأمثلة: [[1], [2, 3]].flatten() // [1, 2, 3] |
✓ (الإصدار 0.22.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.7.1) | ✓ (الإصدار 0.1.1) | ✗ |
lists.range |
تعرض هذه الدالة قائمة بالأعداد الصحيحة [0, ..., n-1].التوقيعات: lists.range(int) -> list(int)أمثلة: lists.range(3) // [0, 1, 2] |
✓ (الإصدار 0.22.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
reverse |
تعكس ترتيب القائمة. التوقيعات: list.reverse() -> listأمثلة: [1, 2].reverse() // [2, 1] |
✓ (الإصدار 0.22.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.1.1) | ✗ |
slice |
تعرض هذه السمة قائمة فرعية من المرتجعات (تتضمّن بداية النطاق ولا تتضمّن نهايته). التوقيعات: list.slice(start, end) -> listأمثلة: [1, 2, 3].slice(1, 3) // [2, 3] |
✓ (الإصدار 0.17.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.1.1) | ✗ |
sort |
ترتّب هذه السمة قائمة العناصر القابلة للمقارنة. التوقيعات: list.sort() -> listأمثلة: [3, 1, 2].sort() // [1, 2, 3] |
✓ (الإصدار 0.22.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.1.1) | ✗ |
sortBy |
ترتّب القائمة حسب المفتاح الذي تم تقييمه من التعبير. التوقيعات: list.sortBy(var, expr) -> listأمثلة: [{"val": 2}, {"val": 1}].sortBy(x, x.val) // [{"val": 1}, {"val": 2}] |
✓ (الإصدار 0.22.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.1.1) | ✗ |
first |
تعرض هذه السمة العنصر الأول كعنصر اختياري. يتطلّب هذا الخيار إضافة Optional. التواقيع: list.first() -> optionalأمثلة: [1, 2].first() // optional(1) |
✓ (الإصدار 0.23.0) | ✓ (الإصدار 0.15.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.1.2) | ✗ |
last |
تعرض هذه السمة العنصر الأخير كعنصر اختياري. يتطلّب هذا الخيار إضافة Optional. التواقيع: list.last() -> optionalأمثلة: [1, 2].last() // optional(2) |
✓ (الإصدار 0.23.0) | ✓ (الإصدار 0.15.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.1.2) | ✗ |
كيفية التفعيل
- القيمة: مرِّر القيمة
ext.Lists()إلىcel.NewEnv(). - C++:
- المجمّع: أضِف
ListsCompilerLibrary()إلىCompilerBuilder. - وقت التشغيل: الاتصال بالرقم
RegisterListsFunctions()فيFunctionRegistryوالاتصال بالرقمRegisterListsMacros()فيMacroRegistry
- المجمّع: أضِف
- Java: أضِف
CelExtensions.lists()إلى أدوات الإنشاءCelCompilerوCelRuntime. - Python: فعِّل هذه الميزة من خلال
cel.EnvConfigعن طريق إضافةlistsإلى قائمةextensions.
مكتبة المجموعات
| الوظيفة | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
sets.contains |
تتحقّق هذه الدالة ممّا إذا كانت list1 تتضمّن جميع عناصر list2. التوقيعات: sets.contains(list1, list2) -> boolأمثلة: sets.contains([1, 2], [1]) // true |
✓ (الإصدار 0.15.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.6.0) | ✓ (الإصدار 0.1.1) | ✗ |
sets.equivalent |
تتحقّق هذه الدالة مما إذا كانت القوائم متطابقة (تحتوي على العناصر الفريدة نفسها). التوقيعات: sets.equivalent(list1, list2) -> boolأمثلة: sets.equivalent([1, 2], [2, 1, 1]) // true |
✓ (الإصدار 0.15.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.6.0) | ✓ (الإصدار 0.1.1) | ✗ |
sets.intersects |
تتحقّق هذه الدالة مما إذا كانت القوائم تتضمّن عنصرًا واحدًا على الأقل. التوقيعات: sets.intersects(list1, list2) -> boolأمثلة: sets.intersects([1, 2], [2, 3]) // true |
✓ (الإصدار 0.15.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.6.0) | ✓ (الإصدار 0.1.1) | ✗ |
كيفية التفعيل
- القيمة: مرِّر القيمة
ext.Sets()إلىcel.NewEnv(). - C++:
- المجمّع: أضِف
SetsCompilerLibrary()إلىCompilerBuilder. - وقت التشغيل: الاتصال بالرقم
RegisterSetsFunctions()علىFunctionRegistry
- المجمّع: أضِف
- Java: أضِف
CelExtensions.sets()إلى أدوات الإنشاءCelCompilerوCelRuntime. - Python: فعِّل هذه الميزة من خلال
cel.EnvConfigعن طريق إضافةsetsإلى قائمةextensions.
مكتبة السلاسل
| الوظيفة | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
charAt |
تعرض هذه الدالة الحرف في الفهرس. التوقيعات: string.charAt(int) -> stringأمثلة: "hello".charAt(1) // "e" |
✓ (الإصدار 0.4.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
indexOf |
تعرض هذه الدالة فهرس أول تكرار للسلسلة الفرعية، أو القيمة -1. التوقيعات: string.indexOf(substr, [start]) -> intأمثلة: "hello".indexOf("l") // 2 |
✓ (الإصدار 0.4.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
lastIndexOf |
تعرض هذه الدالة فهرس آخر تكرار للسلسلة الفرعية، أو القيمة -1. التواقيع: string.lastIndexOf(substr, [end]) -> intأمثلة: "hello".lastIndexOf("l") // 3 |
✓ (الإصدار 0.4.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
join |
تدمج السلاسل. التوقيعات: list(string).join([separator]) -> stringأمثلة: ["a", "b"].join("-") // "a-b" |
✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
split |
تقسيم السلسلة حسب الفاصل التوقيعات: string.split(separator, [limit]) -> list(string)أمثلة: "a-b".split("-") // ["a", "b"] |
✓ (الإصدار 0.4.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
substring |
تعرض هذه الدالة السلسلة الفرعية (بداية شاملة ونهاية غير شاملة). التوقيعات: string.substring(start, [end]) -> stringأمثلة: "hello".substring(1, 3) // "el" |
✓ (الإصدار 0.4.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
trim |
تزيل هذه الدالة المسافات البيضاء في Unicode. التوقيعات: string.trim() -> stringأمثلة: " hello ".trim() // "hello" |
✓ (الإصدار 0.4.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
replace |
يستبدل هذا الإجراء القيم القديمة بالقيم الجديدة. التوقيعات: string.replace(old, new, [limit]) -> stringأمثلة: "hello".replace("l", "w") // "hewwo" |
✓ (الإصدار 0.4.0) | ✓ (الإصدار 0.10.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
reverse |
تعكس نقاط رموز Unicode. التوقيعات: string.reverse() -> stringأمثلة: "abc".reverse() // "cba" |
✓ (الإصدار 0.18.0) | ✓ (الإصدار 0.14.0) | ✓ (الإصدار 0.13.0) | ✓ (الإصدار 0.1.1) | ✗ |
lowerAscii |
تحويل أحرف ASCII إلى أحرف صغيرة التوقيعات: string.lowerAscii() -> stringأمثلة: "Hello".lowerAscii() // "hello" |
✓ (الإصدار 0.6.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
upperAscii |
تحويل أحرف ASCII إلى أحرف كبيرة التواقيع: string.upperAscii() -> stringأمثلة: "Hello".upperAscii() // "HELLO" |
✓ (الإصدار 0.6.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.2.0) | ✓ (الإصدار 0.1.1) | ✗ |
quote |
تُستخدَم هذه الدالة لتجنُّب أي مشاكل عند طباعة السلسلة. التوقيعات: strings.quote(string) -> stringأمثلة: strings.quote("a\tb") // "\"a\\tb\"" |
✓ (الإصدار 0.14.0) | ✓ (الإصدار 0.14.0) | ✓ (الإصدار 0.13.0) | ✓ (الإصدار 0.1.1) | ✗ |
format |
تنسّق السلسلة باستخدام عناصر نائبة بتنسيق printf. التوقيعات: string.format(list) -> stringأمثلة: "str: %s, int: %d".format(["a", 1]) // "str: a, int: 1" |
✓ (الإصدار 0.14.0) | ✓ (الإصدار 0.11.0) | ✗ | ✓ (الإصدار 0.1.1) | ✗ |
كيفية التفعيل
- القيمة: مرِّر القيمة
ext.Strings()إلىcel.NewEnv(). - C++:
- المجمّع: أضِف
StringsCompilerLibrary()إلىCompilerBuilder. - وقت التشغيل: الاتصال بالرقم
RegisterStringsFunctions()علىFunctionRegistry
- المجمّع: أضِف
- Java: أضِف
CelExtensions.strings()إلى أدوات إنشاءCelCompilerوCelRuntime. - Python: استورِد
cel_expr_python.ext.ext_stringsواستخدِمExtStrings()فيcel.NewEnv(extensions=[...]).
مكتبة التعبيرات العادية
| الوظيفة | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
regex.replace |
يستبدل التطابقات بسلسلة الاستبدال (يتيح المراجع الخلفية). التوقيعات: regex.replace(target, pat, repl, [limit]) -> stringأمثلة: regex.replace("123-456", r"(\d+)-(\d+)", r"\2-\1") // "456-123" |
✓ (الإصدار 0.25.1) | ✓ (الإصدار 0.13.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
regex.extract |
عرض أول تطابق للنمط (يجب أن يتضمّن مجموعة التقاط واحدة) التوقيعات: regex.extract(target, pat) -> optional(string)أمثلة: regex.extract("a123b", r"(\d+)") // optional("123") |
✓ (الإصدار 0.25.1) | ✓ (الإصدار 0.13.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
regex.extractAll |
تعرِض هذه الدالة جميع المطابقات للنمط (يجب أن تتضمّن مجموعة التقاط واحدة). التوقيعات: regex.extractAll(target, pat) -> list(string)أمثلة: regex.extractAll("a1b2", r"(\d+)") // ["1", "2"] |
✓ (الإصدار 0.25.1) | ✓ (الإصدار 0.13.0) | ✓ (الإصدار 0.10.1) | ✓ (الإصدار 0.1.1) | ✗ |
كيفية التفعيل
- القيمة: مرِّر القيمة
ext.Regex()إلىcel.NewEnv(). - C++:
- المجمّع: أضِف
RegexExtCompilerLibrary()إلىCompilerBuilder. - وقت التشغيل: الاتصال بالرقم
RegisterRegexExtensionFunctions()علىFunctionRegistry
- المجمّع: أضِف
- Java: أضِف
CelExtensions.regex()إلى أدوات إنشاءCelCompilerوCelRuntime. - Python: فعِّل هذه الميزة من خلال
cel.EnvConfigعن طريق إضافةregexوoptionalإلى قائمةextensions.
Two-Variable Comprehensions
| وحدة الماكرو | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
all |
اختصار عملية الربط المنطقي AND على المفتاح/الفهرس والقيمة التوقيعات: list.all(i, v, pred) -> boolmap.all(k, v, pred) -> boolأمثلة: [1, 2].all(i, v, v > 0) // true |
✓ (الإصدار 0.22.0) | ✓ (الإصدار 0.14.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.1.1) | ✗ |
exists |
اختصار منطق "أو" على المفتاح/الفهرس والقيمة التوقيعات: list.exists(i, v, pred) -> boolmap.exists(k, v, pred) -> boolأمثلة: [1, 2].exists(i, v, v == 2) // true |
✓ (الإصدار 0.22.0) | ✓ (الإصدار 0.14.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.1.1) | ✗ |
existsOne |
للتحقّق ممّا إذا كان هناك زوج واحد فقط يستوفي المسند. التوقيعات: list.existsOne(i, v, pred) -> boolmap.existsOne(k, v, pred) -> boolأمثلة: [1, 2].existsOne(i, v, v == 2) // true |
✓ (الإصدار 0.22.0) | ✓ (الإصدار 0.14.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.1.1) | ✗ |
transformList |
تحويل/فلترة القائمة/الخريطة إلى قائمة التواقيع: list.transformList(i, v, [filter], transform) -> listmap.transformList(k, v, [filter], transform) -> listأمثلة: [1, 2].transformList(i, v, v * 2) // [2, 4] |
✓ (الإصدار 0.22.0) | ✓ (الإصدار 0.14.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.1.1) | ✗ |
transformMap |
تحويل قيم القائمة أو الخريطة إلى خريطة (تبقى المفاتيح ثابتة). التوقيعات: list.transformMap(i, v, [filter], transform) -> mapmap.transformMap(k, v, [filter], transform) -> mapأمثلة: [1, 2].transformMap(i, v, v * 2) // {0: 2, 1: 4} |
✓ (الإصدار 0.22.0) | ✓ (الإصدار 0.14.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.1.1) | ✗ |
transformMapEntry |
يتحوّل إلى خريطة. التوقيعات: list.transformMapEntry(i, v, [filter], transform_entry) -> mapmap.transformMapEntry(k, v, [filter], transform_entry) -> mapأمثلة: [1, 2].transformMapEntry(i, v, {string(v): v * 2}) // {"1": 2, "2": 4} |
✓ (الإصدار 0.22.0) | ✓ (الإصدار 0.14.0) | ✓ (الإصدار 0.11.0) | ✓ (الإصدار 0.1.1) | ✗ |
كيفية التفعيل
- القيمة: مرِّر القيمة
ext.TwoVarComprehensions()إلىcel.NewEnv(). - C++:
- المجمّع: أضِف
ComprehensionsV2CompilerLibrary()إلىCompilerBuilder. - وقت التشغيل: الاتصال بالرقم
RegisterComprehensionsV2Functions()علىFunctionRegistryوالاتصال بالرقمRegisterComprehensionsV2Macros()علىMacroRegistry
- المجمّع: أضِف
- Java: أضِف
CelExtensions.comprehensions()إلى أدوات إنشاءCelCompilerوCelRuntime. - Python: فعِّلها من خلال
cel.EnvConfigبإضافةtwo-var-comprehensionsإلى قائمةextensions.
مكتبة الأنواع الأصلية
| الميزة | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
| Native Structs | تسجيل أنواع أصلية للمضيف وإنشاؤها (بنى Go / كائنات Java POJO) في CEL أمثلة: Account{id: 123} (كائن Java POJO تم إنشاؤه في CEL) |
✓ (الإصدار 0.13.0) | ✗ | ✓ (الإصدار 0.13.0) | ✗ | ✗ |
كيفية التفعيل
- القيمة: تمرير
ext.NativeTypes(...)(توفير أنواع الانعكاس) إلىcel.NewEnv(). - C++: غير متوافق.
- Java: أضِف
CelExtensions.nativeTypes()(الذي يوفّر فئات Java) إلى أدوات الإنشاءCelCompilerوCelRuntime. - Python: غير متاح.
مكتبة الشبكة
توفّر مكتبة الشبكة دوالاً لتحليل عناوين IP وكتل CIDR والتحقّق من صحتها ومعالجتها.
| الوظيفة | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
ip |
تحلّل هذه الدالة سلسلة إلى عنوان IP، أو تستخرج عنوان IP من CIDR. التوقيعات: ip(string) -> IPCIDR.ip() -> IPأمثلة: ip("192.168.0.1")cidr("192.168.0.0/24").ip() |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
isIP |
للتحقّق مما إذا كانت السلسلة تمثّل عنوان IP صالحًا. التوقيعات: isIP(string) -> boolأمثلة: isIP("192.168.0.1") // true |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
ip.isCanonical |
للتحقّق مما إذا كانت سلسلة عنوان IP بالتنسيق الأساسي. التوقيعات: ip.isCanonical(string) -> boolأمثلة: ip.isCanonical("192.168.0.1") // true |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
cidr |
تحلّل هذه الدالة سلسلة إلى كتلة CIDR. التوقيعات: cidr(string) -> CIDRأمثلة: cidr("192.168.0.0/24") |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
isCIDR |
للتحقّق مما إذا كانت السلسلة عبارة عن مجموعة CIDR صالحة. التوقيعات: isCIDR(string) -> boolأمثلة: isCIDR("192.168.0.0/24") // true |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
containsIP |
للتحقّق مما إذا كان حظر CIDR يتضمّن عنوان IP. التواقيع: CIDR.containsIP(IP) -> boolCIDR.containsIP(string) -> boolأمثلة: cidr("192.168.0.0/24").containsIP(ip("192.168.0.1")) // true |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
containsCIDR |
تتحقّق هذه الدالة ممّا إذا كانت إحدى كتل CIDR تتضمّن كتلة CIDR أخرى. التوقيعات: CIDR.containsCIDR(CIDR) -> boolCIDR.containsCIDR(string) -> boolأمثلة: cidr("192.168.0.0/16").containsCIDR(cidr("192.168.1.0/24")) // true |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
family |
تعرِض هذه الدالة عائلة عناوين IP (4 لعنوان IPv4 و6 لعنوان IPv6). التوقيعات: IP.family() -> intأمثلة: ip("192.168.0.1").family() // 4 |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
isGlobalUnicast |
للتحقّق مما إذا كان عنوان IP هو عنوان أحادي البث عالمي. التوقيعات: IP.isGlobalUnicast() -> boolأمثلة: ip("192.168.0.1").isGlobalUnicast() // true |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
isLinkLocalMulticast |
تتحقّق هذه الدالة مما إذا كان عنوان IP هو عنوان بث متعدّد محلي. التوقيعات: IP.isLinkLocalMulticast() -> boolأمثلة: ip("224.0.0.1").isLinkLocalMulticast() // true |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
isLinkLocalUnicast |
تتحقّق هذه الدالة مما إذا كان عنوان IP هو عنوان أحادي البث محليًا. التوقيعات: IP.isLinkLocalUnicast() -> boolأمثلة: ip("169.254.0.1").isLinkLocalUnicast() // true |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
isLoopback |
للتحقّق مما إذا كان عنوان IP هو عنوان إعادة توجيه. التوقيعات: IP.isLoopback() -> boolأمثلة: ip("127.0.0.1").isLoopback() // true |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
isMask |
تتحقّق هذه الدالة مما إذا كان CIDR قناع شبكة فرعية صالحًا. التوقيعات: CIDR.isMask() -> boolأمثلة: cidr("255.255.255.0/24").isMask() // true |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
isUnspecified |
تتحقّق هذه السمة مما إذا كان عنوان IP هو عنوان غير محدّد (مثل 0.0.0.0).التواقيع: IP.isUnspecified() -> boolأمثلة: ip("0.0.0.0").isUnspecified() // true |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
masked |
تعرض هذه الدالة كتلة CIDR المخفية. التوقيعات: CIDR.masked() -> CIDRأمثلة: cidr("192.168.0.1/24").masked() // 192.168.0.0/24 |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
prefixLength |
تعرض هذه السمة طول بادئة حظر CIDR. التنسيقات: CIDR.prefixLength() -> intأمثلة: cidr("192.168.0.0/24").prefixLength() // 24 |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
string |
تحويل عنوان IP أو CIDR إلى سلسلة التواقيع: string(IP) -> stringstring(CIDR) -> stringأمثلة: string(ip("192.168.0.1")) // "192.168.0.1" |
✓ (الإصدار 0.29.0) | ✗ | ✗ | ✗ | ✗ |
كيفية التفعيل
- القيمة: مرِّر القيمة
ext.Network()إلىcel.NewEnv(). - C++: غير متوافق.
- Java: غير متاح.
- Python: غير متاح.
5- الميزات المتقدّمة
ملخّص الميزات المتقدّمة
| الميزة | الوصف | Go | C++ | جافا | Python | C |
|---|---|---|---|---|---|---|
| التقييم الجزئي | التقييم باستخدام مدخلات غير متوفّرة، ويتم عرض قيم غير معروفة أو تعبير مبسط. | ✓³ | ✓⁴ | ✓⁴ | ✗ | ✗ |
| التقييم غير المتزامن | التنفيذ المتزامن غير الحظر لوظائف الإضافة | ✓⁵ | ✗ | ✓⁶ | ✗ | ✗ |
| أدوات التحقّق من صحة ملف AST | تُجري عملية التحليل الثابت عمليات التحقّق من Checked AST بعد التحقّق من النوع. | ✓ | ✓ | ✓ | ✗ | ✗ |
| أدوات تحسين AST | إعادة كتابة شجرة بناء الجملة المجردة (مثل طيّ الثوابت، والتضمين، والتعبير الفرعي المشترك) لتحسين الأداء | ✓ | ✓ | ✓ | ✗ | ✗ |
| أداة تجميع سياسات CEL | تجميع بنى السياسات المستندة إلى YAML في أشجار بنية مجردة (AST) عادية للغة CEL | ✓ | ✓ | ✓ | ✗ | ✗ |
³ تتيح لغة Go إنشاء شجرة بناء مجردة متبقية (شجرة بناء مجردة تم تقليل حجمها). ⁴ تتيح لغتا C++ وJava
عرض UnknownSet / CelUnknownSet في وقت التشغيل، ولكنّهما لا توفّران واجهات برمجة تطبيقات عامة
لإنشاء شجرة بناء الجملة المجردة المتبقية. ⁵ تستخدم Go AsyncBinding / AsyncOp قناة عرض. ⁶ تستخدم Java القيمة CelAsyncRuntime لعرض ListenableFuture.
التقييم الجزئي (القيم غير المعروفة)
تتيح التقييم الجزئي تقييم تعبير عندما تكون مجموعة فرعية فقط من متغيرات الإدخال (المَعلمات) معروفة. بدلاً من أن تفشل عملية التقييم، فإنّها تنتج نتيجة تشير إلى ما هو مفقود، أو تعبير مبسط.
- Go: متوافق تمامًا. تسمح هذه السمة بتحديد
PartialActivationباستخدام أنماط السمات غير المعروفة. يُرجع التقييم قيمةtypes.Unknown. تتيح Go إنشاء شجرة بناء جملة مجردة متبقية (Env.ResidualAst) وهي شجرة بناء جملة مجردة مبسطة ومحذوف منها بعض العناصر، ولا تحتوي إلا على أجزاء التعبير التي لم يكن بالإمكان تقييمها. - C++: تتيح استخدام قيم
Unknown. يتم ضبط أنماط السمات غير المعروفة من خلالActivation::set_unknown_attribute_patterns. تعرض عملية التقييمUnknownSet. لا تعرض واجهة برمجة التطبيقات العامة حاليًا إنشاء AST المتبقّي. - Java: تتيح التقييم الجزئي من خلال
PartialVarsالذي تم تمريره إلىProgram.eval(). تعرض عملية التقييمCelUnknownSet. لا تعرض واجهة برمجة التطبيقات المتاحة للجميع حاليًا ميزة إنشاء شجرة بناء الجملة المجردة المتبقية. - Python / C: لا تتوافق معها بشكلٍ مباشر.
التقييم غير المتزامن
تسمح التقييمات غير المتزامنة لتعبيرات CEL باستدعاء الدوال التي يتم تنفيذها بشكل غير متزامن (مثل إجراء طلبات استدعاء الإجراء عن بُعد أو طلبات البحث في قاعدة البيانات) وحظر التقييم إلى أن تصبح النتائج متاحة، بدون حظر سلسلة التنفيذ الرئيسية.
- Go: تتيح استخدام دوال غير متزامنة عبر
AsyncBindingوAsyncOp. تعرض الدوال غير المتزامنة قناة Go (<-chan ref.Val)، ويتولّى المترجم إدارة التنفيذ المتزامن والمزامنة. - Java: تتيح التقييم غير المتزامن من خلال
CelAsyncRuntimeوAsyncProgram. تستخدِم هذه السمةListenableFutureلتمثيل القيم المعلّقة وتؤدي تلقائيًا إلى إكمال التقييم عند حلّ القيم المستقبلية. - C++ / Python / C: لا تتوفّر ميزة مدمجة.
أدوات التحقّق من صحة AST
تُجري أدوات التحقّق تحليلاً ثابتًا على شجرة بنية مجردة (AST) التي تم التحقّق منها بعد التحقّق من النوع لفرض قيود خاصة بالمجال قبل تنفيذ البرنامج.
- Go: يتوافق مع واجهة
ASTValidator. تشمل أدوات التحقّق من صحة البيانات الأساسية ما يلي:cel.validator.durationوcel.validator.timestampوcel.validator.matches(تعبير عادي) وcel.validator.homogeneous_literalsوcel.validator.comprehension_nesting_limit. - C++: تتوافق مع
cel::Validator. تشمل عمليات التحقّق من صحة الروابط الأساسية ما يلي:AstDepthValidatorوComprehensionNestingLimitValidatorوDurationLiteralValidatorوHomogeneousLiteralValidatorوMatchesValidatorوTimestampLiteralValidator. - Java: تتوافق مع
CelValidatorوCelAstValidator. تشمل أدوات التحقّق من صحة الروابط الأساسيةAstDepthLimitValidatorوComprehensionNestingLimitValidatorوDurationLiteralValidatorوHomogeneousLiteralValidatorوRegexLiteralValidatorوTimestampLiteralValidator. - Python / C: لا تتوفّر إمكانية الربط المباشر.
أدوات تحسين AST
تعيد أدوات التحسين كتابة شجرة بنية التجريد لتحسين أداء التنفيذ. تنقسم أدوات التحسين إلى فئتين: أدوات التحسين الثابتة وأدوات التحسين في وقت التشغيل. تتيح لغات C++ وJava وGo إمكانية التحسين أثناء التشغيل. تتوافق لغتا CEL Java وGo أيضًا مع أدوات التحسين الثابتة.
تشمل التحسينات النموذجية طيّ الثوابت (إعادة تقييم التعبيرات الفرعية التي تتضمّن مدخلات ثابتة) وإزالة التعبيرات الفرعية المشتركة (CSE).
- Go: تتيح طي شجرة بنية التجريد أثناء التجميع/التخطيط.
- ++C: تتيح تقليل الثوابت من خلال الإضافة
cel::extensions::EnableConstantFoldingفي وقت التخطيط. - Java: تتوافق مع واجهة
CelOptimizer. تشمل أدوات التحسين الأساسيةConstantFoldingOptimizer(التي يمكنها طيّ الفروع ذات الدائرة القصيرة من خلال محاكاة التقييم الجزئي) وInliningOptimizerوSubexpressionOptimizer(إزالة التعبيرات الفرعية المشتركة). - Python / C: لا تتوفّر إمكانية الربط المباشر.
أداة تجميع سياسات CEL
سياسة CEL هي تنسيق مستند إلى YAML لإنشاء تعبيرات CEL متعددة معًا مع متغيرات وكتل مطابقة ومخرجات شرطية وقواعد متداخلة. وهي مصمَّمة لمحركات السياسات المعقّدة (مثل Kubernetes Admission Control) التي تصبح فيها تعبيرات CEL الفردية غير قابلة للقراءة.
للحصول على تعريف اللغة الرسمي وبنية الجملة وحزمة اختبار المطابقة، يُرجى الرجوع إلى مواصفات سياسة CEL.
يجمع "مجمّع السياسات" سياسات YAML هذه في شجرة بنية مجردة (AST) واحدة متوافقة مع CEL، ما يعني أنّها متوافقة تمامًا مع أوقات تشغيل CEL العادية وتتضمّن جميع ضمانات الأداء والسلامة.
- Go: متوافق مع سياسة Go.
- C++: يتم توفير الدعم من خلال سياسة C++.
- Java: يتم توفير الدعم من خلال سياسة Java.
- Python / C: غير متوافقَين مباشرةً.