LINUX.ORG.RU
Ответ на: комментарий от Alex-Alex

А что еще никто не написал? Или опять на лиспе так не пишут?

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

Касаемо твоей проблемы: ты ещё подумай, что раз функции не принадлежат классам, то в какую ситуацию ты можешь попасть, если два класса экспортируют функцию с одним именем, но с разными сигнатурами?

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

У тебя сейчас подход: «Мне надо - я и делаю.». В лиспе правильно будет: «Мне надо, пусть он делает.»

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

Ну да

#include <cstdio>

template <typename T, class CopyStrategy>
struct Tree {};

struct ShallowCopy {};

template <typename T>
struct Tree<T, ShallowCopy> {
    T node;
    Tree *l, *r;
    Tree(Tree *l_, T node_, Tree *r_) : node(node_), l(l_), r(r_) {}
    Tree(const Tree &tr) : node(tr.node), l(tr.l), r(tr.r) {}
};

struct DeepCopy {};

template <typename T>
struct Tree<T, DeepCopy> {

    T node;
    Tree *l, *r;

    Tree *copy(const Tree *tr) {
        return tr ? new Tree(copy(tr->l), tr->node, copy(tr->r)) : 0;
    }

    Tree(Tree *l_, T node_, Tree *r_) : node(node_), l(l_), r(r_) {}

    Tree(const Tree &tr) {
        Tree *ntr = copy(&tr);
        if (ntr) {
            node = ntr->node;
            l = ntr->l;
            r = ntr->r;
        }
    }

};

template<typename T, class CopyStrategy>
void f(Tree<T, CopyStrategy> tr)
{
    if (tr.l) {
        printf("%d\n", tr.l->node);
        tr.l->node = 0;
        printf("%d\n", tr.l->node);
    }
}

int main()
{
    Tree<int, DeepCopy> t1(0, 1, 0), tr(&t1, 2, 0);

    if (tr.l) {
        printf("%d\n", tr.l->node);
        f(tr);
        printf("%d\n----\n", tr.l->node);
        printf("%d\n", tr.l->node);
        f(reinterpret_cast<Tree<int, ShallowCopy>&>(*&tr));
        printf("%d\n", tr.l->node);
    }
}

/*
1
1
0
1
----
1
1
0
0
 */

со static_castом при этом не заводится (может можно допилить?) — очень удобно по сравнению с костылями

(defstruct btree l n r)

(defgeneric copy-object (object strategy))

(defmethod copy-object ((object btree) (strategy (eql 'shallow)))
  (copy-btree object))

(defmethod copy-object ((object btree) (strategy (eql 'deep)))
  (with-slots (l n r) object
    (make-btree :l (when l (copy-object l 'deep)) :n n :r (when r (copy-object r 'deep)))))

(defun copy (object &optional (strategy 'shallow))
  (copy-object object strategy))

(defun f (obj)
  (format t "f.1: ~S~%" obj)
  (setf (btree-n (btree-l obj)) 0)
  (format t "f.2: ~S~%" obj))

(let ((obj (make-btree :l (make-btree :l nil :n 1 :r nil) :n 2 :r nil)))
  (format t "1.1: ~S~%" obj)
  (f obj)
  (format t "1.2: ~S~%" obj))

(let ((obj (make-btree :l (make-btree :l nil :n 1 :r nil) :n 2 :r nil)))
  (format t "1.1: ~S~%" obj)
  (f (copy obj))
  (format t "1.2: ~S~%" obj))

(let ((obj (make-btree :l (make-btree :l nil :n 1 :r nil) :n 2 :r nil)))
  (format t "1.1: ~S~%" obj)
  (f (copy obj 'deep))
  (format t "1.2: ~S~%" obj))

:)

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

Допилил немного

#include <cstdio>

template <typename T>
struct Tree {
    T node;
    Tree *l, *r;
    Tree() { l = r = 0; }
    Tree(Tree *l_, T node_, Tree *r_) : node(node_), l(l_), r(r_) {}
};

template <typename T, class CopyStrategy>
struct TreeI {};

struct ShallowCopy {};

template <typename T>
struct TreeI<T, ShallowCopy> : public Tree<T> {
    TreeI(const TreeI &tr) : Tree<T>(tr.l, tr.node, tr.r) {}
};

struct DeepCopy {};

template <typename T>
struct TreeI<T, DeepCopy> : public Tree<T> {

    TreeI(TreeI *l_, T node_, TreeI *r_) : Tree<T>(l_, node_, r_) {}

    TreeI *copy(const TreeI *tr) {
        return tr ? new TreeI(copy(static_cast<TreeI*>(tr->l)), tr->node, copy(static_cast<TreeI*>(tr->r))) : 0;
    }

    TreeI(const TreeI &tr) : Tree<T>() {
        TreeI *ntr = copy(&tr);
        if (ntr) {
            Tree<T>::node = ntr->node;
            Tree<T>::l = ntr->l;
            Tree<T>::r = ntr->r;
        }
    }

};

template<typename T, class CopyStrategy>
void f(TreeI<T, CopyStrategy> tr)
{
    if (tr.l) {
        printf("%d\n", tr.l->node);
        tr.l->node = 0;
        printf("%d\n", tr.l->node);
    }
}

int main()
{
    Tree<int> t1(0, 1, 0), tr(&t1, 2, 0);

    if (tr.l) {
        printf("%d\n", tr.l->node);
        f(static_cast<TreeI<int, DeepCopy>&>(tr));
        printf("%d\n----\n", tr.l->node);
        printf("%d\n", tr.l->node);
        f(static_cast<TreeI<int, ShallowCopy>&>(tr));
        printf("%d\n", tr.l->node);
    }
}
quasimoto ★★★★
()
Ответ на: комментарий от Alex-Alex

ты упоролся

в хаскеле( и в тут с го они удивительно похожи) типы задаются интерфейсами

так же родовое программирование .

т.е интерфейс чек.

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

Ты заебал со своим Степановым. Он мужик умный. Но ты все равно заебал. У тебя портрет его не висит еще над рабочим местом7

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

На лиспе пишут, но по-другому.

Всё верно, на лиспе пишут по-другому.

Если плюсовику или джависту надо разработать систему, он собирает требования, пишет ТЗ (или нанимает аналитика), проектирует, моделирует, дизайнит, разрабатывает, тестирует, внедряет систему, получает деньги.

Лиспер же вместо этого брызжет слюной на форуме, не скупясь на сравнения, про то, какие плюсовики/жабщики быдлокодеры, про то, что им недоступна Священная Суть Лиспа™, про то, что на лиспе МОЖНОЗДЕЛОТЬ. Потом идёт обсуждать с бородатыми корешами анафорические лямбды и пандоричиские захваты. Работа, деньги? Зачем? Лисперу это не нужно. Ведь у него есть лисп.

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

На лиспе тоже нельзя одним махом построить дом с окнами, поэтому лиспер меняет язык, чтобы стало можно.

А можно пруфлинк? Ну вот когда что-то нельзя было сделать, потом поменяли язык, и стало можно.

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

Чувак, ты уверен, что тут есть хоть какая-то зависимость от языка? МГе кажется, что брызгатели слюной могут писать и на джаве, а профессиональные разработчики могут выбрать лисп для какой-то задачи. Не?

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

Взял поменля лисп на яву и всего делов - и возможностей много, и библиотек и фреймворков. И GC нормальный сразу =)

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

Простите, я не допонял, что нужно сделать со Степановым? Котировать? А кто это такой-то? Тот, что отравился и в угаре придумал stl?

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

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

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

Ты что сделать-то хотел

Я определил обычный template <typename T> struct Tree тут — нода типа T и два указателя влево и вправо. Дальше, выше по теме было про то что при передаче такой Tree<T> по значению в функцию она будет копироваться побитно (нода и два указателя), либо так как предполагает конструктор копирования. Можно ли подмешать в Tree<T> несколько конструкторов копирования с возможностью выбора между ними при передаче в функции по значению — один будет делать то же что и дефолтный, другой будет копировать всё дерево рекурсивно? Если использовать traits, то есть по Александресковски и по «стратегии» вообще, то можно поднять два таких наследника — TreeI<T, DeepCopy> и TreeI<T, ShallowCopy> — делаем static_cast в один из них и кидаем в void f(TreeI<T, CopyStrategy> tr) по значению — та или иная стратегия копирования будет выбираться в зависимости от CopyStrategy == DeepCopy или CopyStrategy == ShallowCopy. В стандартной библиотеке много такого кода (тот же char_traits).

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

Лиспер же вместо этого брызжет слюной на форуме, не скупясь на сравнения, про то, какие плюсовики/жабщики быдлокодеры, про то, что им недоступна Священная Суть Лиспа™, про то, что на лиспе МОЖНОЗДЕЛОТЬ. Потом идёт обсуждать с бородатыми корешами анафорические лямбды и пандоричиские захваты.

А что ему остаётся ещё делать, если он уже получил деньги, а плюсовик или джавист всё ещё проектируют?

Работа, деньги? Зачем? Лисперу это не нужно. Ведь у него есть лисп.

... несут из топика в топик анонимные плюсовики и джависты, с завистью глядя на прохлаждающихся лисперов, у которых уже всё давно сделано и продано.

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

Что-то я не допонял. Конструктор копий должен быть один. Хочешь разные - делай методы. Ты же усложнил на ровном месте. По умолчанию для С++ логично реализовать глубинное копирование дерева. И сделать метод для «поверхностного»(хотя я бы не стал). Сорри, если я влез не разобравшись, у меня какая-то мания пьяным на лор ходить - трезвым и не появляюсь почти.

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

А что ему остаётся ещё делать, если он уже получил деньги, а плюсовик или джавист всё ещё проектируют?

вам определенно есть, что обсудить с Bioreactor

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

А что ему остаётся ещё делать, если он уже получил деньги, а плюсовик или джавист всё ещё проектируют?

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

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

А можно пруфлинк? Ну вот когда что-то нельзя было сделать, потом поменяли язык, и стало можно.

Ну вот этот самый пример с (бесполезным) экспортом. Типичный лиспер переопределит поведение стандартного defclass.

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

у которых уже всё давно сделано и продано

Но ведь это влажные лисперские фантазии. Успешно сделанный и проданный лисп-проект только один - QPX от ITA Software. И успех его - не благодаря лиспу, а вопреки.

А в это время сотни тысяч успешных проектов разрабатываются на «мейнстримных» языках. Все эти проекты работают в физике, химии, медицине, энергетике, аэрокосмосе, инженерии, телекоме, оборонке, логистике, банкинге, финансах. И лиспом там даже не пахнет. Успех лиспа и безоговорочная победа, ничего не скажешь!

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

Лиспер же вместо этого брызжет слюной на форуме

Видимо у тебя пердак само-регенерирующийся, в каждом лиспо-треде его разносит, а тебе все равно мало.

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

Ну вот этот самый пример с (бесполезным) экспортом. Типичный лиспер переопределит поведение стандартного defclass.

И? Где тут «поменяли язык»? Java-программист переопределит поведение стандартного classloader'a, это тоже будет считаться «изменением языка»?

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

А что ему остаётся ещё делать, если он уже получил деньги, а плюсовик или джавист всё ещё проектируют?

Но ведь «на порядки более быстрый цикл разработки на лиспе» — это расхожий лисперский миф, не имеющий подтверждения на практике.

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

Сказки пошли.

Если только о светлом и прекрасном будущем. Я писал на лиспе за деньги, и авторитетно заявляю, что это просто отличный инженерный язык: код пишется легко, баги ловятся на раз, развесистая байда развивается наживую без проблем. Согласись, что «я на лиспе зарабатывал, и поэтому...» звучит авторитетней, чем: «я на лиспе не только не писал, но даже его толком не знаю, и поэтому...»?

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

Но ведь «на порядки более быстрый цикл разработки на лиспе» — это расхожий лисперский миф, не имеющий подтверждения на практике.

По личным ощущениям, как минимум, на порядок быстрее сишечки и раза в 2-3 плюсов.

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

Но ведь это влажные лисперские фантазии. Успешно сделанный и проданный лисп-проект только один - QPX от ITA Software. И успех его - не благодаря лиспу, а вопреки.

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

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

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

Я писал на Java+Scala за деньги, и авторитетно заявляю, что это просто отличный инженерный язык: код пишется легко, баги ловятся на раз, развесистая байда развивается наживую без проблем. А ты просто не осилил эти языки. И?

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

По личным ощущениям, как минимум, на порядок быстрее сишечки и раза в 2-3 плюсов.

Ты просто некомпетентен в Си и Си++.

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

И? Где тут «поменяли язык»? Java-программист переопределит поведение стандартного classloader'a, это тоже будет считаться «изменением языка»?

Я с явовской терминологией не знаком, но это разве не изменение рантайма? Где тут изменение конструкций языка?

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

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

Пруфы будут? Люди потянулись, когда запахло шекелями, то-то и всего. А лисп тут ни при чём.

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

у мя рабочего места 4ый год нет , поэтому невесит.

тут Александреску упомянут был.

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

Ты просто некомпетентен в Си и Си++.

Это заявляется на основании того, что на языке более высокого уровня код пишется быстрее, чем на языке более низкого уровня?

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

Пруфы будут?

Конечно, приезжай к нам в Бостон на лисповую конференцию, и спроси сам у них.

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

По личным ощущениям, как минимум, на порядок быстрее сишечки и раза в 2-3 плюсов.

Объективно, надо сравнивать с python, ruby, scala...

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

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

Я могу сказать тоже самое про С++, C#, Java и Python. Ну и как писал выше, про пролог(если бы он совсем не скатился - я писал еще в конце 90х кажется или не сильно позднее, на 5ом vip'е, если понимаешь, о чем я). Нет у лиспа преимуществ перед мейнстримом.

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

Объективно, надо сравнивать с python, ruby, scala...

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

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

Но не вижу причин, почему лисп (коммон который) слабее или менее выразительней языков из этого списка.

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

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

Ну так у меня на питоне получается быстрее их примерно с такими же показателями.

Ну так это же всегда зашибись.

Не убедил.

В чём? В том, что на лиспе код пишется быстрей, чем на C и C++?

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

Ну так у меня на питоне получается быстрее их примерно с такими же показателями.

А питон (более менее) нормальный язык, если что. У лиспа остаются преимущества в виде макросов и инкрементальной разработки.

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

Изменение поведения элемента языка.

Ну так я в Java подсуну свой classloader - изменится поведение оператора new. Навешу аннотацию - изменится поведение сеттера. Переопределю методы интерфейса Iterator - изменится поведение конструкции for. И?

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

Конечно, приезжай к нам в Бостон на лисповую конференцию, и спроси сам у них.

Приезжай на Селигер и спроси у нашистов, почему план Путина — это круто.

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

Он такой же, в принципе. Но в сочетании с маргинальностью смотрится гораздо хуже. Мейнстримность языка означает не только кучу быдлокодеров, но и наличие хороших и поддерживаемых библиотек, развитие стандартов/спецификаций, возможность применения в относительно новых технологиях(возьми тот же андроид - ява была из коробки, NDK для си и плюсов тоже добавили), хорошую и актуальную литературу, активные сообщества, большое количество проектов, в том числе и открытых, большую кодовую базу и пр. и пр.

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

В том, что лисп имеет какие-либо преимущества перед мейнстримом, куда бидон таки относится.

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

Ну, это если из основных. А так вообще: скорость, синтаксис (на любителя), потенциальная возможность (и готовые реализации) вводить в язык с помощью библиотек / dsl изначально не заложенную в него функциональность, декларация типов, tro, коммерческие реализации итд итп.

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