AIL 2.3 Diona
Разработка AIL версии 2.3 началась в марте 2022 года. Ниже приведены основные обновления, исправления и изменения в AIL версии 2.3 на данный момент.
Оператор yield используется в теле функции для объявления этой функции как генератора и одновременного выполнения роли передачи данных между сопрограммами. Например, следующая функция gen_random будет выводить 6 случайных чисел в диапазоне от 1 до 100, а затем выдавать исключение StopIteration:
from random import randint;
func gen_random(n) {
foreach _ in range(n) {
sig = yield randint(1, 100);
if sig {
break;
}
}
}
g = gen_random(10);
foreach i, x in enumerate(g) {
print x;
if i > 5 {
g.send(1);
}
}
Оператор yield from используется для делегирования генерации в функции до тех пор, пока делегированный генератор не завершит работу, после чего функция продолжит выполнение. В следующем примере программа будет печатать «Generation finished!» только после того, как последовательно выведет 2, 1, 3, 5, 6, 3:
func f(*args) {
foreach arg in args {
yield from arg;
}
print 'Generation finished!';
}
foreach x in f((2, 1, 3), [5, 6, 3]) {
print x;
}
Версия AIL 2.3 включает операторы импорта и импорта из Python, используемые для импорта модулей Python.
import! os; // импортировать один модуль Python
improt! a, b, c; // импорт нескольких модулей Python
from os import path; // импортировать отдельный член модуля Python
from typing import List, Tuple; // импортировать несколько членов модуля Python
В версии AIL 2.3 можно использовать переменную file, чтобы получить путь к текущему AIL-приложению. Этот путь является путём к файлу, который пользователь использовал для запуска программы.
// ~/foo.ail
print __file__;
Выполнение программы в оболочке:
pi@raspberrypi:~ $ ail ~/foo.ail
~/foo.ail
pi@raspberrypi:~ $ cd ~/ail/ail/core/
pi@raspberrypi:~/ail/ail/core $ ail ../../../foo.ail
../../../foo.ail
pi@raspberrypi:~/ail/ail/core $
В AIL 2.3 пользователи могут использовать оператор namespace для определения пространства имён:
namespace Apple {
os = 'MacOS';
computer = 'Mac';
}
namespace Microsoft {
os = 'Windows';
computer = 'PC';
}
Дополнительные сведения о пространстве имён см. в документе с описанием пространства имён (./reference/namespace.md).
В AIL 2.3 оператор shadow assign может использоваться для поиска переменных в разных областях. Когда используется оператор shadow assign для определения переменной, если правая часть выражения обращается к этой переменной, происходит поиск переменной в области видимости от global до local. Это означает, что при наличии переменной с одинаковым именем в глобальной и локальной области видимости, будет использоваться глобальная переменная. Пример:
a = 1;
func f() {
a = 2;
a := a + 1;
print a; // output: 2
}
По сравнению с ключевым словом global, использование shadow-assign позволяет защитить глобальное значение при использовании глобальной переменной:
// foo.ail
a = 1 // outside a
func f() {
a := a + 1;
print a; // inside a
a = 2;
}
print a;
f();
print a;
Результат:
$ ail foo.ail
1
2
1
Обычно этот оператор используется для получения копии глобальной переменной с тем же именем в пространстве имён:
// bar.ail
a = 10;
namespace N {
a := a;
}
a = 20;
print a;
print N.a;
Результат:
$ ail bar.ail
20
10
Дополнительную информацию об операторе shadow assign см. в описании shadow assign (./reference/shadow-assign.md).
В AIL 2.3 пользователи могут добавлять типы аннотаций к операторам присваивания:
x: int = 10;
Или просто объявлять переменные:
y: int;
В этом примере y
имеет смысл, и в некоторых случаях y
будет сохранён Python во время выполнения в __annotations__
:
>> class C { y: int; }
>> C.__annotations__
{'y': <class 'int'>}
>>
Эту функцию можно использовать для выполнения некоторых операций, например, для создания класса данных с помощью декоратора dataclass Python:
from dataclasses import dataclass;
@dataclass;
class Student {
name: str;
class_: str;
score: int;
rank: int;
}
std = Student('Klee', '1910', 750, 1);
print std;
Вывод:
Student(name='Klee', class_='1910', score=750, rank=1)
Ранее, при попытке доступа к несуществующему члену модуля, возникало исключение:
>> import 'maptools'
>> maptools.x
Traceback (most recent call last):
File "<shell>", line 1, in <module>
AttributeError: 'AILModule' object has no attribute 'x'
Разработчики не могли определить, какой именно модуль был неправильно использован.
Однако в AIL 2.3 при неправильном доступе к члену модуля возникает следующее сообщение:
>> import 'maptools'
>> maptools.x
Traceback (most recent call last):
File "<shell>", line 1, in <module>
AttributeError: 'AIL Module [maptools]' object has no attribute 'x'
Это позволяет разработчикам точно определить, какой модуль вызвал ошибку.
Начиная с AIL 2.3 порядок поиска модулей следующий:
eval
-> evaluate
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )