Size: a a a

Compiler Development

2020 January 05

K

Kir in Compiler Development
Так-то let тоже создаёт замыкание.
источник

K

Kir in Compiler Development
если есть какой-то оператор open (object, expr), то let можно выразить через него.
источник

K

Kir in Compiler Development
По крайней мере, в чистом языке без мутаций
источник

МБ

Михаил Бахтерев in Compiler Development
Ну... Как бы... С натяжечкой можно и так сказать. Но по смыслу let x = V in E - это (если без рекурсии), просто (\x -> E) V
источник

K

Kir in Compiler Development
Кстати, надо будет добавить варнинг на variable shadowing.

Ну так это и есть создание замыкания, разве нет?
источник

МБ

Михаил Бахтерев in Compiler Development
Создание и применение сразу. То есть, просто выражение.
источник

K

Kir in Compiler Development
open(V as x, E)
источник

K

Kir in Compiler Development
Ещё вопрос: сильно бы вас задолбало, если бы язык нудел варнингами про variable shadowing и затыкался бы только тогда, когда вы руками к объявлению имени припишете shadows?

let
 a = 2
in
 let
   a = 3
 in
   ...


->

let
 a = 2
in
 let
   shadows a = 3
 in
   ...
источник

МБ

Михаил Бахтерев in Compiler Development
Насколько мне известно, это всё же другое. Это ближе к понятию модулей (к которым близки объекты). let можно так выразить, но тогда начнётся беда с рекурсиями, поэтому для модулей и делают специальный open.
источник

K

Kir in Compiler Development
Ну, в моём случае беды с рекурсией не начнётся, слава ленивому порядку вычисления)
источник

МБ

Михаил Бахтерев in Compiler Development
Это ваще должно быть ошибкой :) Shadowing - беда бедовая иногда.
источник

K

Kir in Compiler Development
Точно, надо сделать ошибкой.
источник

K

Kir in Compiler Development
И варнинг если shadows a doesn't shadow anything
источник

МБ

Михаил Бахтерев in Compiler Development
Если что, я пошутил. Не бейте потом. Но у меня были несколько раз дикие косяки из-за этого. Просто не замечал, что переменную unshadow, а потом несколько дней искал, что ж у меня зависает-то всё намертво.
источник

K

Kir in Compiler Development
Я ещё и импорты сделал в виде паттерн-матчинга содержимого модулей-объектов.

Да, я тоже иногда писал

... intro a
let a = ... a ...


но поскольку я после каждого малого изменения всё перезапускаю, мне сразу становилось понятно, что и примерно где случилось. Пока писал парсер, случайно сделал один леворекурсивным, только через 5 минут нашёл, где.
источник

K

Kir in Compiler Development
> Я ещё и импорты сделал в виде паттерн-матчинга содержимого модулей-объектов.

Что позволило унифицировать, например rename в pm и rename в импортах
источник

K

Kir in Compiler Development
Думал ещё сделать сами модули взаимно-рекурсивными, но это кмк перебор
источник

K

Kir in Compiler Development
Потому что рекурсия в зависимостях не рефакторится от слова совсем.
источник

МБ

Михаил Бахтерев in Compiler Development
Kir
Ну, в моём случае беды с рекурсией не начнётся, слава ленивому порядку вычисления)
Порядок вычислений этой проблеме ортогонален, если я верно помню. В общем, я бы действовал по классике. let - отдельно, объекты/модули - отдельно, уже как стандартная надстройка.
источник

K

Kir in Compiler Development
Опять же, сильно помогает, что у меня в языке не планируется побочных эффектов, запуска init() при прогрузке модуля и т.д...
источник