Текущее состояние моделей отсортированных по хорошести
https://paperswithcode.com/sota/multi-task-language-understanding-on-mmlu
https://paperswithcode.com/sota/multi-task-language-understanding-on-mmlu
Очень быстрый гайд по написанию фронтенда языка, пишем лексер(токенайзер), он нужен чтобы превращать неразборчивую писанину в цепочки токенов, типа
s_aS =
0.3432345f
в
[Identifier Equel Float]
Чтобы потом с ними можно было удобнее работать, сохраняем в токенах номер строки и начальную позицию токена, чтобы выдавать юзверам адекватные ошибки
Сам лексер хранит текущую позицию и возможно вам понадобится хранить количество пробелов текущей строки, если хотите сделать чтобы отступы чего то значили.
Нам понадобится набор базовых функций
1) step — поглащает следующие n символов, то есть
ab^cde
^ - курсор
step(2) вернет cd
abcd^e
2) peek — как step но не поглащает, нужна чтобы проверять что там впереди
ab^cde, peek(2) -> cd, ab^cde
3) check(str: string, distance: int): bool — хелпер чтоб проверять что в переди то что мы ожидаем, использует peek
4) match — ровно тоже самое что check, но поглащает строку
^if(sas)
match("if") -> true, if^(sas)
Воот, это база, следующий выпуск завтра
s_aS =
0.3432345f
в
[Identifier Equel Float]
Чтобы потом с ними можно было удобнее работать, сохраняем в токенах номер строки и начальную позицию токена, чтобы выдавать юзверам адекватные ошибки
Сам лексер хранит текущую позицию и возможно вам понадобится хранить количество пробелов текущей строки, если хотите сделать чтобы отступы чего то значили.
Нам понадобится набор базовых функций
1) step — поглащает следующие n символов, то есть
ab^cde
^ - курсор
step(2) вернет cd
abcd^e
2) peek — как step но не поглащает, нужна чтобы проверять что там впереди
ab^cde, peek(2) -> cd, ab^cde
3) check(str: string, distance: int): bool — хелпер чтоб проверять что в переди то что мы ожидаем, использует peek
4) match — ровно тоже самое что check, но поглащает строку
^if(sas)
match("if") -> true, if^(sas)
Воот, это база, следующий выпуск завтра
gavr_sas
Очень быстрый гайд по написанию фронтенда языка, пишем лексер(токенайзер), он нужен чтобы превращать неразборчивую писанину в цепочки токенов, типа s_aS = 0.3432345f в [Identifier Equel Float] Чтобы потом с ними можно было удобнее работать, сохраняем…
Придумайте список токенов на которые делится ваш язык(не АСТ) и напишите парсер для каждой используя базу и несколько хелпер функций вроде isAlphaNumeric для простого парсинга идентификаторов 3
#niva
#niva
gavr_sas
Photo
1) Заготовленные парсеры вроде parseNumber будут мотать ленту пока не распарсят определенный токен
x = ^23.34234
parseNumber -> numToken(23.34234)
x = 23.32234^
2) В цикле while !done() проходим по всем символам, проверяя текущий на какой либо признак и используя эти мини парсеры.
3) И разумеется обкладываем все это тестами, вообще довольно прикольно ставить себе цели добавляя новый еще не работающий тест, а затем делать его рабочим, ага TDD тут очень полезно, в отличии от гуев. #niva
x = ^23.34234
parseNumber -> numToken(23.34234)
x = 23.32234^
2) В цикле while !done() проходим по всем символам, проверяя текущий на какой либо признак и используя эти мини парсеры.
3) И разумеется обкладываем все это тестами, вообще довольно прикольно ставить себе цели добавляя новый еще не работающий тест, а затем делать его рабочим, ага TDD тут очень полезно, в отличии от гуев. #niva
👍1
#KotlinBug
Казалось бы разница в одно ключевое слово
Нно бага, если в таком классе сделать компаньёна, то его инициализатор будет происходить не в статической части, а в обычном конструкторе! то бишь срабатывать каждую инициализацию
Казалось бы разница в одно ключевое слово
value которое делает классы с одним полем зерокостными, тк кк инлайнит это поле вместо класса во всех местах использования.Нно бага, если в таком классе сделать компаньёна, то его инициализатор будет происходить не в статической части, а в обычном конструкторе! то бишь срабатывать каждую инициализацию