Size: a a a

2020 March 06

А

Андрей in Lisp Forever
Это ж не имеет отношения к проекту Cyc?
https://en.wikipedia.org/wiki/Cyc
https://github.com/asanchez75/opencyc
источник

a

akater in Lisp Forever
Alexey Egorov
А что такое undelimeted?
Я не разбираюсь в теме. Слово undelimited означает, что сохраняется информация об очень широком контексте вычисления. В языке может быть только что-то одно, что контролирует control flow в достаточно большой общности, — несколько разных инструментов не могут быть одновременно достаточно сильными и поэтому по крайней мере один из них не будет соответствовать своему описанию в присутствии другого. В CL управление control flow осуществляется с помощью отдельных примитивов. Тот call/cc, который предоставляет cl-cont, не может использоваться в некоторых коммонлисповских выражениях — так было когда я смотрел в последний раз, и я не разбирался, это принципиальные ограничения или нет.

(cl-cont это delimited continuations)
источник

a

akater in Lisp Forever
Нет.
источник

a

akater in Lisp Forever
Вообще-то я не выяснял, но Cyc это старая ИИ-программа, которая успешно играла в игры, а тут просто база данных.
источник
2020 March 07

AE

Alexey Egorov in Lisp Forever
akater
Я не разбираюсь в теме. Слово undelimited означает, что сохраняется информация об очень широком контексте вычисления. В языке может быть только что-то одно, что контролирует control flow в достаточно большой общности, — несколько разных инструментов не могут быть одновременно достаточно сильными и поэтому по крайней мере один из них не будет соответствовать своему описанию в присутствии другого. В CL управление control flow осуществляется с помощью отдельных примитивов. Тот call/cc, который предоставляет cl-cont, не может использоваться в некоторых коммонлисповских выражениях — так было когда я смотрел в последний раз, и я не разбирался, это принципиальные ограничения или нет.

(cl-cont это delimited continuations)
Понятно, спасибо.
источник

AE

Alexey Egorov in Lisp Forever
Лисперы.
источник

AE

Alexey Egorov in Lisp Forever
Если я заворачиваю read в handler-bind, то у меня откатывается поинтер файла, который я читаю?
источник

AE

Alexey Egorov in Lisp Forever
В случае рестарта.
источник

AE

Alexey Egorov in Lisp Forever
Или что вообще происходит.
источник

a

akater in Lisp Forever
Alexey Egorov
Если я заворачиваю read в handler-bind, то у меня откатывается поинтер файла, который я читаю?
read читает из потока, не из файла, поэтому вопрос непонятен. Если вдруг задача в том, чтоб правильно закрыть файл при рестарте, то это вообще-то не должно отличаться от просто «правильно закрыть файл»: если был рестарт, то дальше все пойдет в том же теле with-open-file (или чего-то аналогичного), в котором handler-bind написан, а если был abort или еще что-то такое, то, опять же, with-open-file справится с этим обычным образом.
источник

AE

Alexey Egorov in Lisp Forever
akater
read читает из потока, не из файла, поэтому вопрос непонятен. Если вдруг задача в том, чтоб правильно закрыть файл при рестарте, то это вообще-то не должно отличаться от просто «правильно закрыть файл»: если был рестарт, то дальше все пойдет в том же теле with-open-file (или чего-то аналогичного), в котором handler-bind написан, а если был abort или еще что-то такое, то, опять же, with-open-file справится с этим обычным образом.
Окей, поинтер потока.
источник

AE

Alexey Egorov in Lisp Forever
А кто читает из файла, если уж на то пошло?
источник

AE

Alexey Egorov in Lisp Forever
Алсо по-моему из контекста довольно очевидно, что я открыл файл и читаю read'ом из соответствующего потока.
источник

AE

Alexey Egorov in Lisp Forever
Так как иначе я вообще не представляю, как бы у меня получалось читать.
источник

AE

Alexey Egorov in Lisp Forever
Задача в том, чтобы обработать ситуации, которые возникают при чтении формы из файла, и потом заново повторить чтение этой формы.
источник

AE

Alexey Egorov in Lisp Forever
Например если я пытаюсь читать форму, в которой есть символ из несуществующего пакета, то я создаю пакет и заново хочу прочитать форму.
источник

a

akater in Lisp Forever
Alexey Egorov
Например если я пытаюсь читать форму, в которой есть символ из несуществующего пакета, то я создаю пакет и заново хочу прочитать форму.
Если это SBCL, то не надо перечитывать форму. Если я пишу в репле 'wow:nonexistent, то я могу сделать нужное через рестарты без перечитывания.
источник

a

akater in Lisp Forever
М.б. это стандарт, а не SBCL, но сейчас не успею посмотреть. :-(
источник

a

akater in Lisp Forever
Alexey Egorov
Например если я пытаюсь читать форму, в которой есть символ из несуществующего пакета, то я создаю пакет и заново хочу прочитать форму.
Есть-таки портируемое решение, которое я имел в виду.

Я имел в виду, что /перечитывать/ если само содержание потока-то не поменялось, это явно неправильно: «перечитывать» все-таки значит пойти в потоке назад к началу символа и снова парсить. Если содержание потока не изменилось, то это бессмысленно.

Это работает, но у меня мало опыта, так что не уверен, что логика внутри lambda не переусложненная или не переупрощенная:

(handler-bind ((package-error
               (lambda (c)
                 (cond
                   ((find-restart 'use-value c)
                    (invoke-restart 'use-value
                                    (make-package
                                     (slot-value c 'package))))
                   ((find-restart 'continue c)
                    (invoke-restart 'continue))))))
 (read-from-string "'non-existent-package:non-exported-symbol"))


Здесь continue это для символов, которые были записаны в потоке через одно двоеточие. Second guessing при чтении форм это по-моему очень сомнительная практика, но раз есть портируемое решение, то наверное OK.
источник

a

akater in Lisp Forever
akater
Есть-таки портируемое решение, которое я имел в виду.

Я имел в виду, что /перечитывать/ если само содержание потока-то не поменялось, это явно неправильно: «перечитывать» все-таки значит пойти в потоке назад к началу символа и снова парсить. Если содержание потока не изменилось, то это бессмысленно.

Это работает, но у меня мало опыта, так что не уверен, что логика внутри lambda не переусложненная или не переупрощенная:

(handler-bind ((package-error
               (lambda (c)
                 (cond
                   ((find-restart 'use-value c)
                    (invoke-restart 'use-value
                                    (make-package
                                     (slot-value c 'package))))
                   ((find-restart 'continue c)
                    (invoke-restart 'continue))))))
 (read-from-string "'non-existent-package:non-exported-symbol"))


Здесь continue это для символов, которые были записаны в потоке через одно двоеточие. Second guessing при чтении форм это по-моему очень сомнительная практика, но раз есть портируемое решение, то наверное OK.
Замечание: тут символ не экспортируется даже если записан как экспортируемый; это видно в выводе примера.
источник