Следующая страница > 1 < [2]

Автор Сообщение

gihar

Moderators


Статус

249 сообщений

Где: --- да вот он я? приехал уже из Катманду
Род занятий: конкретный
Возраст: 1

#948   2009-12-28 21:51 GMT+3 часа(ов)      
Неожиданно поимел проблему - лисп-функция не хочет принять
список-параметр по значению
, а вроде берет как ссылку

(defun cp1 (-C-)
 
(incf (cdr(elt -C- 0)))
 
)


делаю список:
(setq z (list (cons 0 0)(cons 0 0)))
(0 . 0) (0 . 0))
 
вызываю функцию
(cp1 z)
 
и получается что z тоже меняет значение.
z
>(0 . 1) (0 . 0))
 
(cp1 z)
 
z
>(0 . 2) (0 . 0))



Интересно можно ли как то сделать что бы по значению было принято?


и вообще с копированием z тоже самое (setq z1 z)
z1 тут идет как ссылка на z. (Блин)

отредактировал(а) gihar: 2009-12-29 17:50 GMT+3 часа(ов)
Это было точно последнее редактирование

_lee

Members


Статус

69 сообщений

Где: Russia
Род занятий:
Возраст:

#949   2009-12-28 22:22 GMT+3 часа(ов)      
(cpl (copy-list z))
 
(setq z1 (copy-list z))


Для Lisp модификация списков является менее обычной операцией чем создание новых, потому язык спроектирован так, что все передается по ссылке (за исключение очень маленьких объектов: чисел FIXNUM и Characters)

gihar

Moderators


Статус

249 сообщений

Где: --- да вот он я? приехал уже из Катманду
Род занятий: конкретный
Возраст: 1

#950   2009-12-28 23:27 GMT+3 часа(ов)      
C простыми списками copy-list работает '( 1 2 3 4 5) ,
а там где cons((1.1)(2.2)(3.3)) почему то нет.

Странно что модификация списков не является сильной фишкой Лиспа,
я тут с лямбдой поломал голову .
Оказалось что и лямбда не сильная фишка Лиспа.
И тоже на очень простых вещах.Досадно.

И непонятно что является сильной его фишкой. Остается мало сильных мест.
Обидно.


Поразительно , оказывается я не могу список в список скопировать

отредактировал(а) gihar: 2009-12-28 23:38 GMT+3 часа(ов)
Это было точно последнее редактирование

_lee

Members


Статус

69 сообщений

Где: Russia
Род занятий:
Возраст:

#951   2009-12-29 00:05 GMT+3 часа(ов)      
gihar
C простыми списками copy-list работает '( 1 2 3 4 5) ,
а там где cons((1.1)(2.2)(3.3)) почему то нет


с ними работает copy-tree



gihar
И непонятно что является сильной его фишкой.

Макросы - это отличительная черта Lisp, языком макросов Lisp явлется сам Lisp, в других языках такого нет:
в C: #define, в C++ template<> - это все надстройки со своим синтаксисом

gihar

Moderators


Статус

249 сообщений

Где: --- да вот он я? приехал уже из Катманду
Род занятий: конкретный
Возраст: 1

#952   2009-12-29 00:36 GMT+3 часа(ов)      
Цитата
_lee :
gihar
C простыми списками copy-list работает '( 1 2 3 4 5) ,
а там где cons((1.1)(2.2)(3.3)) почему то нет


с ними работает copy-tree



gihar
И непонятно что является сильной его фишкой.

Макросы - это отличительная черта Lisp, языком макросов Lisp явлется сам Lisp, в других языках такого нет:
в C: #define, в C++ template<> - это все надстройки со своим синтаксисом




Благодарю тебя _lee :!! , а то я тут не по детски рассклеился(даже заплакал) , но ведь проверил , точно копирует!

Я снова поверил в Лисп!!
И продолжу копать.

P.S.
И еще , действительно макросы пишутся на самом лиспе , как я этого раньше
не замечал?
Это было точно последнее редактирование

bach74

Members


Статус

40 сообщений

Где: Russia Челябинск
Род занятий: программист
Возраст: 44

#953   2009-12-29 01:38 GMT+3 часа(ов)      
Ну, вы, ребята, двоишники. В CL параметры передаются по значению и не иначе. Поизучайте более детально предмет. Не буду вдаваться в теоретические детали (разбирайтесь сами - полезно), но намекну на примере java, где та же петрушка. Скажем:

class A {

int i;

}
public class B {

static void f (A a)
{
a.i=3;
}
static public void main (String [] args)
{
A p = new A();
p.i=2;
f(p);
System.out.println("p.i="+p.i)
}
}
Ну и увидите, что напечатается p.i=3.

bach74

Members


Статус

40 сообщений

Где: Russia Челябинск
Род занятий: программист
Возраст: 44

#954   2009-12-29 01:40 GMT+3 часа(ов)      
Намекну, что список передается как "объект".

_lee

Members


Статус

69 сообщений

Где: Russia
Род занятий:
Возраст:

#955   2009-12-29 01:57 GMT+3 часа(ов)      
To:bach74

а что есть язык, где не так?
в чем смысел фразы "по значению"?

Fallen_s4e

Members


Статус

114 сообщений
http://lisper.ru
Где: Zimbabwe lisper.ru
Род занятий: fallen_s4e
Возраст: 6

#956   2009-12-29 02:16 GMT+3 часа(ов)      
Видимо подразумевалась передача объекта, а не указателя на него.
А насчет copy-tree. Так даже если его нет, его же написать - 3 строчки.)

_lee

Members


Статус

69 сообщений

Где: Russia
Род занятий:
Возраст:

#957   2009-12-29 02:24 GMT+3 часа(ов)      
ну так в лиспе передается указатель на список а не сам список
стало быть метод передачи не-по-значению.

gihar

Moderators


Статус

249 сообщений

Где: --- да вот он я? приехал уже из Катманду
Род занятий: конкретный
Возраст: 1

#958   2009-12-29 08:16 GMT+3 часа(ов)      
Цитата
bach74 :
Ну, вы, ребята, двоишники. В CL параметры передаются по значению и не иначе. Поизучайте более детально предмет. Не буду вдаваться в теоретические детали (разбирайтесь сами - полезно), но намекну на примере java, где та же петрушка. Скажем:

class A {

int i;

}
public class B {

static void f (A a)
{
a.i=3;
}
static public void main (String [] args)
{
A p = new A();
p.i=2;
f(p);
System.out.println("p.i="+p.i)
}
}
Ну и увидите, что напечатается p.i=3.




to bach74 :
Только не надо путать ООП с Лиспом.

Сам то ты хоть видишь где у тебя тут срабатывает конструктор копий?





Цитата
Fallen_s4e :
Видимо подразумевалась передача объекта, а не указателя на него.
А насчет copy-tree. Так даже если его нет, его же написать - 3 строчки.)




Да я так и сделал , но перед этим потратил часа 2-3 на поиск готового
решения,
а так как время все равно потрачено то тут уже дело принципа , узнать
как же сами разработчики лиспа решают это , а они позаботились.

отредактировал(а) gihar: 2009-12-29 08:37 GMT+3 часа(ов)
Это было точно последнее редактирование

bach74

Members


Статус

40 сообщений

Где: Russia Челябинск
Род занятий: программист
Возраст: 44

#959   2009-12-29 11:27 GMT+3 часа(ов)      
>Только не надо путать ООП с Лиспом.
Причем тут ООП? Я лишь дал намек.
Вызов по ссылке - это передача указателя на переменную, а вызов по значению - ссылки на объект в случае непримитивных типов.
При вызове по ссылке вы можете изнутри функции манипулировать внешней переменной в таких языках как С++.

В случае Лисп передает указатель на первую ячейку списка, а не вся структура списка, т.е. передается ЗНАЧЕНИЕ аргумента, которое является указателем на первую ячейку списка.
Представляете, если бы при этом автоматически копировался список? Да за это бы убили создателей CL и других диалектов Лиспа. Прикольно бы было, если бы аргумент содержал список из 10000 ячеек и вместо передачи значения в виде указателя на первую ячейку списка копировался весь список. Тогда уж точно никто бы не стал использовать Лисп.
Если бы передавались аргументы по ссылке, то тогда бы функция получала указатель на ПЕРЕМЕННУЮ, а не на указатель первой ячейки. Ущучили разницу?
Кстати, почитайте http://cl-cookbook.sourceforge.net/clos-tutorial/index.html о CLOS. Кое-что интересное узнаете о встроенных классах...

_lee

Members


Статус

69 сообщений

Где: Russia
Род занятий:
Возраст:

#960   2009-12-29 12:54 GMT+3 часа(ов)      
bach74
При вызове по ссылке вы можете изнутри функции манипулировать внешней переменной в таких языках как С++.


Так ежели я в Lisp вызову:
 
(foo 'a)
(defun foo (sym)
(setf (symbol-value sym) 123))


Это будет манипуляция переменно как в C++, значится в Lisp есть передача по ссылке?

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#961   2009-12-29 13:37 GMT+3 часа(ов)      
>... значится в Lisp есть передача по ссылке?
В классическом лиспе нет ссылок и указателей.

_lee

Members


Статус

69 сообщений

Где: Russia
Род занятий:
Возраст:

#962   2009-12-29 13:46 GMT+3 часа(ов)      
misha
В классическом лиспе нет ссылок и указателей.

Я бы сказал что в Lisp всё объекты представлены указателями.

В любой реализации
(setq a b)
означает что a и b обозначают теперь один и тот же объект
Это и есть определение указателя, аналогично в C.

char *a = "abc"
char *b = a;

a и b указывают на одно и тоже.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#963   2009-12-29 13:55 GMT+3 часа(ов)      
Вы это об устройстве лисп-машины? В зависимости от ее устройства, указателей может и не быть вовсе. Связывание может происходить также по номеру(индексу) ячейки.

bach74

Members


Статус

40 сообщений

Где: Russia Челябинск
Род занятий: программист
Возраст: 44

#964   2009-12-29 14:03 GMT+3 часа(ов)      
Хотя я уже вроде разжевал да и в Гугле все можно найти, но приведу примеры.
Передача по ссылке в С++:
void swap(int& a, int& b)
{
int temp=a;
a=b;
b=temp;

}

void main()
{
int i = 2;
int j = 3;
swap(i,j);

}
После этого будет i=3, j=2.
По значению в С++:
void swap(int a, int b)
{
int temp=a;
a=b;
b=temp;

}

void main()
{
int i = 2;
int j = 3;
swap(i,j);

}
После этого будет i=2, j=3, т.е. swap уже не работает.
Если бы в Лиспе шла передача по ссылке, то работало бы так:

(defun swap (a b)
(setf temp a)
(setf b a)
(setf a temp))

(setf a1 '(a b))
(setf a2 '(c d))

(swap a1 a2)

Причем в результате a1 должно было бы равняться '(c d), а a2 - '(a b). Однако на самом деле этого не происходит, так как передача по ссылке означает передачу указателя на ПЕРЕМЕННУЮ, А НЕ НА ЗНАЧЕНИЕ! А в Лиспе при передаче аргументов передается указатель на значение (при непримитивных типах), а не на переменную. Понимаете разницу?
http://www.cyberguru.ru/programming/cpp/cpp-language-straustrup2-page61.html
или еще что-нибудь погуглите для ясности

gihar

Moderators


Статус

249 сообщений

Где: --- да вот он я? приехал уже из Катманду
Род занятий: конкретный
Возраст: 1

#965   2009-12-29 14:04 GMT+3 часа(ов)      
Цитата
bach74 :
>Только не надо путать ООП с Лиспом.
Причем тут ООП? Я лишь дал намек.
Вызов по ссылке - это передача указателя на переменную, а вызов по значению - ссылки на объект в случае непримитивных типов.
При вызове по ссылке вы можете изнутри функции манипулировать внешней переменной в таких языках как С++.

В случае Лисп передает указатель на первую ячейку списка, а не вся структура списка, т.е. передается ЗНАЧЕНИЕ аргумента, которое является указателем на первую ячейку списка.



================================
Ты тут нагородил заборов.
Давай разгораживать.
Переменная - область в памяти.(мы видим через дебагер как адрес памяти)
Указатель - это обычно 32битная переменная, которая содержит адрес другой переменной.
Ссылка - тот же указатель , но тут есть тонкости.
Это указатель который должен быть инициализирован сразу же в месте объявления его.
и плюс к этому потом компилятор не позволит узнать настоящего адреса ссылки.
потому что на запрос адреса вернется адрес того места памяти на которое указывает ссылка, это есть безопасность.

А вызов по значению в чистом виде это просто забивание содержимого
переменной в стек. Конечно положить туда просто 4байта ссылки , быстрее
и экономичнее чем 1000байт.
Но если бы Лисп ценили по экономичности , то им бы не пользовались.
Лисп ценен по гибкости и комбинационным возможностям

================================

Цитата
bach74 :
Представляете, если бы при этом автоматически копировался список? Да за это бы убили создателей CL и других диалектов Лиспа. Прикольно бы было, если бы аргумент содержал список из 10000 ячеек и вместо передачи значения в виде указателя на первую ячейку списка копировался весь список. Тогда уж точно никто бы не стал использовать Лисп.
Если бы передавались аргументы по ссылке, то тогда бы функция получала указатель на ПЕРЕМЕННУЮ, а не на указатель первой ячейки. Ущучили разницу?
Кстати, почитайте http://cl-cookbook.sourceforge.net/clos-tutorial/index.html о CLOS. Кое-что интересное узнаете о встроенных классах...



=================================
Так разработчики Лисп и предусмотрели два вида передачи данных в функцию.
И их незашта убивать.



Цитата
misha :
Вы это об устройстве лисп-машины? В зависимости от ее устройства, указателей может и не быть вовсе. Связывание может происходить также по номеру(индексу) ячейки.




И я думаю что в Лиспе могут быть свои методы доступа к переменным.
(Основывась на просмотре дизассемблерного кода)

отредактировал(а) gihar: 2009-12-29 14:27 GMT+3 часа(ов)
Это было точно последнее редактирование

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#966   2009-12-29 14:25 GMT+3 часа(ов)      
Цитата
bach74 :
...
(defun swap (a b)
(setf temp a)
(setf b a)
(setf a temp))

(setf a1 '(a b))
(setf a2 '(c d))

(swap a1 a2)

Причем в результате a1 должно было бы равняться '(c d), а a2 - '(a b). Однако на самом деле этого не происходит, так как передача по ссылке означает передачу указателя на ПЕРЕМЕННУЮ, А НЕ НА ЗНАЧЕНИЕ! А в Лиспе при передаче аргументов передается указатель на значение (при непримитивных типах), а не на переменную. Понимаете разницу?
http://www.cyberguru.ru/programming/cpp/cpp-language-straustrup2-page61.html
или еще что-нибудь погуглите для ясности

Правильнее говорить, что в лиспе происходит связывание переменной а1 со списком (a b).
Цитата
gihar :
...
И я думаю что в Лиспе могут быть свои методы доступа к переменным.
(Основывась на просмотре дизассемблерного кода)
А если лисп-машина реализована в кремнии? Как будем дизассемблировать?

gihar

Moderators


Статус

249 сообщений

Где: --- да вот он я? приехал уже из Катманду
Род занятий: конкретный
Возраст: 1

#967   2009-12-29 14:41 GMT+3 часа(ов)      
bach74 :

Ты того , не отсылай никого-никогда гуглить(нехорошо это). Хватает обгугленоых.
И ссылки на английские статьи давать не надо. Мы люди простые , славяне ,
английский нам костью в горле.


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

Thanks!
Это было точно последнее редактирование

_lee

Members


Статус

69 сообщений

Где: Russia
Род занятий:
Возраст:

#968   2009-12-29 14:41 GMT+3 часа(ов)      
misha
А если лисп-машина реализована в кремнии? Как будем дизассемблировать?

то что в кремнии - это программа на микрокоде - дизассемблируется тоже, только сложнее вытащить

misha
(defun swap (a b)
(setf temp a)
(setf b a)
(setf a temp))



Так swap Пишется и вызывается по другому просто на Lisp:
(defun swap (a b)
(rotatef (symbol-value a) (symbol-value b)))
 
(swap 'a 'b)
 


То что для вызова по имени надо поставить кавычку не говорит что в Lisp нет вызова по имени, Lisp реализует разные типы вызовов

bach74

Members


Статус

40 сообщений

Где: Russia Челябинск
Род занятий: программист
Возраст: 44

#969   2009-12-29 14:43 GMT+3 часа(ов)      
gihar
Я тут ничего не городил и не высасывал из пальца. Это Вы тут занимаетесь придумыванием или додумыванием существующей общепринятой терминологии. Я лишь дал пояснения по поводу терминологии, которую нередко даже в книгах путают.
Когда в CL вы встречаете выражение (setf x '(a b)), то это означает, что символ x связывается с указателем на первую ячейку списка (a b). Другими словами, "переменная" x содержит в качестве значения указатель на первую ячейку, что и передается в качестве значения той или иной функции, если х участвует в качестве фактического аргумента. Передача же по ссылке (если бы она была в Лиспе) означала бы передачу УКАЗАТЕЛЯ НА САМ СИМВОЛ X. Так что это Вы тут занимается додумыванием терминологии вместо того, что разобраться в общепринятой терминологии. А потом в результате и возникают всякие недоумения по поводу очень замечательного языка Лисп.

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#970   2009-12-29 14:50 GMT+3 часа(ов)      
Цитата
_lee :
misha
А если лисп-машина реализована в кремнии? Как будем дизассемблировать?

то что в кремнии - это программа на микрокоде - дизассемблируется тоже, только сложнее вытащить

Что вытащить? Микрокод? Я говорил про внутреннее устройство лисп-процессора.
Цитата
_lee :
...
То что для вызова по имени надо поставить кавычку не говорит что в Lisp нет вызова по имени, Lisp реализует разные типы вызовов

А я разве говорил иначе?

gihar

Moderators


Статус

249 сообщений

Где: --- да вот он я? приехал уже из Катманду
Род занятий: конкретный
Возраст: 1

#971   2009-12-29 14:56 GMT+3 часа(ов)      
Если разобраться в общепринятой терминологии.
Берешь Дебагер и смотришь что такое ссылка -и видишь что это и есть указатель
на область памяти переменной(в С++)
А что это значит в Лиспе - тут
надо учитывать что лисп может имитировать многие вещи для того что бы поддерживать максимальную гибкость программирования.

Короче больше примеров - меньше слов.

Терминалогию запутать можно , поэтому упор на практику.

Все , ушел комбинировать.

отредактировал(а) gihar: 2009-12-29 15:06 GMT+3 часа(ов)
Это было точно последнее редактирование

bach74

Members


Статус

40 сообщений

Где: Russia Челябинск
Род занятий: программист
Возраст: 44

#972   2009-12-29 15:38 GMT+3 часа(ов)      
>Терминалогию запутать можно , поэтому упор на практику.
Так общепринятая терминология, с одной стороны, важна для общения, а также важна для изучения.
>То что для вызова по имени надо поставить кавычку не говорит что в Lisp нет вызова по имени, Lisp реализует разные типы вызовов

Сами по себе параметры передаются по значению! Другое дело, что имея возможность произвольной работы с символами, Вы можете имитировать вызов по ссылке с легкостью (да и многое другое). В этом мощь и сила Лиспа. Но давайте все-таки не будем произвольно толковать термины. Хотя в Лиспе самом по себе своя терминология с определенными нюансами. Но в книгах по Лиспе, кстати, пишут о том, что передача происходит по значению.

bach74

Members


Статус

40 сообщений

Где: Russia Челябинск
Род занятий: программист
Возраст: 44

#973   2009-12-29 15:48 GMT+3 часа(ов)      
gihar
>Неожиданно поимел проблему - лисп-функция не хочет принять
список-параметр по значению

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

misha

Moderators


Статус

1275 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#974   2009-12-29 16:01 GMT+3 часа(ов)      
2 bach74 :
Давайте приблизимся к классической работе Джона Маккарти, Recursive Functions of Symbolic Expressions and Their Computation by Machine, Part I. Т.е. заменим термин указатель на адрес и тогда, имхо, все станет на свои места

_lee

Members


Статус

69 сообщений

Где: Russia
Род занятий:
Возраст:

#975   2009-12-29 16:29 GMT+3 часа(ов)      
misha
Что вытащить? Микрокод? Я говорил про внутреннее устройство лисп-процессора.


Ну а как Lisp-процессоры устроены? это обычный процессор, внутри которого работают подпрограммы на микрокоде, реализующие Lisp
таково было устройство Lisp-workstations от Xerox: Dolphin. Dorado
и Lisp-машин от Symbolics. При желании микрокод можно модифицировать меняя поведение

bach74

Members


Статус

40 сообщений

Где: Russia Челябинск
Род занятий: программист
Возраст: 44

#976   2009-12-29 16:36 GMT+3 часа(ов)      
>Давайте приблизимся к классической работе Джона Маккарти

Да я полагаю, что уже все все поняли и дискуссия оказалась архиважной и архиполезной))

bach74

Members


Статус

40 сообщений

Где: Russia Челябинск
Род занятий: программист
Возраст: 44

#977   2009-12-29 16:41 GMT+3 часа(ов)      
misha
Сейчас я перечитал диалог и у меня создалось впечатление, что gihar так и не понял, о чем я говорил, и что такое передача по ссылке. Во всяком случае создается впечатление, что внимательно он меня не читал. ну да ладно. Со временем разберется.


Онлайн :

0 пользователь(ей), 26 гость(ей) :




Реклама на сайте: