Любопытно, конечно, что наибольшую популярность завоёвывают именно плохие с инженерной точки зрения технологии. Я не могу объяснить этот феномен: казалось бы, согласно эволюционной теории "более лучшие" вещи должны постепенно заменять эквивалентные по функционалу "более худшие", но этого не происходит. И даже не всегда проблема в том, что что-то
(
Read more... )
Reply
Я ниже запостил, а вот программное обеспечение в виде текста:
https://gist.github.com/kika/b3dbba968f52614f71ac89d066723b21
Я что-то подозреваю что это можно гораздо более кратко выразить, но не настоящий сварщик.
Reply
Reply
( ... )
Reply
Js_of_ocaml тогда надо брать. :) Окамл-то все правильно умеет.
Вот как надо компиляторы делать:
( ... )
Reply
А по части "вот так надо писать компиляторы" я бы не сказал:
http://ocsigen.org/js_of_ocaml/dev/manual/tailcall
Решили оптимизировать одно, а не другое, ну ок. Небольшое достижение для языка с внушительным рантаймом (где и запрятан этот трамплин). У пурескрипта-то рантайм нулевой.
Reply
Ещё лучше ghcjs - он тоже умеет проводить автоматический trampolining :) Но там свои приколы
Reply
Reply
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
Reply
Leave a comment