Size: a a a

Compiler Development

2020 January 04

K

Kir in Compiler Development
Кроме того, нерекурсивный let не позволит мне объявлять рекурсивные парсеры например, которые суть значения, ссылающиеся сами на себя.
источник
2020 January 05

DP

Dmitry Ponyatov in Compiler Development
Михаил Бахтерев
Но мне бы хотелось однообразного синтаксиса с обычной инициализацией. Может, какое-нибудь ¿a = a. Чтобы понимать, что это просто поле... А потом уже уточнять тонкости.
env at: #a put: a
источник

МБ

Михаил Бахтерев in Compiler Development
Kir
А я по-прежнему не вижу необходимости в нерекурсивном let. Это самый let меня в окамле/F# просто достал, в т.ч., ограничениями на рекурсию значений. Когда я через F# computation expressions пытался сделать http://hackage.haskell.org/package/base-4.12.0.0/docs/Control-Monad-Fix.html#v:mfix, я проклял всё. В итоге, использование того, что получилось, выглядело как месиво из функций, lazy/force и было невместно для демонстрации в приличном обществе.
Так для энергичных языков свои варианты fix должны быть. Z-комбинатор, например. Понятное дело, что дословно очень тяжело переписывать.
источник

K

Kir in Compiler Development
Вот я и хочу сделать ленивый язык, чтобы не пришлось всё это как-то туда костылить.
источник

K

Kir in Compiler Development
Даже компилятор fsharp кое-где разбивает рекурсивные значения вставкой lazy/force.
источник

МБ

Михаил Бахтерев in Compiler Development
Так, собственно, никто и не возражает, мне кажется :) Пожелание только о том, чтобы аккуратно работать со scope-ами. А то в ленивых языках это может снести весь мозг программисту. Возникающая при построении структуры проблема с {a = a} признак того, что, возможно, в scope-ах не всё гладко.
источник

K

Kir in Compiler Development
Ну, я с ленивыми языкам работаю давно, мне такие вещи уже кажутся естественными.
источник

YS

Yuriy Syrovetskiy in Compiler Development
Михаил Бахтерев
Так, собственно, никто и не возражает, мне кажется :) Пожелание только о том, чтобы аккуратно работать со scope-ами. А то в ленивых языках это может снести весь мозг программисту. Возникающая при построении структуры проблема с {a = a} признак того, что, возможно, в scope-ах не всё гладко.
идея в том, чтобы структура неявно строилась по набору определений. для определений рекурсия как раз более естественна
источник

VK

Val Krylov in Compiler Development
Kir
Вас бы сильно задолбало, если бы
1) любое имя было бы импортировано явно (кроме встроенных функций)?
2) перед каждым импортируемым именем не-модуля в списке импорта пришлось бы писать use?

Т.е., либо

let
 import data.list as { use sort, use group }

sort (group [1,2,3,3,2,1])

либо

let
 import data.list as list

list.sort (list.group [1,2,3,3,2,1])

либо, для ненавидящих пунктуацию

let
 import data.list as module
   use sort
   use group

sort (group [1,2,3,3,2,1])

?
Смотря какая ниша. Для предметки или REPL желательно иметь wildcard imports. Как питоновское:
from math import *
источник

МБ

Михаил Бахтерев in Compiler Development
Может, кстати, и не нужно тащить семантику let в конструкторы структур. По идее, сама структура нового scope не создаёт. И когда мы пишем {foo = a}, то foo - это не имя переменной (как в let), а имя функции доступа к полю. Вероятно, если хочется рекурсии, должно быть так: let x = {a = a x, foo = b}, или что-то в этом роде.
источник

МБ

Михаил Бахтерев in Compiler Development
Yuriy Syrovetskiy
идея в том, чтобы структура неявно строилась по набору определений. для определений рекурсия как раз более естественна
Таки я ж и не против. Я ж говорю, что с логикой скопов что-то не так в этой конкретной реализации. А не о том, что ленивость и рекурсия - это плохо. Это хорошо. Но с ленивыми вычислениями надо быть очень точными и осторожными в семантике. Иначе взрыв-башка.
источник

K

Kir in Compiler Development
Val Krylov
Смотря какая ниша. Для предметки или REPL желательно иметь wildcard imports. Как питоновское:
from math import *
Было бы удобно, да. Но для js, в котором wildcard imports есть, от них рекомендуют отказываться, потому что dead code elimination и все дела. Да и грепать в попытке выяснить, откуда взялся этот foo - такое себе удовольствие.
источник

МБ

Михаил Бахтерев in Compiler Development
В Go импорт модулей сделан идеально, imho. Чуть похуже в Clojure. Надо брать оттуда пример
источник

K

Kir in Compiler Development
Скоупы у меня появились потому, что в промежуточном языке у меня объект это let ... in {...exported-names}, для унификации let-блока и "объектов"
источник

МБ

Михаил Бахтерев in Compiler Development
Люди специально заморачивались там.
источник

K

Kir in Compiler Development
А получился "объект" в виде списка захвата потому, что мне надо было как-то делать приватные функции, а самый простой способ - через let.
источник

МБ

Михаил Бахтерев in Compiler Development
let - это создание локального скопа. А объекты - это замыкания, штуки, которые запоминают скопы. Они ортогональны в некотором смысле. И их смешивать... Ну. Как бы, что-то, не сходится.
источник

K

Kir in Compiler Development
Михаил Бахтерев
Люди специально заморачивались там.
В итоге у них там есть wildcard import
import (
 . "foo/bar"
)
источник

K

Kir in Compiler Development
Я бы сказал, что let - это объект + действие в его контексте.
источник

K

Kir in Compiler Development
Если считать объектом замыкание.
источник