Трамплины и продолжения

Aug 27, 2016 06:17

Любопытно, конечно, что наибольшую популярность завоёвывают именно плохие с инженерной точки зрения технологии. Я не могу объяснить этот феномен: казалось бы, согласно эволюционной теории "более лучшие" вещи должны постепенно заменять эквивалентные по функционалу "более худшие", но этого не происходит. И даже не всегда проблема в том, что что-то ( Read more... )

trampoline, continuations, continuation passing style, tail recursion, haskell, lisp, tco, elm

Leave a comment

thedeemon August 27 2016, 05:54:53 UTC
Интересно, как с этим у PureScript.

Reply

kika August 27 2016, 06:54:53 UTC
Ну вот, пока я разрабатывал программное обеспечение, уже успели спросить.
Я ниже запостил, а вот программное обеспечение в виде текста:
https://gist.github.com/kika/b3dbba968f52614f71ac89d066723b21

Я что-то подозреваю что это можно гораздо более кратко выразить, но не настоящий сварщик.

Reply

thedeemon August 27 2016, 07:12:36 UTC
Это обход проблемы, а сама проблема-то там есть? Если в лоб написать взаимнорекурсивные ф-ии, что будет?

Reply

kika August 27 2016, 07:19:52 UTC
Куда ж она денется, подлежащий яваскрипт от наличия монад лучше не становится. Пурескрипт точно так же оптимизирует в цикл только классическую хвостовую рекурсию.

... )

Reply

thedeemon August 27 2016, 07:31:11 UTC
Плохой, плохой пурескрипт.
Js_of_ocaml тогда надо брать. :) Окамл-то все правильно умеет.

Вот как надо компиляторы делать:

... )

Reply

kika August 27 2016, 08:35:40 UTC
Ну так 2.8.1, а пурескрипт 0.9.3 и там еще сам язык в каждом релизе меняется (хотя слава богу в последнее время правки механические скорее). Отдельный человек пишет суровый оптимизатор с инлайнером, глядишь скоро и будет.

А по части "вот так надо писать компиляторы" я бы не сказал:
http://ocsigen.org/js_of_ocaml/dev/manual/tailcall

Решили оптимизировать одно, а не другое, ну ок. Небольшое достижение для языка с внушительным рантаймом (где и запрятан этот трамплин). У пурескрипта-то рантайм нулевой.

Reply

swizard August 27 2016, 11:12:11 UTC
> Js_of_ocaml тогда надо брать. :)

Ещё лучше ghcjs - он тоже умеет проводить автоматический trampolining :) Но там свои приколы

Reply

vshabanov August 28 2016, 19:46:53 UTC
А какие приколы у GHCJS? Тоже что-то не работает?

Reply

thedeemon August 27 2016, 07:58:42 UTC
Если напрямую так:

module Main where

import Prelude
import Control.Monad.Eff (Eff)
import Control.Monad.Eff.Console (CONSOLE, log)

isEven :: Int -> Boolean
isEven n | n == 0 = true
| otherwise = isOdd (n - 1)

isOdd :: Int -> Boolean
isOdd n | n == 0 = false
| otherwise = isEven (n - 1)

main :: forall e. Eff (console :: CONSOLE | e) Unit
main = do
log $ show $ isEven 100000

то:

RangeError: Maximum call stack size exceeded

Reply

thedeemon August 27 2016, 08:00:30 UTC
Э-э, надо было обновить страницу, сорри

Reply


Leave a comment

Up