مرجع API زبان عبارت مشترک (CEL)

این سند به عنوان مرجع یکپارچه API Doc برای زبان عبارات مشترک (CEL) عمل می‌کند. این سند تمام ماکروها، عملگرها و توابع استاندارد را فهرست می‌کند و امضاها، رفتارها و وضعیت پشتیبانی آنها را در پشته‌های رسمی CEL نشان می‌دهد.

برای جزئیات بیشتر در مورد رفتار و مشخصات زبان، به تعریف زبان CEL مراجعه کنید.

نسخه‌های پشته‌ای

این سند مرجع بر اساس نسخه‌های زیر از پشته‌های CEL تهیه شده است:

  • CEL Go : v0.29.2 (و جدیدتر)
  • سل سی++ : v0.15.0
  • جاوا CEL : v0.13.1
  • زبان برنامه‌نویسی پایتون (CEL) : v0.1.3
  • CEL C : تصویر لحظه‌ای از توسعه (منتشر نشده)

آینه‌های گیت‌هاب

پیاده‌سازی‌های رسمی CEL در GitHub تحت سازمان cel-expr منعکس شده‌اند:


۱. ماکروهای اصلی

اینها ماکروهای داخلی هستند که در زمان کامپایل گسترش می‌یابند.

ماکرو توضیحات برو سی++ جاوا پایتون سی
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 پشتیبانی می‌شود زیرا ماکروها در حین کامپایل توسط کامپایلر میزبان به درک متقابل گسترش می‌یابند.


۲. اپراتورهای اصلی

اپراتور توضیحات برو سی++ جاوا پایتون سی
محاسبات ( + ، - ، * ، / ، % ) عملیات حسابی استاندارد. نفی ( -x ) و هویت ( +x ). الحاق لیست ( list + list ) در Go، C++، Java و Python پشتیبانی می‌شود.

امضاها:
T + T -> T
T - T -> T
T * T -> T
T / T -> T
T % T -> T
-T -> T
+T -> T
list + list -> list

مثال‌ها:
1 + 2 * 3 // 7
[1] + [2] // [1, 2]
²
مقایسه ( == ، != ، < ، <= ، > ، >= ) مقایسه استاندارد. مقایسه‌های عددی ناهمگن هستند (مثلاً 1 == 1.0 ).

امضاها:
T == T -> bool
T != T -> bool
T < T -> bool
T <= T -> bool
T > T -> bool
T >= T -> bool

مثال‌ها:
x < 42.0
1 == 1.0 // true
منطقی ( ! ، && ، || ، ? : :) توابع منطقی NOT، AND، OR و شرطی سه‌تایی. AND/OR از ارزیابی اتصال کوتاه استفاده می‌کنند.

امضاها:
!bool -> bool
bool && bool -> bool
bool || bool -> bool
bool ? T : T -> T

مثال‌ها:
x > 0 ? "positive" : "non-positive"
فهرست بندی ( [] ) دسترسی به عنصر یک لیست از طریق اندیس یا کلید جستجو در نقشه.

امضاها:
list[int] -> T
map[K] -> V

مثال‌ها:
tags[0]
users['john']
عضویت ( in ) بررسی می‌کند که آیا عنصر در یک لیست است یا کلید در یک نقشه قرار دارد.

امضاها:
T in list -> bool
K in map -> bool

مثال‌ها:
'admin' in roles

² الحاق لیست ( list + list ) در زمان اجرای C پشتیبانی نمی‌شود ، اگرچه سایر عملگرهای حسابی پشتیبانی می‌شوند.


۳. کارکردهای اصلی

توابع عمومی و رشته‌ای

عملکرد توضیحات برو سی++ جاوا پایتون سی
size اندازه یک رشته (کاراکتر)، بایت، لیست یا نقشه را برمی‌گرداند.

امضاها:
size(T) -> int (که در آن T string ، bytes ، list یا map است) <br /><br />**Examples:**<br /> 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 استخراج می‌کنند.

عملکرد توضیحات برو سی++ جاوا پایتون سی
getFullYear سال را به صورت ۴ رقمی برمی‌گرداند.

امضاها:
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 روز ماه (۱-۳۱) را برمی‌گرداند.

امضاها:
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]) -> int
duration.getHours() -> int

مثال‌ها:
duration("1h30m").getHours() // 1
getMinutes دقیقه (0-59) را برمی‌گرداند.

امضاها:
timestamp.getMinutes([tz]) -> int
duration.getMinutes() -> int

مثال‌ها:
duration("1h30m").getMinutes() // 30
getSeconds ثانیه‌ها (0-59) را برمی‌گرداند.

امضاها:
timestamp.getSeconds([tz]) -> int
duration.getSeconds() -> int

مثال‌ها:
duration("1h30m45s").getSeconds() // 45
getMilliseconds میلی ثانیه (0-999) را برمی‌گرداند.

امضاها:
timestamp.getMilliseconds([tz]) -> int
duration.getMilliseconds() -> int

مثال‌ها:
duration("1.5s").getMilliseconds() // 500

تبدیل نوع

نوع هدف توضیحات برو سی++ جاوا پایتون سی
bool به بولی تبدیل می‌کند.

امضاها:
bool(bool) -> bool
bool(string) -> bool

مثال‌ها:
bool("true") // true
bytes به بایت تبدیل می‌کند.

امضاها:
bytes(bytes) -> bytes
bytes(string) -> bytes

مثال‌ها:
bytes("hello") // b"hello"
double به نوع اعشاری با دقت مضاعف تبدیل می‌کند.

امضاها:
double(double) -> double
double(int) -> double
double(uint) -> double
double(string) -> double

مثال‌ها:
double(1) // 1.0
duration به مدت زمان تبدیل می‌کند.

امضاها:
duration(duration) -> duration
duration(string) -> duration

مثال‌ها:
duration("1.5s") // 1.5s duration
int به عدد صحیح علامت‌دار ۶۴ بیتی تبدیل می‌کند.

امضاها:
int(int) -> int
int(uint) -> int
int(double) -> int (به صفر گرد می‌کند)
int(string) -> int
int(timestamp) -> int (ثانیه از زمان شروع)

مثال‌ها:
int(1.5) // 1
string به رشته تبدیل می‌کند.

امضاها:
string(T) -> string ( bool ، int ، uint ، double ، bytes ، timestamp ، duration پشتیبانی می‌کند) <br /><br />**Examples:**<br /> string(1.5) // "1.5"`
timestamp به برچسب زمانی تبدیل می‌شود.

امضاها:
timestamp(timestamp) -> timestamp
timestamp(string) -> timestamp (RFC3339)

مثال‌ها:
timestamp("2026-07-23T00:00:00Z")
uint به عدد صحیح بدون علامت ۶۴ بیتی تبدیل می‌کند.

امضاها:
uint(uint) -> uint
uint(int) -> uint
uint(double) -> uint
uint(string) -> uint

مثال‌ها:
uint(1) // 1u
dyn برای بررسی نوع، مقدار را به نوع پویا تبدیل می‌کند.

امضاها:
dyn(T) -> dyn

مثال‌ها:
dyn([1, "two"])
type نوع مقدار را برمی‌گرداند.

امضاها:
type(T) -> type

مثال‌ها:
type(1) // int

۴. افزونه‌ها (کتابخانه‌ها)

کتابخانه صحافی

عملکرد توضیحات برو سی++ جاوا پایتون سی
cel.bind برای جلوگیری از ارزیابی تکراری، یک متغیر محلی را مقید می‌کند.

امضاها:
cel.bind(varName, initExpr, resultExpr) -> T

مثال‌ها:
cel.bind(x, a + b, x * x)
(نسخه ۰.۱۵.۰) (نسخه ۰.۱۰.۰) (نسخه ۰.۲.۰) (نسخه ۰.۱.۱)

نحوه فعال کردن

  • برو: ext.Bindings() را به cel.NewEnv() ارسال کن.
  • ++C: تابع BindingsCompilerLibrary() را به CompilerBuilder اضافه کنید. (زمان اجرا به صورت خودکار مدیریت می‌شود).
  • جاوا: CelExtensions.bindings() را به سازندگان CelCompiler و CelRuntime اضافه کنید.
  • پایتون: cel_expr_python.ext.ext_bindings وارد کنید و ExtBindings() در cel.NewEnv(extensions=[...]) استفاده کنید.

کتابخانه انکودرها

عملکرد توضیحات برو سی++ جاوا پایتون سی
base64.encode بایت‌ها را به رشته‌ی base64 کدگذاری می‌کند.

امضاها:
base64.encode(bytes) -> string

مثال‌ها:
base64.encode(b"hello") // "aGVsbG8="
(نسخه ۰.۶.۰) (نسخه ۰.۱۰.۰) (نسخه ۰.۲.۰) (نسخه ۰.۱.۱)
base64.decode رشته‌ی base64 را به بایت تبدیل می‌کند. در صورت ورود اطلاعات نامعتبر، خطا می‌دهد.

امضاها:
base64.decode(string) -> bytes

مثال‌ها:
base64.decode("aGVsbG8=") // b"hello"
(نسخه ۰.۶.۰) (نسخه ۰.۱۰.۰) (نسخه ۰.۲.۰) (نسخه ۰.۱.۱)
json.encode یک مقدار CEL را به رشته JSON سریالی می‌کند.

امضاها:
json.encode(dyn) -> string

مثال‌ها:
json.encode([1, 2]) // "[1,2]"
(نسخه ۰.۲۹.۰)

نحوه فعال کردن

  • برو: تابع ext.Encoders() را به cel.NewEnv() ارسال کن.
  • سی++:
  • جاوا: CelExtensions.encoders() را به سازندگان CelCompiler و CelRuntime اضافه کنید.
  • پایتون: cel_expr_python.ext.ext_encoders را وارد کنید و ExtEncoders() در cel.NewEnv(extensions=[...]) استفاده کنید.

کتابخانه ریاضی

عملکرد توضیحات برو سی++ جاوا پایتون سی
math.greatest بزرگترین آرگومان عددی (یا لیستی از اعداد) را برمی‌گرداند.

امضاها:
math.greatest(arg, ...) -> T

مثال‌ها:
math.greatest(1, 3, 2) // 3
(نسخه ۰.۱۳.۰) (نسخه ۰.۱۰.۰) (نسخه ۰.۲.۰) (نسخه ۰.۱.۱)
math.least کمترین تعداد آرگومان‌های عددی (یا لیستی از اعداد) را برمی‌گرداند.

امضاها:
math.least(arg, ...) -> T

مثال‌ها:
math.least([1, 3, 2]) // 1
(نسخه ۰.۱۳.۰) (نسخه ۰.۱۰.۰) (نسخه ۰.۲.۰) (نسخه ۰.۱.۱)
math.abs ارزش مطلق.

امضاها:
math.abs(T) -> T ( int ، uint ، double پشتیبانی می‌کند) <br /><br />**Examples:**<br /> math.abs(-1) // 1`
(نسخه ۰.۲۱.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱۰.۱) (نسخه ۰.۱.۱)
math.sqrt جذر.

امضاها:
math.sqrt(T) -> double ( int ، uint ، double پشتیبانی می‌کند) <br /><br />**Examples:**<br /> math.sqrt(9) // 3.0`
(نسخه ۰.۲۵.۱) (نسخه ۰.۱۲.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱.۱)
math.bitAnd بیتی و.

امضاها:
math.bitAnd(T, T) -> T ( int و uint پشتیبانی می‌کند) <br /><br />**Examples:**<br /> math.bitAnd(5, 3) // 1`
(نسخه ۰.۲۱.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱۰.۱) (نسخه ۰.۱.۱)
math.bitOr یای بیتی.

امضاها:
math.bitOr(T, T) -> T ( int uint پشتیبانی می‌کند) <br /><br />**Examples:**<br /> math.bitOr(5, 3) // 7`
(نسخه ۰.۲۱.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱۰.۱) (نسخه ۰.۱.۱)
math.bitXor XOR بیتی

امضاها:
math.bitXor(T, T) -> T ( int و uint پشتیبانی می‌کند) <br /><br />**Examples:**<br /> math.bitXor(5, 3) // 6`
(نسخه ۰.۲۱.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱۰.۱) (نسخه ۰.۱.۱)
math.bitNot بیتی نیست.

امضاها:
math.bitNot(T) -> T ( int uint پشتیبانی می‌کند) <br /><br />**Examples:**<br /> math.bitNot(1) // -2`
(نسخه ۰.۲۱.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱۰.۱) (نسخه ۰.۱.۱)
math.bitShiftLeft شیفت بیتی به چپ.

امضاها:
math.bitShiftLeft(T, int) -> T ( int و uint پشتیبانی می‌کند) <br /><br />**Examples:**<br /> math.bitShiftLeft(1, 2) // 4`
(نسخه ۰.۲۱.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱۰.۱) (نسخه ۰.۱.۱)
math.bitShiftRight شیفت بیتی به راست.

امضاها:
math.bitShiftRight(T, int) -> T ( int و uint پشتیبانی می‌کند) <br /><br />**Examples:**<br /> math.bitShiftRight(4, 2) // 1`
(نسخه ۰.۲۱.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱۰.۱) (نسخه ۰.۱.۱)
math.ceil گرد کردن سقف.

امضاها:
math.ceil(double) -> double

مثال‌ها:
math.ceil(1.2) // 2.0
(نسخه ۰.۲۱.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱۰.۱) (نسخه ۰.۱.۱)
math.floor گرد کردن کف.

امضاها:
math.floor(double) -> double

مثال‌ها:
math.floor(1.8) // 1.0
(نسخه ۰.۲۱.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱۰.۱) (نسخه ۰.۱.۱)
math.round گرد کردن نزدیکترین عدد صحیح.

امضاها:
math.round(double) -> double

مثال‌ها:
math.round(1.5) // 2.0
(نسخه ۰.۲۱.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱۰.۱) (نسخه ۰.۱.۱)
math.trunc گرد کردن با برش (به سمت صفر).

امضاها:
math.trunc(double) -> double

مثال‌ها:
math.trunc(-1.8) // -1.0
(نسخه ۰.۲۱.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱۰.۱) (نسخه ۰.۱.۱)
math.isInf بررسی می‌کند که آیا double مثبت است یا منفی بی‌نهایت.

امضاها:
math.isInf(double) -> bool

مثال‌ها:
math.isInf(1.0/0.0) // true
(نسخه ۰.۲۱.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱۰.۱) (نسخه ۰.۱.۱)
math.isNaN بررسی می‌کند که آیا double برابر با NaN است یا خیر.

امضاها:
math.isNaN(double) -> bool

مثال‌ها:
math.isNaN(0.0/0.0) // true
(نسخه ۰.۲۱.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱۰.۱) (نسخه ۰.۱.۱)
math.isFinite بررسی می‌کند که آیا double متناهی است یا خیر.

امضاها:
math.isFinite(double) -> bool

مثال‌ها:
math.isFinite(1.2) // true
(نسخه ۰.۲۱.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱۰.۱) (نسخه ۰.۱.۱)
math.sign علامت مقدار (-1، 0، یا 1) را برمی‌گرداند.

امضاها:
math.sign(T) -> T ( int ، uint ، double پشتیبانی می‌کند) <br /><br />**Examples:**<br /> math.sign(-42) // -1`
(نسخه ۰.۲۱.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱۰.۱) (نسخه ۰.۱.۱)

نحوه فعال کردن

  • برو: تابع ext.Math() را به cel.NewEnv() ارسال کن.
  • سی++:
  • جاوا: CelExtensions.math() را به سازندگان CelCompiler و CelRuntime اضافه کنید.
  • پایتون: cel_expr_python.ext.ext_math را وارد کنید و ExtMath() در cel.NewEnv(extensions=[...]) استفاده کنید.

کتابخانه پروتوس

عملکرد توضیحات برو سی++ جاوا پایتون سی
proto.getExt فیلد افزونه proto2 را برمی‌گرداند، یا اگر تنظیم نشده باشد، پیش‌فرض است.

امضاها:
proto.getExt(msg, extName) -> T

مثال‌ها:
proto.getExt(msg, google.api.expr.test.int32_ext)
(نسخه ۰.۱۳.۰) (نسخه ۰.۱۰.۰) (نسخه ۰.۲.۰) (نسخه ۰.۱.۱)
proto.hasExt بررسی می‌کند که آیا فیلد افزونه‌ی proto2 تنظیم شده است یا خیر.

امضاها:
proto.hasExt(msg, extName) -> bool

مثال‌ها:
proto.hasExt(msg, google.api.expr.test.int32_ext)
(نسخه ۰.۱۳.۰) (نسخه ۰.۱۰.۰) (نسخه ۰.۲.۰) (نسخه ۰.۱.۱)

نحوه فعال کردن

  • برو: ext.Protos() را به cel.NewEnv() ارسال کن.
  • ++C: اضافه کردن ProtoExtCompilerLibrary() به CompilerBuilder . (زمان اجرا به صورت خودکار مدیریت می‌شود).
  • جاوا: CelExtensions.protos() را به سازندگان CelCompiler و CelRuntime اضافه کنید.
  • پایتون: cel_expr_python.ext.ext_proto را وارد کنید و ExtProto() در cel.NewEnv(extensions=[...]) استفاده کنید.

کتابخانه لیست‌ها

عملکرد توضیحات برو سی++ جاوا پایتون سی
distinct عناصر متمایز را برمی‌گرداند.

امضاها:
list.distinct() -> list

مثال‌ها:
[1, 2, 2].distinct() // [1, 2]
(نسخه ۰.۲۲.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱.۱)
flatten لیست‌های تو در تو را مسطح می‌کند.

امضاها:
list.flatten([depth]) -> list

مثال‌ها:
[[1], [2, 3]].flatten() // [1, 2, 3]
(نسخه ۰.۲۲.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۷.۱) (نسخه ۰.۱.۱)
lists.range لیستی از اعداد صحیح [0, ..., n-1] را برمی‌گرداند.

امضاها:
lists.range(int) -> list(int)

مثال‌ها:
lists.range(3) // [0, 1, 2]
(نسخه ۰.۲۲.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱۰.۱) (نسخه ۰.۱.۱)
reverse لیست را برعکس می‌کند.

امضاها:
list.reverse() -> list

مثال‌ها:
[1, 2].reverse() // [2, 1]
(نسخه ۰.۲۲.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱.۱)
slice زیرلیست (شامل شروع، شامل پایان) را برمی‌گرداند.

امضاها:
list.slice(start, end) -> list

مثال‌ها:
[1, 2, 3].slice(1, 3) // [2, 3]
(نسخه ۰.۱۷.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱.۱)
sort فهرست عناصر قابل مقایسه را مرتب می‌کند.

امضاها:
list.sort() -> list

مثال‌ها:
[3, 1, 2].sort() // [1, 2, 3]
(نسخه ۰.۲۲.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱.۱)
sortBy لیست را بر اساس کلید ارزیابی شده از عبارت مرتب می‌کند.

امضاها:
list.sortBy(var, expr) -> list

مثال‌ها:
[{"val": 2}, {"val": 1}].sortBy(x, x.val) // [{"val": 1}, {"val": 2}]
(نسخه ۰.۲۲.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱.۱)
first عنصر اول را به عنوان اختیاری برمی‌گرداند. به افزونه‌ی Optional نیاز دارد.

امضاها:
list.first() -> optional

مثال‌ها:
[1, 2].first() // optional(1)
(نسخه ۰.۲۳.۰) (نسخه ۰.۱۵.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱.۲)
last آخرین عنصر را به عنوان اختیاری برمی‌گرداند. به افزونه‌ی Optional نیاز دارد.

امضاها:
list.last() -> optional

مثال‌ها:
[1, 2].last() // optional(2)
(نسخه ۰.۲۳.۰) (نسخه ۰.۱۵.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱.۲)

نحوه فعال کردن

  • برو: تابع ext.Lists() را به cel.NewEnv() ارسال کن.
  • سی++:
  • جاوا: CelExtensions.lists() را به سازندگان CelCompiler و CelRuntime اضافه کنید.
  • پایتون: با افزودن lists به فهرست extensions ، از طریق cel.EnvConfig فعال کنید.

کتابخانه مجموعه‌ها

عملکرد توضیحات برو سی++ جاوا پایتون سی
sets.contains بررسی می‌کند که آیا list1 شامل تمام عناصر list2 است یا خیر.

امضاها:
sets.contains(list1, list2) -> bool

مثال‌ها:
sets.contains([1, 2], [1]) // true
(نسخه ۰.۱۵.۰) (نسخه ۰.۱۰.۰) (نسخه ۰.۶.۰) (نسخه ۰.۱.۱)
sets.equivalent بررسی می‌کند که آیا لیست‌ها معادل مجموعه هستند (شامل عناصر منحصر به فرد یکسان هستند).

امضاها:
sets.equivalent(list1, list2) -> bool

مثال‌ها:
sets.equivalent([1, 2], [2, 1, 1]) // true
(نسخه ۰.۱۵.۰) (نسخه ۰.۱۰.۰) (نسخه ۰.۶.۰) (نسخه ۰.۱.۱)
sets.intersects بررسی می‌کند که آیا لیست‌ها حداقل یک عنصر مشترک دارند یا خیر.

امضاها:
sets.intersects(list1, list2) -> bool

مثال‌ها:
sets.intersects([1, 2], [2, 3]) // true
(نسخه ۰.۱۵.۰) (نسخه ۰.۱۰.۰) (نسخه ۰.۶.۰) (نسخه ۰.۱.۱)

نحوه فعال کردن

  • برو: تابع ext.Sets() را به cel.NewEnv() ارسال کن.
  • سی++:
  • جاوا: CelExtensions.sets() را به سازندگان CelCompiler و CelRuntime اضافه کنید.
  • پایتون: با افزودن sets به لیست extensions ، از طریق cel.EnvConfig فعال کنید.

کتابخانه رشته‌ها

عملکرد توضیحات برو سی++ جاوا پایتون سی
charAt کاراکتر را در اندیس برمی‌گرداند.

امضاها:
string.charAt(int) -> string

مثال‌ها:
"hello".charAt(1) // "e"
(نسخه ۰.۴.۰) (نسخه ۰.۱۰.۰) (نسخه ۰.۲.۰) (نسخه ۰.۱.۱)
indexOf اندیس اولین وقوع زیررشته یا -۱ را برمی‌گرداند.

امضاها:
string.indexOf(substr, [start]) -> int

مثال‌ها:
"hello".indexOf("l") // 2
(نسخه ۰.۴.۰) (نسخه ۰.۱۰.۰) (نسخه ۰.۲.۰) (نسخه ۰.۱.۱)
lastIndexOf اندیس آخرین وقوع زیررشته یا -۱ را برمی‌گرداند.

امضاها:
string.lastIndexOf(substr, [end]) -> int

مثال‌ها:
"hello".lastIndexOf("l") // 3
(نسخه ۰.۴.۰) (نسخه ۰.۱۰.۰) (نسخه ۰.۲.۰) (نسخه ۰.۱.۱)
join رشته‌ها را به هم متصل می‌کند.

امضاها:
list(string).join([separator]) -> string

مثال‌ها:
["a", "b"].join("-") // "ab"
(نسخه ۰.۱۰.۰) (نسخه ۰.۱۰.۰) (نسخه ۰.۲.۰) (نسخه ۰.۱.۱)
split رشته را با استفاده از جداکننده تقسیم می‌کند.

امضاها:
string.split(separator, [limit]) -> list(string)

مثال‌ها:
"ab".split("-") // ["a", "b"]
(نسخه ۰.۴.۰) (نسخه ۰.۱۰.۰) (نسخه ۰.۲.۰) (نسخه ۰.۱.۱)
substring زیررشته (شامل شروع، شامل پایان) را برمی‌گرداند.

امضاها:
string.substring(start, [end]) -> string

مثال‌ها:
"hello".substring(1, 3) // "el"
(نسخه ۰.۴.۰) (نسخه ۰.۱۰.۰) (نسخه ۰.۲.۰) (نسخه ۰.۱.۱)
trim فاصله‌های خالی یونیکد را حذف می‌کند.

امضاها:
string.trim() -> string

مثال‌ها:
" hello ".trim() // "hello"
(نسخه ۰.۴.۰) (نسخه ۰.۱۰.۰) (نسخه ۰.۲.۰) (نسخه ۰.۱.۱)
replace موارد قدیمی را با موارد جدید جایگزین می‌کند.

امضاها:
string.replace(old, new, [limit]) -> string

مثال‌ها:
"hello".replace("l", "w") // "hewwo"
(نسخه ۰.۴.۰) (نسخه ۰.۱۰.۰) (نسخه ۰.۲.۰) (نسخه ۰.۱.۱)
reverse نقاط کد یونیکد را معکوس می‌کند.

امضاها:
string.reverse() -> string

مثال‌ها:
"abc".reverse() // "cba"
(نسخه ۰.۱۸.۰) (نسخه ۰.۱۴.۰) (نسخه ۰.۱۳.۰) (نسخه ۰.۱.۱)
lowerAscii کاراکترهای ASCII را به حروف کوچک تبدیل می‌کند.

امضاها:
string.lowerAscii() -> string

مثال‌ها:
"Hello".lowerAscii() // "hello"
(نسخه ۰.۶.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۲.۰) (نسخه ۰.۱.۱)
upperAscii کاراکترهای ASCII را به حروف بزرگ تبدیل می‌کند.

امضاها:
string.upperAscii() -> string

مثال‌ها:
"Hello".upperAscii() // "HELLO"
(نسخه ۰.۶.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۲.۰) (نسخه ۰.۱.۱)
quote رشته را برای چاپ ایمن escape می‌کند.

امضاها:
strings.quote(string) -> string

مثال‌ها:
strings.quote("a\tb") // "\"a\\tb\""
(نسخه ۰.۱۴.۰) (نسخه ۰.۱۴.۰) (نسخه ۰.۱۳.۰) (نسخه ۰.۱.۱)

نحوه فعال کردن

  • برو: تابع ext.Strings() را به cel.NewEnv() ارسال کن.
  • سی++:
  • جاوا: CelExtensions.strings() را به سازندگان CelCompiler و CelRuntime اضافه کنید.
  • پایتون: cel_expr_python.ext.ext_strings وارد کنید و ExtStrings() در cel.NewEnv(extensions=[...]) استفاده کنید.

کتابخانه عبارات منظم

عملکرد توضیحات برو سی++ جاوا پایتون سی
regex.replace موارد منطبق را با رشته جایگزین جایگزین می‌کند (از ارجاعات معکوس پشتیبانی می‌کند).

امضاها:
regex.replace(target, pat, repl, [limit]) -> string

مثال‌ها:
regex.replace("123-456", r"(\d+)-(\d+)", r"\2-\1") // "456-123"
(نسخه ۰.۲۵.۱) (نسخه ۰.۱۳.۰) (نسخه ۰.۱۰.۱) (نسخه ۰.۱.۱)
regex.extract اولین تطابق الگو را برمی‌گرداند (باید یک گروه ضبط داشته باشد).

امضاها:
regex.extract(target, pat) -> optional(string)

مثال‌ها:
regex.extract("a123b", r"(\d+)") // optional("123")
(نسخه ۰.۲۵.۱) (نسخه ۰.۱۳.۰) (نسخه ۰.۱۰.۱) (نسخه ۰.۱.۱)
regex.extractAll تمام تطابق‌های الگو را برمی‌گرداند (باید یک گروه ضبط داشته باشد).

امضاها:
regex.extractAll(target, pat) -> list(string)

مثال‌ها:
regex.extractAll("a1b2", r"(\d+)") // ["1", "2"]
(نسخه ۰.۲۵.۱) (نسخه ۰.۱۳.۰) (نسخه ۰.۱۰.۱) (نسخه ۰.۱.۱)

نحوه فعال کردن

  • برو: تابع ext.Regex() را به cel.NewEnv() ارسال کن.
  • سی++:
  • جاوا: CelExtensions.regex() را به سازندگان CelCompiler و CelRuntime اضافه کنید.
  • پایتون: با افزودن regex و optional به لیست extensions ، از طریق cel.EnvConfig فعال کنید.

درک مفاهیم دو متغیره

ماکرو توضیحات برو سی++ جاوا پایتون سی
all اتصال کوتاه منطقی AND روی کلید/شاخص و مقدار.

امضاها:
list.all(i, v, pred) -> bool
map.all(k, v, pred) -> bool

مثال‌ها:
[1, 2].all(i, v, v > 0) // true
(نسخه ۰.۲۲.۰) (نسخه ۰.۱۴.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱.۱)
exists اتصال کوتاه OR منطقی روی کلید/شاخص و مقدار.

امضاها:
list.exists(i, v, pred) -> bool
map.exists(k, v, pred) -> bool

مثال‌ها:
[1, 2].exists(i, v, v == 2) // true
(نسخه ۰.۲۲.۰) (نسخه ۰.۱۴.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱.۱)
existsOne بررسی می‌کند که آیا دقیقاً یک جفت، گزاره را ارضا می‌کند یا خیر.

امضاها:
list.existsOne(i, v, pred) -> bool
map.existsOne(k, v, pred) -> bool

مثال‌ها:
[1, 2].existsOne(i, v, v == 2) // true
(نسخه ۰.۲۲.۰) (نسخه ۰.۱۴.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱.۱)
transformList لیست/نقشه را به یک لیست تبدیل/فیلتر می‌کند.

امضاها:
list.transformList(i, v, [filter], transform) -> list
map.transformList(k, v, [filter], transform) -> list

مثال‌ها:
[1, 2].transformList(i, v, v * 2) // [2, 4]
(نسخه ۰.۲۲.۰) (نسخه ۰.۱۴.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱.۱)
transformMap مقادیر لیست/نقشه را به یک نقشه تبدیل می‌کند (کلیدها ثابت می‌مانند).

امضاها:
list.transformMap(i, v, [filter], transform) -> map
map.transformMap(k, v, [filter], transform) -> map

مثال‌ها:
[1, 2].transformMap(i, v, v * 2) // {0: 2, 1: 4}
(نسخه ۰.۲۲.۰) (نسخه ۰.۱۴.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱.۱)
transformMapEntry تبدیل به نقشه می‌شود.

امضاها:
list.transformMapEntry(i, v, [filter], transform_entry) -> map
map.transformMapEntry(k, v, [filter], transform_entry) -> map

مثال‌ها:
[1, 2].transformMapEntry(i, v, {string(v): v * 2}) // {"1": 2, "2": 4}
(نسخه ۰.۲۲.۰) (نسخه ۰.۱۴.۰) (نسخه ۰.۱۱.۰) (نسخه ۰.۱.۱)

نحوه فعال کردن

کتابخانه انواع بومی

ویژگی توضیحات برو سی++ جاوا پایتون سی
سازه‌های بومی ثبت و نمونه‌سازی انواع بومی میزبان (ساختارهای Go / POJOهای جاوا) در CEL.

مثال‌ها:
Account{id: 123} (جاوا POJO در CEL نمونه‌سازی شده است)
(نسخه ۰.۱۳.۰) (نسخه ۰.۱۳.۰)

نحوه فعال کردن

  • برو: ext.NativeTypes(...) (ارائه انواع منعکس کننده) را به cel.NewEnv() منتقل کن.
  • سی پلاس پلاس: پشتیبانی نمی‌شود.
  • جاوا: CelExtensions.nativeTypes() (که کلاس‌های جاوا را ارائه می‌دهد) را به سازندگان CelCompiler و CelRuntime اضافه کنید.
  • پایتون: پشتیبانی نمی‌شود.

کتابخانه شبکه

کتابخانه شبکه توابعی را برای تجزیه، اعتبارسنجی و دستکاری آدرس‌های IP و بلوک‌های CIDR ارائه می‌دهد.

عملکرد توضیحات برو سی++ جاوا پایتون سی
ip یک رشته را به آدرس IP تجزیه می‌کند، یا IP را از CIDR استخراج می‌کند.

امضاها:
ip(string) -> IP
CIDR.ip() -> IP

مثال‌ها:
ip("192.168.0.1")
cidr("192.168.0.0/24").ip()
(نسخه ۰.۲۹.۰)
isIP بررسی می‌کند که آیا یک رشته، یک آدرس IP معتبر است یا خیر.

امضاها:
isIP(string) -> bool

مثال‌ها:
isIP("192.168.0.1") // true
(نسخه ۰.۲۹.۰)
ip.isCanonical بررسی می‌کند که آیا یک رشته آدرس IP در قالب متعارف خود قرار دارد یا خیر.

امضاها:
ip.isCanonical(string) -> bool

مثال‌ها:
ip.isCanonical("192.168.0.1") // true
(نسخه ۰.۲۹.۰)
cidr یک رشته را به یک بلوک CIDR تجزیه می‌کند.

امضاها:
cidr(string) -> CIDR

مثال‌ها:
cidr("192.168.0.0/24")
(نسخه ۰.۲۹.۰)
isCIDR بررسی می‌کند که آیا یک رشته، یک بلوک CIDR معتبر است یا خیر.

امضاها:
isCIDR(string) -> bool

مثال‌ها:
isCIDR("192.168.0.0/24") // true
(نسخه ۰.۲۹.۰)
containsIP بررسی می‌کند که آیا یک بلوک CIDR حاوی آدرس IP است یا خیر.

امضاها:
CIDR.containsIP(IP) -> bool
CIDR.containsIP(string) -> bool

مثال‌ها:
cidr("192.168.0.0/24").containsIP(ip("192.168.0.1")) // true
(نسخه ۰.۲۹.۰)
containsCIDR بررسی می‌کند که آیا یک بلوک CIDR حاوی بلوک CIDR دیگری است یا خیر.

امضاها:
CIDR.containsCIDR(CIDR) -> bool
CIDR.containsCIDR(string) -> bool

مثال‌ها:
cidr("192.168.0.0/16").containsCIDR(cidr("192.168.1.0/24")) // true
(نسخه ۰.۲۹.۰)
family خانواده IP را برمی‌گرداند (۴ برای IPv4، ۶ برای IPv6).

امضاها:
IP.family() -> int

مثال‌ها:
ip("192.168.0.1").family() // 4
(نسخه ۰.۲۹.۰)
isGlobalUnicast بررسی می‌کند که آیا IP یک آدرس یونی‌کَست سراسری است یا خیر.

امضاها:
IP.isGlobalUnicast() -> bool

مثال‌ها:
ip("192.168.0.1").isGlobalUnicast() // true
(نسخه ۰.۲۹.۰)
isLinkLocalMulticast بررسی می‌کند که آیا IP یک آدرس چندپخشی لینک-محلی است یا خیر.

امضاها:
IP.isLinkLocalMulticast() -> bool

مثال‌ها:
ip("224.0.0.1").isLinkLocalMulticast() // true
(نسخه ۰.۲۹.۰)
isLinkLocalUnicast بررسی می‌کند که آیا IP یک آدرس تک پخشی لینک-لوکال است یا خیر.

امضاها:
IP.isLinkLocalUnicast() -> bool

مثال‌ها:
ip("169.254.0.1").isLinkLocalUnicast() // true
(نسخه ۰.۲۹.۰)
isLoopback بررسی می‌کند که آیا IP یک آدرس loopback است یا خیر.

امضاها:
IP.isLoopback() -> bool

مثال‌ها:
ip("127.0.0.1").isLoopback() // true
(نسخه ۰.۲۹.۰)
isMask بررسی می‌کند که آیا CIDR یک subnet mask معتبر است یا خیر.

امضاها:
CIDR.isMask() -> bool

مثال‌ها:
cidr("255.255.255.0/24").isMask() // true
(نسخه ۰.۲۹.۰)
isUnspecified بررسی می‌کند که آیا IP یک آدرس نامشخص است یا خیر (مثلاً 0.0.0.0 ).

امضاها:
IP.isUnspecified() -> bool

مثال‌ها:
ip("0.0.0.0").isUnspecified() // true
(نسخه ۰.۲۹.۰)
masked بلوک CIDR ماسک‌شده را برمی‌گرداند.

امضاها:
CIDR.masked() -> CIDR

مثال‌ها:
cidr("192.168.0.1/24").masked() // 192.168.0.0/24
(نسخه ۰.۲۹.۰)
prefixLength طول پیشوند بلوک CIDR را برمی‌گرداند.

امضاها:
CIDR.prefixLength() -> int

مثال‌ها:
cidr("192.168.0.0/24").prefixLength() // 24
(نسخه ۰.۲۹.۰)
string IP یا CIDR را به رشته تبدیل می‌کند.

امضاها:
string(IP) -> string
string(CIDR) -> string

مثال‌ها:
string(ip("192.168.0.1")) // "192.168.0.1"
(نسخه ۰.۲۹.۰)

نحوه فعال کردن

  • برو: تابع ext.Network() را به cel.NewEnv() ارسال کن.
  • سی پلاس پلاس: پشتیبانی نمی‌شود.
  • جاوا: پشتیبانی نمی‌شود.
  • پایتون: پشتیبانی نمی‌شود.

۵. ویژگی‌های پیشرفته

خلاصه ویژگی‌های پیشرفته

ویژگی توضیحات برو سی++ جاوا پایتون سی
ارزیابی جزئی با ورودی‌های ناموجود ارزیابی کنید؛ مقادیر مجهول یا یک عبارت ساده‌شده را برمی‌گرداند. ³
ارزیابی ناهمزمان اجرای همزمان توابع افزونه بدون انسداد. ✓⁶
اعتبارسنج‌های AST تحلیل استاتیک پس از بررسی نوع، AST بررسی‌شده را بررسی می‌کند.
بهینه‌سازهای AST بازنویسی‌های AST (تا کردن مداوم، درون‌خطی کردن، CSE) برای بهبود عملکرد.
کامپایلر سیاست CEL ساختارهای سیاست مبتنی بر YAML را در ASTهای استاندارد CEL کامپایل می‌کند.

³ زبان Go از تولید یک AST باقیمانده (AST هرس شده) پشتیبانی می‌کند. ⁴ زبان‌های C++ و Java از برگرداندن UnknownSet / CelUnknownSet در زمان اجرا پشتیبانی می‌کنند، اما APIهای عمومی را برای تولید AST باقیمانده در معرض نمایش قرار نمی‌دهند. ⁵ زبان Go از کانال‌های برگشتی AsyncBinding / AsyncOp استفاده می‌کند. ⁶ زبان جاوا CelAsyncRuntime برای برگرداندن ListenableFuture استفاده می‌کند.

ارزیابی جزئی (نامشخص‌ها)

ارزیابی جزئی امکان ارزیابی یک عبارت را زمانی فراهم می‌کند که فقط زیرمجموعه‌ای از متغیرهای ورودی (آرگومان‌ها) شناخته شده باشند. به جای شکست، ارزیابی نتیجه‌ای را تولید می‌کند که نشان می‌دهد چه چیزی از قلم افتاده است، یا یک عبارت ساده شده.

  • Go: پشتیبانی کامل. امکان تعریف یک PartialActivation با الگوهایی از ویژگی‌های ناشناخته را فراهم می‌کند. ارزیابی مقدار types.Unknown را برمی‌گرداند. Go از تولید یک AST باقیمانده ( Env.ResidualAst ) پشتیبانی می‌کند که یک AST هرس شده و ساده شده است که فقط شامل بخش‌هایی از عبارت است که نمی‌توانند ارزیابی شوند.
  • ++C: از مقادیر Unknown پشتیبانی می‌کند. الگوهای ویژگی ناشناخته از طریق Activation::set_unknown_attribute_patterns پیکربندی می‌شوند. ارزیابی یک UnknownSet را برمی‌گرداند. API عمومی در حال حاضر نسل AST باقیمانده را در معرض نمایش قرار نمی‌دهد.
  • جاوا: از ارزیابی جزئی از طریق PartialVars ارسال شده به Program.eval() پشتیبانی می‌کند. ارزیابی یک CelUnknownSet برمی‌گرداند. API عمومی در حال حاضر نسل AST باقیمانده را افشا نمی‌کند.
  • پایتون / سی: پشتیبانی بومی ندارد.

ارزیابی ناهمزمان

ارزیابی ناهمگام به عبارات CEL اجازه می‌دهد تا توابعی را که به صورت ناهمگام اجرا می‌شوند (مثلاً ایجاد RPC یا پرس‌وجوهای پایگاه داده) فراخوانی کنند و ارزیابی را تا زمان در دسترس بودن نتایج مسدود کنند، بدون اینکه نخ اجرای اصلی مسدود شود.

  • Go: از سربارگذاری توابع غیرهمزمان از طریق AsyncBinding و AsyncOp پشتیبانی می‌کند. توابع غیرهمزمان یک کانال Go ( <-chan ref.Val ) برمی‌گردانند و مفسر، اجرای همزمان و همگام‌سازی را مدیریت می‌کند.
  • جاوا: از ارزیابی غیرهمزمان (async) از طریق CelAsyncRuntime و AsyncProgram پشتیبانی می‌کند. از ListenableFuture برای نمایش مقادیر در حال انتظار استفاده می‌کند و به طور خودکار ارزیابی را به سمت تکمیل همزمان با حل و فصل آینده هدایت می‌کند.
  • سی‌پلاس‌پلاس / پایتون / سی: پشتیبانی داخلی ندارد.

اعتبارسنج‌های AST

اعتبارسنج‌ها پس از بررسی نوع، تحلیل استاتیکی روی Checked AST انجام می‌دهند تا محدودیت‌های خاص دامنه را قبل از اجرای برنامه اعمال کنند.

  • Go: از رابط ASTValidator پشتیبانی می‌کند. اعتبارسنج‌های متعارف شامل cel.validator.duration ، cel.validator.timestamp ، cel.validator.matches (regex)، cel.validator.homogeneous_literals و cel.validator.comprehension_nesting_limit هستند.
  • ++C: از cel::Validator پشتیبانی می‌کند. اعتبارسنجی‌های متعارف شامل AstDepthValidator ، ComprehensionNestingLimitValidator ، DurationLiteralValidator ، HomogeneousLiteralValidator ، MatchesValidator و TimestampLiteralValidator می‌شوند.
  • جاوا: CelValidator و CelAstValidator پشتیبانی می‌کند. اعتبارسنج‌های متعارف شامل AstDepthLimitValidator ، ComprehensionNestingLimitValidator ، DurationLiteralValidator ، HomogeneousLiteralValidator ، RegexLiteralValidator و TimestampLiteralValidator هستند.
  • پایتون / سی: پشتیبانی مستقیمی وجود ندارد.

بهینه‌سازهای AST

بهینه‌سازها AST را برای بهبود عملکرد اجرا بازنویسی می‌کنند. بهینه‌سازها در یکی از دو دسته قرار می‌گیرند: بهینه‌سازهای ایستا و زمان اجرا. ++C، جاوا و Go از بهینه‌سازی زمان اجرا پشتیبانی می‌کنند. CEL جاوا و Go نیز از بهینه‌سازهای ایستا پشتیبانی می‌کنند. بهینه‌سازی‌های معمول شامل تاخوردگی ثابت (پیش‌ارزیابی زیرعبارات با ورودی‌های ثابت) و حذف زیرعبارات مشترک (CSE) است.

  • Go: از تا کردن AST در حین کامپایل/برنامه‌ریزی پشتیبانی می‌کند.
  • سی پلاس پلاس: از تا شدن مداوم (constant folding) از طریق افزونه‌ی cel::extensions::EnableConstantFolding در زمان برنامه‌ریزی پشتیبانی می‌کند.
  • جاوا: از رابط CelOptimizer پشتیبانی می‌کند. بهینه‌سازهای متعارف شامل ConstantFoldingOptimizer (که می‌تواند شاخه‌های اتصال کوتاه را با شبیه‌سازی ارزیابی جزئی تا کند)، InliningOptimizer و SubexpressionOptimizer (CSE) هستند.
  • پایتون / سی: پشتیبانی مستقیمی وجود ندارد.

کامپایلر سیاست CEL

سیاست CEL یک قالب مبتنی بر YAML برای ترکیب چندین عبارت CEL به همراه متغیرها، بلوک‌های تطبیق، خروجی‌های شرطی و قوانین تو در تو است. این سیاست برای موتورهای سیاست پیچیده (مانند کنترل پذیرش Kubernetes) طراحی شده است که در آنها عبارات CEL منفرد غیرقابل خواندن می‌شوند.

کامپایلر سیاست، این سیاست‌های YAML را در یک استاندارد واحد CEL AST کامپایل می‌کند، به این معنی که آنها کاملاً با زمان‌های اجرای استاندارد CEL سازگار هستند و تمام ضمانت‌های عملکرد و ایمنی را به ارث می‌برند.

  • برو: از طریق third_party/cel/go/policy پشتیبانی می‌شود.
  • ++C: از طریق third_party/cel/cpp/policy پشتیبانی می‌شود.
  • جاوا: از طریق third_party/java/cel/policy پشتیبانی می‌شود.
  • پایتون / سی: مستقیماً پشتیبانی نمی‌شود.