Возможно ли реализовать головоломку Инь-Ян в C # 5.0 с помощью асинхронного режима? - PullRequest
1 голос
/ 08 ноября 2011

Головоломка, реализованная в Схеме, выглядит следующим образом:

(let* ((yin
     ((lambda (cc) (display #\@) cc) (call-with-current-continuation (lambda (c) c))))
   (yang
     ((lambda (cc) (display #\*) cc) (call-with-current-continuation (lambda (c) c)))))
(yin yang))

Цель этой головоломки - выработать и понять вывод этого кода.

Мне интересноесли возможно реализовать код с той же семантикой, используя новые функции асинхронной CPS в C # 5.0.

Часть, которую мне трудно понять, заключается в том, что головоломка опирается на семантику let * так же, какзвоните / куб.см.Я не уверен, как правильно выразить это взаимодействие в C #.

1 Ответ

1 голос
/ 08 ноября 2011

CPS может полностью избавиться от call / cc, так что вы определенно можете реализовать это в C #, вручную выполняя CPS. Ничего не зная об автоматическом CPS-входе в C #, я не могу сказать, будет ли эта функция делать это автоматически. Однако «асинхронность» в названии заставляет меня задуматься. Вопрос, который вы задаете, явно связан с синхронной оценкой этого выражения.

Мое мнение: я думаю, что перевод этого на C # не самый быстрый способ понять это.

Наконец, let * - это сокращение для вложенных привязок. Таким образом, вы можете переписать это как:

(let ([yin ...])
  (let ([yang ...])
     ...))

... чтобы избавиться от лет *. В вашем случае, поскольку «ян» не зависит от «инь», эффект заключается в последовательности. Таким образом, продолжение, зафиксированное в правой части привязки 'yin', является тем, которое еще не оценило привязку 'yang'.

...