Skip to content

Commit db3bff9

Browse files
committed
Добавлена поддержка лямбда выражений без параметров
1 parent 742bad4 commit db3bff9

9 files changed

+126
-6
lines changed

README.md

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -68,9 +68,11 @@
6868
1. Предоставить возможность не писать возврат в однострочных лямбда выражениях вашим потребителям, если это функция
6969

7070
В составе библиотеки поставляет ряд функциональных интерфейсов (в модуле `ФункциональныеИнтерфейсы`):
71+
1. Вызываемый - Функция `Вызвать` без параметров
7172
1. УниФункция - Функция `Применить` с одним параметром
7273
1. БиФункция - Функция `Применить` с двумя параметром
7374
1. ТриФункция - Функция `Применить` с тремя параметром
75+
1. Запускаемый - Процедура `Запустить` без параметров
7476
1. УниПроцедура - Процедура `Принять` с одним параметром
7577
1. БиПроцедура - Процедура `Принять` с двумя параметрами
7678
1. ТриПроцедура - Процедура `Принять` с тремя параметрами
@@ -372,6 +374,17 @@
372374

373375
### ФункциональныеИнтерфейсы
374376

377+
#### Вызываемый
378+
379+
```bsl
380+
// Возвращает интерфейс объекта содержащий функцию без параметров
381+
//
382+
// Возвращаемое значение:
383+
// ИнтерфейсОбъекта - Искомый интерфейс
384+
//
385+
Функция Вызываемый() Экспорт
386+
```
387+
375388
#### УниФункция
376389

377390
```bsl
@@ -404,6 +417,16 @@
404417
//
405418
Функция ТриФункция()
406419
```
420+
#### Запускаемый
421+
422+
```bsl
423+
// Возвращает интерфейс объекта содержащий функцию без параметров
424+
//
425+
// Возвращаемое значение:
426+
// ИнтерфейсОбъекта - Искомый интерфейс
427+
//
428+
Функция Запускаемый() Экспорт
429+
```
407430

408431
#### УниПроцедура
409432

packagedef

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
Описание.Имя("lambdas")
2-
.Версия("0.1.2")
2+
.Версия("0.1.3")
33
.Автор("Кирилл Черненко")
44
.АдресАвтора("https://github.com/sfaqer")
55
.Описание("API для реализации функциональных интерфейсов для OneScript")
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Функция Вызвать() Экспорт // BSLLS:FunctionShouldHaveReturn-off
2+
КонецФункции
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Процедура Запустить() Экспорт
2+
КонецПроцедуры

src/internal/Модули/ЛямбдыКешируемыеЗначения.os

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
Если ЭтоЛямбдаВыражение = Неопределено Тогда
77

88
ЭтоЛямбдаВыражение = Новый РегулярноеВыражение(
9-
"\(?\s*([^)]+)\s*\)?\s*->\s*\{?([^\}]+)\}?"
9+
"\(?\s*([^)]*)\s*\)?\s*->\s*\{?([^\}]+)\}?"
1010
);
1111

1212
КонецЕсли;

src/Классы/ЛямбдаВыражение.os

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -189,10 +189,11 @@
189189
КонецЕсли;
190190

191191
Совпадения = ЭтоЛямбдаВыражение.НайтиСовпадения(Выражение);
192-
192+
193193
РазобранноеВыражение.Параметры = СтрРазделить(
194194
Совпадения[0].Группы[1].Значение,
195-
","
195+
",",
196+
Ложь
196197
);
197198

198199
РазобранноеВыражение.Тело = Совпадения[0].Группы[2].Значение;
@@ -206,7 +207,9 @@
206207

207208
Если ЭтоФункция Тогда
208209

209-
Если КоличествоПараметров = 1 Тогда
210+
Если КоличествоПараметров = 0 Тогда
211+
мИнтерфейс = ФункциональныеИнтерфейсы.Вызываемый();
212+
ИначеЕсли КоличествоПараметров = 1 Тогда
210213
мИнтерфейс = ФункциональныеИнтерфейсы.УниФункция();
211214
ИначеЕсли КоличествоПараметров = 2 Тогда // BSLLS:MagicNumber-off
212215
мИнтерфейс = ФункциональныеИнтерфейсы.БиФункция();
@@ -216,7 +219,9 @@
216219

217220
Иначе
218221

219-
Если КоличествоПараметров = 1 Тогда
222+
Если КоличествоПараметров = 0 Тогда
223+
мИнтерфейс = ФункциональныеИнтерфейсы.Запускаемый();
224+
ИначеЕсли КоличествоПараметров = 1 Тогда
220225
мИнтерфейс = ФункциональныеИнтерфейсы.УниПроцедура();
221226
ИначеЕсли КоличествоПараметров = 2 Тогда // BSLLS:MagicNumber-off
222227
мИнтерфейс = ФункциональныеИнтерфейсы.БиПроцедура();

src/Модули/ФункциональныеИнтерфейсы.os

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,31 @@
11
#Использовать reflector
22
#Использовать "../internal"
33

4+
Перем Вызываемый; // Кеш интерфейса Вызываемый
45
Перем УниФункция; // Кеш интерфейса УниФункция
56
Перем БиФункция; // Кеш интерфейса БиФункция
67
Перем ТриФункция; // Кеш интерфейса ТриФункция
8+
Перем Запускаемый; // Кеш интерфейса Запускаемый
79
Перем УниПроцедура; // Кеш интерфейса УниПроцедура
810
Перем БиПроцедура; // Кеш интерфейса БиПроцедура
911
Перем ТриПроцедура; // Кеш интерфейса ТриПроцедура
1012

13+
// Возвращает интерфейс объекта содержащий функцию без параметров
14+
//
15+
// Возвращаемое значение:
16+
// ИнтерфейсОбъекта - Искомый интерфейс
17+
//
18+
Функция Вызываемый() Экспорт
19+
20+
Если Не ЗначениеЗаполнено(Вызываемый) Тогда
21+
Вызываемый = Новый ИнтерфейсОбъекта();
22+
Вызываемый.ИзОбъекта(Тип("Вызываемый"));
23+
КонецЕсли;
24+
25+
Возврат Вызываемый;
26+
27+
КонецФункции
28+
1129
// Возвращает интерфейс объекта содержащий функцию с одним параметром
1230
//
1331
// Возвращаемое значение:
@@ -56,6 +74,22 @@
5674

5775
КонецФункции
5876

77+
// Возвращает интерфейс объекта содержащий процедуру без параметров
78+
//
79+
// Возвращаемое значение:
80+
// ИнтерфейсОбъекта - Искомый интерфейс
81+
//
82+
Функция Запускаемый() Экспорт
83+
84+
Если Не ЗначениеЗаполнено(Запускаемый) Тогда
85+
Запускаемый = Новый ИнтерфейсОбъекта();
86+
Запускаемый.ИзОбъекта(Тип("Запускаемый"));
87+
КонецЕсли;
88+
89+
Возврат Запускаемый;
90+
91+
КонецФункции
92+
5993
// Возвращает интерфейс объекта содержащий процедуру с одним параметром
6094
//
6195
// Возвращаемое значение:

tests/ЛямбдаВыражение.os

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,6 +280,24 @@
280280

281281
КонецПроцедуры
282282

283+
&Тест
284+
Процедура ОпределяетсяИнтерфейсДляФункцииБезПараметров() Экспорт
285+
286+
// Дано
287+
288+
ЛямбдаВыражение = Новый ЛямбдаВыражение(" -> Возврат 1");
289+
290+
// Когда
291+
292+
ЛямбдаВыражение.ВОбъект();
293+
294+
// Тогда
295+
296+
Ожидаем.Что(Рефлектор.ПолучитьСвойство(ЛямбдаВыражение, "мИнтерфейс"))
297+
.Равно(ФункциональныеИнтерфейсы.Вызываемый());
298+
299+
КонецПроцедуры
300+
283301
&Тест
284302
Процедура ОпределяетсяИнтерфейсДляФункцииСОднимПараметром() Экспорт
285303

@@ -334,6 +352,24 @@
334352

335353
КонецПроцедуры
336354

355+
&Тест
356+
Процедура ОпределяетсяИнтерфейсДляПроцедурыБезПараметров() Экспорт
357+
358+
// Дано
359+
360+
ЛямбдаВыражение = Новый ЛямбдаВыражение(" -> X = 1 = 1");
361+
362+
// Когда
363+
364+
ЛямбдаВыражение.ВОбъект();
365+
366+
// Тогда
367+
368+
Ожидаем.Что(Рефлектор.ПолучитьСвойство(ЛямбдаВыражение, "мИнтерфейс"))
369+
.Равно(ФункциональныеИнтерфейсы.Запускаемый());
370+
371+
КонецПроцедуры
372+
337373
&Тест
338374
Процедура ОпределяетсяИнтерфейсДляПроцедурыСОднимПараметром() Экспорт
339375

tests/ФункциональныеИнтерфейсы.os

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,14 @@
11
#Использовать ".."
22

3+
&Тест
4+
Процедура Вызываемый() Экспорт
5+
6+
Ожидаем.Что(ФункциональныеИнтерфейсы.Вызываемый())
7+
.ИмеетТип("ИнтерфейсОбъекта")
8+
.Равно(ФункциональныеИнтерфейсы.Вызываемый());
9+
10+
КонецПроцедуры
11+
312
&Тест
413
Процедура УниФункция() Экспорт
514

@@ -27,6 +36,15 @@
2736

2837
КонецПроцедуры
2938

39+
&Тест
40+
Процедура Запускаемый() Экспорт
41+
42+
Ожидаем.Что(ФункциональныеИнтерфейсы.Запускаемый())
43+
.ИмеетТип("ИнтерфейсОбъекта")
44+
.Равно(ФункциональныеИнтерфейсы.Запускаемый());
45+
46+
КонецПроцедуры
47+
3048
&Тест
3149
Процедура УниПроцедура() Экспорт
3250

0 commit comments

Comments
 (0)