Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.66/358: Рейтинг темы: голосов - 358, средняя оценка - 4.66
2 / 2 / 0
Регистрация: 14.02.2021
Сообщений: 27

Является ли "+" - функцией?

24.12.2022, 23:21. Показов 72836. Ответов 32

Здравствуйте! Вопрос, возможно, глупый. Хотелось бы уточнить - "+" (равно как и "-") - это функция или оператор? И есть ли разница между оператором и функцией?
Таким образом, (+ 5 3) - вызов функции?
Заранее спасибо!
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
24.12.2022, 23:21
Ответы с готовыми решениями:

starDrag не является функцией
Пишу в as3 код import flash.geom.Rectangle; qw.addEventListener(MouseEvent.MOUSE_DOWN, onMD); function onMD(e:MouseEvent):void ...

Кнопка не является функцией
В хроме обнаружил такую ошибку Uncaught TypeError: addModal is not a function at HTMLButtonElement.onclick именно эта кнопка <button...

Проверить, является ли отношение R функцией?
Прикрепила лабу и сами задания. В четвертом задании ошибка, и я не могу ее найти. 4) Проверить, является ли отношение R функцией? ...

32
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
05.01.2023, 14:45
Цитата Сообщение от Гай Посмотреть сообщение
Почему же тогда специальная форма называется defvar, а не defsym например?
Потому что символы отдельно определять не надо, их ридер создаёт при чтении.

А что делает defvar? Наверно, заносит символ в какой-то перечень глобальных переменных. А может, записывает где-то в самом символе, что он может использоваться в качестве глобальной переменной. Зависит от реализации.

Цитата Сообщение от Гай Посмотреть сообщение
Вы мне отвечаете: нет, на самом деле вы не понимаете! катарсис это буквы - к. а. т. а. р. с. и. с.
..., с которыми ассоциирован процесс и результат бла-бла. В языках, где язык отдельно, а программа отдельно, не возникает недоразумений, если смешиваются имена и означаемые ими сущности. А в лиспе программа - это данные, поэтому надо осознавать, что означаемое и означающее - разные вещи. Потому что означающее - тоже лисповая сущность, но другой природы. В CL на первом месте выражения должен стоять символ. А функция - не может. Скопирую пример:
Lisp
1
2
(+ 5 6) ; в голове - символ: работает
(#.(function +) 5 6) ; в голове - функция: не работает
В схеме для головы другое правило; возможно, в Clojure - тоже. Не знаю, как в Clojure с макросами чтения, и можно ли в принципе в выражение воткнуть саму функцию, а не её имя и не выражение, вычисляющееся в функцию. В CL - можно.

Цитата Сообщение от Гай Посмотреть сообщение
Если IF - это просто символ, то почему же он не работает как специальная форма if выше в моём примере?
Ваш пример работает так. Предположу, Clojure, как Scheme, является лиспом-1 и допускает выражение в голове выражения. В голове вашего выражения стоит выражение, состоящее из одного символа - sym. Так как это ничем не примечательный символ (не специальный оператор и не макрос), то правило вычисления требует вычислить значение головы, получить функцию, и применить её к чему нужно. Односимвольное выражение-голова вычисляется как значение переменной, то есть в значение переменной sym - символ if. Ожидали получить в качестве значения функцию, получили - символ. Ошибка в рантайме.

Кстати, по поводу вашего изначального утверждения
Цитата Сообщение от Гай Посмотреть сообщение
Если вы попытаетесь в попытаетесь на первое место в списке поставить не функцию, то получите сообщение об ошибке.
if, defn, defvar - не функции и не имена функций, а ничего, можно ставить в голову выражения.

Добавлено через 22 минуты
Цитата Сообщение от Гай Посмотреть сообщение
Вот это да! Как и везде в других языках. Невероятно.
Есть нюанс - гомоиконность. В роли переменных выступают символы (symbol, тип данных). Так бывает далеко не везде. И этими символами мы оперируем при метапрограммировании. Да что там, можно функцией выполнять (глобальные) присваивания в рантайме с динамически вычисляемым именем переменной:
Lisp
1
2
3
4
5
6
7
8
(defvar *a* 'foo)
(defvar *b* 'bar)
 
(set '*a* 'baz)
(let ((var '*b*))
  (set var 'qux))
*a* ; BAZ
*b* ; QUX
0
Заблокирован
05.01.2023, 15:34
Цитата Сообщение от helter Посмотреть сообщение
Потому что означающее - тоже лисповая сущность, но другой природы. В CL на первом месте выражения должен стоять символ. А функция - не может. Скопирую пример:
А символ - это сферический конь в вакууме иди всё же ссылка на функцию?
Символ это designator.
A designator is an object that denotes another object.
Lisp
1
(print (funcall '+ 4 3))
Цитата Сообщение от helter Посмотреть сообщение
Предположу, Clojure, как Scheme, является лиспом-1 и допускает выражение в голове выражения.
А CL как работает?
Lisp
1
2
3
(defvar var 'if)
(print (type-of var))
(print (var (> 10 5) "bigger" "smaller"))
Цитата Сообщение от helter Посмотреть сообщение
if, defn, defvar - не функции и не имена функций
Да, это специальные формы, которые особым образом интерпретируются компилятором. Заходим на новый круг.

Цитата Сообщение от helter Посмотреть сообщение
Потому что символы отдельно определять не надо
Ну defvar же привязывает значение к символу. Так что это в итоге - символ или переменная?

Добавлено через 22 минуты
Цитата Сообщение от helter Посмотреть сообщение
Не знаю, как в Clojure
вот что я нашёл по Clojure
https://stackoverflow.com/ques... in-clojure
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
05.01.2023, 15:37
Цитата Сообщение от Гай Посмотреть сообщение
А символ - это сферический конь в вакууме иди всё же ссылка на функцию?
Символ - это сферический конь в вакууме. Symbol, тип данных, как вы пишете. А с ним может быть ассоциирована функция.

Цитата Сообщение от Гай Посмотреть сообщение
Символ это designator.
A designator is an object that denotes another object.
"Символ" - это объект соответствуюего типа данных. А "designator" - роль. Символы существуют "в природе", а designator-ы - в голове программиста.

Цитата Сообщение от Гай Посмотреть сообщение
А CL как работает?
Десять раз уже писал. В голове формы может быть только символ или лямбда-выражение, больше ничего. Если в голове стоит символ, то выражение вычисляется в зависимости от категории символа: если это специальный оператор, у него индивидуальное правило; если с этим символом ассоциирован макрос - раскрывается макрос, потом вычисляется; если с символом ассоциирована функция в пространстве имён функций - применяется эта функция; в противном случае - ошибка.

Цитата Сообщение от Гай Посмотреть сообщение
Так что это в итоге - символ или переменная?
Символ - это объект типа данных symbol. А переменная - это ассоциация символа со значением.
variable n. a binding in the ``variable'' namespace. See Section 3.1.2.1.1 (Symbols as Forms).
Символы возникают обычно при чтении. А defvar задаёт определённые свойства ассоциации: что она будет глобальная динамическая.

Ладно, я вижу, это сложновато. Думаю, понятнее объяснить я уже не смогу, так что подробности - в CLHS. Собственно, я и не собирался вам ничего растолковывать - просто не хотел, чтобы случайный читатель принял на веру, что "на первом месте выражения может стоять только функция".
0
Заблокирован
05.01.2023, 15:44
Глобальный вывод
+ - это символ, который связан с переменной с таким именем, которая, в конечном итоге, разрешается в функцию.

простой пример

Lisp
1
2
3
4
5
(def x 10)
 
;(var  x) var x даст нам ссылку на переменную, а @  эту ссылку разыменует
 
(+ 10 @(var x))
Добавлено через 3 минуты
Цитата Сообщение от helter Посмотреть сообщение
переменная - это ассоциация символа со значением.
О, наконец-то.
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
05.01.2023, 15:52
Цитата Сообщение от Гай Посмотреть сообщение
Глобальный вывод
+ - это символ, который связан с переменной с таким именем, которая, в конечном итоге, разрешается в функцию.
Выкинул фикцию. Символ "разрешается" в функцию: в лиспе-1 в единственном пространстве имён, в лиспе-2 - в функциональном.
0
Заблокирован
05.01.2023, 15:59
Цитата Сообщение от helter Посмотреть сообщение
Выкинул фикцию.
Lisp
1
2
3
4
5
6
7
8
9
10
Вот что я нашёл насчёт разницы в CL
 
;Calls the lexical function named foo. If there is no lexical function foo, it calls the symbol function of foo.
(funcall #'foo 1 2 3)
 
;Calls the lexical function named foo. If there is no lexical function foo, it calls the symbol function of foo.
(foo 1 2 3)
 
;Calls the global symbol function of foo. Thus there will be a lookup through the symbol.
(funcall 'foo 1 2 3)
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
05.01.2023, 16:08
Да, всё так. Вот это "function named" означает существование ассоциации в функциональном пространстве имён. С символом может быть ассоциирована функция в функциональном пространстве, и её можно "вытаскивать" для разных целей - не только чтобы вызвать funcall-ом, но и, например, чтобы передать в mapcar или sort. А если символ стоит на первом месте списка, лисп вытаскивает ассоциированную функцию самостоятельно. На первых порах насчёт (funcall 'foo 1 2 3) можно особенно не париться, это дополнительное удобство funcall-а и некоторых других функций; но действительно удобно (например, если использовать что-нибудь хукоподобное: с символами удобнее, чем с функциями).
0
Заблокирован
05.01.2023, 16:15
helter, как я понял #' - это переменная, как и в Кложе. А 'x - мы тут экранируем х и превращаем его в символ, чтобы уче через символ добраться до значения.
0
4528 / 3522 / 358
Регистрация: 12.03.2013
Сообщений: 6,038
05.01.2023, 16:57
#' - это доступ к значению в функциональном пространстве имён. Ну то есть да, как переменная, только в другом пространстве. То есть когда мы пишем (funcall #'foo 1 2 3), funcall получает уже саму функцию, символа foo он не видит. (По идее, надо сказать не "funcall получает", а "функция, ассоциированная с символом funcall в функциональном пространстве имён получает...", но я сдаюсь, ваша правда, так разговаривать невозможно.) А когда мы пишем (funcall 'foo 1 2 3), funcall получает символ, который он должен применить как функцию. Но у него хватает соображения найти функцию с этим именем и применить её.
0
Заблокирован
05.01.2023, 17:15
helter, ну вот и разобрались во всём)
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,781
07.01.2023, 08:48
Цитата Сообщение от Гай Посмотреть сообщение
В компьютере есть ячейки памяти. Когда вы обращаетесь к gee, то вы обращаетесь к переменной хранящей адрес функции. Вы же не с голым адресом в памяти работаете.
Потому что Lisp. Был бы Си, мог бы и с голым адресом работать. Компьютер ничего не знает про переменные и функции.

Добавлено через 1 минуту
#' — это синтаксический сахар для (function ...)
1
Заблокирован
10.01.2023, 09:40
Цитата Сообщение от korvin_ Посмотреть сообщение
#' — это синтаксический сахар для (function ...)
Цитата Сообщение от Гай Посмотреть сообщение

(print #'gee)
что равнозначно

(print (function gee))
Спасибо, кеп. В очередной раз.
0
Заблокирован
10.01.2023, 22:06
Цитата Сообщение от korvin_ Посмотреть сообщение
Компьютер ничего не знает про переменные и функции.
Пылесос ничего не знает о вакууме.
Электрическое рыле ничего не знает об электричестве.
Космический корабль ничего не знает о космосе.


Похоже я тут один в полной мере знаю Лисп - что ни скажу все за мной тут же повторяю. Да, кажется, мой авторитет очень велик.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
10.01.2023, 22:06

Ошибка: setProgress не является функцией
Здравствуйте! Новичок во Flash, столкнулась с проблемой: flash выдает ошибку: в чем проблема - не могу понять. При этом в...

Является ли функцией бинарная матрица?
Как определить является ли бинарная матрица отношения размерностью nxn функцией? Помогите пожалуйста

Является ли функция безопасной псевдослучайной функцией
Пусть функция F:{0,1}^n×{0,1}^n→{0,1}^n является безопасной псевдослучайной функцией. Является ли функция F′ также безопасной...

Является ли функция от x,y,z рациональной ф-цией от y ,от z ; целой функцией от x
alpha(x,y,z)=y^2-(ycosz+zcosy)x+{x}^{(y+z)/(y-z)} Можете подсказать как решить данное задание ?

Функцией чего является теплоёмкость термодинамической системы
Функцией чего является теплоёмкость термодинамической системы?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Программа для com-порта
Uhbif79 05.06.2026
Всем привет, давно хотел изучить Qt, начинал, бросал, потом снова начинал. И сейчас вот смог написать свою первую программу. До этого имел опыт программирования микроконтроллеров, писал прошивки на. . .
Транскрипция 55-минутного видео через Whisper: WhisperDesktop облажался, спас Google Colab[
anaschu 01.06.2026
Понадобилось получить текст из свежезагруженного видео на YouTube. Казалось бы, задача на пять минут. Заняла полтора часа. Делюсь опытом — может кому пригодится последовательность решений. . . .
21 мат мед. Планы на развитие модели здравоСохранения
anaschu 01.06.2026
AnyLogic: план развития симуляционной модели рабочего коллектива — динамический абсентеизм, реальные данные, три сценария сравнения Продолжаю серию постов о дискретно-событийной модели рабочего. . .
20. Мат мед. Абсентеизм как отдельный тип простоя
anaschu 29.05.2026
Апдейт модели: исправленные баги, абсентеизм и новые механизмы Продолжаю развивать ранее описанную модель рабочего коллектива на AnyLogic. За последние несколько дней был проведён серьёзный. . .
19. здоровье, усталость и психотип работника влияют на производительность предприятия, и наоборот, производительность на здоровье, усталось и психотип
anaschu 28.05.2026
Дискретно-событийная модель рабочего коллектива на AnyLogic: здоровье, выгорание, психотипы и микростимуляция Привет, коллеги. Хочу поделиться итогами нескольких недель работы над симуляционной. . .
"Прокси" для последовательного порта
Eddy_Em 28.05.2026
Эту штуку написал я достаточно давно. Но сейчас вот понадобилось настроить датчик грозы, но при этом не отключать его от "метеодемона". Соответственно, надо запустить этот "прокси": метеодемон будет. . .
Рефакторинг программы уравнивания.
Massaraksh7 26.05.2026
Пример по предыдущей записи в блоге. Но, надо заметить, что, во-первых, там оптимизация не только математики, но и работы с базой данных, и с графами, а во-вторых, это ещё не всё.
Использование TThread в Lazarus для математических вычислений.
Massaraksh7 25.05.2026
Производя рефакторинг своих программ на предмет ускорения их работы, обратил внимание на такой аспект, как сокращение времени матвычислений. Дело в том, что приходится работать с большими матрицами. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru