• Haskell Lua stg Моя лунная stg-машина посчитала факториал! Поскольку парсер грамматики stg я написал удивительно трансректальным образом, а сам транслятор никак не проверяет корректность AST-дерева перед переписыванием в луну, факториал видимо останется самой сложной программой которую я смог для него написать.

Replies (14)

  • @ndtimofeev, нифига себе ты маньяк
  • @qnikst, Да ладно. У lua уже есть сборщик мусора, анонимные функции, замыкания. Нужно было только реализовать абстракцию thunk'а. Причём даже тут я ничего не изобрёл: половину подсмотрел в haskellwiki, половину в haste. Заодно понял почему все промежуточные языки ghc строго типизированы.
  • @qnikst, Кстати, а зачем в haskell Int — алгебраический тип с одним конструктором?
  • @ndtimofeev, stg это что
  • @ndtimofeev, Для ленивости, если я правильно понял, о чем ты спрашиваешь.
  • @rkit, Вот именно это мне и не понятно. Операции над приимитивными типами выполняются by value? Что мешает просто вернуть замыкание содержащие сложение двух Int#ов например?
  • @ndtimofeev, Либо ты возвращаешь значение, либо ты возвращаешь указатель на кучу, который уже указывает либо на замыкание, либо на значение.
  • @rkit, Это понятно. Просто для алгебраического типа ты ещё и отдельно вычисляешь конструктор. Собственно вопрос в том, зачем нужен data Int = I# Int#, когда всё тоже самое можно было бы делать с Int#. Лень обеспечивалась бы возвращением указателя на замыкание где посчитают результат.
  • @ndtimofeev, Нет, ты нифига не понял.
    Лень обеспечивалась бы возвращением указателя на замыкание где посчитают результат.Что это вообще значит? Вот есть у тебя язык C. В нем есть функция int f(). Как она указатель на замыкание вернет?
  • @rkit, Функцие на языке C не надо ничего возвращать. Вокруг неё будет функция на высокоуровневом языке возвращающая санк указывающий на вычисление форсирующее аргументы, дёргающее сишную функцию и возвращающее её результат.
  • @ndtimofeev, Вокруг неё будет функция на высокоуровневом языкеКак только x86 научится интерпретировать выскороуровневые языки — так сразу. А пока завязывай с фантазиями.
  • @rkit, Функция на высокоуровневом это кусок кода (в том числе и вызов f()) и список аргументов переданных в эту функцию. Возвращать ей ничего не надо вообще. Достаточно того что она будет находиться по указателю который будет использоваться в дальнейших вычислениях. Когда её наконец форсируют, придёт функция рантайма ЯВУ, сходит по указателю, передаст аргументы на стек замкнутого кода, запустит код, получит результат и весьма вероятно, что перепишет всю это байду по указателю вычисленным значением.
  • @ndtimofeev, just like VOPs in SBCL