LINUX.ORG.RU

[CL] Частное против общего, setq VS setf


1

4

Привет. Недавно просил оценить пару десятков строк своего кода на лиспе и получил несколько ссылок «как правильно писать». Одним из пунктов было примерно следующее: старайтесь в каждом случае использовать частные решения вместо общих, когда это возможно eq вместо equal, setq вместо setf и т.д. И если со сравнением все понятно - у разных функций разная точность и разная скорость выполнения, - то ситуация с setq и setf не совсем ясна.

С одной стороны я и сам давно привык присваивать значения символам через setq, но борюсь с этой привычкой для однообразного отражения в коде однотипных операций; для присваивания символам setf раскрывается в setq - о производительности речи не идет. С другой стороны, увидел этот совет и задумался: setq и setf и так визуально достаточно похожи, в коде однозначно читаются как «присваивание», зато по setq можно сразу определить, что присваивание происходит просто переменной, а по setf - что это модификация части какого-то объекта.

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

★★★★★
Ответ на: комментарий от archimag

Я считаю, что стилистически лучше использовать везде SETF. Почему — напишу как-нибудь попозже :)

Если автор статьи ты, пиши :) Речь сейчас именно об этом.

staseg ★★★★★
() автор топика

Частное имеет смысл только в случае оптимизаций, в частности - в случае оптимизаций по скорости выполнения. Сюда, например, относится eq вместо eql или equal, или какой-нибудь обобщенной функции сравнения. И другое подобное.

Но, в большинстве случаев стоит использовать именно наиболее «общие» варианты. Потому что это упрощает код(в т.ч., что важно - для чтения другими людьми), повышает уровень абстракции, и все такое. Ну сам понимаешь, думаю.

setq вообще использовать не надо, считай ее деталью реализации setf.

Кто тебе тот совет то дал? Слушай блин больше всяких там ....
Нормальных специалистов по лиспам, в частности, людей, понимающих что-то в стиле написания кода на диалектах лиспа, в рашке в принципе практически нет.

lovesan

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

В принципе можно провести следующую аналогию.

Если сравнивать setq vs setf с языками типа Си - то это то же самое, что спрашивать - а как же блин, лучше возвращать целочисленное значение из функции на x86 - ручками ли писать volatile asm { mov eax, value } или же просто использовать return?

lovesan

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

Кто тебе тот совет то дал?

Анонимус какой-то, хз, вы обычно не подписываетесь. Кодогенерация LISP → C (комментарий) Конкретно эта ссылка: http://www.faqs.org/faqs/lisp-faq/part1/section-4.html, search: Use the most specific construct that does the job.

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

Окей, спасибо за мнение.

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

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

Потому что дальше же:

Stylistic preferences:

      - Use (SETF (CAR ..) ..) and (SETF (CDR ..) ..) in preference to
        RPLACA and RPLACD. Likewise (SETF (GET ..) ..) instead of PUT.

Короче, делай я как уже написал, и будет тебе щастье.

lovesan

anonymous
()

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

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

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

Use the most _specific_ construct that does the job.

Подозреваю, что имелось ввиду, немного другое: например, если есть одна ветка в условии - то вместо if when/unless etc.

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

Кто тебе тот совет то дал?

Анонимус какой-то, ...

Не ври! Я тебе давал совет по when/if/cond, а ссылки добавил для самостоятельного изучения. Перечитай пост.

А следующим постом упомянул про исключения и дал ссылку на Зака.

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

А следующим постом упомянул про исключения и дал ссылку на Зака.

Не сердись, анон. Как видишь, ссылки изучил - и возник сей вопрос.

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

А чего мне сердиться? Ссылки дал, в том числе и на МИТ, а насколько они полезна: пусть каждый сам решает - я ещё не встречал безмозглых лисперов.

И учти, хороший анон плохого не посоветует, а плохих анонов лучше вообще не слушать.

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