Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.188.61.223] |
|
Страницы: (5) 1 [2] 3 4 ... Последняя » все ( Перейти к последнему сообщению ) |
Сообщ.
#16
,
|
|
|
Не вопрос: delete -- вызов функции delete (стандартная лисповская) затем идут два ее параметра: 0 (это то, чему должна равняться значение ключевой функции), затем a -- сам список. После этого идут keyword parameters (по-русски ИМХО это ближе всего к именованным параметрам): :cout 4 -- число удалений :from-end t -- булевый параметр, указывающий на то, что список надо ворошить с хвоста :key а тут надо предоставить функцию получения значения ключа; в качестве параметра передается элемент списка #' -- это что-то вроде операции взятия адреса функции (применимо только к функциям) а дальше идет сама лямбда-функция: (lambda (x) (mod x 3)) -- берет один аргумент, возвращает остаток от деления аргумента на 3. Ну а потом закрываются все скобки |
Сообщ.
#17
,
|
|
|
Цитата linuxfan @ delete -- вызов функции delete (стандартная лисповская) затем идут два ее параметра: 0 (это то, чему должна равняться значение ключевой функции), затем a -- сам список. После этого идут keyword parameters (по-русски ИМХО это ближе всего к именованным параметрам): :cout 4 -- число удалений :from-end t -- булевый параметр, указывающий на то, что список надо ворошить с хвоста :key а тут надо предоставить функцию получения значения ключа; в качестве параметра передается элемент списка Т. е. в (не)монструозности лямбда-функции ни при чем. Ибо если бы небыло некоторых ограничений на предикаты (как то ограничение на сохранение состояния), то на С++ это тоже бы в одну строчку уместилось... |
Сообщ.
#18
,
|
|
|
Не совсем так: delte просто будет «покруче» плюсовых remove_if (кстати, в list и такое есть )
|
Сообщ.
#19
,
|
|
|
Цитата linuxfan @ delte просто будет «покруче» плюсовых remove_if (кстати, в list и такое есть ) А чем именно? |
Сообщ.
#20
,
|
|
|
Ну хотя бы тем, что он умеет "count"
|
Сообщ.
#21
,
|
|
|
Цитата linuxfan @ Ну хотя бы тем, что он умеет "count" И что? Методы типа erase тоже умеют удалять заданное количество элементов. count в данном случае для того, чтобы цикл не организовывать. Разве нет? |
Сообщ.
#22
,
|
|
|
Кстати, вот такой вот изврат в lispe'е можно осуществить:
функция, возвращающая список из двух функций, одна из которых пишед в заданный файл, а другая -- закрывает его. Тут демонстируется то, что называется «lexical closure» (defun make-logger (filename) (let ((log (open filename :direction :output :if-does-not-exist :create :if-exists :append))) (values (lambda (string) (format log "~a~%" string)) (lambda () (close log))))) А вот так помле этого можно создавать функции, работающие с этим файлом (меня просто прикалывает этот изврат ): (mapcan #'(lambda (name body) (setf (fdefinition name) body)) '(my-log my-log-close) (multiple-value-list (make-logger "/tmp/out.log"))) Ессно, это полный изврат и так никто не делает. В этом случае в C++ создавать экземпляры классов с определенными методами, но тут другой интересный факт: лексическое связывание осуществляется в runtime. И это еще без макросов Добавлено Цитата Flex Ferrum @ count в данном случае для того, чтобы цикл не организовывать. Но его ведь можно и не указывать Покажи мне в C++ аналог именуюемых параметров. Со значениями по умолчанию -- есть, vararg'и (...) есть, а вот аналога &key нету. Допустим, есть некая ф-ция подсоединения к БД, которая принимает на вход хост, логин, пароль и порт, причем хост, пароль и порт имеют значения по умолчанию, и пусть функция коннекта выглядит так (const не пишу из лени): DBconnection *connect (char *login,char *pass=NULL,char *host=NULL,int port=5432) А мне понадобилось законнектиться к localhost (host=NULL) без пароля, но к нестандартному порту 8765. У меня просто нет другого выхода, кроме как описать все параметры. Lisp-way: (defun connect (login &key pass host (port 5432)) (...)) И вызов: (connect "mylogin" :port 8765) И наглядно, и понятно, и удобно. |
Сообщ.
#23
,
|
|
|
Цитата linuxfan @ И наглядно, и понятно, и удобно. В целом, да, но можно сделать перегрузки для различных комбинаций (но оно, конечно, будет менее удобно). |
Сообщ.
#24
,
|
|
|
А еще в lisp'е совершенно другой подход к ООП, поэтому там возможно легко и естественно делать мультиметоды (интересующимся рекомендую просто почитать про этот паттерн).
|
Сообщ.
#25
,
|
|
|
У С++ есть только один конкурент - asm. Все остальное (тем более Лисп) и рядом не валялось.
|
Сообщ.
#26
,
|
|
|
Цитата Red Devil @ У С++ есть только один конкурент - asm. Юмор прочитал. Шутку оценил. Или ты серьезно Ты так много инструментов разработки знаешь, чтобы такие выводы делать? Забабахай-ка мне на quick sort double'ов на асме А потом говори кто кому конкурент Добавлено Желяющие померяться мультиметодами будут? |
Сообщ.
#27
,
|
|
|
Цитата linuxfan @ Можно создать proxy-класс, перегрузить для него, например, operator<< и использовать примерно в таком стиле:А мне понадобилось законнектиться к localhost (host=NULL) без пароля, но к нестандартному порту 8765. У меня просто нет другого выхода, кроме как описать все параметры. connect(default_connection_params()<<conn_port(8756)); или даже так: connect(conn_port(8756)); |
Сообщ.
#28
,
|
|
|
Цитата trainer @ Можно создать proxy-класс, перегрузить для него, например, operator<< и использовать примерно в таком стиле: А лишние накладные расходы, в т. ч. и на работу с прокси-классом и на написание прокси-классов для каждой функции? |
Сообщ.
#29
,
|
|
|
linuxfan
Цитата Или ты серьезно Сурьезно. Цитата Ты так много инструментов разработки знаешь, чтобы такие выводы делать? Все основные знаю, или по крайне мере знаком как с asm. Цитата Забабахай-ка мне на quick sort double'ов на асме Я не могу полностью писать программы на asm. Только мелкие вставки. Прадва в скором времени исправлю этот недостаток. |
Сообщ.
#30
,
|
|
|
Цитата Red Devil @ Все основные знаю, или по крайне мере знаком как с asm. Назови, плз Вот список того, о чем я имею представление: C, C++, Pascal (сюде идет и Delphi), Java, basic (в т. ч. и с vba забавлялся), perl, php, python, bash (а чем не язык ), JavaScript, Rebol (было дело , Lisp, Fortran, Assembler x86 (хоть для real mode, хоть для pm32; как intel'овский, так и AT'шный синтаксис). И вроде как получается Lisp с любым потягаться может. Не по скорости, конечно (хотя джаву, vba, perl, php, python, bash, javascript и rebol по скорости уделает без вопросов; с остальными может почти на равных быть, если icc в расчет не брать), но по удобству или хотя бы по красоте. |