Егор писал(а):
речи стиль понимать начинаю.
Этот Ваш абарот напомнил мне пассаж из одной книжицы (американской), цель которого была объяснить европейцам, что выучить японский европейцу не так уж сложно. Надо только перейти от Фортрановского/Си-шного мышления к стековому, т.е вместо
говорить на PostScripte (какой-то другой стековый язык был упомянут, предшественник PS)
Японцы действительно так строят фразу --- выкладывают слова на стек, потом чего-то с этим делают:
Я в лингво-форуме приводил такой пример:
"Люблю гулять под дождём" --- "Ame-no naka de aruku koto-ga suki desu".
аme --- дождь;
ame-
no ---- притяжательный падеж (rain's)
ame-no
naka --- rain's interior, внутренность дождя;
ame-no naka
de --- by (means of) внутренность дождя;
ame-no naka de
aruku --- гулять посредством внутренности дождя;
ame-no naka de aruku
koto-ga --- субстантивируем это действо, т.е. делаем из него некое существительное, которое можно будет, например, любить;
ame-no naka de aruku koto-ga
suki desu --- наконец, любим...
(Гуляют они
внутри дождя, а не
под дождём)
Добавлено спустя 1 час 30 минут 36 секунд:
Всё же сделаю это сейчас, в декабре
ИСН, выложив сей чудный примерчик, надо полагать, не возражает против его раскурочивания. Для начинающих многое прояснится.
Сначала одно упрощение --- оставляем одну функцию e:
Код:
%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 12 272 508 608
%%Creator: ISN
/e {%
3 index 2 index sub dup mul 3 index 2 index sub dup mul add 2 gt
{3 index 2 index sub 2 div 3 index 2 index add 2 div add
3 index 2 index sub 2 div 0 exch sub
5 index 4 index add 2 div add exch 1 index 1 index 6 2 roll e e
}{moveto lineto} ifelse
} bind def
newpath
120 500 440 500 e
stroke
showpage
Теперь такое преобразование --- две "неявные функции" делаем явными прцедурами e1 и e2:
Код:
%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 12 272 508 608
%%Creator: ISN
/e {%
3 index 2 index sub dup mul 3 index 2 index sub dup mul add 2 gt
{e1}{e2} ifelse
} bind def
/e1 {%
3 index 2 index sub 2 div 3 index 2 index add 2 div add
3 index 2 index sub 2 div 0 exch sub
5 index 4 index add 2 div add exch 1 index 1 index 6 2 roll e e
} bind def
/e2 {moveto lineto} bind def
newpath
120 500 440 500 e
stroke
showpage
Теперь --- подробное расписывание:
Код:
%!PS-Adobe-3.0 EPSF-3.0
%%BoundingBox: 12 272 508 608
%%Creator: ISN
%!
/e {% на стеке предполагается наличие 4-х аргументов
% x1 y1 x2 y2
% (3)(2)(1)(0)
3 index % x1 y1 x2 y2 x1 %вытащили 3-й с конца арг:
2 index % x1 y1 x2 y2 x1 x2
sub % x1 y1 x2 y2 x1-x2
dup %(duplicate) % x1 y1 x2 y2 x1-x2 x1-x2
mul % x1 y1 x2 y2 (x1-x2)^2
3 index 2 index % x1 y1 x2 y2 (x1-x2)^2 y1 y2
sub dup mul % x1 y1 x2 y2 (x1-x2)^2 (y1-y2)^2
add % x1 y1 x2 y2 (x1-x2)^2+(y1-y2)^2
2 gt % x1 y1 x2 y2 bool(true/false) [ (x1-x2)^2+(y1-y2)^2 > 2 ]
% далее на стек кладутся 2 процедурки, ибо когда появится оператор
% ifelse, он потребует 3-х аргументов:
% bool {proc1_for_true} {proc2_for_false} ifelse
{e1} % x1 y1 x2 y2 bool {e1}
{e2} % x1 y1 x2 y2 bool {e1} {e2}
ifelse % x1 y1 x2 y2 (выполнившись, ifelse съел 3 последних арг. со стека)
} bind def
/e1 {% на стеке предполагается наличие 4-х аргументов
% x1 y1 x2 y2
3 index 2 index sub % x1 y1 x2 y2 (x1-x2)
2 % x1 y1 x2 y2 (x1-x2) 2
div % x1 y1 x2 y2 (x1-x2)/2
3 index 2 index % x1 y1 x2 y2 (x1-x2)/2 y1 y2
add 2 div % x1 y1 x2 y2 (x1-x2)/2 (y1+y2)/2
add % x1 y1 x2 y2 [(x1-x2)/2+(y1+y2)/2]
%далее посл. арг. обозначен как s1: x1 y1 x2 y2 s1
3 index 2 index sub 2 div % x1 y1 x2 y2 s1 (y1-y2)/2
0 % x1 y1 x2 y2 s1 (y1-y2)/2 0
exch % x1 y1 x2 y2 s1 0 (y1-y2)/2
sub % x1 y1 x2 y2 s1 0-(y1-y2)/2 [ = (y2-y1)/2 ]
% последовательность 0 exch sub
% можно было заменить командой neg (negate)
5 index 4 index % x1 y1 x2 y2 s1 (y2-y1)/2 x1 x2
add 2 div add % x1 y1 x2 y2 s1 (y2-y1)/2+(x1+x2)/2 [ = s2 ]
exch % x1 y1 x2 y2 s2 s1
1 index 1 index % x1 y1 x2 y2 s2 s1 s2 s1
6 2 % x1 y1 x2 y2 s2 s1 s2 s1 6 2
%6 2 roll --- циклич. сдвиг группы из 6 последних аргументов 2 раза
roll % x1 y1 s2 s1 x2 y2 s2 s1
e % рекурсия: выполнить процедуру e для x2 y2 s2 s1, новое содержимое стека неизвестно ---
% или их съели, или нафракталили новые четвёрки...
e
} bind def
/e2 {% на стеке предполагается наличие 4-х аргументов
% x1 y1 x2 y2
moveto % x1 y1
lineto % (стек опустел)
} bind def
newpath
120 500 440 500 e
stroke
showpage