В настоящее время я в основном программист на D и хочу добавить в свой набор инструментов еще один язык, желательно тот, который поддерживает хаки метапрограммирования, которые просто невозможно сделать на статически компилируемом языке, таком как D.
Я немного читал о Лиспе, и мне бы хотелось найти язык, который допускает некоторые из классных вещей, которые делает Лисп, но без странного синтаксиса и т.п. Лиспа. Я не хочу начинать языковую войну, и я уверен, что у Ruby и Python есть свои компромиссы, поэтому я перечислю то, что важно лично для меня. Скажите, пожалуйста, лучше ли мне подойдет Ruby, Python или другой язык.
Важный:
- Хорошее метапрограммирование. Возможность создавать классы, методы, функции и т.д. во время выполнения. Желательно минимальное различие между кодом и данными в стиле Лисп.
- Хороший, чистый, разумный синтаксис и последовательная, интуитивно понятная семантика. По сути, это хорошо продуманный, интересный в использовании современный язык.
- Множественные парадигмы. Ни одна парадигма не подходит для каждого проекта или даже для каждой небольшой подзадачи в рамках проекта.
- Интересный язык, который действительно влияет на то, как люди думают о программировании.
Немного важно:
- Производительность. Было бы неплохо, если бы производительность была приличной, но когда производительность является реальным приоритетом, я буду использовать D.
- Хорошо задокументированы.
Не важно:
- Размер сообщества, доступность библиотеки и т. Д. Ничто из этого не является характеристикой самого языка, и все может измениться очень быстро.
- Наличие вакансий. Я не профессиональный программист, работающий полный рабочий день. Я аспирант, и программирование имеет косвенное отношение к моим исследованиям.
- Любые функции, которые в первую очередь разработаны для очень больших проектов, над которыми работает миллион кодовых обезьян.
python
ruby
lisp
metaprogramming
дсимча
источник
источник
Ответы:
На самом деле нет большой разницы между питоном и рубином, по крайней мере, на идеологическом уровне. По большей части, это просто разные вкусы одного и того же. Таким образом, я бы рекомендовал посмотреть, какой из них больше соответствует вашему стилю программирования.
источник
Разве не все мы.
К сожалению, минимальное различие между кодом и данными и «странный» синтаксис являются следствием друг друга.
Если вам нужен простой для чтения синтаксис, у вас есть Python. Однако этот код не представлен ни в одной из обычно используемых встроенных структур данных. Он не попадает - как и большинство языков - в пункт № 1 вашего «важного» списка. Это затрудняет оказание полезной помощи.
Вы не можете получить все это. Помните, вы не первый, кто задумывается об этом. Если бы существовал что-то вроде вашего идеального языка, мы бы все использовали его. Поскольку реальный мир не соответствует вашим идеалам, вам придется изменить приоритеты в списке желаний. «Важный» раздел необходимо изменить, чтобы определить, что действительно важно для вас.
источник
Честно говоря, в том, что касается возможностей метапрограммирования, Ruby и Python намного больше похожи, чем некоторые из их приверженцев хотели бы признать. Этот обзор обоих языков предлагает довольно хорошее сравнение / обзор:
Итак, просто выберите один на основе некоторых критериев. Может быть, вам нравится Rails и вы хотите изучить этот код. Может быть, SciPy вам нравится. Посмотрите на экосистему библиотек, сообщества и т. Д. И выберите одну. Вы, конечно, не потеряете какую-то нирвану метапрограммирования, если захотите.
источник
Отказ от ответственности: я только балуюсь любым языком, но я написал по крайней мере небольшие рабочие программы (а не только быстрые сценарии, для которых я использую Perl, bash или GNU make) на обоих.
Рубин может быть очень хорошо для «нескольких парадигм» пункта 3, потому что он усердно работает, чтобы сделать его легко создавать предметно-ориентированные языки. Например, зайдите в Интернет и посмотрите пару фрагментов кода Ruby on Rails и пару фрагментов кода Rake. Они оба являются Ruby, и вы можете видеть сходство, но они не похожи на то, что вы обычно думаете как один и тот же язык.
Python кажется мне немного более предсказуемым (возможно, коррелирует с «чистым» и «нормальным» пунктом 2), но я действительно не знаю, связано ли это с самим языком или просто потому, что он обычно используется людьми с разными значениями. . Я никогда не пробовал использовать глубокую магию на Python. Я бы с уверенностью сказал, что оба языка хорошо продуманы.
И оценка хорошо в 1 и 4. [Edit: на самом деле 1 довольно спорно - есть «Eval» в обоих, как общие в интерпретируемых языках, но они вряд ли концептуально чистым. Вы можете определять замыкания, назначать методы объектам и т. Д. Не уверен, доходит ли это так далеко, как вы хотите.]
Лично мне Ruby интереснее, но отчасти потому, что легче отвлечься, думая о крутых способах решения задач. На самом деле я больше использовал Python. Иногда тебе не хочется крутизны, ты хочешь заняться этим, так что это делается перед сном ...
Ни одно из них не является трудным для понимания, поэтому вы можете просто решить выполнить следующее второстепенное задание в одном, а одно за другим - в другом. Или возьмите в библиотеке вводную книгу по каждому из них, бегло прочитайте их и посмотрите, что вам понравится.
источник
Вы думали о Smalltalk? Он предлагает очень простой, понятный и расширяемый синтаксис с возможностями отражения и самоанализа, а также полностью интегрированную среду разработки, которая использует эти возможности. Взгляните, например, на то, что делается в Squeak Smalltalk . Многие исследователи, использующие Squeak, используют список рассылки Squeak и #squeak на freenode, поэтому вы можете легко получить помощь по сложным вопросам.
Другие индикаторы его актуальности: он работает на любой платформе, которую вы хотите назвать (включая iPhone ); Гилад Браха основывает свой новояз на писке; команда V8 набралась опыта в отношении виртуальных машин Smalltalk ; а Дэн Ингаллс и Рэндал Шварц недавно вернулись к работе над Smalltalk после многих лет в пустыне.
Желаем удачи в поиске - дайте нам знать, что вы решите в итоге.
источник
Лисп удовлетворяет всем вашим критериям, включая производительность, и это единственный язык, который не имеет (странного) синтаксиса. Если вы откажетесь от него на такой поразительно плохо информированной / ошибочной основе и, следовательно, упустите опыт использования, например, Emacs + SLIME + CL, вы окажете себе большую медвежью услугу.
источник
Ваши 4 «важных» точки ведут к Ruby, а 2 «несколько важных» точки - к Python. Быть по сему.
источник
Вы описываете Ruby.
Во время выполнения очень легко расширять и изменять существующие примитивы. В Ruby все является объектом, строками, целыми числами и даже функциями.
Вы также можете создавать ярлыки для синтаксического сахара, например, с помощью class_eval .
Ruby следует принципу меньшего удивления , и при сравнении кода Ruby с эквивалентом на другом языке многие люди считают его более «красивым».
Вы можете следовать императивному, объектно-ориентированному, функциональному и рефлексивному.
Это очень субъективно, но, с моей точки зрения, возможность использовать несколько парадигм одновременно позволяет генерировать очень интересные идеи.
Я пробовал Python, и он не соответствует вашим важным моментам.
источник
lambda
/Proc.new
mess было названо «неожиданным поведением» и «крайне противоречивым». :-) В любом языке, таком большом и сложном, как Ruby, неизбежно будут такие запутанные области.String
в Ruby для целей метапрограммирования: coldattic.info/shvedsky/pro/blogs/a-foo-walks-into-a-bar/posts/… . Подклассы не годятся; однако простая функция с двумя аргументами будет.Сравните примеры кода, которые делают то же самое (присоединяются с новой строкой к непустым описаниям элементов из
myList
списка) на разных языках (языки расположены в обратном алфавитном порядке):Рубин :
myList.collect { |f| f.description }.select { |d| d != "" }.join("\n")
Или
myList.map(&:description).reject(&:empty?).join("\n")
Python :
descriptions = (f.description() for f in mylist) "\n".join(filter(len, descriptions))
Или
"\n".join(f.description() for f in mylist if f.description())
Perl :
join "\n", grep { $_ } map { $_->description } @myList;
Или
join "\n", grep /./, map { $_->description } @myList;
Javascript :
myList.map(function(e) e.description()) .filter(function(e) e).join("\n")
Ио :
myList collect(description) select(!="") join("\n")
Вот руководство по Ио .
источник
Ruby был бы лучше, чем Lisp, с точки зрения «мейнстрима» (что бы это ни значило на самом деле , но одна реальная проблема заключается в том, насколько легко было бы найти ответы на ваши вопросы о программировании на Lisp, если бы вы согласились с этим.) В любом случае , Я обнаружил, что Руби очень легко подобрать. За то же время, которое я потратил на первое изучение Python (или других языков, если на то пошло), я вскоре начал писать лучший код, намного более эффективно, чем когда-либо раньше. Однако это всего лишь мнение одного человека; Полагаю, воспринимайте это с недоверием. На данный момент я знаю о Ruby гораздо больше, чем Python или Lisp, но вы должны знать, что я был человеком Python довольно долгое время, прежде чем переключился.
Lisp, безусловно, довольно крутой, и его стоит изучить; как вы сказали, размер сообщества и т. д. может измениться довольно быстро. При этом сам размер не так важен, как качество сообщества. Например,
#ruby-lang
канал до сих пор заполнен невероятно умными людьми. Lisp, кажется, привлекает и некоторых действительно умных людей. Я не могу много говорить о сообществе Python, поскольку у меня нет большого личного опыта, но иногда оно кажется «слишком большим». (Я помню, как люди были довольно грубы на своем IRC-канале, и из того, что я слышал от друзей, которые действительно увлекаются Python, это, похоже, скорее правило, чем исключение.)В любом случае, некоторые ресурсы, которые могут вам пригодиться:
1) Серия Ruby Metaprogramming от прагматичных программистов ( http://www.pragprog.com/screencasts/v-dtrubyom/the-ruby-object-model-and-metaprogramming ) - платная, но более поздние эпизоды весьма интригуют. (Код бесплатный, если вы хотите скачать его и посмотреть, что вы узнаете.)
2) О Лиспе Пола Грэма ( http://www.paulgraham.com/onlisp.html ). Это немного старовато, но это классика (и ее можно скачать бесплатно).
источник
Я использую Python для многих проектов и думаю, что Python предоставляет все функции, которые вы просили.
важный:
Немного важно:
Поскольку вы аспирант, вы можете прочитать эту статью, в которой утверждается, что Python - это все, что нужно ученому . К сожалению, я не могу сравнивать Python с Ruby, поскольку никогда не использовал этот язык.
С уважением, Деннис
источник
@ Джейсон Я, соответственно, не согласен. Есть различия, которые делают Ruby лучше Python в плане метапрограммирования - как философские, так и прагматические. Во-первых, Ruby получает правильное наследование с помощью Single Inheritance и Mixins . А когда дело доходит до метапрограммирования, вам просто нужно понимать, что все дело в самом себе . Каноническая разница в том, что в Ruby у вас есть доступ к объекту self во время выполнения, а в Python - нет!
В отличие от Python, в Ruby нет отдельной фазы компиляции или выполнения. В Ruby каждая строка кода выполняется для определенного объекта self . В Ruby каждый класс наследуется как от объекта, так и от скрытого метакласса. Это дает интересную динамику:
class Ninja def rank puts "Orange Clan" end self.name #=> "Ninja" end
Использование self.name обеспечивает доступ к методу имени метакласса классов Ninja, чтобы вернуть имя класса Ninja. Неужели метапрограммирование так красиво в Python? Искренне сомневаюсь!
источник
Что ж, если вам не нравится синтаксис lisp, возможно, вам подойдет ассемблер. :-)
Он, безусловно, имеет минимальное различие между кодом и данными, является мультипарадигмальным (или, может быть, это не парадигма), и это расширяющий сознание (если утомительный) опыт как с точки зрения обучения, так и с точки зрения трюков, которые вы можете выполнять.
источник
Ио удовлетворяет всем вашим "важным" пунктам. Я не думаю, что есть лучший язык для сумасшедшего мета-хакерства.
источник
Лисп можно скомпилировать.
источник
Вы пробовали Ребол?
источник
Мой ответ - ни то, ни другое. Я знаю оба языка, прошел курс Ruby и несколько лет программировал на Python. Lisp хорош в метапрограммировании из-за того, что его единственная цель - преобразовывать списки, его собственный исходный код - это просто список токенов, поэтому метапрограммирование является естественным. Три языка, которые мне больше всего нравятся для этого типа вещей, - это Rebol, Forth и Factor. Rebol - это очень сильный диалектный язык, который берет код из входного потока, запускает выражение против него и преобразует его, используя правила, написанные на этом языке. Очень выразительный и очень хорошо диалектирует. Фактор и Форт более или менее полностью отделены от синтаксиса, и вы программируете их, определяя и вызывая слова. Как правило, они в основном написаны на их родном языке. Вы не пишете приложения в традиционном понимании, вы расширяете язык, написав свои собственные слова для определения вашего конкретного приложения. Фактор может быть особенно хорош, поскольку он имеет множество функций, которые я видел только в smalltalk для оценки и работы с исходным кодом. Действительно красивое рабочее пространство, интерактивные документы и т. Д.
источник
На самом деле не так уж и много разделять Python и Ruby. Я бы сказал, что сообщество Python больше и зрелее, чем сообщество Ruby, и это действительно важно для меня. Ruby - более гибкий язык, который имеет как положительные, так и отрицательные последствия. Однако я уверен, что будет много людей, которые подробно расскажут об обоих этих языках, поэтому я выберу третий вариант. А как насчет JavaScript?
Изначально JavaScript был разработан как схема для Интернета и основан на прототипах, что является преимуществом перед Python и Ruby в том, что касается мультипарадигмы и метапрограммирования. Синтаксис не так хорош, как два других, но, вероятно, это наиболее широко распространенный язык из существующих, и его производительность улучшается с каждым днем.
источник
Если вам нравится концепция «код - это данные» в стиле Lisp, но не нравится синтаксис Lispy, возможно, Prolog будет хорошим выбором.
Я оставлю это на усмотрение других, квалифицируется ли это как «забавный в использовании современный язык». ;-)
источник
Я выбрал Ruby после изучения Python, Smalltalk и Ruby.
источник
А как насчет OCaml?
Возможности OCaml: система статических типов, вывод типов, параметрический полиморфизм, хвостовая рекурсия, сопоставление с образцом, лексические замыкания первого класса, функторы (параметрические модули), обработка исключений и автоматическая сборка мусора с возрастающим поколением.
Я думаю, что это удовлетворяет следующему:
источник
Я немного использую Python, но гораздо больше - Ruby. Однако я бы сказал, что они оба предоставляют то, о чем вы просили.
Если я увижу все ваши четыре точки, вы можете хотя бы проверить: http://www.iolanguage.com/
И Моцарт / Оз тоже может быть вам интересен: http://mozart.github.io/
С уважением Фридрих
источник
Для синтаксиса в стиле Python и макросов, подобных Lisp (макросы, которые представляют собой реальный код) и хорошего DSL, см. " Converge" .
источник
Я не уверен, что Python выполнит все, что вы хотите (особенно вопрос о минимальном различии между кодом и данными), но есть один аргумент в пользу python. Существует проект, который упрощает программирование расширений для Python на языке D, так что вы можете получить лучшее из обоих миров. http://pyd.dsource.org/celerid.html
источник
если любишь розу, надо научиться жить с шипами :)
источник
Я бы порекомендовал вам пойти с Руби.
Когда я только начал его изучать, мне было очень легко понять.
источник
Не смешивайте язык программирования Ruby с реализациями Ruby, думая, что потоки POSIX невозможны в ruby.
Вы можете просто скомпилировать с поддержкой pthread, и это уже было возможно во время создания этого потока , если вы простите за каламбур.
Ответ на этот вопрос прост. Если вам нравится шепелявый, вы, вероятно, предпочтете рубин. Или как хотите.
источник
Я предлагаю вам попробовать оба языка и выбрать тот, который вам нравится. И Python, и Ruby могут делать то, что вы хотите.
Также прочтите эту ветку .
источник
Пойдите с JS, просто проверьте AJS (альтернативный синтаксис JavaScript) на моем github http://github.com/visionmedia, он даст вам более чистые закрытия и т. Д .: D
источник
Что касается вашей основной идеи (метапрограммирования): Groovy версии 1.6 имеет встроенное программирование AST (абстрактное синтаксическое дерево) в качестве стандартной и интегрированной функции. Ruby имеет RubyParser, но это надстройка.
источник