Cyril Slobin (slobin) wrote,
Cyril Slobin
slobin

Categories:

Юбилейно-техническое

Мне тут напомнили, что у нас сейчас вялотекущий (в смысле только год, конкретной даты нет) юбилей Алгола-68. В СССР в 80-х он был довольно популярен, но писали на нём в основном в Ленинграде и Новосибирске, а в Москве не писали. Поэтому я с ним тогда не сталкивался, только прочитал парку книжек и ничего не понял. С тех пор я стал не то чтобы умнее (скорее наоборот), но немножко опытнее, и вот вчера сделал второй заход. Было интересно, умеет ли язык в функциональщину. Благо это вообще один из первых языков, где функции -- значения первого класса. И не просто указатели на код, как в сях, а полноценные функции с контекстом.

Увы, стандартный язык не умеет -- передавать функцию вовне её родного контекста явно запрещено (как и ссылку). Но в 1976, кажется, году Линдси предложил расширение языка -- частичную параметризацию, с которой уже можно. Немножко неуклюже -- захваченный контекст приходится помечать руками, но зато никаких неожиданных миграций из стека в кучу, как в няшной гошечке. Примерно так:

# Algol 68 Genie partial parametrization demo #

PROC make counter = PROC (INT) INT:
BEGIN
  HEAP INT counter := 0;
  PROC inc = (REF INT nn, INT n) INT: nn +:= n;
  inc(counter,)
END;

PROC (INT) INT pears := make counter;
PROC (INT) INT kiwis := make counter;

print((pears(100), new line));
print((kiwis(200), new line));
print((pears(400), new line));
print((kiwis(800), new line));

print(("done", new line))

Что тут происходит? При вызове make counter мы размещаем новый counter в куче, а потом частично параметризуем inc, и ссылка на этот counter оказывается замороженной в её первом параметре. Выглядит практически по современному. Ссылка на песочницу с этим примером: http://tpcg.io/S2GtO8

... Вычислительные средства находятся на клавиатуре справа ...

Tags: tekniko
Subscribe
  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 9 comments