
A
02.09.2018
08:08:23
нет)

Alexander
02.09.2018
08:08:35

alexknvl
02.09.2018
08:08:44
а зачем тебе IORefы в твоём языке?

A
02.09.2018
08:09:22
ну какое-то подобие переменных впилить

Google

Alexander
02.09.2018
08:10:20
локальные переменные можно на StateT, глобальные не нужны
как то так
Впрочем, без монад глобальные таки нужны :(

alexknvl
02.09.2018
08:11:38
State есть, если функции в языке есть

A
02.09.2018
08:11:45
любой State в интерпретаторе, который меняется при работе = память

alexknvl
02.09.2018
08:11:45
т.е. почти всегда
не, юзай State внутри языка
а не в интерпретаторе

A
02.09.2018
08:12:19
типа если ты туда что-то добавил, то оно там так и будет валяться, если сам не почистишь
гц за тебя это не сделает

Alexander
02.09.2018
08:12:29
проблема в том что в глобальном State внезапно не будет работать gc
с другой стороны, чистить глобальный стейт затея так себе, так что наверно пофигу

alexknvl
02.09.2018
08:12:54
статические переменные тоже не собираются обычно

Google

Alexander
02.09.2018
08:13:07
в руби хорошо реализованно, там локальный стейт это объект первого класса

A
02.09.2018
08:13:40
? началось

alexknvl
02.09.2018
08:13:53
@azzaazaa если в языке есть функции, есть StateT, если есть StateT, то есть переменные
и не нужен экстра GC

A
02.09.2018
08:14:27
внутри твоего трансформера что?

alexknvl
02.09.2018
08:15:29
хочу переменную типа X, пишу код в State X

A
02.09.2018
08:16:05
ок, пробграмма твоя перестала эту переменную использовать, что произошло?

Alexander
02.09.2018
08:17:00
Давайте для начала начнем с того, какого рода язык мы имеем?
если там есть переменные, то наверно он отличается от хаскеля, а если отличается то наверно сильнее чем наличием переменных
возможно там даже грязные функции есть

alexknvl
02.09.2018
08:18:46
как я понимаю, он хочет лямбда исчисление, но зачем-то с переменными. я предлагаю использовать просто лямбда исчисление и реализовать переменные с помощью него

A
02.09.2018
08:19:10
эх, ладно, проехали

alexknvl
02.09.2018
08:19:14
переменные становятся просто абстракцией использующей s -> (s, a)
я вижу только три варианта: 1) юзать IORef и хаскельный GC, 2) юзать Map Int Data и писать свой GC, 3) не давать юзеру newIORef и заставлять использовать State внутри языка
можно ещё юзать IORef с reference counting и запретить создание циклических ссылок
ну и аналогично можно и без IORef тогда обойтись

Alexander
02.09.2018
08:33:10
использовать GC Haskell и делать ref counting /0

Terminator
02.09.2018
09:36:18
@nDanshin будет жить. Поприветствуем!

Oleg
02.09.2018
10:10:18
В обычной просто-типизированой лямбде циклические референсы не выразимы, конечно же
В раннем лиспе референс каунтеры внедрили именно потому что была доп-конструкция Cons

Google

Oleg
02.09.2018
10:12:22
Поэтому в общем случае потребность GC выражается доп. конструкциями
Добавляю свой голос в число тех, кто полагает, что если будут циклические, то ничего лучше хост-GC всё равно не сделаешь
Но даже если добавить в язык какой-то fix, можно всё равно сделать референс-каунтинг, учитывающий эти добавленные ссылки
Смысл это всё имеет только если потеря переменной из скоупа должна иметь какую-то семантику в строящемся языке

A
02.09.2018
10:16:51
так разговор не про циклы, а про грязь

Oleg
02.09.2018
10:17:04

A
02.09.2018
10:17:10
ref
var

Oleg
02.09.2018
10:17:22
А что с ними?

A
02.09.2018
10:17:31
блин, опять
как их реализовать не используя ref - ы самого хаскеля и при этом не менеджить самому эту память

Oleg
02.09.2018
10:18:50
Ну предложили же массив

A
02.09.2018
10:19:07
это и есть память
своя
которую gc хаскеля заберёт только когда весь массив не нужен будет

Oleg
02.09.2018
10:20:03
Да. И, все и я указали, что в зависимости от языка, тебе нужен или не нужен гарбедж коллектор той или иной формы
Слово var само по себе ни о чём не говорит
Какова семантика?

alexknvl
02.09.2018
10:20:33
если вары только локальные, то ГЦ не нужен

A
02.09.2018
10:21:16
функции, логические значения, вары

Google

A
02.09.2018
10:21:38
вары типизируемые

Oleg
02.09.2018
10:21:41
ты опять сказал "вары'

alexknvl
02.09.2018
10:21:43
пример напиши в своём языке

Oleg
02.09.2018
10:21:55
Могут ли вары ссылаться друг на друга
Есть ли в языке индукиивные типы и какой формы
Есть ли уникальность
Гарбейдж коллектор появляется не тогда, когда у тебя есть вары и ссылки. А когда они начинают промоутиться вверх из скоупа опрелеления
С помощью каких-то других определений

A
02.09.2018
10:24:49
а?
промоутить?

Oleg
02.09.2018
10:26:02
Например в чистом call-by-name любой вар или что там у тебя - это ссылка на выражение, она будеи вычисляться каждый раз при необходимости.
И тогда не нужно ни программного хипа, ни GC
Поэтому нужно очень много деталей операционной семантики для рассуждений о контроле за памятью

A
02.09.2018
10:27:05
чувсвую сложность излишнюю в твоих речах )
то, что многое зависит от семантики - согласен

Oleg
02.09.2018
10:28:05
Мне, наоборот, кажется, что ты решил погрузиться в детали реализации, не имея хорошо сформулированного плана интерпретации
Звучит, будто решил сделать интерпретатор интуитивно, с наскока
А значит обсуждать тут нечего, делай как подсказывает сердце

A
02.09.2018
10:31:33
var f = (lambda x:Bool.
var z = 0
(lambda y:Bool. if x then z = z + 1 else z - 1))
f(true)
вот в той реализации, которую я в голове пока могу сложить, во второй строке, выражение var z = 0 мутирует какую-то память интепретатора, StateT, Map, etc - не суть
вот когда f пропадёт из области видимости, память, которую она по сути заалоцировала в этом стейте, должна быть почищена ручками

Oleg
02.09.2018
10:33:10

Google

Oleg
02.09.2018
10:33:22
А потом можно сказать, какой будет GC

A
02.09.2018
10:33:52
f возвращает функцию, которая инкрементирует счётчик z при true параметре и наоборот

Oleg
02.09.2018
10:34:27
Потому что я могу вообразить как минимум пару форм, где GC не нужен
Например, овнершип. Внутренняя лямбда объявляется овнером x, x исчезает вместе с ней.
При иниерпретации внутренняя лямбда превращает свой предыдущий завоненный стейт в следующий

KrivdaAllStars
02.09.2018
10:36:18
Call-by-value всегда же будет в ситуации , когда gc не нужен
Ну и запрет на передачу ссылок

A
02.09.2018
10:38:12
условно если я 1М таких функций навызывал, а потом перестал
этот предыдущий стейт где находится?

Yuriy
02.09.2018
10:39:24
зачем вы разбиваете предложения на реплики? тяжело читать же

Oleg
02.09.2018
10:40:04
предыдущий?
Да. В семантике, где у тебя есть функции с овненным скрытым стейтом, ты имеешь каждый раз в скоупе функцию и последний актуальный стейт для неё.

alexknvl
02.09.2018
10:44:08
f = \_ -> {
var z = 1
(\_ -> { z += 1; z },
\_ -> { z -= 1; z })
}
f = \_ -> {
var z = \_ -> 1
(\_ -> { z 2 },
\f -> { z = f; () })
}
(a, b) = f()
b(a)
если оба примера должны работать в этом гипотетическом языке, то без ГЦ не обойтись
если запретить var f : a -> b (и полиморфные varы, если есть полиморфизм), то можно обойтись reference counting

A
02.09.2018
10:49:01
а интерпретаторы с reference counting вообще существуют? )

alexknvl
02.09.2018
10:49:20
а почему нет

A64m
02.09.2018
10:50:34