این سند به عنوان مرجع یکپارچه 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 منعکس شدهاند:
- مشخصات: سل-اسپکترونیک
- برو: سل-گو
- سی++: cel-cpp
- جاوا: سل-جاوا
- پایتون: cel-python
- سی: سل-سی
۱. ماکروهای اصلی
اینها ماکروهای داخلی هستند که در زمان کامپایل گسترش مییابند.
| ماکرو | توضیحات | برو | سی++ | جاوا | پایتون | سی |
|---|---|---|---|---|---|---|
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 -> 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 | ✓ | ✓ | ✓ | ✓ | ✓ |
منطقی ( ! ، && ، || ، ? : :) | توابع منطقی NOT، AND، OR و شرطی سهتایی. AND/OR از ارزیابی اتصال کوتاه استفاده میکنند. امضاها: !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 پشتیبانی نمیشود ، اگرچه سایر عملگرهای حسابی پشتیبانی میشوند.
۳. کارکردهای اصلی
توابع عمومی و رشتهای
| عملکرد | توضیحات | برو | سی++ | جاوا | پایتون | سی |
|---|---|---|---|---|---|---|
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]) -> 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 | ✓ | ✓ | ✓ | ✓ | ✗ |
تبدیل نوع
| نوع هدف | توضیحات | برو | سی++ | جاوا | پایتون | سی |
|---|---|---|---|---|---|---|
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 | به عدد صحیح علامتدار ۶۴ بیتی تبدیل میکند. امضاها: 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 پشتیبانی میکند) <br /><br />**Examples:**<br /> string(1.5) // "1.5"` | ✓ | ✓ | ✓ | ✓ | ✓ |
timestamp | به برچسب زمانی تبدیل میشود. امضاها: timestamp(timestamp) -> timestamptimestamp(string) -> timestamp (RFC3339)مثالها: timestamp("2026-07-23T00:00:00Z") | ✓ | ✓ | ✓ | ✓ | ✓ |
uint | به عدد صحیح بدون علامت ۶۴ بیتی تبدیل میکند. امضاها: 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 | ✓ | ✓ | ✓ | ✓ | ✗ |
۴. افزونهها (کتابخانهها)
کتابخانه صحافی
| عملکرد | توضیحات | برو | سی++ | جاوا | پایتون | سی |
|---|---|---|---|---|---|---|
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()ارسال کن. - سی++:
- کامپایلر:
EncodersCompilerLibrary()را بهCompilerBuilderاضافه کنید. - زمان اجرا: فراخوانی
RegisterEncodersFunctions()رویFunctionRegistry.
- کامپایلر:
- جاوا:
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()ارسال کن. - سی++:
- کامپایلر:
MathCompilerLibrary()را بهCompilerBuilderاضافه کنید. - زمان اجرا: فراخوانی
RegisterMathExtensionFunctions()رویFunctionRegistry.
- کامپایلر:
- جاوا:
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()ارسال کن. - سی++:
- کامپایلر:
ListsCompilerLibrary()را بهCompilerBuilderاضافه کنید. - زمان اجرا: فراخوانی
RegisterListsFunctions()رویFunctionRegistryوRegisterListsMacros()رویMacroRegistry.
- کامپایلر:
- جاوا:
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()ارسال کن. - سی++:
- کامپایلر:
SetsCompilerLibrary()را بهCompilerBuilderاضافه کنید. - زمان اجرا: فراخوانی
RegisterSetsFunctions()رویFunctionRegistry.
- کامپایلر:
- جاوا:
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()ارسال کن. - سی++:
- کامپایلر:
StringsCompilerLibrary()را بهCompilerBuilderاضافه کنید. - زمان اجرا: فراخوانی
RegisterStringsFunctions()رویFunctionRegistry.
- کامپایلر:
- جاوا:
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()ارسال کن. - سی++:
- کامپایلر:
RegexExtCompilerLibrary()را بهCompilerBuilderاضافه کنید. - زمان اجرا: فراخوانی
RegisterRegexExtensionFunctions()رویFunctionRegistry.
- کامپایلر:
- جاوا:
CelExtensions.regex()را به سازندگانCelCompilerوCelRuntimeاضافه کنید. - پایتون: با افزودن
regexوoptionalبه لیستextensions، از طریقcel.EnvConfigفعال کنید.
درک مفاهیم دو متغیره
| ماکرو | توضیحات | برو | سی++ | جاوا | پایتون | سی |
|---|---|---|---|---|---|---|
all | اتصال کوتاه منطقی AND روی کلید/شاخص و مقدار. امضاها: list.all(i, v, pred) -> boolmap.all(k, v, pred) -> boolمثالها: [1, 2].all(i, v, v > 0) // true | ✓ (نسخه ۰.۲۲.۰) | ✓ (نسخه ۰.۱۴.۰) | ✓ (نسخه ۰.۱۱.۰) | ✓ (نسخه ۰.۱.۱) | ✗ |
exists | اتصال کوتاه OR منطقی روی کلید/شاخص و مقدار. امضاها: list.exists(i, v, pred) -> boolmap.exists(k, v, pred) -> boolمثالها: [1, 2].exists(i, v, v == 2) // true | ✓ (نسخه ۰.۲۲.۰) | ✓ (نسخه ۰.۱۴.۰) | ✓ (نسخه ۰.۱۱.۰) | ✓ (نسخه ۰.۱.۱) | ✗ |
existsOne | بررسی میکند که آیا دقیقاً یک جفت، گزاره را ارضا میکند یا خیر. امضاها: list.existsOne(i, v, pred) -> boolmap.existsOne(k, v, pred) -> boolمثالها: [1, 2].existsOne(i, v, v == 2) // true | ✓ (نسخه ۰.۲۲.۰) | ✓ (نسخه ۰.۱۴.۰) | ✓ (نسخه ۰.۱۱.۰) | ✓ (نسخه ۰.۱.۱) | ✗ |
transformList | لیست/نقشه را به یک لیست تبدیل/فیلتر میکند. امضاها: list.transformList(i, v, [filter], transform) -> listmap.transformList(k, v, [filter], transform) -> listمثالها: [1, 2].transformList(i, v, v * 2) // [2, 4] | ✓ (نسخه ۰.۲۲.۰) | ✓ (نسخه ۰.۱۴.۰) | ✓ (نسخه ۰.۱۱.۰) | ✓ (نسخه ۰.۱.۱) | ✗ |
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} | ✓ (نسخه ۰.۲۲.۰) | ✓ (نسخه ۰.۱۴.۰) | ✓ (نسخه ۰.۱۱.۰) | ✓ (نسخه ۰.۱.۱) | ✗ |
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} | ✓ (نسخه ۰.۲۲.۰) | ✓ (نسخه ۰.۱۴.۰) | ✓ (نسخه ۰.۱۱.۰) | ✓ (نسخه ۰.۱.۱) | ✗ |
نحوه فعال کردن
- برو: تابع
ext.TwoVarComprehensions()را بهcel.NewEnv()ارسال کن. - سی++:
- کامپایلر: اضافه کردن
ComprehensionsV2CompilerLibrary()بهCompilerBuilder. - زمان اجرا: فراخوانی
RegisterComprehensionsV2Functions()رویFunctionRegistryوRegisterComprehensionsV2Macros()رویMacroRegistry.
- کامپایلر: اضافه کردن
- جاوا:
CelExtensions.comprehensions()را به سازندگانCelCompilerوCelRuntimeاضافه کنید. - پایتون: با افزودن
two-var-comprehensionsبه لیستextensions، از طریقcel.EnvConfigفعال کنید.
کتابخانه انواع بومی
| ویژگی | توضیحات | برو | سی++ | جاوا | پایتون | سی |
|---|---|---|---|---|---|---|
| سازههای بومی | ثبت و نمونهسازی انواع بومی میزبان (ساختارهای Go / POJOهای جاوا) در CEL. مثالها: Account{id: 123} (جاوا POJO در CEL نمونهسازی شده است) | ✓ (نسخه ۰.۱۳.۰) | ✗ | ✓ (نسخه ۰.۱۳.۰) | ✗ | ✗ |
نحوه فعال کردن
- برو:
ext.NativeTypes(...)(ارائه انواع منعکس کننده) را بهcel.NewEnv()منتقل کن. - سی پلاس پلاس: پشتیبانی نمیشود.
- جاوا:
CelExtensions.nativeTypes()(که کلاسهای جاوا را ارائه میدهد) را به سازندگانCelCompilerوCelRuntimeاضافه کنید. - پایتون: پشتیبانی نمیشود.
کتابخانه شبکه
کتابخانه شبکه توابعی را برای تجزیه، اعتبارسنجی و دستکاری آدرسهای IP و بلوکهای CIDR ارائه میدهد.
| عملکرد | توضیحات | برو | سی++ | جاوا | پایتون | سی |
|---|---|---|---|---|---|---|
ip | یک رشته را به آدرس IP تجزیه میکند، یا IP را از CIDR استخراج میکند. امضاها: ip(string) -> IPCIDR.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) -> boolCIDR.containsIP(string) -> boolمثالها: cidr("192.168.0.0/24").containsIP(ip("192.168.0.1")) // true | ✓ (نسخه ۰.۲۹.۰) | ✗ | ✗ | ✗ | ✗ |
containsCIDR | بررسی میکند که آیا یک بلوک CIDR حاوی بلوک CIDR دیگری است یا خیر. امضاها: CIDR.containsCIDR(CIDR) -> boolCIDR.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) -> stringstring(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پشتیبانی میشود. - پایتون / سی: مستقیماً پشتیبانی نمیشود.