С Новым годом! Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.84/25: Рейтинг темы: голосов - 25, средняя оценка - 4.84
165 / 164 / 23
Регистрация: 23.02.2011
Сообщений: 347

setf setq

01.02.2013, 21:25. Показов 5279. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Скажите, в чем разница между setf и setq?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.02.2013, 21:25
Ответы с готовыми решениями:

SETQ не работает для безымянной функции
В самоучителе по Лиспу нашел, что можно лямбда-функцию присвоить переменной, и вызывать как обычную функцию: Задание:...

Setf и другие спискоразрушающие функции. Когда их применение оправдано?
Ознакомившись с функциями rplaca, rplacd, я решил никогда, без крайней нужды, не применять спискоразрушающие функции. Но, меня смущает то,...

cout.setf не могу понять
Не могу понять что это значит. cout.setf(ios_base::fixed, ios_base::floatfield); В книге написано, что это фиксированная точка. Также...

7
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38163 / 21098 / 4306
Регистрация: 12.02.2012
Сообщений: 34,687
Записей в блоге: 14
01.02.2013, 22:08
Это один из расхожих вопросов. Кратко: setq присваивает значение символу. И только. А setf может больше (изменить элемент списка, хеш-массива в т.ч. и присвоить значение символу).
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4575 / 2774 / 491
Регистрация: 28.04.2012
Сообщений: 8,761
01.02.2013, 23:47
http://www.lispworks.com/docum... _setf_.htm

Например:
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
(defun make-point (x y)
  (vector x y))
 
(defun point-x (p)
  (aref p 0))
 
(defun point-y (p)
  (aref p 1))
 
(defun (setf point-x) (new-x p)
  (setf (aref p 0) new-x))
 
(defun (setf point-y) (new-y p)
  (setf (aref p 1) new-y))
 
(defun test ()
  (let ((p (make-point 1 2)))
    (format t "p.x = ~a~%" (point-x p))
    (setf (point-x p) 3)
    (format t "p.x = ~a~%" (point-x p))))
 
(test)
; 1
; 3
Важно при этом понимать, что первый аргумент setf (place) — это вовсе не аналог передачи по ссылке как в Паскале или C++
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
...
 
(defun set-value (ref new-value)
  (setf ref new-value))
 
(defun test-2 ()
  (let ((p (make-point 1 2)))
    (format t "p.x = ~a~%" (point-x p))
    (set-value (point-x p) 3)
    (format t "p.x = ~a~%" (point-x p))))
 
(test-2)
; 1
; 1
1
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
02.02.2013, 03:47
http://lisper.ru/articles/setf-vs-setq
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38163 / 21098 / 4306
Регистрация: 12.02.2012
Сообщений: 34,687
Записей в блоге: 14
02.02.2013, 11:02
В свое время я тоже не смог "въехать" в этот вопрос. Читал и статью "setf vs setq". Методически она написана не вполне корректно:

"... setq - это оператор, присваивающий значения переменным" - это и так ясно.
"... setf - это макрос " - и что?
"... он позволяет выполнить присваивание в произвольное место" - вводится новое понятие - "присваивание в место". Определения не дается, но приводятся примеры (car, cdr и т.д.)

На мой взгляд, лучше было бы обойтись без сомнительных нововведений и просто сказать: setf позволяет модифицировать различные структуры (и, в т.ч. присваивать значения символам). Реализуется, как макрос.

Простейшая реализация (из HomeLisp):

Lisp
1
2
3
4
5
6
7
8
(defmacro setf (place val)
    (COND ((ATOM place) (LIST (QUOTE SETQ) place val))   ;; SETQ
    ((EQ (QUOTE CAR) (CAR place)) (LIST (QUOTE PROG) NIL (LIST (QUOTE RPLACA) (CAR (CDR place)) val) (LIST (QUOTE RETURN) val)))  ;; RPLACA
    ((EQ (QUOTE CDR) (CAR place)) (LIST (QUOTE PROG) NIL (LIST (QUOTE RPLACD) (CAR (CDR place)) val) (LIST (QUOTE RETURN) val)))  ;; RPLACD
   ...
   ...  и др. модификации структур Лиспа
   ...
)
2
Эксперт С++
 Аватар для Nameless One
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
02.02.2013, 12:09
Catstail, тут, ИМХО, больше интересна возможность определять custom setf'able places (для Common Lisp).

Цитата Сообщение от Catstail Посмотреть сообщение
"... setf - это макрос " - и что?
"... он позволяет выполнить присваивание в произвольное место" - вводится новое понятие - "присваивание в место". Определения не дается, но приводятся примеры (car, cdr и т.д.)
Это неформальное понятие, которое используется для объяснения сущности setf. Вот мой вольный перевод фрагмента из главы «Generalized Variables» (CLtL), в которой об этом говорится немного подробнее:

Вместо того, чтобы думать о двух различных функциях, которые, соответственно, обращаются и модифицируют область памяти (storage location), каким-то образом полученную из их аргументов, мы можем просто думать о вызове функции доступа к данным аргументам как об «имени» области памяти (storage location). Таким образом, как x можно считать именем некоторой области памяти (переменной), так же и (car x) является именем для car'а некоторой cons-ячейки (которая в свою очередь названа x). Теперь вместо того, чтобы запоминать две функции для каждого типа обобщенных переменных (запоминая, к примеру, что rplaca относится к car), мы принимаем единообразный синтаксис для модификации областей памяти, именованных таких образом, с помощью макроса setf. Это аналогично способу, по которому мы использовали специальную форму setq для преобразования имени переменной (которая также является формой, которая обращается к ней [к переменной]) в форму, которая модифицирует ее [переменную].

Не по теме:

Возможно, лучше было перевести «storage location» как «место хранения».



Таким образом, setf заменил избыточные формы:

С появлением setf в Common Lisp пропала необходимость в setq, rplaca и set; они избыточны. Они сохранились в Common Lisp из-за их исторической важности для Lisp. Однака, большинство других модифицирующих функций (таких как putprop, модифицирующей функции для get) были устранены из Common Lisp в пользу того, что setf будет единообразно использоваться взамен.
А вообще, проще всего сказать, что setf — это макрос, который в зависимости от формы place генерирует различный код присваивания (на самом деле так и есть).
2
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38163 / 21098 / 4306
Регистрация: 12.02.2012
Сообщений: 34,687
Записей в блоге: 14
02.02.2013, 14:25
Цитата Сообщение от Nameless One Посмотреть сообщение
custom setf'able places
- и в HomeLisp тоже...

Добавлено через 1 минуту
Цитата Сообщение от Nameless One Посмотреть сообщение
мы принимаем единообразный синтаксис для модификации областей памяти
- вот! О чем я и сказал!
0
1075 / 968 / 113
Регистрация: 04.11.2012
Сообщений: 1,013
02.02.2013, 16:46
Здесь тоже есть немножко про setf

http://lisper.ru/articles/nikodemus-cl-faq
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
02.02.2013, 16:46
Помогаю со студенческими работами здесь

Использование setf() для установки флага
этот листинг работает: #include <iostream> using namespace std; int main() { cout.setf(ios::showpos); ...

Зачем нужна член-функция cout.setf?
Всем здравствуйте, у меня такой вопрос: Начал изучать программирование C++. Попался мне вот такой пример и в нём есть строка, назначение...

Что означает строка кода cout.setf(ios_base::fixed)
Что это значит? cout.setf(ios_base::fixed);

cout.setf и cout.precision
Здравствуйте. В одной книге увидел строчку кода: cout.precision(2); cout.setf(ios::fixed, ios::floatfield); Объясните, что...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Новый CodeBlocs. Версия 25.03
palva 04.01.2026
Оказывается, недавно вышла новая версия CodeBlocks за номером 25. 03. Когда-то давно я возился с только что вышедшей тогда версией 20. 03. С тех пор я давно снёс всё с компьютера и забыл. Теперь. . .
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru