Ленивый ML с π-calculus в 26КБ
Написал ленивый Эрланг (:
./ml.exe spawn.ml
Synrc ML Jun 2012
let rec
run = lambda nn. output ! spawn let rec
from = lambda n. output ! n -> if n = 1 then stop else from n - 1
in from 10 -> if nn = 1 then stop else run nn - 1
in run 3000000
2 processes left
36000001 evals, procs: 3000000
6000007 env cells used, 0 cells used
execution time: 3.05s
Создание 3 миллионов потоков занимает 3 секунды. Потоки выводят числа от 1 до
10. но поскольку вывод отключен и ленивость то это отрабатывает за 3 секунды.
Если отключить ленивость то 5 тыс процессов отрабатывают вывод в канал за 2
секунды. Надо быстрее!
Решето Эратосфена
let rec
from = lambda n. fromchan ! n -> if n = 10 then stop else from (n+1),
fromchan = chan,
sieve = lambda inch.
inch ? p -> output ! p ->
let rec
filter = inch?x ->
if (x/p) * p <> x then connect!x -> filter
else filter,
connect = chan
in (filter || sieve connect)
in from 2 || sieve fromchan
Реверс масива
let rec
reverse = lambda L. let rec
rev = lambda inp. lambda op. if null inp then op else rev tail inp head
inp :: op
in rev L nil,
L1 = 1 :: 3 :: 5 :: 7 :: 9 :: 11 :: nil,
L2 = reverse L1
in output ! L2 -> stop
[2]. Namda Tonpa. Lazy ML interpreter with π-calculus in 26KB . Github Sources.