LINUX.ORG.RU

Преимущества лиспа на наглядных примерах


0

0

В литературе по лиспу довольно часто (обычно в предисловии) расписывают как крут лисп - позволяет "создавать язык программирования под конкретную задачу", существенно облегчает доработку имеющегося кода и т. д. А нет ли где-нибудь набора конкретных примеров, иллюстрирующих все эти преимущества? В стиле "вот задача, на c/python/что-то ещё она решается вот так, а на лиспе вот так"?

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

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

А что, Borland VCL работает на линуксе?

Кроссплатформенное - бери биндинги к кроссплатформенным сишным библиотекам. GTK+, если конкретно.

windows.h+winerror.h+winuser.h+gdi32.h это не так уж и много.
Если тебе не хватает существующего, надо написать его, а не ныть на формумах что де библиотек нет.
Что значит не получается автоматизировать? Парсеры и генераторы врапперов отменили? Макросы на что, в конце концов?

guest-3484-2009
()
Ответ на: комментарий от den73

> Пример с разбоксингом - давай.

Вот откуда оно начиналось ( http://www.linux.org.ru/jump-message.jsp?msgid=3594542&cid=3597331 )

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

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

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

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

Да ладно тебе, это ж везде так. На прошлой работе связался с C++ и Линуксом - шарился везде, начиная с ядра, через glibc, libxml2 и libalsa, к проклятому бусту. Всё глючит, всё патчил. И g++ сегфолтился на валидных конструкциях. И чипы, выпускающиеся уже 10 лет, виснут на определённых комбинациях, не смотря на сто ревизий. И китайское железо ещё, бывало, как завернёт, так потом два дня доходишь до светлой мысли, что, оказывается, за стеной, в другом подъезде, электрощиток стоит, который баги и вызывает. Нет щастья...

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

> Нужно понять одну простую вещь: быдлопрограммист - это программист который программирует В ТЕРМИНАХ ПАРАДИГМЫ.

'And it should be the law: If you use the word "paradigm" without knowing what the dictionary says it means, you go to jail. No exceptions.' (c)

tailgunner ★★★★★
()
Ответ на: комментарий от guest-3484-2009

>Основная проблема

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

>А так - никаких сложностей.

оно и видно. впрочем, я всегда открыт примерам, опровергающим мою точку зрения :) можешь продемонстрировать связь C++ и CL вызовом std::nth_element из лиспа? буду чудовищно благодарен. кроме шуток

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

#include <iostream>                                                                                                                 
                                                                                                                                    
#define AS(T) as<T>()                                                                                                               
                                                                                                                                    
template<typename T> class Boxed;                                                                                                   
                                                                                                                                    
class Something
{                                                                                                                                   
  /// это корень иерархии, можно написать нужные пустые вирутальные методы, например print                                          
public:                                                                                                                             
  virtual void print_value_size() {};                                                                                               
  template<typename T> T* as() {                                                                                                    
    Boxed<T>* ptr = dynamic_cast<Boxed<T>*>(this);                                                                                  
    return ptr ? ptr->get() : NULL ;                                                                                                
  }                                                                                                                                 
  virtual ~Something(){}                                                                                                            
};                                                                                                                                  
                                                                                                                                    
template<typename T> class Boxed: public Something                                                                                  
{                                                                                                                                   
private:                                                                                                                            
  T value;                                                                                                                          
public:                                                                                                                             
  Boxed<T>(T arg): value(arg) {}                                                                                                    
  T* get() { return &value; }                                                                                                       
  virtual void print_value_size() { std::cout << " sizeof=" << sizeof(value); }                                                     
  virtual ~Boxed(){}                                                                                                                
};                                                                                                                                  
                                                                                                                                    
template<typename T> inline Boxed<T>* boxed(T arg) { return new Boxed<T>(arg); }                                                    
                                                                                                                                    
class Hierarhy1 {};                                                                                                                 
class Hierarhy2 {};                                                                                                                 
                                                                                                                                    
/// usage:                                                                                                                          
int main()                                                                                                                          
{                                                                                                                                   
  Something* x[]={ boxed(1), boxed("asdf"), boxed(3.0), boxed(new Hierarhy1()), boxed(new Hierarhy2()) };                           
  for( int i=0; i<5; i++) {                                                                                                         
    x[i]->print_value_size();                                                                                                       
    int* y = x[i]->AS(int);                                                                                                         
    if( y )                                                                                                                         
      std::cout << " value=" << (*y) << ' ';                                                                                        
    else                                                                                                                            
      std::cout << " value is not int" << ' ';                                                                                      
    std::cout << '\n';                                                                                                              
  }                                                                                                                                 
}                           

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

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

Что значит "печатать"? Гвоздем пусть рисуют. И чтобы работало.

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

> Что значит "печатать"? Гвоздем пусть рисуют. И чтобы работало.

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

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

> зачем мне что-то доказывать что-то непонятно кому?

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

З.Ы. Некоторым и РНР хватает...

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

> Эх Виталик-Виталик! Как я тебя понимаю.

А я -- нет. Мне вообще не понятно, как можно пытаться программировать не в понятиях предметной области.

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

>Эх Виталик-Виталик! Как я тебя понимаю.

А ты к Виталику не примазывайся. Ты то как раз услышал где-то фразу и теперь тыкаешь всюду.

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

>как можно пытаться программировать не в понятиях предметной области

Ну дык, а я про что? Только вот почему-то пытаются. То же всем известный object-relational impedance mismatch. Он как из предметной области проистекает или из-за разницы подходов (парадигм)?

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

>Ааааа... плять... *ушел под вайном пускать* :')

под вайном-то зачем? o_O он же нативный до мозга костей

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

> То же всем известный object-relational impedance mismatch. Он как из предметной области проистекает или из-за разницы подходов (парадигм)?

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

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

>И что нам делать, когда мы изуродуем предметную область объектно-ориентированной декомпозицией?

о нет. это какая-то новая стадия, после ООП головного мозга - воинствующая мультипарадигмальность головного мозга (ВМГМ)

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

> И что нам делать, когда мы изуродуем предметную область объектно-ориентированной декомпозицией?

Пойти и ...

На самом деле ООД весьма полезна, особенно если ее обобщить должным образом.

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

> о нет. это какая-то новая стадия, после ООП головного мозга - воинствующая мультипарадигмальность головного мозга (ВМГМ)

Обычно ВМГМ развивается на фоне шизофрении: каждое "я" свою парадигму выбирает.

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

> о нет. это какая-то новая стадия, после ООП головного мозга - воинствующая мультипарадигмальность головного мозга (ВМГМ)

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

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

>парадигм его списывать тоже будет неточно

Согласен. Только примеров таких mismatch'ей можно много привести.

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

>На самом деле ООД весьма полезна, особенно если ее обобщить должным образом.

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

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

>> Для тех, кто не знает лисп
>Для нас еще скажи, что за функция foo-bar

Это функция,которая ожидает в качестве аргумента структуру foo (или её наследника) и даёт доступ к полю bar. Увы, нужно писать (foo-bar x), а не x.bar, и как раз в этом месте тема плавно переходит к недостаткам лиспа.

>> мы читаем экземпляр этой структуры

>Откуда?

Из потока.

>> у которой поле bar равно самой структуре и записываем в локальную >>переменную.

>То есть весь вопрос - в закольцованности списка?

Мммм. Смотря чего хотеть и с чем сравнивать. В том числе, в закольцованности списка. Хотя тут можно и больше вопросов накопать.

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

>На самом деле ООД весьма полезна

А я спорю? Только вот при ООД почему-то логика работы тонким слоем размазывается по иерархии классов.

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

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

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

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

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

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

а про DDD читать пробовал? :) FAST какой-нибудь, например. того же Виталика статью

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

>это какая-то новая стадия, после ООП головного мозга

А чего ты так завелся-то? Я ВСЕГО ЛИШЬ дал свое, емкое и краткое определение быдлопрограммиста. Притом универсальное. Им можно и лисперов и хаскелистов и С++'сников клеймить. А не только PHPшников, VBшников или питонщиков.

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

>А чего ты так завелся-то?

у меня мозг после работы отдыхает, пишу на автомате :)

>емкое и краткое определение быдлопрограммиста

смешное оно у тебя получилось

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

> Я ВСЕГО ЛИШЬ дал свое, емкое и краткое определение быдлопрограммиста. Притом универсальное.

Ты всего лишь сказал глупость с умным видом. Любой прогер работает в рамках парадигмы. Ты - тоже.

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

>под вайном-то зачем? o_O он же нативный до мозга костей Хм... а можно подробнее? Мы про dungeon keeper говорим? =) Где бинарники скачать можно?

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

>Мы про dungeon keeper говорим?

увы, нет. я - про nethack :)

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

> А я спорю? Только вот при ООД почему-то логика работы тонким слоем размазывается по иерархии классов.

А вот тут поподробней.

(Хотя могу уже предложить понятие Chainlet и поддерживающую его синтаксическую конструкцию как альтернативу иерархии классов. http://www.fiber-space.de/EasyExtend/doc/gallery/gallery.html А все потому, что ООП криво построено!)

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

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

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

>рекомендую :)

Почитал статью на википедии. Чего-то многовато трескучих терминов в этой концепции, хотя интересно. Надо будет почитать.

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

>А вот тут поподробней.

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

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

>Любой прогер работает в рамках парадигмы. Ты - тоже.

Ну да, Я - БЫДЛОПРОГРАММИСТ. Верно подмечено.

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

>> Любой прогер работает в рамках парадигмы. Ты - тоже.

> Ну да, Я - БЫДЛОПРОГРАММИСТ.

По твоему определению, все - быдлопрограммисты.

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

> Ты всего лишь сказал глупость с умным видом. Любой прогер работает в рамках парадигмы. Ты - тоже.

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

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

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

Вместо тяжких стонов напиши пример.

З.Ы. Программирование в какой-то степени субъективно.

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

>  Boxed<T>(T arg): value(arg) {}  
Копируем значение? Хм-хм. Уже потеря общности. 
Я не настолько знаю/помню С++, но допустим, 
можно сделать T& value. Допустим. 

>x[i]->print_value_size();
>int* y = x[i]->AS(int);  
 
Всё круто, но в лиспе это выглядит так:

(print (type-of (elt x i))) ; печатаем имя типа
(typecase (elt x i) ; выбор по типу
  (int "Это целое")
  (hierarchy1 "Это hierarchy1"))

Т.е., неплохо бы сделать так, чтобы box мог возвращать свой тип.
А то он ведёт себя как вот такой сфинкс 

http://www.indaflash.ru/flashka.php?id=13

По правде говоря, мне сдаётся, что это на самом деле возможно с
 помощью неких извращений. Типа делаем в box<T> статическое поле
(главное, чтобы его можно было инициализировать нулём без написания
дополнительных строк кода, но это я уже не помню). И с его помощью 
присваиваем каждому типу, для которого box был инстанцирован,
уникальный код. Имя типа мы не получим, но, во всяком случае,
получим число. Правда, я не уверен, что это не будет стоить дорого
 (например, проверка того, что код уже присвоен, при каждом вызове
 конструктора box<T>). В общем, как и обычно в плюсах, всё мутно и
я не уверен, что моё предложение - не бред, но это как раз не я
говорил, что в плюсах всё круто :) 

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

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

Возьми. И дай ссылку на словарь, который дает это определение.

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

> По твоему определению, все - быдлопрограммисты.

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

З.Ы. Не-быдлоязыки общего назначения можно сделать. И нужно.

www_linux_org_ru ★★★★★
()
Ответ на: комментарий от guest-3484-2009

> Кроссплатформенное - бери биндинги к кроссплатформенным сишным библиотекам. GTK+, если конкретно

Не хочу разводить священную войну на тему ГУЯ, но мы выбрали wx, т.к. он нативен на разных платформах.

> Если тебе не хватает существующего, надо написать его,

> а не ныть на формумах что де библиотек нет.

А я не ною. Я изучаю питон, в котором биндинги к wx есть.

> Что значит не получается автоматизировать? Парсеры и

> генераторы врапперов отменили? Макросы на что, в конце

> концов?

В итоге задача сведётся к написанию специализированного компилятора С (или там плюсы?), понимающего все расширения Microsoft. Кстати,
я уже патчил в своё время SWIG и совсем недавно порывался писать
свой генератор врапперов для С на базе gdb. Но так руки и не дошли. В общем, я признаю, что этот путь для меня слишком трудоёмок и я предпочту быть ещё одним бараном в стаде быдлопитонистов, чем гордым и одиноким горным козлом - лиспером. Да, это было трудное решение, т.к. всё же питон после лиспа - это не гламурно. Не знаю, может, после знакомства с питоном я вернусь к лиспу.

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

> Все современные языки общего назначения -- быдлоязыки.

Суров.

> З.Ы. Не-быдлоязыки общего назначения можно сделать.

Ждем-с.

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

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

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

> Я не настолько знаю/помню С++, но допустим, можно сделать T& value

Тут ты прав, я упустил &, но вообще этот пример был наскоро сделан, чтоб показать идею.

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