LINUX.ORG.RU

Кто пишет gui на яве?

 ,


1

5

Правда, что одно и тоже приложение javaFX можно запустить на десктопе, в браузере и на мобильном устройстве? Насколько это хорошо работает?

Хотя ни одной такой программы не встречала, интересно кто их пишет и для кого?

PS Встретила здесь скептическое отношение к ява, но мне она нравится больше чем питон или перл. Возникает ощущение какой-то фундаментальности языка и делает его очень солидная компания.


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

Удобнее и привычнее чем:

смотря кому. Как по мне — одинаково, что в первом случае сразу всё ясно, что во втором.

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

Если кто-то читаем код на лиспе и ему обидно, что он не похож, на код на С, питоне или фортране, то мы имеем ярко выраженный приступ синдрома утенка.

Да у всех вышеперечисленых набор букв хоть как-то имеет отношение к тому что делает функция, вас не затруднит рассказать нам как расшифровывается это набор символов car, cdr.

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

Покажи как ты будешь использовать объекты CLOS, например, в качестве ключей hash-table.

Я не говорил, что низкоуровневые вещи станут волшебным образом высокоуровневыми. Но никто не машает тебе их написать.

Вообще, CLOS довольно неинтересный пример высокоуровневости Лиспа. Я тут просто руководствуюсь синдромом Блаба и пытаюсь объяснять в знакомых понятиях.

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

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

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

Я из 2017.

RAM 16GB в наше время перестала быть экзотикой.

Труд Java-программиста в ДС оплачивается в десятки раз дороже малограмотного китайского рабочего, работающего на фабрике по 16 часов в день за чашку риса.

https://www.iphones.ru/iNotes/568708

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

Я не говорил, что низкоуровневые вещи станут волшебным образом высокоуровневыми. Но никто не машает тебе их написать

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

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

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

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

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

Во всех нормальных языках это не составит проблемы

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

В Си ты не можешь запилить себе объекты, тебе нужен Страуструп и 30 лет разработки. Потом окажется, что Страуструп неосилил, и уже нужна транснациональная корпораци для разработки Java. Точнее две транснациональные корпорации.

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

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

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

Еще раз, проблема в том, что как раз стандартные средства общелиспа факапятся на простой задаче, и тебе посоветуют взять genhash и пр.

В Си ты не можешь запилить себе объекты

https://developer.gnome.org/gobject/stable/

По сути такая же конструкция из говна и палок, как и CLOS. Только ее действительно используют.

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

Еще раз, проблема в том, что как раз стандартные средства общелиспа факапятся на простой задаче, и тебе посоветуют взять genhash и пр.

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

По сути такая же конструкция из говна и палок, как и CLOS.

Ну-ну, покажи множественную диспетчеризацию, которой даже ни в письке, ни в жабке нет.

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

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

Нет, я просто видел эти «небоскребы» в виде нор, где сидят грязные лисперы и рассказывают, что они из говна(списков) и палок(функций) могут слепить все что угодно, в том числе ООП, про который ты завел речь.

Ну-ну, покажи множественную диспетчеризацию, которой даже ни в письке, ни в жабке нет.

Ее нет по простой причине - не нужна и не востребована. И лепится она ровно так же как и в CLOS, никаких проблем наваять ее нет.

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

>>Потому что наследие ограничений на длину имени тянут до сих пор с собой.

>Не мог бы ты озвучить это ограничение?

IBM 704 car -> Contents of the Address part of Register cdr -> Contents of the Decrement part of Register Что это, почему это тянется до сих пор? Производные от этого?

Зачем ты прикидываешься дислексиком или идиотом? Ты написал о каком-то ОГРАНИЧЕНИИ на ДЛИНУ ИМЕНИ. Историю происхождения команд car и cdr я знаю. Меня интересует ограничение на длину имени.

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

Да у всех вышеперечисленых набор букв хоть как-то имеет отношение к тому что делает функция, вас не затруднит рассказать нам как расшифровывается это набор символов car, cdr.

Ты сам написал расшифровку. Имена car и cdr оставлены для совместимости - да, грамотно написанная программа на лиспе может корректно работать десятилетиями. В нынешнем стандарте ЦЛ используют first и rest соответственно. Это просто синонимы тех же car и cdr. Обе функции работают со списками. Тебе объяснить что делают эти функции?

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

Ты претворяешься? Написано не ограничение на длину имени, а наследие ограничений, когда оно существовало любили писать strbr и прочее, cdr и car из той же оперы выпук из 59 года.

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

Вне зависимости от ответа, я считаю это настолько неважной мелочью, что мне даже этот комментарий писать лень. Если кого-то car и cdr отпугнёт от программирования, то наверное ему лучше найти себя в какой-нибудь другой профессии.

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

Ты претворяешься? Написано не ограничение на длину имени, а наследие ограничений

Зато скимеры психанули и вытворяют (some-long-function-name-for-doing-something params)

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

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

P.S. Программ которые написаны и работают уже по 50 лет очень много, и 99% написаны не на Лиспе. Cobol тут в переди планеты все, и кстати он стал популярным именно из-за близости синтаксиса к нормальномы человечему языку. Да еще слышал спутники Глонас вроде на Модулв-2 написан софт, тоже надежно и без элитарного язычка.

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

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

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

Нет, я просто видел эти «небоскребы» в виде нор, где сидят грязные лисперы и рассказывают, что они из говна(списков) и палок(функций) могут слепить все что угодно, в том числе ООП, про который ты завел речь.

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

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

И лепится она ровно так же как и в CLOS, никаких проблем наваять ее нет.

https://ru.wikipedia.org/wiki/Мультиметод

Не считая простыни говнокода.

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

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

Детский сад.

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

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

Вижу, кто-то менее компетентный, чем авторы языка, практически гарантированно накосячит еще больше, и пользоваться его кодом будет сплошная головная боль. Вероятно этим и объясняется низкое качество и малое количество библиотек. И все эти «безграничные средства» по сути просто треп, типичный рабочий код на лиспе (а не синтетический пример, который прячет портянку реализации в стороне) крайне примитивен и полон бойлерплейта.

Не считая простыни говнокода.

Ты реализацию CLOS в каком-нибудь sbcl смотрел? Такие же простыни.

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

Нет он просто не будет использовать элитарный язычок.

Потому что функция называются car/cdr а не first/tail? Довольно идиотская причина как по мне, но мир вообще полон странных людей.

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

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


Common Lisp:

(defgeneric collide (x y))

(defmethod collide ((x asteroid) (y asteroid))
  ;;астероид сталкивается с астероидом
  )

(defmethod collide ((x asteroid) (y spaceship))
  ;;астероид сталкивается с космическим кораблем
  )

(defmethod collide ((x spaceship) (y asteroid))
  ;;космический корабль сталкивается с астероидом
  )

(defmethod collide ((x spaceship) (y spaceship))
  ;;космический корабль сталкивается с космическим кораблем
  )

C++:

#include <typeinfo>
#include <unordered_map>

typedef unsigned uint4;
typedef unsigned long long uint8;

class Thing {
  protected:
    Thing(const uint4 cid) : tid(cid) {}
    const uint4 tid; // type id

    typedef void (Thing::*CollisionHandler)(Thing& other);
    typedef std::unordered_map<uint8, CollisionHandler> CollisionHandlerMap;

    static void addHandler(const uint4 id1, const uint4 id2, const CollisionHandler handler) {
        collisionCases.insert(CollisionHandlerMap::value_type(key(id1, id2), handler));
    }
    static uint8 key(const uint4 id1, const uint4 id2) {
        return uint8(id1) << 32 | id2;
    }

    static CollisionHandlerMap collisionCases;

  public:
    void collideWith(Thing& other) {
        CollisionHandlerMap::const_iterator handler = collisionCases.find(key(tid, other.tid));
        if (handler != collisionCases.end()) {
            (this->*handler->second)(other); // pointer-to-method call
        } else {
            // default collision handling
        }
    }
};

class Asteroid: public Thing {
    void asteroid_collision(Thing& other)   { /*handle Asteroid-Asteroid collision*/ }
    void spaceship_collision(Thing& other)  { /*handle Asteroid-Spaceship collision*/}

  public:
    Asteroid(): Thing(cid) {}
    static void initCases();
    static const uint4 cid;
};

class Spaceship: public Thing {
    void asteroid_collision(Thing& other)   { /*handle Spaceship-Asteroid collision*/}
    void spaceship_collision(Thing& other)  { /*handle Spaceship-Spaceship collision*/}

  public:
    Spaceship(): Thing(cid) {}
    static void initCases();
    static const uint4 cid; // class id
};

Thing::CollisionHandlerMap Thing::collisionCases;
const uint4 Asteroid::cid  = typeid(Asteroid).hash_code();
const uint4 Spaceship::cid = typeid(Spaceship).hash_code();

void Asteroid::initCases() {
    addHandler(cid, cid, (CollisionHandler) &Asteroid::asteroid_collision);
    addHandler(cid, Spaceship::cid, (CollisionHandler) &Asteroid::spaceship_collision);
}

void Spaceship::initCases() {
    addHandler(cid, Asteroid::cid, (CollisionHandler) &Spaceship::asteroid_collision);
    addHandler(cid, cid, (CollisionHandler) &Spaceship::spaceship_collision);
}

int main() {
    Asteroid::initCases();
    Spaceship::initCases();

    Asteroid  a1, a2;
    Spaceship s1, s2;

    a1.collideWith(a2);
    a1.collideWith(s1);

    s1.collideWith(s2);
    s1.collideWith(a1);
}

Теперь, внимание, вопрос.

Что лучше, красивый код на Common Lisp с нестандартным хешем или портянки говнокода на C++ со стандартным?

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

Потому что функция называются car/cdr а не first/tail?

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

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

держать все в списках и выдергивать из них значение по их индексу.

Ну понятно, эти идиоты Лисп только на картинках видели. Развели детский сад.

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

Федерация ведущих собаководов России настоятельно не рекомендует изучать lisp (а равно как и другие языки) по лиспосрачам на лоре.

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

Что лучше, красивый код на Common Lisp с нестандартным хешем или портянки говнокода на C++ со стандартным?

Не надо пытаться выставить остальных дураками. Код на С++ можно написать значительно проще, а код на лиспе неполный, в отличие от примера на С++. Ты даже частный случай, когда пытался выдать портянку реализации в CLOS за преимущество, подал нечестно, скорее всего скопипастив первое попавшееся.

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

... не ограничение на длину имени, а наследие ограничений,...

Чтобы было «наследие ограничений», изначально должны быть «ограничения». Видимо, русский язык тебе не родной.

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

Объясни мне что делают эти функции...

first - [англ. первый] возвращает первый элемент списка.

rest - [англ. остальное, остаток] возвращает оставшуюся часть списка.

.

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

пример, как получить 321-й элемент из списка my-list:

(nth 321 my-list)
начинай ржать.

.

PS. надеюсь ты работаешь не программистом, а каким-нибудь маркетологом.

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

Ну понятно, эти идиоты Лисп только на картинках видели. Развели детский сад.
Федерация ведущих собаководов России настоятельно не рекомендует изучать lisp (а равно как и другие языки) по лиспосрачам на лоре.

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

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

функции tail в стандарте нет. есть tailp, но это совершенно другая функция

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

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

О да, недостающие строки:

(defclass asteroid () ())
(defclass spaceship () ())

Может хватит уже кривляться, как девочка? Победа лисперов очевидна.

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

Может хватит уже кривляться, как девочка? Победа лисперов очевидна.

Детский сад выдавать частное за «победу», да еще и сравниваясь с С++, да еще и с кривой реализацией на нем. Точно так я могу предложить решить задачу, например, поиска n-го простого числа и привести решение на Ruby в одну строку, когда тебе придется писать пачку кода на лиспе.

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

Точно так я могу предложить решить задачу, например, поиска n-го простого числа и привести решение на Ruby в одну строку, когда тебе придется писать пачку кода на лиспе.


Common Lisp:

(find 3 '(1 2 3 4 5))

Ruby:
array = [1,2,3]
found = array.detect {|e| e == 3} #=> 3

2:0 в пользу Лиспа.

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

2:0 в пользу Лиспа.

Ты задачу хоть понял перед тем как что-то там засчитывать? Или понятие «простые числа» тебе не знакомо?

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

Не говоря уж про то, что Ruby, как и С++, ты видно знаешь только по википедии.

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

О да, недостающие строки:

И это тоже не все по сравнению с кодом на С++. Ну и вот тебе более простое решение данного частного примера:

#include <iostream>
using namespace std;
struct asteroid;
struct spaceship;

struct thing {
virtual void collide(asteroid& other) = 0;
virtual void collide(spaceship& other) = 0;
};

struct asteroid : thing {
void collide(asteroid& other) { cout << "A - A\n"; }
void collide(spaceship& other) { cout << "A - S\n"; }
void collide(thing& other) { other.collide( *this ); }
};

struct spaceship : thing {
void collide(asteroid& other) { cout << "S - A\n"; }
void collide(spaceship& other) { cout << "S - S\n"; }
void collide(thing& other) { other.collide( *this ); }
};

int main() {
   asteroid a1, a2;
   spaceship s1, s2;

   a1.collide( a2 );
   a1.collide( s1 );

   s1.collide( a1 );
   s1.collide( s2 );
}
anonymous
()
Ответ на: комментарий от anonymous

Забыл добавить:

virtual void collide(thing& other) = 0;

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

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

Кроме того, решение на С++ гарантирует, что все варианты будут выписаны. И если я добавлю под thing еще несколько классов - bullet и т.п., то будут добавлены и реализации для работы с ними, иначе программа не соберется. Хотя можно и дефолтную реализацию сделать, если хочется. А в коде с CLOS один-два варианта спокойно могут затеряться, что вылезет ошибкой в рантайме.

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

И если я добавлю...

Для этого надо иметь мозги и силу воли для того, чтобы встать с дивана. Итог: не добавишь.

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

Объясни мне что делают эти функции...
first - [англ. первый] возвращает первый элемент списка.
rest - [англ. остальное, остаток] возвращает оставшуюся часть списка.

Остаток? WTF Мне там выше типа рассказывали про какой-то второй элемент, на мое возражение cdr, что возвращается хвост списка отправили меня читать мануал, вы там Лисперы в терминологии и теории разберитесь между собой.

Там еще один Лиспер втирал мне что дескать car cdr традиционно привычнее и эффективнее, а однако для них все же родили синонимы, зачем так обошлись с традицией?

пример, как получить 321-й элемент из списка my-list:

(nth 321 my-list)
начинай ржать.

Ржу над тобой, чем это лучше list.get(321)? У вас там как нибудь так сработает? (nth 321 my-list1 my-list2)? А нет не сработает, тогда вопрос зачем такая уродская запись.

PS. надеюсь ты работаешь не программистом, а каким-нибудь маркетологом.

Не надейся, надежда умирает последней. Хотя я может быть наврал тебе.

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

Для этого надо иметь мозги и силу воли для того, чтобы встать с дивана. Итог: не добавишь.

Чо? Ну и вот: http://rextester.com/FCDN17265

А теперь пусть лисперы родят решение, где гарантирована обработка всех коллизий для тех же объектов.

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

Для этого надо иметь мозги и силу воли для того, чтобы встать с >дивана. Итог: не добавишь.
Чо? Ну и вот: http://rextester.com/FCDN17265
А теперь пусть лисперы родят решение, где гарантирована обработка >всех коллизий для тех же объектов.

Не метай перед ними бисер, грамотные Лисперы уже в основном вымерли, так что они врятли смогут...

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

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

. не ограничение на длину имени, а наследие ограничений,...
Чтобы было «наследие ограничений», изначально должны быть >«ограничения». Видимо, русский язык тебе не родной.

Что тебе не понятно в фразе «наследие ограничений», написано вполне по русски, и ограничения были, ты хочешь сказать у перволиспа на IBM 704 не было ограничений? Для тебя походу слова длинее трех букв сложны к пониманию, могу только посочувствовать.

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

Не метай перед ними бисер, грамотные Лисперы уже в основном вымерли, так что они врятли смогут...

Это да, но все-равно весело. И что забавно, они сами ничего другого, кроме лиспа и не знают, но считают свой язык элитарным.

П.С. а вот это, (страшное слово) целый DSL на (страшное слово) макросах (которые на самом деле не макросы, ведь макросы только в лиспе, а это тупо препроцессор), который заменил для данной задачи жирный и тормозной CLOS:

#include <iostream>
using namespace std;
struct asteroid;
struct bullet;
struct spaceship;

#define DECLARE_MM(x) virtual void collide(x& other) = 0;
#define DEFINE_MM(x) void collide(x& other)
#define DELEGATE_MM(x) void collide(x& other) { other.collide(*this); }
#define END_THING };
#define THING(x) struct x: thing { void collide(thing& other) { other.collide(*this); }

struct thing {
   DECLARE_MM(asteroid)
   DECLARE_MM(bullet)
   DECLARE_MM(spaceship)
   DECLARE_MM(thing)
};

THING(asteroid)
   DEFINE_MM(asteroid) {}
   DEFINE_MM(bullet) { cout << "BOOM\n"; }
   DEFINE_MM(spaceship) { cout << "GAME OVER\n"; }
END_THING

THING(bullet)
   DELEGATE_MM(asteroid)
   DEFINE_MM(bullet) {}
   DEFINE_MM(spaceship) {}
END_THING

THING(spaceship)
   DELEGATE_MM(asteroid)
   DEFINE_MM(bullet) {}
   DEFINE_MM(spaceship) {}
END_THING

int main() {
   asteroid a;
   bullet b;
   spaceship s;

   b.collide(a);
   s.collide(a);
}

http://rextester.com/AOI63526

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

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