LINUX.ORG.RU

операторы

В лиспе нет операторов, там только фнкции, потому что запись всех выражений в префиксной форме.

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

вообще то, операторы отличаются не этим, а тем, что они предварительно обрабатываются препроцессором, и не являются объектами языка.

onceagain2017
()

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

loz ★★★★★
()

Глянь лекции Романа Попова и сам табличку нарисуй. И разберёшься, и запомнишь лучше, и оформишь в виде удобном для тебя.

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

а чё не посоветовал посты анонiмуса? он ещё тупее

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

Нет, я вообще. То что ты сказал изначально про префиксную запись — неверно, она тут не при чем. Например, в инфиксной записи это могут методы, а не операторы 1 +(2)

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

Ок. Тогда в лиспе все равно нет операторов. Только макросы и функции. Т.к. препроцессор ничего кроме макросов отдельно не обрабатывает.

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

И их вполне можно назвать операторами

Вообще-то нет. Оператор - это инструкция (statement), а не выражение (expression). А в лиспе всё является выражением.

no-such-file ★★★★★
()
Ответ на: комментарий от onceagain2017

они предварительно обрабатываются препроцессором, и не являются объектами языка

Совсем поехавший?

no-such-file ★★★★★
()

В Common Lisp 25 специальных операторов.

quote - предотвращает вычисление выражения

progn - последовательное вычисление заданных форм

locally - аналогично progn, но может содержать декларации

block - именованный блок кода, за пределы которого можно вернуться с помощью return-from

return-from - возвращается из соответствующего block

let - параллельный биндинг переменных

let* - последовательный биндинг переменных

progv - динамический биндинг динамических переменных

unwind-protect - выполнение заданной формы, и последующее выполнение «защищенных форм» (аналог try...finally)

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

throw - возвращается за пределы соответствующего блока catch

tagbody - установление блоков кода, связанных с метками, по которым можно вернуться с помощью оператора go

go - возврат на соответствущую метку в tagbody

setq - изменение значения переменной

if - оператор ветвления

flet - биндинг локальных нерекурсивных функций

labels - биндинг локальных рекурсивных, в т.ч. взаимно-рекурсивных, функций

macrolet - биндинг локальных макросов

symbol-macrolet - биндинг локальных символьных макросов (аналог #define)

the - декларация компилятору о том, что переданное выражение имеет заданный тип

function - получение функции по имени, известному во время компиляции (в CL у функций и переменных разные пространства имен, поэтому так)

eval-when - выполнение кода в зависимости от конкретной стадии компиляции/загрузки/выполнения

load-time-value - откладывание выполнения до момента загрузки кода, также с его помощью можно создавать readonly-значения-константы

multiple-value-call - применение функции к одному или нескольким кортежам множественных значений как будто бы к спискам собранным в один список аргументов

multiple-value-prog1 - вычисляет сначала первую форму, потом следующие, но возращает кортеж множественных значений, полученный из первой

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

values - превращает список аргументов в кортеж множественных значений

funcall - применяет функцию к аргументам

apply - применяет функцию к аргументам, последний аргумент должен быть списком, он раскрывается как будто бы все значения оттуда передали напрямую

Что до стандартных типов данных и функций для работы с ними, то читай PCL и CLHS

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

Ещё есть специальные формы. И их вполне можно назвать операторами.

В лиспе есть специальные операторы - так и называются. Но они не являются операторами в смысле как у алголоподобных языков.

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

Но спецформы являются выражениями языка. Это разве сочетается? По сути, спецформы — это выражения, которые не следуют обычному порядку выполнения, в этом их основная суть

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

это операторы

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

foo - простая форма

(cons 1 2) - составная форма

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

Например, go и return-from

Формально у них всё-таки есть значение, т.е. это выражения. Так же как void foo() в Си - всё равно функции.

no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 2)
Ответ на: комментарий от no-such-file

Нет у них значения, от слова совсем. Потому что они никогда ничего не возвращают. Это операторы мгновенной передачи control flow. Какой может быть тип у goto или java-style throw?

Если не углубляться в теорию типов и прочее (в хаскеле - аналог - bottom)

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

Ну а как же, все таки, определять оператор? Если исходить из Вашего объяснения, то получается, что:

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

Так будет корректно?

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

Ну допустим, корректно.

Если проще сказать, оператор - все что не функция.

В случае лиспа же можно сказать умнее - форма оператора это нередуцируемая специальная форма.

Редуцируемая специальная форма (специальная, или, корректнее перевести - «особенная» - она в том плане что отличается по семантике от формы вызовы функции) - это макрос.

lovesan ★★
()
Последнее исправление: lovesan (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Формально у них всё-таки есть значение, т.е. это выражения.

Хм... Действительно (+ 1 (return-from ...)) и (+ 1 (go ...)) компилируется.

Согласен.

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

Нет у них значения, от слова совсем

Их можно использовать в любом месте, где ожидается значение. Как аргументы функции, инициализирующий параметр let, условие if и т.д. Поэтому выражения.

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

Я не знаю, что этим ты хотел сказать, но в CL операторов в привычном их понимании нет.

С обработкой операторов _препроцессором_ тоже эпичное заявление :)

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

Как мы выяснили ниже — есть. Но это терминологический спор, похоже, который не имеет разрешения.

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