LINUX.ORG.RU

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

 , ,


2

5

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

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

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



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

А то что без .Net он «нинужын» — это вендорлокин :)

Я-то не то, чтобы сильно спорил, но авторы OpenSim, например, считают иначе - оно написано на Mono и вполне обходится без .Net.

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

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

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

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

для дельфи до сих пор, вроде, под онтопик ничего вменяемого нет.

Уже нет. А был кроссплатформенный CLX искаропки, прикинь да? :) Только они заигрались в умные и красивые... Не смогли определиться.

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

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

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

Ничо-ничо... Щас Мигелька вкурит свежих сорцов .Net — вообще будет полный ажур, ЕВПОЧЯ :)

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

Особенно для тех вещей, которых раньше в С++ сильнее всего не хватало.

Я с нетерпением жду, когда ж модули стандартизуют. Это едва ли не единственный пункт, по которому Object Pascal, он же Delphi Language, начисто переигрывает C++. Причём как переиграл в начале 90-х, так и остался впереди в 2015-м.

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

начисто переигрывает C++

Ну, некоторые восприняли это настолько некритично, что завязывались на порядок инициализации модулей, хотя в описании языка еще в Delphi 3 был черным по белому прописан АТАТАТ на этот счет. А привело это к чему? «Пересобери еще раз, может запустится» :)

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

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

Если в паскале забыть нужный uses - с вероятностью, близкой к 100% компилятор тут же ругнётся. Если в плюсах забыть #include - результат зависит от ОС, версий компилятора и применяемых библиотек и разумеется, фазы Луны. Я уж молчу про ошибку undefined referenced to vtable, у которой может быть полдесятка разных причин. Очень весёлые и труднообнаруживаемые ошибки могут произойти из-за неправильного написания стража компиляции - к счастью, во всех нормальных IDE они генерятся автоматом. Ну и скорость сборки тоже страдает, хотя на современных компах это наконец-то стало не так критично.

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

В плюсах этого «Пересобери, может запустится» в разы больше.

Это потому что плюсы и используются больше :) Хотя в моей практике ни разу не было, чтоб на отличненько собралось что-то в принципе не запускабельное на одних и тех же сорцах, для исправления чего требуется только пересборка, а не правка именно ошибок в #include или линковании зависимостей :) В Delphi фанатами модулей, не понимающими для чего модули и чего в них делать прямо запрещено описанием языка, легко допускалась ситуация, что результат конпеляции... не зависит от ничего кроме фазы луны, т.е. «формально» ошибок нет — потому что они в... голове пользователя языка — и по его мнению исправлять ничего не надо «потому что за это не заплатят, и вообще мы переписываем все на Delphi XE, просто пересобери еще раз».

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

Пожалуй, PicoLisp больше лисп чем CL или Ракет. Во всяком случае, по духу он ближе к первоисточнику.

Поддерживаю. Более того, CL и Racket вообще лиспами назвать можно с натяжкой. Все что делало лиспы лиспами — runtime instectable/modifible, dynamic binding, fexprs — ничего этого нет.

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

У set!-values есть возможность откатить/повторить транзакцию?

А зачем это может быть надо? Он просто атомарен. В каких случаях транзакцию может потребоваться повторить?

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

Практики по книгам приводят к цитатам из книг в продукшын коди

Что в этом плохого? Цитата в книге, как правило, обосновывается.

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

Пока пишут хеловорды. А когда начинается магия с метаклассами, декораторами, кастомными аксессорами и прямом ковырянии в dict класса - нихера не легко.

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

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

JS

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

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

pyston - An open-source Python implementation using JIT techniques.

Ты наркоман штоле, сука?

anonymous
()

Прочитал первую страницу комментариев. Почему-то половина советуют Java, C++, C# и т.д., которые мало того, не рассматриваются ТС, ещё и аргументом в их пользу указывается, что на них большой спрос на рынке труда и можно будет зарабатывать, что тоже не указывалось ТС как критерий для выбора.

Узнаю ЛОР...

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

Питон: Достоинства: интуитивно-понятный синтаксис

Когда-то я думал, что у Erlang трудночитаемый синтаксис, но потом мне дали попробовать Python...

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

буст и Qt с плюсами автоматически в комплекте не идут

В gentoo идут.

У если «буст и Qt ... не всегда идут в комплекте», то Racket тоже на самом деле состоит из Minimal Racket (ядра) и дополнительных пакетов.

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

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

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

JS - это раковая опухоль

Шта? js - божественен, es6 вообще мана небесная.

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

Все что делало лиспы лиспами — runtime instectable/modifible, dynamic binding, fexprs — ничего этого нет.

Можно пример в виде кода? Возможность смотреть/редактировать код из REPL?

cl-user> (in-package :ibcl-user)
#<Package "COM.INFORMATIMAGO.COMMON-LISP.LISP.IMAGE-BASED-COMMON-LISP-USER">
image-based-common-lisp-user> (defun f (x)
                                (if (zerop x)
                                  1
                                  (* x (f (1- x)))))

f
image-based-common-lisp-user> (source 'f :function)
(defun f (x) (if (zerop x) 1 (* x (f (1- x)))))

dynamic binding

http://clhs.lisp.se/Body/m_defpar.htm

fexpr

Можно пример? Я не очень помню, как оно должно работать

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

видимо этот CLX был также как с#

Нет. Он просто был проприетарный. Соответственно, единственное использование — перенос уже написанного с виндовса.

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

Ракету (И СБКЛ) надо собирать самому, в репах одна тухлятина. И Иметь под рукой Emacs.

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

никаких нагромождений скобок.

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

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

Открываешь любой репозиторий с питоном на гитхабе и читаешь.

Если конкретнее, вот с этим проектом пришлось столкнуться: https://github.com/ProgVal/Limnoria/blob/master/src/registry.py

Регулярные выражения, очевидно, не считаются, они везде одинаковы (и не так уж и нечитаемы ИМХО).

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

Лисп: элитарность.

Да никакой там нет элитарности. Просто хороший инструмент.

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

Годная обвязка над процессингом. Поваял на нём немного говнеца.

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

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

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

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

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

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

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

В CL куда большая проблема – многословность и длиннословность.

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

Можно пример трудночитаемого кода?

На питоне? Ну хотя бы вот

from inspect import Signature, Parameter

def make_sig(*names):
   parms = [Parameter(name, Parameter.POSITIONAL_OR_KEYWORD) for name in names]
   return Signature(parms)

class Structure:
   __signature__ = make_sig()
   def __init__(self, *args, **kwargs):
      bound_values = self.__signature__.bind(*args, **kwargs)
      for name, value in bound_values.arguments.items():
         setattr(self, name, value)

class Stock(Structure):
   __signature__ = make_sig('name', 'shares', 'price')

class Point(Structure):
   __signature__ = make_sig('x', 'y')
no-such-file ★★★★★
()
Ответ на: комментарий от no-such-file

На питоне? Ну хотя бы вот

Вообще-то всё понятно. Не сложнее, чем аналогичный код с CLOS/MOP. Немножко странно, что такой __init__ автоматически не делается (там же просто заполнение слотов переданными аргументами).

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

Если конкретнее, вот с этим проектом пришлось столкнуться: https://github.com/ProgVal/Limnoria/blob/master/src/registry.py

Видимо «читаемость» очень субъективная характеристика. Большинство кода на Java мне читать гораздо труднее, чем то, что по ссылке.

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

Типичное блабла, скопипащеное от других «недоспециалистов» с лора по принципу «бабка бабке сказала».

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

Причём как переиграл в начале 90-х, так и остался на свалке в 2015-м.

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

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

APL, J, Sendmail.cf. Скорее всего, Forth.

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

Когда-то я думал, что у Erlang трудночитаемый синтаксис, но потом мне дали попробовать Python...

Мне фактически одновременно дали попробовать Erlang и Python, и, хоть я большой противник использования отступов как части языка, считаю, что с точки зрения синтаксиса Erlang кошмарен, наверное это самый ужасный язык, на котором мне приходилось много писать. Но в целом Erlnag BEAM конечно намного интереснее питона.

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

Узнаю ЛОР...

Дата регистрации: 27.10.2014 13:58:22

Э?

ТС, выбирай лиспы точеные. Они летают, и ты лети, подальше от питона.

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

Мне фактически одновременно дали попробовать Erlang и Python, и, хоть я большой противник использования отступов как части языка, считаю, что с точки зрения синтаксиса Erlang кошмарен, наверное это самый ужасный язык, на котором мне приходилось много писать. Но в целом Erlnag BEAM конечно намного интереснее питона.

Это ты ещё Scala исходники не читал, вот уж где с синтаксисом перестарались

От Erlang очень уж сильно прологом веет, от этого странности.

Ну а питон с этим его __ехал__ _андерскор_ через __андерскор__ и selfом погонял это вообще отдельная история.

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

В CL куда большая проблема – многословность и длиннословность.

В Racket эту проблему решили с помощью модулей. Когда при импорте можно указать (prefix-in m: my-long-package-name), то нет проблем называть модули достаточно длинно (для однозначной идентификации), а все импортируемые символы достаточно коротко. Опять же, при импорте можно указать (rename-in my-super-b-trees [map tree-map]) и использовать удобное для себя имя.

Жаль, что к CL нельзя прикрутить модули не поломав напрочь совместимость.

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

Если конкретнее, вот с этим проектом пришлось столкнуться:

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

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

Эликсир попробуй. Работает на эрланговской вм, по сути тот же эрланг, только с более простой мордой.
http://elixir-lang.org/

Есть лиспота на эрланге, дай бог жив буду, хоть попробую.
https://en.wikipedia.org/wiki/LFE_(programming_language)

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

Дык они и у меня тусклые. Но таки разноцветные.

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

JS'ный this всегда указывает на окружение получателя сообщения, где бы ни был определен метод. Это нормальная практика для ООП-языков. А вот пистоновский self и правда непонятно что делает. Видимо, какая то очередная ошибка в дизайне языка.

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

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

Видимо, в лиспах какие-то проблемы дизайна, раз там поднимаются подобные вопросы.

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

Питоновский self указывает:

class Class(object):
    def method(self):
        pass

obj = Class()
0.) Если используется обычный синтаксис – obj.method(), то self указывает на obj, интерпретатор сам неявно передаст в method первым аргументом obj. Таким образом, в методе method, принадлежащем объекту obj, self == obj.

1.) Если прибегнуть к ручной привязке — Class.method(obj), то будет то же самое, но, как видно, ничто не мешает передать вместо объекта obj любой другой объект. Но тут уж ССЗБ.

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

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

Видимо, в лиспах какие-то проблемы дизайна, раз там поднимаются подобные вопросы.

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

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