Можно ли реализовать «если» с помощью «call / cc»? - PullRequest
5 голосов
/ 29 июля 2011

Мне сказали, что call / cc можно использовать для реализации произвольных конструкций потока управления, поэтому я пытаюсь реализовать все такие конструкции с использованием call / cc, но у меня возникли проблемы.Предполагая, что у меня не было «если», как бы я реализовал это, используя «define-syntax» и «call / cc»?Это возможно или я был введен в заблуждение?Я знаю, как реализовать безусловный переход с помощью «call / cc», но на уровне машины условное выполнение выполняется с помощью инструкций ветвления, выполнение которых зависит от битов состояния процессора.Без конструкций такого типа я не вижу, как это можно сделать.

Ответы [ 2 ]

8 голосов
/ 29 июля 2011

Вы не можете - у вас должен быть какой-то способ проверить вещи и определить, являются ли они истинными или ложными.Вы можете подобраться ближе, с некоторым функциональным представлением логических значений.Например, с общей церковной кодировкой:

(define (true x y) x)
(define (false x y) y)

и теперь вы можете рассматривать тест (который возвращает одно из этих закодированных логических значений) как функцию, которая принимает продолжение «успешно» и «неудачно»и использует это для продолжения:

(define (if c x y) (c x y))

Если вы хотите поэкспериментировать с этим, вам нужно учитывать тот факт, что Scheme не ленивый язык, поэтому вам нужно все продумать.Например:

(define (true x y) (x))
(define (false x y) (y))
(define-syntax if
  [(if c x y) (c (lambda () x) (lambda () y))])

(Но вам все еще нужно пересмотреть существующие предикаты и т. Д., Чтобы вернуть эти логические значения.)

В любом случае, call/cc сам по себе на самом деле не имеет ничего общего...

2 голосов
/ 17 ноября 2012

Вы можете реализовать , если , только с процедурами высшего порядка.Это очевидная неторопливая кодировка Церкви:

IF ? T E === (? (lambda () T) (lambda () F))

TRUE     === (lambda (t _) (t))
FALSE    === (lambda (_ f) (f))

Вам вообще не нужны продолжения.True - это двоичная функция, которая выполняет первый аргумент;False - это двоичная функция, которая выполняет второй аргумент.If - троичная функция, которая объединяет их вместе, получая Истину / Ложь, определенную тестом (?), И назначая ей две функции, которые задерживают последовательные значения.

...