LINUX.ORG.RU

Классификация операторов в Lisp

 


3

1

Разработчики Common Lisp не зря поменяли традиционный термин «специальная форма» на «специальный оператор». Например, выражение как целое (quote a) является специальной формой, а quote обозначает специальный оператор. Необходимо еще немного прояснить терминологию. Итак, оператор — любой объект, который может находится в голове формы. Ниже представлена классификация операторов:

                           Операторы
             _________________/\__________________________________________
	    |                              |                              |
         Функции                Специальные операторы                  макросы
       ____/\____              ____________/\________________ 
      |          |            |                              |
 встроенные   замыкания     Примитивные                 реификаторы
                        специальные операторы       ________/\_________
                                                   |                   |
                                               частичные             полные

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

В соответствии с этой теорией должен быть изменен apply/eval интерпретатор:

(eval выражение окружение продолжение)
(apply-operator оператор аргументы окружение продолжение)
(apply-function функция аргументы продолжение)

Функция eval лишь вычисляет голову формы, а результат (оператор) классифицируется функций apply-operator, которая либо передает управление функции, которая реализует соответствующий специальный оператор, либо функции apply-function. Кроме того, что специальные операторы применяются к невычисленным аргументам (cdr формы), они еще имеют доступ к полному контексту вычислений. Макросы не имеют такого доступа, поэтому, я не классифицирую их как специальные операторы. Функции не имеют доступа к лексическому окружению момента вызова. Следовательно такие функции как set из CL должны рассматриваться как нарушение теории и исключены из Лиспа. Функция set может быть, но только если она будет принимать дополнительный аргумент: (set символ значение окружение).

Частичные реификторы. nlambda получает только cdr формы, vau — cdr формы и окружение.

Полные реификаторы. В работах Brian Cantwell Smith были предложены 3-х аргументные fexpr'ы. В реификаторы Смита передаются не только сырые аргументы и окружение, но и продолжение. Полные реификаторы неотличимы от встроенных специальных операторов.

Что ты хочешь?

Это какое-то откровение шизофреника? Как нам относиться к твоему полотну?

niemand
()

Тема ректификации, кстати, не раскрыта

niemand
()

Зачем нужен ЛИСП, кроме конфигурирования emacs'a? Не знал, что на нем кто-то программирует.

hotpil ★★★★
()
Ответ на: комментарий от niemand

А топики на лоре могут содержать только вопросы? Это «полотно» не откровения шизофреника, а один из результатов моих исследований в области рефлексии и языка Lisp. Если ты не понимаешь, что тут написано, то это не повод высказываться в таком неуважительном ключе.

komputikisto
() автор топика
Ответ на: комментарий от hotpil

Не знал, что на нем кто-то программирует.

Очень мало программируют. Lisp — одна из моделей (наряду с лямбда-исчислением) для научного исследования языков программирования. Если тебя языки интересуют лишь в практическом отношении, то Lisp тебе не нужен. Для достижения практических целей лучше заниматься каким-нибудь питоном или руби.

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

а один из результатов моих исследований

Так вот тебе пропишут таблетки, что ты перестанешь мнить из себя исследователя

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

Расскажешь доктору, что занимаешься рефлексией, ок?

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

заниматься каким-нибудь питоном или руби.

Попрошу не обобщать. Питон — это жаба, адаптированная для веба, а RUBY — это мощнейший язык, он ничем не уступает лиспам, скорей, даже, превосходит их. Это лисп и смоллток в одном флаконе. Так что не надо тут кукарекать не по теме, и сравнивать член с пальцем.

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

Не знаю, что такое «Lisp» или «ЛИСП», но современные диалекты - это реальные языки.

Понятие модель не всегда означает что-то нереальное. «Наиболее совершенной моделью кота является такой же кот, а лучше — он сам.» Норберт Винер.

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

Питон — это жаба, адаптированная для веба

С Жабой его можно сравнивать только в социальном плане, т.к. Питон — самый популярный динамический язык. Он с технической точки зрения это вполне добротный язык. Идеала нет! Как Питон, так и Руби имеют множество изъянов в дизайне. Один из самых главных недостатков обоих языков — отсутствие доступа к AST из коробки. В целом, да, выразительность в Руби выше из-за блоков.

komputikisto
() автор топика

(eval выражение окружение продолжение)

продолжение, вероятно, должно тоже получать окружение в качестве аргумента? В каком окружении оно выполняется в твоей модели?

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

Один из самых главных недостатков обоих языков — отсутствие доступа к AST из коробки

Это даже не недостаток

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

динамический язык

Нет, в нем недостаточно динамики. Его «динамика» от жабской недалеко уползла. Все методы в питоне с ранним статическим связыванием. На каждый объект — свой набор методов. Почему его называют «динамическим», я хз. В чем его «динамичность»?

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

Ну зачем говорить самому с собой, исследователь? Тебе помощь нужна, понимаешь?

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

лисп - модель лиспа.

Языки программирования — не только научный объект или техническая система, но и социальное явление. Если бы не социальный аспект, все языки можно было бы заменить на диалекты Лиспа. Учитывая тот факт, что научному анализу Lisp поддается лучше чем современные языки с их нагромождением ad hoc правил, лучше исследовать его, а не Питон или Руби. Таким образом, Lisp — модель динамических языков программирования. В рамках теории разработанной на основе Лиспа можно описывать явления из динамических языков вообще, т.е. исследования Лиспа ценны не только как исследования Лиспа.

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

Таким образом, Lisp — модель динамических языков программирования.

Только старинные, и пара интерпретируемых современных, лисп-мейнстрим никаким боком не динамичен.

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

но и социальное явление.

Так ты гуманитарий. Что же ты молчал?

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

О, ну поздравляю! Только узнал, что он сам с собой говорит? Я вообще не удивлюсь, если это виртуал «добропорядочного» лоровца с уймой свободного времени

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

Кетонал свечи ректальные

Люди в большинстве своем не хотят ректально применять лекарства. Из-за этих страхов ассортимент свечей узок. Зря! Кетонал быстро садит желудок, а свечи безопаснее. И быстрее действует.

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

Вы, возможно, из-за потока офтопа, пропустили мой вопрос. Каким образом в вашей модели продолжение получает свое окружение? Я серьезно спрашиваю, интересно.

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

продолжение, вероятно, должно тоже получать окружение в качестве аргумента?

Функция применения продолжения имеет следующий интерфейс:

(apply-continuation продолжение . аргументы)

На самом деле продолжение — это особый вид замыкания, которое несет в себе ссылку не только на лексическое окружение, но и на динамическое. Если есть ошибочная континуация, то она тоже записывается в это особое замыкание. Т.е.

замыкание = тело функции + окружение
продолжение = замыкание + динамическое окружение + error-континуация

То, что это действительно так можно убедиться посмотрев на функцию extend-continuation языка Kernel:

(extend-continuation continuation applicative [environment])

The extend-continuation applicative constructs and returns a new child of continuation that, when it normally receives a value v, calls the underlying combiner of applicative with dynamic environment environment (or an empty environment if none was specified) and operand tree v, the result of the call normally to be returned to continuation.

komputikisto
() автор топика

Код интерпретатора для вашего диалекта можете подготовить? Сначала на одном из распространенных диалектов, потом на своем, для сравнения.

Я как бы за научные исследования, например. В том числе, за исследования в области языков. Но во-первых, не за голословные (чтоб был пример интерпретатора, желательно на своём же диалекте), и во-вторых, чтоб идеи исследований были ясно изложены, с примерами, схемами, и тд.

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

особый вид замыкания, которое несет в себе ссылку не только на лексическое окружение, но и на динамическое

Это очень напоминает модель исполнения Javascript:


x=1

environment=function(){this.x=x}

;(function(x){return function(y){print( this.x+y+x )}})(1).apply(new environment, [2]) // -- лексический x - 1; явный аргумент -- y - 2;  динамически получаем новое окружение new environment 

x=2

;(function(x){return function(y){print( this.x+y+x )}})(1).apply(new environment, [2])


//  4
//  5
[/js]
Не оно?

anonymous
()

Работы Смита мы и сами можем прочитать. Научная новизна ваших непосредственно идей в чем состоит?

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

Его нет в систематическом виде. Есть дерево различных схем, которые я опробовал, но я не думаю, что они представляют интерес. Смысл имеет публиковать код результата и он будет но не прямо сейчас. Скорее всего это будет опубликовано в виде лекций по интерпретации Лиспа. Вот тут я рассказывал о двух основных фичах будущего диалекта — изменчивость текстовой репрезентации символов и реификаторах. Т.е. постепенно публикую, что могу.

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

реификаторах

Я вбил в гугле реификаторы — на русском 3 результата, первый — страница на которой мы находимся:) Неохота надрывать голову, на английском читать. ожет пояснишь в 2-х словах здешней полуграмотной публике, что это такое? Заранее спасибо.

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

Научная новизна ваших непосредственно идей в чем состоит?

Ну, принципиально нового я ничего не сделал. Я, хоть и Попов, но стою на плечах гигантов. Если коротко, то:

  • Смит использовал функциональное представление продолжений, а для сохранения гомоиконности нужно фреймовое представление, которое было открыто до меня, но не в контексте реификаторов;
  • я придумал контексты репрезентаций, которые позволяют изменять текстовую репрезентацию символов;
  • немного исправил first-class окружения (смотри MIT Scheme);
  • разработал описанную в посте классификацию

Все остальное компиляция.

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

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

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

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

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

«Смит использовал функциональное представление продолжений, а нужно фреймовое» в контексте реификаторов.

«Контексты репрезентаций»

Вот на это хотелось бы действительно глянуть, только в удобочитаемом виде.

bogus_result
()

Я не знаток CL, но в Scheme вроде set это особая форма, и по вашей классификации она как особая форма вполне может существовать. В CL это не так?

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

В CL есть специальный оператор setq и функция set. Т.е. в CL можно писать так

(set 'x 'функция)
(setq x 'специальный-оператор)

Классификация не с потолка взялась. Внутренний и внешний интерфейсы интерпретатора должны быть унифицированы. Если внутри интерпретатора apply принимает окружение (что нужно для функции set), то и внешний apply должен тоже принимать окружение. Но окружение момента вызова не нужно для применения замыканий. Таким образом, выбираем наиболее узкий интерфейс и отвергаем такие функции как set.

komputikisto
() автор топика
Ответ на: комментарий от hotpil

Зачем нужен ЛИСП, кроме конфигурирования emacs'a? Не знал, что на нем кто-то программирует.

Дата регистрации: 07.12.2014 18:44:28

Тебе ещё многое предстоит узнать об этом мире, сынок...

mv ★★★★★
()
Ответ на: комментарий от komputikisto

Крамолу сейчас скажу: мне кажется, что настоящая проблема зарыта глубже. Да, если рассматривать её в терминах замыканий, окружений, евал, апплай, то все так как вы говорите. Но возможно сама модель вычислений с окружениями создала проблему с функциями, подобными set, и возможно она решаться должна на уровне модели вычислений?

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

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