На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела:
1. Название темы - краткое описание кто/что против кого/чего
2. В первом сообщении - список параметров, по которым идет сравнение.
3. Старайтесь аргументировать свои высказывания. Фразы типа "Венда/Слюникс - ацтой" считаются флудом.
4. Давайте жить дружно и не доводить обсуждение до маразма и личных оскорблений.
Модераторы: Модераторы, Комодераторы
Страницы: (5) 1 [2] 3 4 ... Последняя » все  ( Перейти к последнему сообщению )  
> Lisp vs C++ , померяемся?
    Цитата Flex Ferrum @
    Вопрос из за того, что с синтаксисом лиспа я не знаком.

    Не вопрос:
    delete -- вызов функции delete (стандартная лисповская)
    затем идут два ее параметра: 0 (это то, чему должна равняться значение ключевой функции), затем a -- сам список.
    После этого идут keyword parameters (по-русски ИМХО это ближе всего к именованным параметрам):
    :cout 4 -- число удалений
    :from-end t -- булевый параметр, указывающий на то, что список надо ворошить с хвоста
    :key а тут надо предоставить функцию получения значения ключа; в качестве параметра передается элемент списка
    #' -- это что-то вроде операции взятия адреса функции (применимо только к функциям)
    а дальше идет сама лямбда-функция:
    (lambda (x) (mod x 3)) -- берет один аргумент, возвращает остаток от деления аргумента на 3.
    Ну а потом закрываются все скобки :)
      Цитата linuxfan @
      delete -- вызов функции delete (стандартная лисповская)
      затем идут два ее параметра: 0 (это то, чему должна равняться значение ключевой функции), затем a -- сам список.
      После этого идут keyword parameters (по-русски ИМХО это ближе всего к именованным параметрам):
      :cout 4 -- число удалений
      :from-end t -- булевый параметр, указывающий на то, что список надо ворошить с хвоста
      :key а тут надо предоставить функцию получения значения ключа; в качестве параметра передается элемент списка

      Т. е. в (не)монструозности лямбда-функции ни при чем. Ибо если бы небыло некоторых ограничений на предикаты (как то ограничение на сохранение состояния), то на С++ это тоже бы в одну строчку уместилось...
        Не совсем так: delte просто будет «покруче» плюсовых remove_if (кстати, в list и такое есть :))
          Цитата linuxfan @
          delte просто будет «покруче» плюсовых remove_if (кстати, в list и такое есть :))

          А чем именно?
            Ну хотя бы тем, что он умеет "count" :)
              Цитата linuxfan @
              Ну хотя бы тем, что он умеет "count"

              И что? Методы типа erase тоже умеют удалять заданное количество элементов. count в данном случае для того, чтобы цикл не организовывать. Разве нет?
                Кстати, вот такой вот изврат в lispe'е можно осуществить:
                функция, возвращающая список из двух функций, одна из которых пишед в заданный файл, а другая -- закрывает его.
                Тут демонстируется то, что называется «lexical closure»
                ExpandedWrap disabled
                  (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)))))

                А вот так помле этого можно создавать функции, работающие с этим файлом (меня просто прикалывает этот изврат :D):
                ExpandedWrap disabled
                  (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 в данном случае для того, чтобы цикл не организовывать.

                :yes: Но его ведь можно и не указывать :)
                Покажи мне в C++ аналог именуюемых параметров.
                Со значениями по умолчанию -- есть, vararg'и (...) есть, а вот аналога &key нету.
                Допустим, есть некая ф-ция подсоединения к БД, которая принимает на вход хост, логин, пароль и порт, причем хост, пароль и порт имеют значения по умолчанию, и пусть функция коннекта выглядит так (const не пишу из лени):
                ExpandedWrap disabled
                  DBconnection *connect (char *login,char *pass=NULL,char *host=NULL,int port=5432)

                А мне понадобилось законнектиться к localhost (host=NULL) без пароля, но к нестандартному порту 8765. У меня просто нет другого выхода, кроме как описать все параметры.
                Lisp-way:
                ExpandedWrap disabled
                  (defun connect (login &key pass host (port 5432)) (...))

                И вызов:
                ExpandedWrap disabled
                  (connect "mylogin" :port 8765)

                И наглядно, и понятно, и удобно.
                  Цитата linuxfan @
                  И наглядно, и понятно, и удобно.

                  В целом, да, но можно сделать перегрузки для различных комбинаций (но оно, конечно, будет менее удобно).
                    А еще в lisp'е совершенно другой подход к ООП, поэтому там возможно легко и естественно делать мультиметоды (интересующимся рекомендую просто почитать про этот паттерн).
                      У С++ есть только один конкурент - asm. Все остальное (тем более Лисп) и рядом не валялось.
                        Цитата Red Devil @
                        У С++ есть только один конкурент - asm.

                        Юмор прочитал. Шутку оценил.
                        Или ты серьезно :blink:
                        Ты так много инструментов разработки знаешь, чтобы такие выводы делать? :lol:
                        Забабахай-ка мне на quick sort double'ов на асме :D А потом говори кто кому конкурент :D

                        Добавлено
                        Желяющие померяться мультиметодами будут? ;)
                          Цитата linuxfan @
                          А мне понадобилось законнектиться к localhost (host=NULL) без пароля, но к нестандартному порту 8765. У меня просто нет другого выхода, кроме как описать все параметры.
                          Можно создать proxy-класс, перегрузить для него, например, operator<< и использовать примерно в таком стиле:
                          ExpandedWrap disabled
                            connect(default_connection_params()<<conn_port(8756));

                          или даже так:
                          ExpandedWrap disabled
                            connect(conn_port(8756));
                            Цитата trainer @
                            Можно создать proxy-класс, перегрузить для него, например, operator<< и использовать примерно в таком стиле:

                            А лишние накладные расходы, в т. ч. и на работу с прокси-классом и на написание прокси-классов для каждой функции?
                              linuxfan
                              Цитата

                              Или ты серьезно

                              Сурьезно.

                              Цитата
                              Ты так много инструментов разработки знаешь, чтобы такие выводы делать?

                              Все основные знаю, или по крайне мере знаком как с asm.

                              Цитата
                              Забабахай-ка мне на quick sort double'ов на асме

                              Я не могу полностью писать программы на asm. Только мелкие вставки. Прадва в скором времени исправлю этот недостаток.
                              Сообщение отредактировано: Red Devil -
                                Цитата 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 в расчет не брать), но по удобству или хотя бы по красоте.
                                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                0 пользователей:


                                Рейтинг@Mail.ru
                                [ Script execution time: 0,0501 ]   [ 15 queries used ]   [ Generated: 27.04.24, 09:02 GMT ]