LINUX.ORG.RU

Racket VS Common Lisp

 , , , ,


8

10

Добрый день дорогие аналитики L0R'a. Ковыряю ракет, пишу на нем клиентскую программу - а пока хочется вот что спросить. Все же что лучше - Racket или Common Lisp? Что более перспективно? Ну и естественно, какие у одного недостатки/преимущества по сравнению с другим?

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

Я анонимус и я пишу на C, С++, Java, Scala и Python. Знаю еще туеву кучу языков. И лисп - один из любимых(в данной теме я за Racket). Так что не согласен с тобой. Чем обусловлена твоя ненависть? Тебя лисперы обидели в детстве? Или жена к лисперу ушла?

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

можно сделать вот так:

Это не то. Смысл handler-bind и эквивалентов в том, что в месте, где может быть ошибка ты не принимаешь решение, что с этой ошибкой делать, а принимаешь решение на несколько уровней стека выше.

Например, в одном случае нужно выполнить test заменяя деленияе-на-ноль на нули, в другом на символ 'not-a-number, потом кто-нибудь захочет добавить обработку варианта не-число-в-списке и т. д.

Можно, конечно, делать в стиле C++:

(define (testl l check-value) 
  (if (null? l)
      '()
      (cons (or (check-value (car l)) (/ 1 (car l)))
            (testl (cdr l)))))

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

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

Инспектор устанавливается во время запуска, а не во время компиляции, по идее. Видимо он в модуле гуйни хитро как-то переопределяется. В общем надо спрашивать на маиллитсе.

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

Гм. Сейчас посомтрел, тут, видимо, какаие-то хитрые манипуляции с инспекторами внутри Dr.Racket. В чистом репле все работает:

Welcome to Racket v5.3.3.
> (define inspector (current-inspector))
> (current-inspector (make-inspector inspector))
> (require racket/gui)
> (new frame% (label "test"))
(object:frame% ...)
> (current-inspector inspector)
> (new frame% (label "test"))
#0=(object:frame%
    #1=(object:...ed/private/wxtop.rkt:591:4
        #f
        #<cpointer:HWND>
        #t
        #t
        #2=(eventspace
            #<thread:mzscheme>
            #<procedure:...common/queue.rkt:316:34>
            '#hasheq()
            #<semaphore-peek>
            #f
            #<semaphore>
            0
            '#hash()
            0)
        #f
        #f
        #f
        #f
        #f
        #f
        "test"
        #f
        #f
        #f
        #f
        #f
        #f
        #<cpointer:HWND>
        16
        38
        #f
        #t
        #t
        #f
        #3=(object:.../private/wxpanel.rkt:730:4
            #1#
................................
            'center
            0
            #f)
        #f
        #f
        #f
        #f
        #f
        #f
        #4#
        #f
        #f
        #f
        #f
        #f
        #t
        #t
        0
        #f
        #f
        #f
        -1
        -1
        #3#
        #t
        #t
        #f
        '()
        #f
        '#hasheq()
        '#hasheq()
        #f
        #f
        #0#
        #0#
        -1
        -1
        -1
        -1
        #t
        0
        0
        #f
        '()
        #f)
    #<procedure:...rivate/mrtop.rkt:148:44>
    #f
    #1#
    #<procedure:...rivate/mrtop.rkt:148:23>
    "test"
    (object:cursor% (object:cursor-driver% #<cpointer:HCURSOR>))
    #1#
    #1#
    #3#
    #4#
    #f
    #<procedure:finish>
    #1#
    #f
    #f)
>
anonymous
()
Ответ на: комментарий от anonymous

Кстати, ракетчики-то даже поотмороженнее ортодоксальных лиспнутых будут. Эдакие ваххабиты.

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

Дебильные вопросы задаешь. Мун ласты поклеил, и без него конторка под откос пошла. А хаббард сразу систему строил так, чтоб она его легко пережила. Так что выбор очевиден.

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

Спасибо! Надо будет время найти и что-то наподобие SLIME-inspector сварганить: а то всё хорошо, но имён полей очень не хватает.

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

У структур поля безымянные. У классов по идее есть имена (которые указываются при инициализации), но я хз откуда их вытащить. В дескрипторе класса этих имен нет.

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

У структур поля безымянные.

???

(struct st (a b))

(define x (st 1 2))

(st-a x) -> 1
(st-b x) -> 2

a и b — поля.

Кстати, как подружить параметризацию с определениями. В CL я могу сделать

(let ((x 0))
  (defun inc () (incf x)))

А в Racket определение потом снаружи не видно.

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

А это не то?

;;#lang racket/base

(require racket/class)

(define my-class%
  (class object%
    (super-new)
    (init-field A B)
    (define/public (get-A)
      A)
    (define/private (get-B)
      B)
    ))

(define my-obj (new my-class% [A 1][B 2]))

(interface->method-names (class->interface my-class%))
(field-names my-obj)
(interface->method-names (object-interface my-obj))

;;result
'(get-A)
'(A B)
'(get-A)

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

a и b — поля.

Нет :)

Имен полей нету, есть только имена ацессоров: st-a и st-b. при чем эти имена генерируются макросом struct, и они не обязательно вообще содержат имя поля, то есть можно указать для ацессоров совершенно любые имена. Если же создавать структуру не макросом, а напрямую, то в качестве ацессоров будут просто лямбды (значения которых можно присвоить произвольно выбранным именам). А на более низком уровне нету и ацессоров для полей - внутренне в Racket структура это просто вектор. И есть лишь один ацессор - который принимает инстанс структуры и номер поля. А это уже потом генерятся лямбды вида: (lambda (x) (yoba-ref x 0)), (lambda (x) (yoba-ref x 1)) и так далее.

Если говорить о классах, то можно без костылей получить имена публичных полей и имена публичных методов. Имена инициализирующих полеЙ, если они не публичны, без костылей получать нлеьзя, но с костылями, наверное, можно (т.к. эти имена где-то хранятся), имена других полей получить нельзя - их просто не существует.

А в Racket определение потом снаружи не видно.

В схеме, в отличии от SBCL лексический контекст работает правильно :) И дефайнов внутри контекста вообще делать нельзя. Но в Racket двухпроходной экспандер, который трансформирует потом эти дефайны в летрек-форму.

Вариантов сделать как в SBCL два - либо splicing-let, либо (define name (let ([...]) (lambda (x) ...)).

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

Я выше описал, информация о каких полях хранится. Но это далеко не все поля, большая часть в том же frame% имен не имеет.

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

Вариантов сделать как в SBCL два - либо splicing-let...

Именно это и искал. А splicing-parameterize приципиально не бывает? Просто костыли (define inspector ...) слегка напрягают, а группу параметризовать неясно как.

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

имена других полей получить нельзя - их просто не существует.

Ну почему?

grep -r "(struct st" $racket-dir | parse-struct

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

Структура не обязательно создается через struct. Ну и исходников может не быть.

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

какой смысл параметризовывать лмябду, если при выходе из парметризации (и при запуске лямбды, соответственно) параметры вернутся к оригинальным значениям?

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

кстати если структура определена через struct то можно через (syntax-local-value #'struct-name) получить статическую информацию о структуре, в которой будут имена ацессоров.

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

какой смысл параметризовывать лмябду, если при выходе из парметризации (и при запуске лямбды, соответственно) параметры вернутся к оригинальным значениям

-> (parameterize ([current-inspector (make-inspector)])
    (struct st (a b))
    (struct st2 (c d))
    (define test% (class object% (super-new) (init-field a)))
    (list (st 1 2) (st2 3 4) (new test% [a 10]))) 

(list (st 1 2) (st2 3 4) (object:test% 10))

-> (st 1 2)
. . reference to an identifier before its definition: st
monk ★★★★★
()
Ответ на: комментарий от alienclaster

Люди в перерывах между тренажеркой, виски и секасом обсуждают racket и lisp - на их месте могла быть критика чистого разума vs чему нас учат полевые лилии и небесные птицы кьеркегора...

Зачем ты лжёшь?

Какой смысл в том, чтобы представлять лисперов эдакими интеллектуалами-эрудитами? Интересы типичного лиспера скудны, и лисп, как правило, является его единственным хобби (если не сказать — предметом зацикливания). Давайте рассмотрим известных лисперов и их интересы:

  • Виталий Луговский — лисп, троллинг на форумах;
  • Eric Naggum — лисп, троллинг на форумах;
  • lovesan — лисп, троллинг на форумах, наркотики;
  • Золотце — лисп, троллинг на форумах, антисемитизм, антиматематика;
  • ugoday — лисп, троллинг на форумах, неонацизм, неофашизм;

и так далее. Как видим, увлечения лисперов немногочисленны и довольно патологичны. Так какой смысл выдавать желаемое за действительное?

хотя в это время мог бы...

Это — логическая ошибка (или намеренная уловка?), называемая «ложной дихотомией». Уверяю, у меня замечательно получается сочетать стёб над лисперами и «социальную жизнь» (правда, мои представления о ней несколько отличаются).

Подведём итоги. У тебя проблемы с логикой, и ты лжец. При этом лиспер. Показательно, не правда ли?

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

Я анонимус и я пишу на C, С++, Java, Scala и Python. Знаю еще туеву кучу языков. И лисп - один из любимых(в данной теме я за Racket). Так что не согласен с тобой.

И что тут странного?

Давай разберёмся. Ты работаешь программистом. Стандартом де-факто для промышленной разработки являются так называемые «мейнстрим»-языки (вышеперечисленные «C, С++, Java, Scala и Python»). При этом ты начинаешь потихоньку осознавать, что в XXI веке профессия программиста вернулась туда же, откуда она и начинала, - в категорию обслуживающего персонала. До аналитика/архитектора/ПМа ты не дорос. Поэтому у тебя начали развиваться комплексы и, как следствие, желание выделиться, быть не как все. Выделиться своими талантами и достижениями ты не можешь, поэтому прибегаешь к внешним атрибутам (каковым, например, является айфон). Лисп тут приходится как нельзя кстати: немейнстримный, непрактичный язык с причудливым синтаксисом и требующий больших временнЫх затрат на изучение. Таким образом, причина твоей любви к лиспу — чистый нонконформизм и реализация комплексов. Вот и всё.

Чем обусловлена твоя ненависть? Тебя лисперы обидели в детстве? Или жена к лисперу ушла?

Испытывать ненависть к лиспу — патология (как, впрочем, ненависть к любому рабочему инструменту). Испытывать ненависть к лисперам я не могу, ибо грешно презирать сирых и убогих.

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

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

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

Че-т я не понял. А когда она из этой категории выходила? Это всегда была профессия для низших.

До аналитика/архитектора/ПМа ты не дорос.

Это тоже обслуживающий персонал, если что.

и требующий больших временнЫх затрат на изучение

Да ладно, это тупое и бесполезное говно за 40 минут выучить можно. Илита такая илита - не понимаешь, что ей в качестве «илитного» инструмента детскую игрушку для обучения студентоты подсунули. Типа Лого, только еще более бесполезное.

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

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

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

Испытывать ненависть к лисперам я не могу, ибо грешно презирать сирых и убогих.

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

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

Так что да, они сирые и убогие, но их стоит ненавидеть и давить везде, где только можно.

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

Утютю. Надо быть совсем уж «илитой» на всю голову, чтобы этот твой убогий говнолисп не осилить. Осиливать-то в этом быдлоязычке нечего.

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

Если ты ненавидишь язык, ты безусловно дебил, нормальные люди просто изучают инструмент и оценивают его возможности для своих задач. Если людей, которые на нем пишут, то ты просто ущербен. В любом случае, твои выводы неверны, я пишу на лиспе и не считаю его серебрянной пулей, а себя элитой. Как описывать идеи, возникающие при решении реальной задачи, не столь важно - использовать во всю ООП через CLOS, или описать свой DSL, юзая макросы, или оперировать последовательностями и продолжениями, в любом случае CL дает на выбор кучу техник, которые можно как успешно применять, так и написать с их помощью неразборчивую херню.

Конечно, чем больше язык дает свободы, тем более кривые решения можно на нем написать. Использовать всё, что даёт язык, где это не нужно - признак кривых рук не только в лиспе. Когда язык ограничен в узких рамках, к примеру ООП и императивщины, и люди пишут все только в этих рамках, то и поддерживать это смогут люди с малыми знаниями. В этом плане я тебя понимаю - когда, к примеру, ты ява-дебил, поддерживать проекты с неизвестными технологиями одно мучение.

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

Если людей, которые на нем пишут, то ты просто ущербен.

Да, я презираю и ненавижу людей, которым нравится этот язык. И я как раз не ущербен. Ущербны они. Точно так же я ненавижу тех, кто ссыт в лифте, ненавижу тех, кто швыряет окурки с балкона, ненавижу тех, и т.д.

я пишу на лиспе и не считаю его серебрянной пулей, а себя элитой

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

юзая макросы

А вот за это надо вешать.

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

Опять больной в треде... Твой унылый бред даже жалости не вызывает. Но это не имеет никакого отношения к топику.

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

При этом ты начинаешь потихоньку осознавать, что в XXI веке профессия программиста вернулась туда же, откуда она и начинала, - в категорию обслуживающего персонала.

Не, я не люблю какие бы то ни было категории=)

И программистов всегда относили к данной категории.

Мне нравится программировать и я программирую. Если мне не нравится конкретная работа - я ее меняю. Если мне не нравится конкретные таски, я скидываю их на «обычных» или младших программеров.

До аналитика/архитектора/ПМа ты не дорос

Да, до системного архитектора я хочу дорости. Сейчас я ведущий. До ПМа расти не надо - это другая сфера деятельности. Аналитиком мне быть никогда не хотелось.

Поэтому у тебя начали развиваться комплексы

Хм. Я вполне себе осознаю, что я обладаю весьма средними способностями и совершенно не комплексую по этому поводу, ибо не считаю это чем-то важным в жизни. У меня чудесная семья, интересная работа, неплохой для Питера доход и достаточно свободного времени для увлечений(велик, лыжи, сад, создание «умных» систем, также разрабатываю нудную игру(без шансов на выход) и собираюсь писать книгу) и занятий с ребенком. Так что меня все устраивает. Сейчас вот думаю для фана получить очередную вышку, но пока сомневаюсь, стоит ли. И я не лиспер. Т.е. вообще. Мне кажется, он не подходит для реальной разработки. Разве что в качестве скриптов, вроде autolisp'а или elisp'а.

поэтому прибегаешь к внешним атрибутам (каковым, например, является айфон)

Не, у меня какая-то гадость от sony на android'е. Айфон я жене купил, чтоб экспериментировать спокойно с кросс-смартфонной разработкой(хорошо, что она ЛОР не читает).

Лисп тут приходится как нельзя кстати: немейнстримный, непрактичный язык с причудливым синтаксисом и требующий больших временнЫх затрат на изучение. Таким образом, причина твоей любви к лиспу — чистый нонконформизм и реализация комплексов. Вот и всё.

Лисп я изучил очень давно. До скалки с бидоном точно.

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

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

А. Ну тоды валяй.

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

Да, я презираю и ненавижу людей, которым нравится этот язык. И я как раз не ущербен. Ущербны они. Точно так же я ненавижу тех, кто ссыт в лифте, ненавижу тех, кто швыряет окурки с балкона, ненавижу тех, и т.д.

Какие у тебя странные ассоциации с лисперами. Кстати, какой язык тебе нравится?

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

Ненависть - признак страха, все-таки ты неосилятор.

Да, я боюсь тех, кто ссыт в лифте. Я боюсь в очередной раз зайти и почувствовать этот омерзительный запах. Я боюсь тех, кто швыряет с балконов окурки, один из них может попасть мне за шиворот. Это нормально, бояться всякую мразь. И давить ее превентивно.

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

Еще одна крыса. Ну ничего, вас тут мало, не больше десятка. Все остальные тысячи посетителей ЛОРа вполне нормальны.

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

Какие у тебя странные ассоциации с лисперами.

Что странного-то? Что те, что эти, могут только гадить и вонять.

Кстати, какой язык тебе нравится?

Я не задрот, чтобы мне языки нравились.

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

Хм. Я вроде тоже не задрот. Но я, например, не буду брать Delphi или PHP, потому что они говно. Ты, как я понял, не возьмешь лисп. Но мне приятно брать в руки скалку. Бидон сносен. К С++ у меня странное отношение... Ну т.е. инструменты отличаются по сфере применения и по тому, насколько идеология их использования соответствует твоим представлениям о хорошем инструменте в контексте данной задачи.

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

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

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

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

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

А где он не прав? Назови хоть одного говнолиспера, отличающегося хоть чем-то в лучшую сторону от перечисленных ничтожных персонажей.

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

Больше ненависти! А еще лисперы пьют кровь христианских младенцев.

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

Бу-го-га.

Что не так? Или ты будешь отрицать, что ты — фашня и нацик?

Вообще, ничего смешного тут нет. Печально, что такие, как ты, до сих пор топчут эту бренную планету.

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