Przejdź do treści

olski.cennik

Cennik: co w tej gramatyce jest nacechowane i ile to kosztuje.

Koszt porządkuje czytania i werdyktu nie rusza; czym jest i czego nie robi, mówi docs/disambiguation.md#kolejność-czytań-ustala-koszt-i-późne-domknięcie.

Produkcja nazywa tutaj pozycje, którymi płaci, a ceny nie wypisuje (olski.grammar.Production.koszty). Kalibracja jest przez to edycją jednego pliku, a czytelnik strony dostaje pod czytaniem nazwy obok liczb: to, za co ono płaci, i to, ile płaci razem (witryna/skrypt.js).

Cena jest deklaracją o polszczyźnie, a nie częstością wziętą z korpusu: mówi, że jedno czytanie tego samego napisu jest zwyklejsze od drugiego. Czytania porządkuje suma pozycji po całym drzewie (razem), więc pozycja policzona przy korzeniu waży tyle samo, co pozycja spod niego. Rozstrzyga przy tym porządek, w jakim pozycje stoją, a nie wysokość stawek, i mówi to pomiar wariantami tej tabeli (docs/disambiguation.md#kolejność-czytań-ustala-koszt-i-późne-domknięcie).

Obie rodziny pozycji płaci się na miejscu: pozycję produkcji ciało, które ją nosi, a pozycję morfologii liść, na którym forma stoi (olski.parse.czytanie.Leaf.koszty). Wyżej żadna z nich nie idzie, bo suma bierze je spod całego drzewa.

OKOLICZNIK = 'okolicznik' module-attribute

PRZESTAWIENIE = 'przestawienie' module-attribute

WYSUNIĘTY_ORZECZNIK = 'wysunięty orzecznik' module-attribute

CZASOWNIK_PRZED_PODMIOTEM = 'czasownik przed podmiotem' module-attribute

OPUSZCZONY_PODMIOT = 'opuszczony podmiot' module-attribute

WYSUNIĘTE_DOPEŁNIENIE_BEZOKOLICZNIKA = 'wysunięte dopełnienie bezokolicznika' module-attribute

PRZYSŁÓWEK_PRZED_PRZYSŁÓWKIEM = 'przysłówek przed przysłówkiem' module-attribute

CZĄSTKA_PRZED_OKOLICZNIKIEM = 'cząstka przed okolicznikiem' module-attribute

FORMA_SPOZA_REJESTRU = 'forma spoza rejestru' module-attribute

CENNIK = {PRZESTAWIENIE: 100, OKOLICZNIK: 100, WYSUNIĘTY_ORZECZNIK: 100, CZASOWNIK_PRZED_PODMIOTEM: 100, PRZYSŁÓWEK_PRZED_PRZYSŁÓWKIEM: 100, CZĄSTKA_PRZED_OKOLICZNIKIEM: 100, OPUSZCZONY_PODMIOT: 200, WYSUNIĘTE_DOPEŁNIENIE_BEZOKOLICZNIKA: 200, FORMA_SPOZA_REJESTRU: 100} module-attribute

cena(nazwa)

Cena pozycji o tej nazwie.

Nazwa nieznana podnosi wyjątek, zamiast kosztować zero: literówka w deklaracji przemilczana zdejmowałaby cenę i nie byłoby tego widać po niczym poza kolejnością czytań.

Source code in olski/cennik.py
83
84
85
86
87
88
89
90
91
92
93
def cena(nazwa: str) -> int:
    """Cena pozycji o tej nazwie.

    Nazwa nieznana podnosi wyjątek, zamiast kosztować zero:
    literówka w deklaracji przemilczana zdejmowałaby cenę
    i nie byłoby tego widać po niczym poza kolejnością czytań.
    """
    try:
        return CENNIK[nazwa]
    except KeyError:
        raise KeyError(f"cennik nie ma pozycji o nazwie {nazwa!r}") from None

suma(koszty)

Ile płaci ten, kto płaci tymi pozycjami; pozycja powtórzona płaci tyle razy.

Source code in olski/cennik.py
96
97
98
def suma(koszty: Iterable[str]) -> int:
    """Ile płaci ten, kto płaci tymi pozycjami; pozycja powtórzona płaci tyle razy."""
    return sum(cena(nazwa) for nazwa in koszty)

razem(policzone)

Ile płaci czytanie o tym rachunku (rachunek).

Liczba ta jest miejscem w kolejce: las porządkuje czytania sumą cennika po całym drzewie (docs/disambiguation.md#kolejność-czytań-ustala-koszt-i-późne-domknięcie), więc rachunek wypisany bez niej mówi, za co czytanie płaci, i przemilcza, czemu stoi tam, gdzie stoi.

Source code in olski/cennik.py
101
102
103
104
105
106
107
108
109
def razem(policzone: Iterable[tuple[str, int]]) -> int:
    """Ile płaci czytanie o tym rachunku (:func:`rachunek`).

    Liczba ta jest miejscem w kolejce: las porządkuje czytania sumą cennika po
    całym drzewie (``docs/disambiguation.md#kolejność-czytań-ustala-koszt-i-późne-domknięcie``),
    więc rachunek wypisany bez niej mówi, za co czytanie płaci, i przemilcza,
    czemu stoi tam, gdzie stoi.
    """
    return sum(cena(nazwa) * ile for nazwa, ile in policzone)

rachunek(koszty)

Te pozycje policzone — nazwa wraz z liczbą wystąpień — w kolejności CENNIK.

Nazwy przychodzą tu sprawdzone, bo płaci nimi produkcja (olski.grammar.Production) albo kwalifikator (olski/rejestr.py), a obie drogi wołają wcześniej cena.

Source code in olski/cennik.py
112
113
114
115
116
117
118
119
120
def rachunek(koszty: Iterable[str]) -> tuple[tuple[str, int], ...]:
    """Te pozycje policzone — nazwa wraz z liczbą wystąpień — w kolejności :data:`CENNIK`.

    Nazwy przychodzą tu sprawdzone, bo płaci nimi produkcja
    (:class:`olski.grammar.Production`) albo kwalifikator (``olski/rejestr.py``),
    a obie drogi wołają wcześniej :func:`cena`.
    """
    ile = Counter(koszty)
    return tuple((nazwa, ile[nazwa]) for nazwa in CENNIK if nazwa in ile)