LINUX.ORG.RU

Какой из лиспов лучше взять?

 ,


6

4

Собственно меня интересуют батарейки и возможность компиляции в нативный код (последнее в меньшей степени). Как я понял, серьезно следует рассматривать только различные реализации CL и Scheme (Racket).

Если вы предлагаете Clojure, хотелось бы услышать обоснование (кококо-интероперабельность-с-жабой и кококо-ынтырпрайз - не аргументы).

Deleted
Ответ на: комментарий от anonymous

На макросах можно сделать кернел, но на кернеле - нельзя сделать макросы.

на фекспрах можно сделать макросы. другое дело, что в текущей реализации фекспров это банка с червями, поэтому их как-то нужно ограничивать, чтобы обеспечить нормальную оптимизацию, анализ. который в общем случае (те же MacLisp/InterLisp) — мутное и непрозрачное дело.

поэтому нужны не софсем фекспры, а что-то похожее, но попроще для анализа.

Оно же невыразительно.

да ладно тебе. из примера про реализацию eval (ссылку не помню, но суть такова): в обычном лиспе требуется «питушение списков» (tm) и cond по символам, как в интерпретаторе, в другом — организация такого окружения / «пространства имён», будучи раскрытым в котором те, что нужно  — транслируются в то, что нужно, а те, что не нужно — не транслируются ни во что. пруфлинк посеял, увы.

потом, можно же «Environment Passing Style» организовать. по аналогии с IPS для всех этих «частичных lisp-N».

Вообще, это хороший критерий - если что-то постоянно происходит в естественном языке, то это совершенно недопустимо в ЯП.

почему? ЕЯ кратче, ёмче для нетривиальных примеров. смотри, например, программирование на Inform7 (книжка) ( пример  — смотреть после «And now for something completely different; this version for Inform 7 written by Emily Short and Graham Nelson in March 2007:»

теперь представь, что это всё мы расказываем не утёнку, не человеко-исполнителю читателю, а параллельно идёт второй поток текста в Sexprs-ах, которые для роботов-чукчей, программируемых на лиспе, а не человеков-читателей.

Неправильный пример. Это обычная типизация, а не лисп-н.

ну да, не совсем хороший — потому что порядок слов можно менять. а если взять какой-нибудь язык с Verb-Subject-Object, где от порядка слов смысл может кардинально поменяться? то есть, типизированы будут по-разному.

anonymous
()
Ответ на: комментарий от anonymous

из примера про реализацию eval (ссылку не помню, но суть такова): в обычном лиспе требуется «питушение списков» (tm) и cond по символам, как в интерпретаторе, в другом — организация такого окружения / «пространства имён», будучи раскрытым в котором те, что нужно — транслируются в то, что нужно, а те, что не нужно — не транслируются ни во что. пруфлинк посеял, увы.

пруфлинк :

McCarthy's Eval Function (transformed from the original M-expressions into more familiar s-expressions)

(define (eval e a)
  (cond
   ((atom e) (assoc e a))
   ((atom (car e))
    (cond
     ((eq (car e) 'quote) (cadr e))
     ((eq (car e) 'atom)  (atom   (eval (cadr e) a)))
     ((eq (car e) 'eq)    (eq     (eval (cadr e) a)
                                  (eval (caddr e) a)))
     ((eq (car e) 'car)   (car    (eval (cadr e) a)))
     ((eq (car e) 'cdr)   (cdr    (eval (cadr e) a)))
     ((eq (car e) 'cons)  (cons   (eval (cadr e) a)
                                  (eval (caddr e) a)))
     ((eq (car e) 'cond)  (evcon. (cdr e) a))
     ('t (eval (cons (assoc (car e) a)
                      (cdr e))
                a))))
   ((eq (caar e) 'label)
    (eval. (cons (caddar e) (cdr e))
           (cons (list (cadar e) (car e)) a)))
   ((eq (caar e) 'lambda)
    (eval (caddar e)
           (append (pair (cadar e) (evlis (cdr e) a))
                   a)))))

Vau Eval Function

(define (eval e a)
  (cond
   ((atom e) (assoc e a))
   ((atom (car e))
    (eval (cons (assoc (car e) a)
                       (cdr e))
                 a))
   ((eq (caar e) 'vau)
    (eval (caddar e)
           (cons (cons (cadar e) 'env)
                 (append (pair (cadar e) (cdr e))
                          a))))))
anonymous
()
Ответ на: комментарий от anonymous

на фекспрах можно сделать макросы.

Конечно же нет. Просто по определению.

да ладно тебе. из примера про реализацию eval (ссылку не помню, но суть такова): в обычном лиспе требуется «питушение списков» (tm) и cond по символам, как в интерпретаторе, в другом — организация такого окружения / «пространства имён», будучи раскрытым в котором те, что нужно — транслируются в то, что нужно, а те, что не нужно — не транслируются ни во что. пруфлинк посеял, увы.

Смотри в чем дело - наличие макросов очевидным образом повышает выразительность языка. Наличие фекспров - не повышает. То есть язык с ф-ями и фекспрами не отличается от языка с функциями. Ведь фекспр - это ни что иное, как обычная ф-я.

ЕЯ кратче, ёмче для нетривиальных примеров.

Вообще-то наоборот. ЕЯ переусложнен, очен вербозен, для выражения даже простейших вещей, которые однострочно делаются на ЯП в ЕЯ тебе пришлось бы писать даже не абзацы - целые страницы текста.

anonymous
()
Ответ на: комментарий от anonymous

А у меня есть еще более хорошее решение:

(define eval vau-eval)

смотри как коротко, компактно, универсально и ортогонально!

anonymous
()
Ответ на: комментарий от anonymous

на фекспрах можно сделать макросы.

Конечно же нет. Просто по определению.

Ведь фекспр - это ни что иное, как обычная ф-я.

?? в понимании недо общелиспа (MacLisp/Interlisp) — да. вообще нет.

из описания kernel: есть два вида комбинаторов, applicatives и operatives. applicatives примерно соответствуют функциям — вычисляются все аргументы перед выполнением. operatives (фекспры в kernel) — наоборот, не вычисляется ни одного, и явно требуют вычислять вручную через eval.

далее он в kernel по религиозным причинам отказывается и от квазицитирования. дескать, явное вычисление лучше неявного, скрытого синтаксическим сахаром.

то есть, далее он фактически фигачит комбинаторами с двумя моделями вычисления: с eager (функции, applicatives) и lazy (фекспры, operatives) вычислениями, оборачивая их обёртками vau и wrap. в ленивом — нужно eval делать руками, хотя можно написать и синтаксис для implicit вычислений.

Смотри в чем дело - наличие макросов очевидным образом повышает выразительность языка. Наличие фекспров - не повышает. То есть язык с ф-ями и фекспрами не отличается от языка с функциями. Ведь фекспр - это ни что иное, как обычная ф-я.

повышает и отличается, т.к. у функций разная семантика вычислений, жадная или ленивая.

Вообще-то наоборот. ЕЯ переусложнен, очен вербозен, для выражения даже простейших вещей, которые однострочно делаются на ЯП в ЕЯ тебе пришлось бы писать даже не абзацы - целые страницы текста.

давай примеров. вот если взять Interactive Fiction вот отсюда с конца

ЕЯ это код

вербозность это хорошо, когда концепции более сложные чем однострочники

выразительность это хорошо.

Cloak of Darkness"

The story headline is "A basic IF demonstration."

The maximum score is 2.

[Whatever room we define first becomes the starting room of the game,
in the absence of other instructions:]

Foyer of the Opera House is a room.  "You are standing in a spacious hall,
splendidly decorated in red and gold, with glittering chandeliers overhead.
The entrance from the street is to the north, and there are doorways south and west."

Instead of going north in the Foyer, say "You've only just arrived, and besides,
the weather outside seems to be getting worse."

[We can add more rooms by specifying their relation to the first room.
Unless we say otherwise, the connection will automatically be bidirectional,
so "The Cloakroom is west of the Foyer" will also mean "The Foyer is east of the Cloakroom":]

The Cloakroom is west of the Foyer.
"The walls of this small room were clearly once lined with hooks, though now only one remains.
The exit is a door to the east."

In the Cloakroom is a supporter called the small brass hook.
The hook is scenery. Understand "peg" as the hook.

[Inform will automatically understand any words in the object definition
("small", "brass", and "hook", in this case), but we can add extra synonyms
with this sort of Understand command.]

The description of the hook is "It's just a small brass hook,
[if something is on the hook]with [a list of things on the hook]
hanging on it[otherwise]screwed to the wall[end if]."

1. ... is west of the ... определения комнат со ссылками в обе стороны (проставили для одной, автоматически проставились для другой).

2. типы объектов: room, supporter, scenery. можно комбинировать, так что это больше напоминает типы классов.

The player wears a velvet cloak. The cloak can be hung or unhung.
Understand "dark" or "black" or "satin" as the cloak.
The description of the cloak is  ...
<и далее правила, применимые к объекту>
Neatness is a kind of value. The neatnesses are neat, scuffed, and trampled.
The message has a neatness. The message is neat.

типы, traits, свойства, предикат свойства.

anonymous
()
Ответ на: комментарий от anonymous

3.

 Understand "peg" as the hook.
...
Understand "hang [something preferably held] on [something]" as putting it on.

определили методы. в дальнейшем эти методы больше напоминают правила (применимы к определённым типам и свойствам):

Instead of dropping or putting the cloak on when the player is not in the cloakroom:
    say "This isn't the best place to leave a smart cloak lying around."
Instead of doing something other than going in the bar when in darkness:
    if the message is not trampled, change the neatness of the message
    to the neatness after the neatness of the message;
    say "In the dark? You could easily disturb something."

движки правил: Planner

Эразмотрон

Уже предпринимались радикальные попытки поднять отношения игрока и NPC на новую высоту. Я говорю о так называемом Эразматроне (Erasmatron). Детище Криса Кроуфорда, автора нескольких IF-игр для Macintosh, Эразматрон — это программа, представляющая базирующееся на атрибутах общество.

Кроуфорд наделил всех своих NPC различными атрибутами, которые были призваны отражать их текущее состояние. Это Кроткость, Исполнительность, Великодушие, Доверчивость, Верность, Завистливость, Гордость, Любвеобильность, Голод, Ненадежность, Честность, Привлекательность, Влияние, Дееспособность, Болтливость, Предприимчивость, Жадность, Либидо, Озабоченность, Заботливость, Настроение и Жизнерадостность. Каждый из этих атрибутов динамично изменяется у каждого из персонажей в зависимости от того, что в данный момент этот персонаж видит или делает, с кем он говорит и о чем. В свою очередь, значение каждого из этих показателей влияет на то, что он сделает или скажет, и если хотите, о чем подумает.

Что ж, идея не нова, но она наконец-то реализована. Была выпущена игра «Shattertown Sky», использовавшая эту систему, но, к сожалению, она не особо блистала идеальными NPC из-за обилия недоделок и малого уровня интерактивности непосредственно интерфейса игры (зачастую игроку можно было выбирать лишь один из двух или один из одного (!) вариантов поведения своего персонажа). К тому же, игра, состоящая из сплошных разговоров, не особо развлекает. Однако, главного эта игра достигла — она сделала первый шаг к по-настоящему интерактивным персонажам.

Интерактивность NPC заключается в создании иллюзии, что игрок опять же может «внести» в игровой мир некую информацию, «не заложенную» автором в уста NPC (создать «второй поток»). Грубо говоря, игрок должен быть способен «рассказать» NPC о себе, своих проблемах, сподвигнуть его на какие-то действия, при этом должна сохраняться иллюзия того, что NPC сам решает, что ему сделать, что сказать, а что — нет. Интерактивность может выразиться в том, что NPC сможет действовать самостоятельно, причем в зависимости от обстоятельств, первую попытку предпринять это сделала система Эразматрон, а вторую сможете сделать вы. :-)

anonymous
()
Ответ на: Lists and Lists от anonymous

история Interactive Fiction

вообще, в разрезе лиспов — на мой вгляд, незаслуженно забыта такая штука как Interactive Ficton.

первая текстовая адвентюра, «Collossal Cave Adventure» была написана на Фортране. Код превратился в лапшу из IF-ов и вычисляемых GOTO раннего фортрана.

вторая текстовая адвентюра, Dungeon была написана на лиспе в лаборатории динамического моделирования. использовался свой лисп MDL (Muddle). затем половина лаборатории отправилась на вольные хлеба в стартап — писать Zork.

моделировать текстовую псевдожизнь стало интереснее, чем физические процессы :))

Zork появлялся в виде хака для миникомпьютеров, и требовал громоздкого Lisp-интерпретатора. тем не менее, появилось ощущение, что можно написать «более лучшую реализацию лиспа», для 8-битных домашних компьютеров.

в итоге появлась Z-машина — VM полученная адаптацией интерпретатора большого лиспа для миникомпьютеров, специализацией в 8-битную VM для текстовых адвентюр, для 8-мибитных и 16-битных малышек.

затем, после Zork-а и 50 хитовых текстовых адвентюр, фирма Infocom была скуплена Activision на корню и загублена.

возможно, подточил финансовую устойчивость невыстреливший проект для СУБД Cornerstone, выпущенной для IBM PC, в которой аналогично Interactive Fiction можно было общаться со своими данными, задавать правила обработки и т.п.

или просто Sierra On-Line сбила мазу в «графические квесты». или мода прошла на текстовые игори. пипл начал хавать графон заместо тёплых ламповых текстов.

но движок не сдох, и формат Z-code был отреверсен и затем выпущена открытая (ну или полуоткрытая) реализация среды разработки Infrom, которая в версии Infrom7 2006 года напоминает программирование на ЕЯ.

были конечно и другие реализации — как интерпретаторов Z-code (например, на Elisp в емаксе), так и сред для разработки IF.

при этом, сред таких было выпущено порядка 20-30 с 80-х по текущее время.

из них интересны такие как AdvSys, GINAS  — на лиспе, даже в журнале Byte писали какие-то примеры на лиспе. на CL есть например lifp, с примерами

здесь несмотря на много сред, рулят основные 2: TADS с языком как будто язык программирования, и Inform7 с программированием на ЕЯ (в Inform6 был более ЯП)

так вот, я бы сказал что среда вроде Infrom7 позволяет программировать на ЕЯ проще, быстрее и понятнее чем на искусственом ИЯ программирования.

концептуально целостнее, особенно если совместить с Literate Programming.

когда эти самые правила становятся более-менее нетривиальными (например, тот же Эразмотрон).

хотя дьявол, конечно в деталях — в библиотеках правил, rulebook (которые здеь заменяют API).

Чем IF среды интересны сейчас? да это просто более прямой, чуть ли не самый очевидный способ программирования роботов.

просто движок игры должен выдавать несколько выхлопов — не только текстовый для читателя-человека, но и какую-то реализацию в Sexprs, JSON, ... текущего обновлённого дерева мира, и действия, и реакций мира/NPC.

писать два текста вместо одного, второй — исполняемый для REPL.

например, допилить Glulx для standalone клиента такого рода несложно.

или, для хисптеров — допилить JS интерпретатор до поддержки WebGL и 3д движка интерактивного мира в браузере.

anonymous
()
Ответ на: комментарий от anonymous

ещё такая вот мысль:

вот это

...
 ((eq (caar e) 'vau)
    (eval (caddar e)
         (cons (cons (cadar e) 'env)
                 (append (pair (cadar e) (cdr e))
                          a))))))

фактически и есть Environment passing style (во втором параметре eval — окружения, которые могут быть разными).

автор LoperOS, долгостроя LispOS в интервью проводит идею своего продукта: реконфигурируемый вычислитель FPGA, организованный как ‘dataflow CPU’

то есть, такой вот eval «в железе».

anonymous
()
Ответ на: комментарий от anonymous

вообще нет.

Вообще - да.

applicatives примерно соответствуют функциям — вычисляются все аргументы перед выполнением. operatives (фекспры в kernel) — наоборот, не вычисляется ни одного, и явно требуют вычислять вручную через eval.

Совершенно очевидно, что operatives ничем не отличаются от applicatives. Фишка в том, что не важно когда и как вычисляются аргументы - это не дают ровно никакого увеличения выразительности.

то есть, далее он фактически фигачит комбинаторами с двумя моделями вычисления: с eager (функции, applicatives) и lazy (фекспры, operatives) вычислениями

Ну да. Только они и так эквивалентны. Если у тебя етсь eager язык, то добавление lazy не повышает выразительности. И наоборот. По-этому язык с фекспрами совершенно никак не отличается по выразительности от обычного ЯП.

И, конечно, это знает любой, кто знает, что такое фекспры.

повышает и отличается, т.к. у функций разная семантика вычислений, жадная или ленивая.

Не повышает, т.к. ленивая и жадная семантика эквивалентны и тривиально выражаются одна через другую.

давай примеров. вот если взять Interactive Fiction вот отсюда с конца

примеров чего? Да, по твоей ссылке нету никакого ЕЯ, даже близко. Но ты ведь об этом знаешь, так?

ЕЯ это код

ЕЯ - это переусложненный код в котором дочерта лишнего. Ты даже факториал на ЕЯ не сможешь написать.

выразительность это хорошо.

Так в том и дело, что ЕЯ очень невыразительны по сравнению с ЯП.

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.