call/cc в Lua - Возможный?

Как отмечали другие, скорее всего у вас нет .html, настроенного для обработки PHP-кода.

Сказав это, если все, что вы делаете, использует index.html для включения index.php, ваш вопрос, вероятно, должен быть следующим: «Как использовать index.php как индексный документ?

В этом случае для Apache (httpd.conf) найдите DirectoryIndex и замените строку на это (будет работать только в том случае, если вы включили dir_module, но это по умолчанию для большинства установок):

DirectoryIndex index.php

Если вы используете другие индексы каталогов, перечислите их в порядке предпочтения, то есть

DirectoryIndex index.php index.phtml index.html index.htm
22
задан PeterM 14 May 2010 в 14:56
поделиться

4 ответа

Есть два предварительных условия для ручной реализации call / cc согласно цитате из Википедии:

  1. язык должен поддерживать замыкания
  2. вы должны писать свою программу в стиле продолжения передачи (CPS)

Я подозреваю, что вам не понравится №2.

Чтобы написать вашу программу в стиле передачи продолжения:

  1. Каждая функция должна принимать аргумент продолжения
  2. Функции должны возвращаться, вызывая свое продолжение

Итак, используя k в качестве имени Если аргумент продолжения, функция будет выглядеть так:

function multiplyadd(k, x, y, z) return k(x * y + z) end

Верхний уровень может использовать print в качестве своего продолжения, поэтому вызов multiplyadd на верхнем уровне будет выглядеть так:

multiplyadd(print, 2, 4, 1)

С этим каркасом мы можно определить call / cc как

function callcc(k,f) return f(k,k) end

. Обратите внимание, что приведенное выше multiplyadd на самом деле обманывает, поскольку * и + не входят в CPS. Очень утомительно добавлять все операторы в форме CPS, заменять все функции библиотеки Lua эквивалентами CPS и переводить / генерировать весь ваш код в CPS; см. подробности здесь .

19
ответ дан 29 November 2019 в 04:36
поделиться

Я думаю, вы забыли часть о написании вашей программы в стиле продолжения передачи. Как только вы это сделаете, call / cc станет тривиальным (на Lua или на любом другом языке), так как продолжение будет явным параметром для всех функций (включая call / cc).

PS: кроме замыканий, вам также нужны правильные хвостовые вызовы для программирования в стиле продолжения передачи.

17
ответ дан Roberto Ierusalimschy 29 November 2019 в 04:36
поделиться

Отвечая на вопрос о планах для call / cc в Lua: нет никаких планов для call / cc в Lua. Захват продолжения либо слишком дорогой, либо требует некоторого анализа кода, выходящего далеко за рамки возможностей компилятора Lua. Существует также проблема в том, что Lua-продолжения могут включать части в C.

С сопрограммами, однако, мы уже можем реализовать call / cc1 в Lua (однократное продолжение). Этого достаточно для многих продолжений.

7
ответ дан Roberto Ierusalimschy 29 November 2019 в 04:36
поделиться

Ключевая фраза:

Можно реализовать программы в стиле передачи продолжения

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

Это непрактично для программистов. Преобразование CPS имеет два применения:

  • В качестве теоретической идеи для изучения особенностей языка, особенно управляющих операторов
  • В качестве прохода в компиляторе, который использует CPS в качестве промежуточного языка

Вы не хотите приблизиться к выполнению CPS-преобразований в коде Lua, особенно не вручную.

2
ответ дан 29 November 2019 в 04:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: