LINUX.ORG.RU

Муки выбора первого юзабельного языка (pascal за язык не считается). Есть два ООП ЯП: лиспы точеные и питоны золоченые...

 , ,


2

5

Решил изучать первый (после псевоязыка: паскаля) ООП ЯП. Всё думаю, куда сесть то: на лиспы точеные или на питоны золоченые? Цели: нейронные сети, работа с БД, ФС, мелкие поделки школьного уровня (типа машинного обучения на SVM).

Какие преимущества и недостатки у того и другого ЯП?

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



Последнее исправление: ymn (всего исправлений: 1)
Ответ на: комментарий от DarkEld3r

Его пока не пиарят особо, на паре небольших конференций про него рассказывали. Плюс это практически ребол. А кто вобще слышал слово ребол?)

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

В JS более гибкое решение. Там ты вообще всегда можешь передать в качестве this любой объект. А судя по твоему описанию, поскольку ты не можешь, например, сделать obj.method(anotherObject), метод который в классе и метод который в объекте — это вообще разные методы(в экземпляре — копия), это аналог джаваскриптовского object.foo = function(){doSomething(this)}.bind(object) или object.foo = () => doSomething(this)

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

Это апелляция к авторитетам без понимания, понимает ли цитирующий, что в данном контексте его цитата ниочем — и синглтоны зло :)

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

метод который в классе и метод который в объекте — это вообще разные методы(в экземпляре — копия)

Да, первый называется «unbound method», второй — «bound method».

В JS более гибкое решение. Там ты вообще всегда можешь передать в качестве this любой объект.

И в питоне можешь: obj.__class__.method(another_obj) вместо obj.method()
Другой вопрос, что такая функциональность не является повседневно нужной и полезной, и ее поэтому и нет в удобном виде.

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

Что-то непонятно, в чем проблема длинных определений? Если что-то используется часто, можно просто навесить алиас.

Предположим, у тебя есть такой код (на Io):

GeographicMap := WSProxy getGeographicMapForRussianFederation(addressOfSource)
GeographicMap SetProjection PseudoCylindricalMcBrydeThomasFlatPolarSinusoidalProjection
GeographicMap calculateBoundsOfRegions
writeln("From",
        GeographicMap getBoundsOfMoscowArea TopBound XCoordinate, 
        GeographicMap getBoundsOfMoscowArea TopBound YCoordinate,
        " to "
        GeographicMap getBoundsOfMoscowArea BottomBound XCoordinate, 
        GeographicMap getBoundsOfMoscowArea BottomBound YCoordinate)

Какие алиасы навесишь и куда?

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от no-such-file

Нет, не просто, медитируй ещё.

Ещё раз перечитал. Ничего другого не вижу (кода-то всего три строки). Подскажи.

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

Я знаю о них, LFE еще не пробовал.

О, rebar поддерживает LFE из коробки. Ну теперь точно попробую.

staseg ★★★★★
()
Последнее исправление: staseg (всего исправлений: 1)
Ответ на: комментарий от monk

А в чем проблема?

WSProxy do(
  get := setSlot("getGeographicMapForRussianFederation")
)
И так далее.

Но я вообще то имел в виду не это убожество. Таких уродских определений в Io я вообще не встречал. Я имел в виду просто слова, но не составное говно в стиле Java. Должно быть хотя бы что то такое

GeographicMap := WSProxy Geographic RusianFederation addressOfSourse
, например. Но это какой-то надуманный пример все равно. На практике все гораздо проще.

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

get := setSlot(«getGeographicMapForRussianFederation»)

То есть ты ради своей функции редактируешь глобальный объект. А что будет в таком случае при:

module1.io:

WSProxy do(
  get := setSlot("getGeographicMapForRussianFederation")
)

module1 run := method(
   GeographicMap := WSProxy get 
   ...
)

module2.io:

WSProxy do(
  get := setSlot("getGeographicMapForUSA")
)

module2 run := method(
   GeographicMap := WSProxy get 
   ...
)

main.io:

server doAll := method(
  Russia := module1 run
  USA := module2 run 
  ...
)

module1 run и module2 run отработают каждый со своим get или результат будет зависеть от порядка импорта модулей?

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

В gentoo идут.

К счастью, применение плюсов не ограничивается gentoo.

Racket тоже на самом деле состоит из Minimal Racket (ядра) и дополнительных пакетов.

К сожалению, в плюсах (в общем случае) нет менеджера пакетов. Так что ситуации всё-таки несколько разные.

DarkEld3r ★★★★★
()
Последнее исправление: DarkEld3r (всего исправлений: 1)
Ответ на: комментарий от monk

редактируешь глобальный объект

Это не глобальный объект. То что происходит внутри do выполняется в контексте того объекта, откуда этот do вызван.

или результат будет зависеть от порядка импорта модулей?

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

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

Плюс это практически ребол. А кто вобще слышал слово ребол?)

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

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

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

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

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

Human goto bad
Human goto bath
Human goto work

// а затем наследуем

Man goto bad
Man goto bath
Man goto work

Woman goto bad
Woman goto bath
Waman goto work

Man goto bad
Man goto bath
Man goto work

Jane goto bad
Jane goto bath
Jane goto work

Man goto bad
Man goto bath
Man goto work

John goto bad
John goto bath
John goto work

просто единожды даем определения, затем все наследуется, и интерфейсы обладают единообразием.

Функциональный же стиль заставляет нас переписывать все заново для каждого случая, отсюда и идет это уродство определений

GirlGoToBad = function(){...}
JackGoToBad = function(){...}
раздувается как реализация абстракций, так и их использование, код разрастается в обеих направлениях одновременно, при этом становясь все более хардкорным. И как это не парадоксально, именно такой стиль сегодня навязывается, и де-факто популярен.

somequest
()

Питон. Отступы визуально очерчивают блоки кода. Тормознутость - величина субъективная.

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

Нет, не заставляет.

Давай возьмем простой пример — реализацию аккаунта на замыканиях из SICP

(define (make-account balance)
 (define (withdraw amount)
   (if (>= balance amount)
     (begin (set! balance (- balance amount))
        balance)
     "Insufficient funds"))
  (define (deposit amount)
    (set! balance (+ balance amount))
        balance)
  (define (check) (write balance))
  (define (dispatch message)
    (cond ((eq? message 'withdraw) withdraw)
          ((eq? message 'deposit) deposit)
          ((eq? message 'check) check)
          (else (error "Unknoun request -- MAKE-ACCOUNT" message))))
    dispatch)
Перепишем на Io

Account := Object clone do(
  balance ::= 0
  withdraw := method(amount,
    if(balance >= amount, balance = balance - amount, "Insufficient funds" )
  )
  deposit := method(amount,
    balance = balance + amount
  )
  show := method(balance println)
)
Допустим, нам нужно создать сабкласс, который дублирует функционал Account, но позволяет некоторый кредит, при этом класс Account трогать нельзя. Для этого надо всего лишь затереть один метод, и расширить класс одним определением.
AccountWithCredit := Account clone do(
  credit ::= 0
  withdraw = method(amount, 
    if((balance + credit) >= amount, balance = balance - amount, "Insufficient funds" )
  )
)
Далее, допустим, надо сделать 2 сабкласса-фабрики AccountWithCredit
AccountWithCredit10 := AccountWithCredit clone setCredit(10) setBalance(0) 
AccountWithCredit20 := AccountWithCredit clone setCredit(20) setBalance(0) 
используем так
account1 := Account clone
account2 := AccountWithCredit10 clone
account3 := AccountWithCredit20 clone

Как ты это все провернешь с вариантом на замыканиях? И это только вершина айсберга. Нам может, например, понадобиться, чтобы Account и AccountWithCredit наследовали еще и от 2 других, разных классов. И еще овер10000 различных вещей. Ты нихрена не сделаешь со своей дубовой реализацией, при любом изменении тебе придется все переписывать, и этому не будет ни конца ни края.

Пример прост как 3 копейки, что уж говорить о реальном коде.

Ъ функциональный подход с чистыми ф-циями, осложнит проектирование и раздует код еще раз в 10, как минимум. Зато будешь скакать *банашкой по форумам и всем кричать о своей илитарности, возможно оно того стоит.

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

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

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

И вместо базы - текстовый файл? :D

Страничка Васи Пупкина - это как раз уровень хеловорда. Увы.

anonymous
()

Решил изучать первый (после псевоязыка: паскаля) ООП ЯП. Всё думаю, куда сесть то: на лиспы точеные или на питоны золоченые? Цели: нейронные сети, работа с БД, ФС, мелкие поделки школьного уровня (типа машинного обучения на SVM).

ЖИИИИИРНОО
Попробуй тоньше

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

сервер на нем работает

Сервер на любой запрос выдает <pre>hello world</pre>

no-such-file ★★★★★
()
Ответ на: комментарий от Xenius

Только tcl сочетает в себе также и недостатки лиспа и питона. На tcl так же мало библиотек как и на лисп, и скорость работы как на питон.

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

на tcl мало либ? смеёсси чтоль? я даже либу коммуникации для своего бмв нашел.

anonymous
()

т.к. полностью интерпретируемый

Это, кстати, вранье, сейчас таких языков почти нет. Почему пистон тормозит — это вообще *загадка*. Его и особо динамичным даже не назовешь, пистон должен иметь приличную скорость, по-идее. Например, JS и Lua — куда более динамичные языки, но пистон имеют по перформансу. Кроме как рукожопием дезигнера это вряд ли чем то можно объяснить.

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

Это верно для любого ЯП. Когда ты начинаешь делать что-то сложное, это ВНЕЗАПНО становится сложным.

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

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

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

Есть языки, где сложные вещи делаются просто

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

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

Доки по реболу помогут понять что происходит и большинство примеров из него должны заработать. Своя документация начнется к 0.6, и к 1.0 должна быть более-менее полноценной. Пока тусуемся в https://gitter.im/red/red

Еще начали сторонний проект с примерами http://www.red-by-example.org/

loz ★★★★★
()
Последнее исправление: loz (всего исправлений: 1)
Ответ на: комментарий от Virtuos86

Единственная претензия к исходнику по ссылке — он слишком «тупой» и разжеванный.

У Вас претензия к стилю исходника с точки зрения питон-программиста.

У меня претензии к синтаксису Питона с точки зрения программиста успевшего покодить за деньги на семи с лишним языках общего назначения, среди которых Common Lisp, Tcl, Python, Java, Erlang.

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

Э?

Потерял от старой учётки и пароль, и почту. Там было за 5k комментариев. :'|

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

успевшего покодить за деньги на семи с лишним языках

на семи с лишним? то есть на семи с половиной, например, или на семми с пятью восьмыми? И почему мне всегда ржачно с таких вот «профи»?

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

Перепишем на Io

То, что ты написал на ио - неэквивалентео оригиналу на схемке. Вот эквивалент:

#lang racket
(require racket/hash)

(struct object-struct (fields methods)
  #:property prop:procedure
  (λ (this method . args)
    (apply (hash-ref (object-struct-methods this) method) this args)))

(define (object fields methods)
  (define o (object-struct fields methods))
  (hash-union! (object-struct-methods o)
               (make-hash `([get . ,(λ (this field)
                                      (hash-ref (object-struct-fields this) field))]
                            [set . ,(λ (this field value)
                                      (hash-set! (object-struct-fields this) field value))])))
  o)

;---------------------------------------------------------------

(define (account #:balance [balance 0])
  (object (make-hash `([balance . ,balance]))
          (make-hash `([withdraw . ,(λ (this amount)
                                     (if (>= (this 'get 'balance) amount)
                                         (this 'set 'balance (- (this 'get 'balance) amount))
                                         "Insufficient funds"))]
                       [deposit . ,(λ (this amount)
                                     (this 'set 'balance (+ amount (this 'get 'balance))))]
                       [show . ,(λ (this)
                                  (displayln (this 'get 'balance)))]))))

(define (account-with-credit #:balance [balance 0] #:credit [credit 0])
  (define o (account #:balance balance))
  (hash-union! (object-struct-fields o)
               (make-hash `([credit . ,credit])))
  (hash-set! (object-struct-methods o)
             'withdraw (λ (this amount)
                         (if (>= (+ (this 'get 'balance) (this 'get 'credit)) amount)
                             (this 'set 'balance (- (this 'get 'balance) amount))
                             "Insufficient funds")))
  o)

(define (account-with-credit-10)
  (account-with-credit #:credit 10))

(define (account-with-credit-20)
  (account-with-credit #:credit 20))

(define account1 (account))
(define account2 (account-with-credit-10))
(define account3 (account-with-credit-20))

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

У ребола есть 2 недостатка: он не чисто объектно-ориентированный язык, и он не полностью свободный, и даже, местами, не бесплатный для коммерческого использования.

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

В этом то и дело, что код, изначальный идентичен. Я взял за образец код из SICP as is и расширил. А то что ты показал это результат переписывания — другая реализация полностью. Сейчас я добавлю что-то еще, не трогая существующий код, а тебе придется опять переписывать все с нуля, чтобы работало также. Об этом и речь как раз была.

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

Еще начали сторонний проект с примерами http://www.red-by-example.org/

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

Ты ведь нимом интересуешь - на твой взгляд Red перспективнее или как?

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

не чисто объектно-ориентированный язык

Это с точки зрения «не всё есть объект» или именно наличие других парадигм не устраивает?

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

Потому что им не занимались ребята из гугла или мозиллы. Разрабов устраивает производительность. До появления V8 JS, вроде как, тоже не был сильно быстрым.

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

В этом то и дело, что код, изначальный идентичен.

Нет, не идентичен. Я привел идентичный код.

А то что ты показал это результат переписывания — другая реализация полностью.

Нет, это код идентичный коду на ио.

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

Нет, не придется. Попробуй.

anonymous
()

Ещё говорят, что питон жутко тормозит

Ну ты же не будешь использовать python для cpu-критичных задач?

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

все языки так или иначе осиливают, либо... не осиливают. И гонят потом пургу на ЛОРе.

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

Woman goto bad

плохая девчёнка. ты наверное, имел в виду be, в кроватку?

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