LINUX.ORG.RU
ФорумTalks

Выразительность лиспа - миф или реальность?


1

4

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

Решил переписать последний свой достаточно длинный код (решение этой задачи: http://www.e-olimp.com/problems/2697) на Scheme в максимально функциональном стиле. Т.к. со схемой до этого не сталкивался, то там в коде может быть много фейлов. Но вот, что вышло:

http://pastebin.com/Bny09d5m

Код короче, чем плюсовый (на ЛОРе плюсовый можно найти в девелопменте). Но ИМХО он лишь немного читабельнее ассемблера :)

Почему? Я что-то сделал не так? У меня неправильное представление о читабельности? Или читабельность лиспа - миф?

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

В данном треде речь о схеме, а slime ведь только для CL.

для scheme есть geiser, guile/racket пашут, проверял

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

Есть же вроде стандартная функция nth.

Косметическое улучшение. В любом случае, будут вместо чётких и понятных имён nth или caddadaadddadr, в голове придётся держать всю структуру всех данных. Об удобстве восприятия приходится забыть.

ugoday ★★★★★
()

вот объясните, зачем он(и) нужен(ы)? и чем лучше оояп?

SICP не читал.

ggrn ★★★★★
()

Ну это конечно просто кошмар.

Во-первых, как было уже сказано, россыпи кададыдров - это плохо. Чтобы избегать этого используют destructuring и let'ы.

Во-вторых, попытка привести в функциональный вид сугубо итеративный алгоритм ни к чему хорошему не приводит. Я не говорю уже о sub-, subsub- и subsubsubprocess, которые ты, я так понимаю, использовал вместо тех же let'ов. Ни к чему придумывать функции там, где нельзя дать им имя как логической единице.

В общем, вот как бы это выглядело на Clojure: http://pastebin.com/QXfZAYm8

Признаюсь, во время того, как я переделывал последнюю функцию, у меня стал выдаваться неправильный ответ для 10 15 2 1, но в алгоритме я не разбирался и откатывать назад было лень, поэтому есть как есть. Скорее всего где-то перепутал переменные.

Мое решение все равно нельзя назвать «красивым», но собственно ни в одном языке такое запутанное алгоритмическое мозгоебство (последняя функция на 70% состоит из арифметики) не будет выглядеть красиво.

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

Это что за изврат такой: переводить на английский фразу, получившуюся в результате надмозгового перевода с английского на русский?

Изначально было «make me unsee it», которое перевели, как «сделай мне развидеть это» (хотя вообще, насколько я знаю английский, оно переводится как «заставь меня развидеть это»).

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

Я помню, что было «make me unsee it», но меня смутил проверяльщик орфографии, который решил, что слова unsee нет.

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

Мое решение все равно нельзя назвать «красивым», но собственно ни в одном языке такое запутанное алгоритмическое мозгоебство (последняя функция на 70% состоит из арифметики) не будет выглядеть красиво.

ИМХО, намного читабельнее - так: http://pastebin.com/B5vmFkG2 (как видим, в коде из не совсем очевидного - одна только арифметика).

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

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

ИМХО, намного читабельнее - так: http://pastebin.com/B5vmFkG2 (как видим, в коде из не совсем очевидного - одна только арифметика).

Ну-ну, это уже читерство. С какого это времени в Руби появилась оптимизация хвостовых вызовов?
Другие функции я переписывал почти не трогая твою арифметику т.к. не хотел ничего испортить. В версии на руби упрощенные формулы используются, на лиспе можно было бы упростить так же.
В сухом остатке получили то же самое, только в лиспе еще россыпи let'ов лишние поскольку, как я уже говорил, функциональный язык на императивном алгоритме будет всегда выглядеть хуже.

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

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

Как я уже сказал, для алгоритмического мозго*бства как раз не особо хорошо. Для замысловатых структур данных - да, а они в любом большом проекте замысловатые. Для генерации кода - нет, точнее у Лиспа в генерации кода нет каких-либо особых преимуществ (генерация кода != метапрограммирование/макросы). Последнее - это не цель, это средство для решения различного рода задач.

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

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