1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/LaomoBK-ail

Клонировать/Скачать
2_3.md 8.1 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 29.11.2024 19:57 864373e

AIL 2.3 Diona

Разработка AIL версии 2.3 началась в марте 2022 года. Ниже приведены основные обновления, исправления и изменения в AIL версии 2.3 на данный момент.

== Обновления ==

yield

Оператор 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

Оператор 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;
}

Импорт Python

Версия AIL 2.3 включает операторы импорта и импорта из Python, используемые для импорта модулей Python.

import! os;  // импортировать один модуль Python
improt! a, b, c;  // импорт нескольких модулей Python

from os import path; // импортировать отдельный член модуля Python
from typing import List, Tuple;  // импортировать несколько членов модуля Python

file

В версии 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 $

namespace

В AIL 2.3 пользователи могут использовать оператор namespace для определения пространства имён:

namespace Apple {
    os = 'MacOS';
    computer = 'Mac';
}

namespace Microsoft {
    os = 'Windows';
    computer = 'PC';
}

Дополнительные сведения о пространстве имён см. в документе с описанием пространства имён (./reference/namespace.md).

ShadowAssign

В 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)

== Исправления ==

  • Нет информации о конкретных исправлениях.

== Оптимизация ==

name атрибут модуля

Ранее, при попытке доступа к несуществующему члену модуля, возникало исключение:

>> 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 порядок поиска модулей следующий:

  1. Текущий каталог модуля (отсутствует в режиме AIL Shell)
  2. Текущий рабочий каталог, в режиме AIL Shell это '.'
  3. Собственные модули AIL ($(AIL_ROOT)/module/)
  4. Стандартная библиотека AIL ($(AIL_ROOT)/lib/)

Встроенные функции

  • Переименования: eval -> evaluate

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/LaomoBK-ail.git
git@api.gitlife.ru:oschina-mirror/LaomoBK-ail.git
oschina-mirror
LaomoBK-ail
LaomoBK-ail
3.0