← Архив: Common Lisp

Ссылка на вышеописанное поле струкутры

Author: · 17.11.2009 13:52
· original author: AYKO
Для более краткой записи при создании экземпляра структуры хочу при задании значения второго поля сослаться на уже заданное значение первого. Возможно ли?
(defstruct MyS
  a
  b
)

  
(make-MyS
  :a (+ 2 3)
  :b (Здесь я хочу сослаться на поле "a")
)
· original author: _lee
make-MyS ничем не отличается от вызова любой функции, так что нельзя. Сокращеннее так:
(let ((a (+ 2 3))) (make-MyS :a a :b a))
· original author: AYKO
Видимо я перепутал ситуацию со случаем когда используются необязательные аргументы
> (defun foo (&optional (x 3) (y (+ 2 x))) y)
FOO                                           
> (foo)                                       
5                                               
· original author: Love5an
Прямо форме вызова конструктора этого сделать нельзя.
Можно, правда, написать anaphoric macro для этой цели.
Или просто let/with-accessors использовать.
· original author: AYKO
>Love5an
Я не в теме. "Вы не мудрите, вы пальцем покажите". :)
И еще появился вопросик по струкутрам, что бы не создавать новую тему спрошу здесь. Мне казалось аргументы в функции передаются по значению, а не по ссылке, разве со структурами дело обстоит иначе? Ниже фрагмент кода с побочным эффектом.
> (defstruct MyS a b)                  
MYS                                    
> (setf item (make-MyS :a 1 :b 2))     
#S(MYS A 1 B 2)                        
> (defun foo (x) (setf (MyS-a x) 3) x)
FOO                                    
> item                                 
#S(MYS A 1 B 2)                        
> (foo item)                           
#S(MYS A 3 B 2)                        
> item                                 
#S(MYS A 3 B 2)    


· original author: archimag
> Мне казалось аргументы в функции передаются по значению, а не по ссылке

Неправильно казалось, всё передаётся по ссылке.
· original author: AYKO
Как говорися: "Упс!"
· original author: archimag
> Как говорися: "Упс!"Я думаю будет полезно поразмышлять на тему того, что такое связывание переменных и как работает setf. Это на тему того, почему казалось...
· original author: archimag
О, вот случайно обнаружил более правильное объяснение из PCL (в главе про переменные)
Все значения в Common Lisp, по крайней мере концептуально, являются ссылками на объекты. Поэтому присваивание переменной нового значения изменяет то, на какой объект ссылается переменная (то есть, куда ссылается переменная), но не оказывает никакого влияния на объект, на который переменная ссылалась ранее. Однако, если переменная содержит ссылку на изменяемый объект, вы можете использовать данную ссылку для изменения этого объекта, и это изменение будет видимо любому коду, который имеет ссылку на этот же объект.
Плюс примечание:
В целях оптимизации определенные виды объектов, такие как целые числа, меньшие определенного размера, и знаки могут быть представлены непосредственно в памяти, другие же объекты будут представляться указателями на действительные объекты. Однако, поскольку целые числа и знаки являются неизменяемыми значениями, не имеет значения тот факт, что может существовать несколько копий "одного и того же" объекта в различных переменных. Это и является корнем различия между EQ и EQL, описанного в главе 4.


P.S. Почитать PCL что ли...
· original author: LispUser
А Вы не читали? И таки изучили CL? Особые способности? Как?!
· original author: archimag
> А Вы не читали? И таки изучили CL? 
Ну, прочитал менее половины книги.
> Особые способности? Как?!


Я ещё не изучил, я в процессе. Учу также, как в своем время русский язык :)... читаю, что написали другие и пробую писать сам. Код всему голова.
· original author: dmitry_vk
>А Вы не читали? И таки изучили CL? Особые способности? Как?!
В лиспе многие вещи следуют принципу DWIM (Do What I Mean), что позволяет не всегда вникать в какие-то глубокие особенности.
· original author: artem
> В лиспе многие вещи следуют принципу DWIM (Do What I Mean), что позволяет не всегда вникать в какие-то глубокие особенности.
Неправильный принцип. Вникать нужно. Вот пример набросал:
http://lisper.ru/apps/format/47
Если не вникать в глубинные особенности, то очень сложно объяснить, _почему_  (binder 1) работает, а (create-list) сам по себе, самостоятельно не работает (по внешнему виду кода можно догадаться, но не понять). Кстати, этот мини пример так же пересекается с темой вопроса.
Литературы и материалов по Lisp и Common Lisp достаточно, другое дело что все на английском и без знания английского будет очень и очень сложно.
· original author: archimag
> Вот пример набросал:> http://lisper.ru/apps/format/47

Вряд ли вы сможете найти подобное в реальном коде, и самому так тоже не стоит писать, так зачем вникать?
· original author: archimag
> другое дело что все на английском и без знания английского будет очень и очень сложно.
Ну не знаю, у меня с английским откровенно плохо. Это создаёт проблему, что я не могу общаться и писать документацию на нём. Но в плане изучения и работы с CL особых проблем пока не обнаруживаю :)
· original author: dmitry_vk
>Неправильный принцип. Вникать нужно. Вот пример набросал:
«позволяет не всегда вникать» ≠ «всегда позволяет не вникать»
В принципе, пример не противоречит.
Что я имел в виду, так это то, что в лиспе многие вещи сделаны более ортогонально, чем во многих других языках, и чтобы понять какой-то один аспект работы, не надо детально вникать в другие.
· original author: LispUser
Я без иронии.
Как Вы изучали Common Lisp?
· original author: LispUser
Сорри, надо было обновить страницу.
· original author: LispUser
> Я ещё не изучил, я в процессе. Учу также, как в своем время русский язык :)... читаю, что написали другие и пробую писать сам. Код всему голова.
Не начнете (могу и я начать) отдельную тему "Как я изучаю Common Lisp"?
Практика, источники, софт, код для изучения и т.п.
· original author: archimag
> Не начнете (могу и я начать) отдельную тему "Как я изучаю Common Lisp"?Я не знаю о чём там можно писать, я думаю, что главное писать реальный код, а не какой-нибудь надуманный или "учебный" (пусть даже это упражнения из SICP) и ориентироваться на местности :)
· original author: LispUser
А по каким критериям Вы выбрали именно Lisp, Common Lisp?
· original author: archimag
> А по каким критериям Вы выбрали именно Lisp, Common Lisp?
Ну, мой шеф утверждает, что я интуитивно-логический интроверт :) Т.е. оценку я провожу на основе интуиции, а принятие решения на основе логики. Логика решила, что нужно овладеть несколькими языками. А дальше у меня нет каких-то критериев, которые бы я мог озвучить, и смотрю и вижу, что это хорошо, а это плохо. Вот и всё :)
· original author: artem
> А по каким критериям Вы выбрали именно Lisp, Common Lisp?
REPL, REPL, REPL!!! :-)
· original author: LispUser
У меня была (пылилась) книжка Маурера.
Давно была сделать мысль текстовый органайзер личной информации, в котором сам текст бы как конструктор строил бы связи, ассоциации, напоминания и прочие обработки (сорри за сумбур).
Вспомнил про Лисп.
Intuit.ru, Городняя, замечательная статья
по ссылке с Исток » Лисп » Книги и статьи http://lisp.ystok.ru/ru/articles/index.html
1. Тэйт Б. Пересекая границы: Красота Lisp. Эльдорадо языков программирования. - IBM developerWorks Россия, 2007.
    Введение в Лисп для Java-программистов и сопоставление с Java-технологиями.
http://www.ibm.com/developerworks/ru/library/j-cb02067/index.html
Глава "Введение: почему Lisp?" из PCL, покупка книжки SICP, не прошедшее удивление от примера из SICP, как в несколько строк на Scheme можно построить модель электрической схемы.
До этого изучал C++, но Lisp завораживает какой-то волшебной, на мой взгляд, идеологией.
Это настолько ортогонально алголоподобным (?) языкам, что хочется идти далеко-далеко по этой "дорожке из желтого кирпича". И всхлипы на LOR'е "я писал на С++ и был счастлив, я узнал Lisp, по-прежнему пишу на С++, я теперь несчастлив, зачем я узнал Lisp".
Это мое отношение эмоционально, мало практики. Но вот такой эмоциональный выбор...
· original author: artem
Список литературы в свободном доступе по Lisp (common lisp) есть тут 
http://www.lispmachine.net/
(см. раздел Online Books in PDF format). Там много чего интересного.