LINUX.ORG.RU
ФорумTalks

Ментальный вирус

 ,


0

4

Языки типа Ruby или Io — это тяжелые наркотики вирус, поражающий мозг.

Когда я пишу код на PHP, я думаю о том, насколько же компактнее и понятнее был бы такой же код на Ruby (или на Io).
Когда я пишу код на JS, я думаю о том, насколько же компактнее и понятнее был бы такой же код на Ruby (или на Io).
Когда я пишу код на Пейтоне (что случается раз в полгода, но всё же), я думаю о том, насколько же компактнее и понятнее был бы такой же код на Ruby (или на Io).
И даже когда я вижу случайную строчку кода на Перле, я думаю о всё том же.

Есть ли более тяжелые наркотики вирусные языки, чем Ruby? Лиспы пробовал курить — не штырит.

Когда я пишу код на Пейтоне (что случается раз в полгода, но всё же), я думаю о том, насколько же компактнее и понятнее был бы такой же код на Ruby (или на Io).

Когда я читаю «компактный» и «понятный» код руби, я думаю о том, как же хорошо, что я не пишу на этой фигне.

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

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

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

Когда я читаю «компактный» и «понятный» код руби

Справедливости ради, на Питоне тоже так можно :)

import os, sys

gen = (l.split(":")[0::5] for l in file("/etc/passwd"))
lst = sorted([(u, h) for u, h in gen if h != "/" and os.path.isdir(h)])
map(lambda x: sys.stdout.write(x[0] + " => " + x[1] + "\n"), lst)

(от хака со slice можно избавиться, но он дает более читабельное выражение для lst)

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

Ключевые слова наоборот делают код более читабельным для человека.

В каком месте какое-нибудь

array.select(function(v){ return condition(v);}).sort_by(function(v){ return v.name;}).map(function(v){ return v.name() + " — " + v.description();})
более читабельно для человека, чем
array.select{|v| condition(v)}.sort_by{|v| v.name}.map{|v| v.name + " — " + v.description}
?

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

Я пишу такой код, который удобно читать. Если ты напишешь трехстрочник

filtered_array = array.select(function(v){ return condition(v);});
sorted_array = filtered_array.sort_by(function(v){ return v.name;});
result = sorted_array.map(function(v){ return v.name() + " — " + v.description();});
, легче не станет.

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

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

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

на жс с фп головного мозга писать опасно, с учётом подводных камней в местном map.

Ну мы про синтаксис тащемта. Ибо если семантику JS начать обсуждать, то даже перл покажется божественным языком.

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

Синтаксис у js как у любого курлибракетса. Но этот язык облюбили хипстеры и стали всюду лепить анонимные функции, map и прочую лабуду, место которой в хаскеле, а не в языке для создания интерактивных менюшек на сайтах.

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

А чего б просто не оставить String, сделать его иммутабельным и распространить свойства Symbol на строки? Там из нужного-то, собственно global uniqueness. Или есть еще что-то такое? Тем более, в предисловии к String так и пишут: «не используйте методы, меняющие объект, используйте методы, возвращающие новый».

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

array.map(fun{v: v + 2})

Стало еще лучше.

Вот поэтому-то в слове «JSON» первая буква «J» а не «R»

linuxnewb
()

lisp, haskell, io - все лучше чем говноруби, учитывая, что io - это такой херовенький лисп.

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

меня явный возврат в функциях python добивает, это же надо было так прослоупочить! возвращение последнего вычисленного ещё в ML был!

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

Может это потому, что перед тем как понимать язык, надо прочитать ман, книжечку какую-нибудь?

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

Вот then и else - очень часто используемые конструкты. Я предлагаю их сократить до двух букв. А лучше до одной.

а у меня так и сделано, хоткеями. И стандартные конструкции прописываются автоматически. Правда, Java.

stevejobs ★★★★☆
()
Ответ на: комментарий от special-k

вот ты, часто ли сокращаешь название методов

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

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

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

Вспомнил именование методов objective-c. Перекрестился.

geekless ★★
() автор топика
Ответ на: комментарий от border-radius

Ну вот, опять… JS — убогий недоязычок и ничего не поделаешь. И все попытки выпустить его из браузера выглядели ещё унылее, чем JS в собственно браузере.

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

меня тоже от них тошнило. И от документации, по объему в 10 раз большей, чем мой код.

А потом...

Реальная история - утром приходишь, а у коллеги истерика: «почему-это фронт-контроллеров стало три файла вместо одного? это специально, чтобы я ничего не понял? вы меня кинуть все решили да?!!11». Три файла, index.php, index_dev.php, index_prod.php, отличающиеся наличием if-then-else, в одном файле - debug-сборка для программеров, в другом - release, третий - редирект на один из этих двух. Facepalm.jpg

Короче, я всячески поддерживаю то, что ты тут написал про Ruby. В Java использовал костыли типа Guava и QueryDSL для этого. Но вот названия методов и красивые диффы (и необходимое для этого разбиение однострочника на несколько строк) - это святое, иначе никто твое крео больше не асилит... Увидят, что там какая-то сортировка, которую надо сидеть и врубаться 10 минут, сотрут ее нахрен и заменят скопипастанным пузырьком :) А так, если название функции страшное, с мудреными словами, и на диффе ясно видно что меняется — будет шанс на «миг просветления» :)

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

JS — убогий недоязычок и ничего не поделаешь.

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

border-radius
()
Ответ на: комментарий от border-radius

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

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

как раз результат работы по навешиванию костылей на js

Не на JS, а на недобраузеры, не умеющие в querySelector/querySelectorAll, addEventListener, DOMContentLoaded, classList, CSS3 и другие вкусности. JS как язык здесь вообще ни при чём.

border-radius
()

Лиспы пробовал курить — не штырит.

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

naryl ★★★★★
()

когда я пишу на java я не думаю, программируйте на java - она безопасна для вашего мозга

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

Вообще для любителей for в руби есть, внезапно, for:

array = ["Foo", "Bar"]
table = { foo: "Foo", bar: "Bar" }
 
for item in array do
    puts item
end
 
for key, value in table do
    puts "#{key}: #{value}"
end
korvin_ ★★★★★
()
Ответ на: комментарий от korvin_

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

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

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

languages = [:ruby, :coffeescript, :clojure, :elixir]
 
languages.each do |language|
  p language
end
languages = [:ruby, :coffeescript, :clojure, :elixir]
 
for language in languages
  p language
end
Anatolik ★★
()
Ответ на: комментарий от Anatolik

В классическом for читаемее. Особенно, если отойти от рафинированного each и начать читать всевозможные all? any? each! bla! foo? baz!

Кстати, метод с вопросом - это же, если не ошибаюсь, буль и, соответственно, в || у нас попадает буля, которую и пробрасывает в блок? Или опять в зависимости от метода, как хочешь, так и понимай?

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

В классическом for читаемее.

Что означает «в классическом»? Я думал, мы говорим про Ruby.

Если же говорить в общем, то классическое for из C и JavaScript ужасно. Возьмем, к примеру Perl. В нем можно написать

my @tripled;

for (my $i = 0; $i < scalar @numbers; $i++)
{
    $tripled[$i] = $numbers[$i] * 3;
}
или
my @tripled;

for my $num (@numbers)
{
    push @tripled, $num * 3;
}

вместо

my @tripled = map { $_ * 3 } @numbers;

Неужели первые два примера для вас выглядят читаемей?

В Ruby же вряд ли кто-нибудь стал бы писать это иначе чем

tripled = numbers.map { |number| number * 3 }

Кстати, метод с вопросом - это же, если не ошибаюсь, буль и, соответственно, в || у нас попадает буля, которую и пробрасывает в блок?

Метод с вопросом означает, что на выходе этот метод отдаст «буль». Никакого отношения к тому, что попадет в || это не имеет.

Или опять в зависимости от метода, как хочешь, так и понимай?

Конечно. Увидев незнакомый метод, лучше всего ознакомиться с документацией — Enumerable.

Anatolik ★★
()
Ответ на: комментарий от special-k

Я тоже был в восторге, когда осилил смолтоковские коллекции (по кальке которых оно и сделано)

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

Конечно. Увидев незнакомый метод, лучше всего ознакомиться с документацией

Там, если не ошибаюсь в irb вполне себе хорошо со справкой по набранному методу было

for (my $i = 0; $i < scalar @numbers; $i++)

увидеть scalar в перловке и умереть. Чаще тупо $#.

map { $_ * 3 } @numbers;

недавно самому такую хрень в модуле для OTRS пришлось костылить, правда для grep. До сих пор об эти конструкции жопу рвет. Читаемость никакая.

for my $num (@numbers)

После питона норм. А да, в жабе тоже можно for (int i: arrayOfIntegers).

for (my $i = 0; $i < scalar @numbers; $i++)

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

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

весь нормальный мир давно пишет так:

У вас рубянка!

Да, это именно проявление того, о чем топик.

Более того, обобщая, для себя я уже давно заметил, что рубисты часто злоупотребляют богатыми возможностями, которые предоставляет язык, когда это не надо. «Если у нас есть фича X, ее надо непременно использовать, а то поцоны засмеют!».

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

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

Там, если не ошибаюсь в irb вполне себе хорошо со справкой по набранному методу было

В pry еще лучше. «Месседж» в том, что документацию смотреть нужно.

недавно самому такую хрень в модуле для OTRS пришлось костылить, правда для grep. До сих пор об эти конструкции жопу рвет. Читаемость никакая.

После питона норм

Exactly. «The tools we use have a profound (and devious!) influence on our thinking habits, and, therefore, on our thinking abilities».

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

Еще можно весь код однострочником. Если будет очень нужно, прочитать тоже можно.

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

«Месседж» в том, что документацию смотреть нужно.

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

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

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

В St-80 основной смысл в символах состоит в том, чтобы не сравнивать их посимвольно, а проверять быстро идентичность сравнением указателей (ибо по определению не может быть двух разных объектов флайвейтов, представляющих одно значение).

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

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

Это всего лишь означает, что «некоторые» некачественно смотрели документацию. Очевидно же.

Что именно неясно-то? Сниппеты в студию.

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

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

А maglev смаллтакерам интересен?

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

У смолтокеров есть свой GemStone/S той же конторы (по образу которого и делали maglev)

yoghurt ★★★★★
()

Есть ли более тяжелые наркотики вирусные языки, чем Ruby?

Forth.

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