LINUX.ORG.RU

LISP. Отличие setq от setf.


0

0

По ходу изучения LISP возник вопрос.
В чём разница между (setq a 1) и (setf a 1)?
В обоих случаях мы устанавливаем значение переменной a в 1. Понятно что я могу сделать так

(setq v (make-array '(3)))
;; так допустимо
(setf (aref v 0) "first")

и не могу так

;; так неверно
(setq (aref v 0) "first")

Но ведь (setq a 1) и (setf a 1) одно и тоже. Так зачем вообще использовать setq если его можно заменить setf? Или я что-то не понял?


setf changes the value of place to be newvalue.

setq assigns values to variables.

ska
()

Да, ты прав, его можно не использовать.

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

setf разворачивается в setq только в применении к атомам.

(setq a '(1 2 3))
(macroexpand-1 '(setf (cadr a) 'b))
(LET* ((#:G8367 A) (#:G8368 'B)) (SYSTEM::%RPLACA (CDR #:G8367) #:G8368))

asgard
()

Плачу весь. CL переплюнул С++ по количеству маразма. Scheme is the Lisp, dudes.

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

> (setq a '(1 2 3)) > (macroexpand-1 '(setf (cadr a) 'b)) > (LET* ((#:G8367 A) (#:G8368 'B)) (SYSTEM::%RPLACA (CDR #:G8367) #:G8368))

И эти люди ещё говорят, что плюсовые шаблоны приводят к непонятным сообщениям об ошибках, лол.

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

Результат разворачивания плюсовых шаблонов чаще всего приходится наблюдать в ругани компилятора. А этот CL-ный ахтунг ты можешь лицезреть штатным образом, лол.

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

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

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

Kto-zh tebya zastavlyaet na macroexpand ot standartnogo v CL setf smotret'? Ispol'szuj ego, on rabotaet, a to chto skryto za nim eto delo konkretnoj CL realizacii.

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

ta dlinnay i neponyatnaya otryzhka, kotoruyu plyusovuj kompilyator vydae, naprimer pri ispol'zovanii boost, ni v kakoe sravnenie ne idet s ponyatnym i prostym vyvodom CL'nogo macroexpand'a.

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

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

Ога, у плюсовых фанбоев тоже любимая фраза "вы тупы и не смогли осилить семантику С++". Я пишу на Схеме, и Пол Грэм пишет на схеме, а вы копаетесь в застарелом говнище, не понимая, что от фанатов C++ мало чем отличаетесь.

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

> и Пол Грэм пишет на схеме

"Which should I learn, Common Lisp or Scheme? What's the difference?

Common Lisp is powerful but ugly. Scheme is small and clean, but the standard only defines the inner core of the language. If I had to deliver an application I'd probably use Common Lisp; if I were teaching a course I might use Scheme (but with Common Lisp macros).

Do you know a good, free Lisp implementation?

There are several. The Common Lisp implementation I use is Clisp, but CMUCL is also well-regarded. For Scheme hacking I use Scheme 48 and PLT Scheme.
"

http://paulgraham.com/lispfaq1.html

> а вы копаетесь в застарелом говнище, не понимая, что от фанатов C++ мало чем отличаетесь.

аргументы?

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

asgard,

если бы ты поменьше флудил на Лоре и побольше читал Пола Грэма, ты был бы в курсе, что в последние несколько лет он занят работой над новым лиспом. Причём пишет его на PLT Scheme, а не на CL. И я его прекрасно понимаю.

> аргументы?

Аргументы, ёпт? Если ты собственными глазами не видишь, что CL больше, чем наполовину состоит из ненужного мусора, который не убирается лишь потому, что всем похрену, то медицина тут бессильна. Ты hyperspec вообще открывал?

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

> если бы ты поменьше флудил на Лоре и побольше читал Пола Грэма, ты был бы в курсе, что в последние несколько лет он занят работой над новым лиспом.

я за arc'ом довольно давно слежу, и прекрасно знаю на чём он написан.

> Если ты собственными глазами не видишь, что CL больше, чем наполовину состоит из ненужного мусора, который не убирается лишь потому, что всем похрену, то медицина тут бессильна.

концепция проста: если вам не нужен тот или иной функционал - не используйте его.

> Ты hyperspec вообще открывал?

я её прочитал.

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

> концепция проста: если вам не нужен тот или иной функционал - не используйте его.

А твой аргумент обратно повторяет аргументы плюсистов: не нравится xxx в плюсах - не используйте. Увы, мой наивный юноша, в языке программирования всё взаимосвязано, и не использовать не получается. А в CL половина вещей по нынешним понятиям сделаны через жопу, я гарантирую это. И никто в нём ничего исправлять не собирается, ибо проще написать новый лисп. Вообще будущего никакого у CL нет, это мёртвый язык, даже Схема и та живее.

Собственно, я эту говнофункциональность коммонлиспа и не использую, лол - давно перешёл на Схему и жду Arc.

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

<i>А твой аргумент обратно повторяет аргументы плюсистов: не нравится xxx в плюсах - не используйте.</i>

что-то такого я от ++серов не слышел. ну да не суть.

> и не использовать не получается.

да ну? вы когда пишете программу на языке x, у вас руки чешутся впихнуть в неё всю функциональность языка?

> А в CL половина вещей по нынешним понятиям сделаны через жопу

что значит "нынешние понятия"? детерменируйте.

> И никто в нём ничего исправлять не собирается

нечего там исправлять. почистить - да, было бы не плохо, но исправлять нечего.

> Собственно, я эту говнофункциональность коммонлиспа и не использую, лол - давно перешёл на Схему и жду Arc.

хе-хе, ну ждите дальше. перспектив у arc'a, имхо, никаких.

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

> Вообще будущего никакого у CL нет, это мёртвый язык, даже Схема и та живее.

Вот не надо. Я, хоть и сторонник схемы, коммон-лисп тоже люблю. Как минимум, его инкрементальная компиляция -- это очень мощный удар в рыло всем ныне существующим языкам, и позволяет работать таким былинным вещам, как slime.

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

Ну-ну. Схема годна только для философствований таких теоретиков, как ты. Меня лично бесит отсутствие функционала. Scheme был, есть и будет тормозом, ибо в его спецификации даже хеш-массивов нет. Уж такие вещи можно было встроить в язык, оптимизировать должным образом. А тут - все через списки прийдется делать. Я просто не могу смотреть, на сколько нерационально реализуются те или иные вещи, недостающие в этом языке, и уже присутствующие в _ядре_ Лиспа. Надоел вечный поиск по интернету всяких макросов и функций по каждому поводу, ибо даже самые банальные вещи отсутствуют. Потом на все это плюешь, и пишешь сам. На полпути останавливаешься и не можешь смотреть на то, что получилось - так хочется открыть Си и сделать все должным образом (о чем должны были позаботиться разработчики компилятора). Бррр.

А открываешь Лисп - и сразу такая легкость...

P.S. Scheme хорош для обучения и плагинов, но не более.

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

>уже присутствующие в _ядре_ Лиспа

а там уже появилась хвостовая рекурсия?

>А открываешь Лисп - и сразу такая легкость...

может вы путаете язык и библиотеку?

>P.S. Scheme хорош для обучения и плагинов, но не более.

4.2 dsl'и писать на нем одно удовольствие

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

> Меня лично бесит отсутствие функционала. Scheme был, есть и будет тормозом, ибо в его спецификации даже хеш-массивов нет.

Возьми bigloo / kawa, и получи схему со всем "жабьим legacy" :)

P.S. Я не против CL, я против обгаживания того, чем не пользуешься. Лучше развивай (и расписывай в красках) то, что нравится.

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

>>а там уже появилась хвостовая рекурсия?

>А что, её там нет?

В стандарте нет. В большинстве реализаций есть. К примеру, в cLisp-е есть в откомпилированных функциях, но нет в "интерпретируемых".

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

>Плачу весь. CL переплюнул С++ по количеству маразма. Scheme is the Lisp, dudes.

Схема - тормозной кастрированый Лисп, что в нем хорошего ?

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

>А твой аргумент обратно повторяет аргументы плюсистов: не нравится >xxx в плюсах - не используйте.

Да практически на любом языке так, ты можешь либо массив сам перебирать, либо использовать обобщенную функцию или оператор. setf - обобщенный оператор присваивания, setq - специализированная версия. Что тут лишнее ? Внутри всяких foreach не те же циклы используются ? Давай for из С++ выкинем напрочь, он же лишняя сущность.

>Собственно, я эту говнофункциональность коммонлиспа и не использую, лол - давно перешёл на Схему и жду Arc.

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

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

>> (setq a '(1 2 3)) > (macroexpand-1 '(setf (cadr a) 'b)) > (LET* ((#:G8367 A) (#:G8368 'B)) (SYSTEM::%RPLACA (CDR #:G8367) #:G8368)) >И эти люди ещё говорят, что плюсовые шаблоны приводят к непонятным сообщениям об ошибках, лол.

Напрягают штуки вроде #:G8367 ?

Вот без них: (let ((TmpA A) (TmpB B)) (system::%rplaca (cdr TmpA) TmpB))

Любой самых дохлый лиспер поймет, что тут написано, и развернуть макру можно хоть в рантайме, а в С++ эту хрень видишь когда уже поздно пить боржоми.

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

>Ога, у плюсовых фанбоев тоже любимая фраза "вы тупы и не смогли осилить семантику С++". Я пишу на Схеме, и Пол Грэм пишет на схеме, а вы копаетесь в застарелом говнище, не понимая, что от фанатов C++ мало чем отличаетесь.

Дык Схема - это и есть застарелое говнище, небось еще старее С++. А Пол Грэм вообще непонятно на чем пишет, наверное на Арке :-)

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