LINUX.ORG.RU
ФорумTalks

Warcraft на лиспе.


0

1

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

Вкратце. Некий весьма одиозный персонаж написал загрузчик/визуализатор файлов оригинального Warcraft 2. Без GUI, без AI. Выдает 16 fps. По словам автора, сильно тормозит. Код составляет от 1300 до 1600 (пациент никак не может определиться) строк на самописном DSL. Сколько занимает реализация DSL на Common Lisp, пациент умалчивает. Работа заняла полгода. Поскольку ссылки на отечественные ресурсы подобного толка здесь не очень приветствуются, сошлюсь на зарубежный сайт, к ним вроде у нас более лояльны. Интересующиеся без проблем нагуглят следы пациента на русскоязычных сайтах по фразе «LispCraft v0.1 by SNV», там его деятельность более активна и, я бы сказал, показательна.

По-моему, очень характеризует молодых лисперов-неофитов и их поделки:

  • проект пишется в гордым одиночкой за несмешное время, от полугода до нескольких лет (как, например, тот же LDX Ловсанчега);
  • является недоклоном чего-то древнего, во всем сливая оригиналу;
  • никакой практической ценности не имеет, потому что
  • смысл проекта - в самом проекте: попытаться доказать, что можно сделать realtime-стратегию на лиспе. А то, что попытка провалилась, уже никого не волнует;
  • написан на самопальном вырвиглазном DSLe, без инфраструктуры, библиотек и toolchain'а;
  • работает крайне медленно;
  • автор капитально упорот.

Хочу спросить: это ли то, за что боролся Луговский?

★★

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

loadUnitHlp path t
 -> say "loadUnit $t"
 -> u:b:("$path/unit.txt".fget |> map ?.asChr.{\Newline->\Space; x->x} |> parseST
         |> map [_ a b]~>[a.asStr b.eval] |> sort by=lhd)
 -> if u."type" t=:u."type"   u."type"=:t
 -> if p:u."proto"
    then {-> keep ?,1 !u |> merge (uts.p||(loadUnit "$(path.asDirname)$p"))
          -> bdel "proto" !u}
    else u."layer" =: tileMasks.(u."layer")
 -> faces:(if f:u."faces" (do (bdel "faces" !u) f) (if u."building" 1 5))
 -> "$path/gfxes/".ls |> map (drop dataFull.len+1 ?)
    |> map x~>[(split \. x.asFilename).lhd x] |> sort by=lhd
    |> bmap (loadUnitFrames tint=srcTint faces ?)
    |> {gs -> if gs.no? gs=:u."protoGfx"  u."protoGfx"=:gs
           -> !gs."default" || [dummyFrame]
           -> for [n _] in tilesets gs.n.{no? -> gs.n=:gs."default"}
           -> u."gfxes" =: (bdel "default" gs)}
 -> (loadImage "$(drop dataFull.len+1 path)/icon.png" tint=srcTint) || uts.p."icon"
    |> {i:ye? -> u."icon" =: i}
 -> ss:[] for dir in (ls "$data/units/$t/sounds/")
      ss.(split \/ dir |> ?.rtl.rhd) =: dir.ls
 -> if ss u."sounds"=:ss
 -> [@!u "dir"=dirs,0 "frame"=0
         "mask"=(map {[c x]-> if u.c x} mcs |> fold conc |> map tileMasks.?
                 |> [0@?] |> fold or)]
 -> !u."size"   || [1 1]
 -> !u."selSize"|| u."size"*32
 -> !u."sight"  || 0

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

Kuka ★★
() автор топика

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

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

> Иначе говоря лисп - это следствие, а не причина большого ума.

Если из «большого ума» следует «лисп», то из «не-лиспа» следует «небольшой ум»?

sanuda
()

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

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

>Иначе говоря лисп - это следствие, а не причина большого ума.

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

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

> В этом и заключается трагедия большинства лиспофанбоев.

«Трагедия»? Я ни разу не видел, чтобы шизики делали трагедию из собственной шизы.

anonymous
()

Ну наконец-то вернулся Кука и устроил настоящий лиспосрач.

anonymous
()

Настолько толсто, что деления на моей рулетке вылетели с другой стороны.

tensai_cirno ★★★★★
()

Кука, тебе делать нечего?

anonymous
()

> Выдает 16 fps

На каком железе?

geekless ★★
()

Кто бы спорил. То ли дело Хаскель…

А серьёзно, если убрать пункт про DSL то список получается независимым от языка. Python-фанбои, Ruby-фанбои, Go-фанбои…

KblCb ★★★★★
()

На lisp-e без AI? Нет, значит это не на lisp-e. Оболочка дешёвая.

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

>Вот выдержка из DSL-кода.

Автору нужно не на лиспе это писать, а на хаскеле. Там по крайней мере есть do- и стрелочная нотации.

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

Macil ★★★★★
()

Все лисперы такие, наверное. Хотя бы судя по выкрикам «Лисп наше все!» Фанатики, чего с них взять. А я вот авторитетно заявляю - лисп не нужен, С наше все!

Zhbert ★★★★★
()

Спасибо Кука! Побольше бы таких тредов, чтобы школота и остальные дебилы от CL отстали.

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

Совершенно не понимаю чего тебе не нравится. Мало скобочек?

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

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

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

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

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

anonymous
()

Кука, берёшь любого школьника, даёшь ему пиво/девку/лыжи/паяльник/джаву/лисп, на выходе регистрируешь получившийся «DSL».

Но причем тут Лисп?

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

> Кука, [...] Но причем тут Лисп?

Этот нехороший товарищ копает под сообщество лисперов.

anonymous
()

> Хочу спросить: это ли то, за что боролся Луговский?

Не, это вообще не по Луговскому. Тут, как я понял, один большой и жирный DSL. Это, примерно, как на жаве писать всё в одном классе.

Луговский же говорит про иерархию микро eDSL'ей на лисповых макросах, если не ошибаюсь.

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

> рантайм занят постоянной конпеляцией и разворачиванием макросов

У-у-у-у.

anonymous
()

> По словам автора, сильно тормозит.

Тормозит не сам код варкрафта, а его DSL (aka GoldenLisp). У него там простой факториал раскрывается в кучу тормозной лапши, а уж что-то сложнее...

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

> рантайм занят постоянной конпеляцией и разворачиванием макросов, вместо отрисовки графики.

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

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

> рантайм занят постоянной конпеляцией и разворачиванием макросов, вместо отрисовки графики.

Кука тут налажал. В лиспе он не разбирается.

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

просто пример у него какая-нибудь функция вроде + разворачивается в (cont x ((string? x) ...) (integer x?) ...), чтобы можно было «123» + " 256" и получилось 379. А еще можно «123» + 25, что получится я не знаю (или 148 или «148»), так нувыпонелида. Алсо, у него есть и другие гениальные решения, например в том же факториале при определении ф-и обрабатывается только вариант с непустым списком (типа fac [x@xs] -> x * (fac xs)). а что с пустым списком? А эта ветка генерируется _автоматически_. А зачем? А за тем, чтобы потом можно было сказать «моя реализация факториала на 4 символа короче ващего».

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

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

fixed//

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

> (cont x ((string? x) ...) (integer x?) ...)

(cond x ((string? x) ...) (integer x?) ...), конечно же. алсо - cps-преобразование у него тоже проводится. Помню тред, где он писал о том, что у него SBCL при cps-преобразовании виснет во время экспанда, лол.

anonymous
()

Я удивляюсь как мы вообще модем лицезреть эти скриншоты, ведь аффтар уже давно должен оказаться с той стороны горизонта событий :)

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

> И в результате получается забивание гвоздей головой.

final fix

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

Я авторитетно заявляю: C и Lisp - наше все!

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

Тебе не кажется, что «C наше всё», по меньшей мере, ни чуть не умнее, чем «Lisp наше всё»?

Как-то странно и нелепо вообще говорить, что язык настолько крут, что я на нём всё напишу. Да я на OOo Basic напишу OOo. И чё?

Язык должен быть таким, чтобы:

1 Конечное решение работало на нём без тормозов и сбоев.

2 Решение писалось за минимальное время (с учётом времени на изучение нового ЯП если это необходимо).

Всё остальное от лукавого.

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

Это из разряда «молотки — наше всё», «рубанки — наше всё». Херня в том, что программист работает не с досками, а с идеями и алгоритмами. И программное обеспечение является не только просто инструментом в работе, но и — прямым носителем идеи. А хорошо проработанные идеи имеют свойство захватывать сознание носителя.

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

>Тебе не кажется, что «C наше всё», по меньшей мере, ни чуть не умнее, чем «Lisp наше всё»?

Кажется, я же не зря с сарказмом это говорил =) Язык нужно выбирать по надобности, а не исзодя из фанатичности. НАпример, для полноценного приложения я выберу с++ и кутэ, для простого питон с гтк или тем же кутэ, или просто питон. Ну и т.д.

Zhbert ★★★★★
()

Какое же говно Common Lisp... жуть.

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

> На самом деле нет плохих языков вообще. Есть неправильные сферы применения.

Плохие, плохие сферы применения!!111

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

> Я из тех, кто ненавидит аналогии.

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

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

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

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