Проблема с (if (null? x) (quote ()) (cdr x))
заключается в том, что на самом деле он ничего не делает. например. если я вставлю это в программу R6RS и запущу ее, ничего не произойдет. Поэтому я предлагаю написать это:
(display (if (null? x) (quote ()) (cdr x)))
И предположим, что это вся программа, за исключением того, что определено x
. Теперь if
нужно знать значение (null? x)
, чтобы определить, является ли оно следствием или альтернативой. например.
(null?& x
continuation)
Продолжение должно определить, верно оно или нет, и выполнить одно из двух продолжений:
(null?& x
(lambda (xn)
(if& xn
continuation-consequent
continuation-alternative)))
Если xn
истинно, продолжение должно отображать '()
, но если это не так, то оно должно отображать cdr
из x
:
(null?& x
(lambda (xn) ; 201
(if& xn
(lambda () ; 202
(display& '() halt)
(lambda () ; 203
(cdr& x (lambda (cdrx) ; 204
(display& cdrx halt)))))))
halt
останавливает программу. Теперь давайте представим, что мы переводим это на Алгол, например. JS. Я изменю порядок, чтобы продолжение всегда было первым аргументом. Все процедуры просто получают числовой идентификатор, поэтому язык реализации вообще не должен иметь процедур.
const undef = "BaNaNa";
const x = [1, 2, 3]; // change this
const stack = [200];
main:
while (true) {
const cont = stack.pop();
const cont2 = cont < 200 ? stack.pop() : undef;
switch (cont) {
case 1: // null?&
stack.push(stack.pop().length === 0, cont2);
break;
case 2: // display&
console.log(stack.pop());
stack.push(undef, cont2);
break;
case 3: // cdr&
stack.push(stack.pop().splice(1), cont2);
break;
case 4: // if&
const cont3 = stack.pop();
if (stack.pop()) {
stack.push(cont2);
} else {
stack.push(cont3);
}
break;
// continuations
case 200:
stack.push(x, 201, 1);
break;
case 201:
stack.push(203, 202, 4);
break;
case 202:
stack.push([], 1337, 2);
break;
case 203:
stack.push(x, 204, 3);
break;
case 204:
stack.push(1337, 2);
break;
// halt
case 1337:
break main;
}
}
Теперь мы упустили определяемые пользователем процедуры и соглашения о закрытии, что сделало бы этот пример немного более сложным. Существует некоторая отсутствующая проверка типов, которую сделала бы правильная схема, и я использую массивы вместо реальных пар.
person
Sylwester
schedule
13.08.2019