LINUX.ORG.RU

Нужны идеи по итерации

 , ,


2

2

Существует 3 листа

A (1 2 3 4 5)
B (6 7 8 9 10)
C (11 -12 13 -14 -15)
нужно получить
D (1 7 3 9 10)
по листу C смотрим если елемент положительный берём елемент из листа A, если елемент в листе С отрицательный берём елемент из листа B.

перекрутил в голове nth, elt, do. Подкиньте идею с кодом.

(defun foo (a-list b-list c-list)
  (mapcar #'(lambda (a b c)
              (if (plusp c) a b))
          a-list
          b-list
          c-list))
theNamelessOne ★★★★★
()
Ответ на: комментарий от slovazap

нормальный язык

Блеванул от этого недоязыка. Смотри как надо

(loop 
  for element-a in A 
  for element-b in B 
  for element-c in C 
  collect (if (plusp element-c) element-a element-b))
no-such-file ★★★★★
()
Последнее исправление: no-such-file (всего исправлений: 1)
Ответ на: комментарий от no-such-file

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

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

многословности и ублюдского форматирования

Ублюдочность, это когда делаешь zip чтобы как-то совокупиться с нищенским синтаксисом. И при этом всё равно лепишь разные скобочки.

читается это как 3 вложенных цикла

Но это хотя бы читается. А не вот эта вот write-only белиберда.

даже не завезли операторов

Операторов чего?

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

если елемент положительный берём елемент из листа A, если елемент в листе С отрицательный берём елемент из листа B

Нуль считается положительным?

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

петон

нормальный язык

Ну-ну.

(defn foo
  "Имея три последовательности целых чисел одинаковой длины, создать
  новую последовательность целых чисел, в которую для каждого положительного
  элемента третьей последовательности входит элемент первой, а для каждого
  отрицательного - элемент второй. Нуль считается положительным числом."
  [as bs cs]
  (map #(if (neg? %3) %2 %1) as bs cs))

(def as [1 2 3 4 5])
(def bs [6 7 8 9 10])
(def cs [11 -12 13 -14 -15])

(foo as bs cs)
;; => (1 7 3 9 10)

Скобки сила, питон могила!

Nervous ★★★★★
()

Ни один из примеров говнокода в треде не проверяет размеры массивов. Не удивлюсь, если разные примитивы: map, loop, for..in..zip ведут себя по-разному в этом случае, оставляя читателя в недоумении читать этот факинг мануал.

ЗЫ питон невыносимо ублюдочный (конкретно этот однострочник).

filosofia
()
Последнее исправление: filosofia (всего исправлений: 1)

даже будучи невладах с lisp, но это map.

MKuznetsov ★★★★★
()
var A = [1, 2, 3, 4, 5]
var B = [6, 7, 8, 9, 10]
var C = [11, -12, 13, -14, -15]

var enval = [A,B]

var D = C.map ( (x,i) => enval [-(x>>31)][i] )
//-(x>>31) extracts sign bit

alert (D)
kolpakchi
()
Ответ на: комментарий от filosofia

Ни один из примеров говнокода в треде не проверяет размеры массивов

Но один таки описывает требования к входным параметрам в документации %)

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

В питоне zip (ожидаемо) заканчивается вместе с самым коротким итератором, иначе есть itertools.zip_longest, который будет выдавать None

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

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

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

(defmacro-clause (FOR vars THROUGH lists)
  (assert (alexandria:length= vars lists))
  `(progn ,@(mapcar (lambda (var list) `(for ,var in ,list))
                    vars lists)))

(let ((list-A '(1 2 3 4 5))
      (list-B '(6 7 8 9 10))
      (list-C '(11 -12 13 -14 -15)))
  (iter (for (a b c) through (list-A list-B list-C))
        (collect (if (plusp c) a b))))

хотя конкретно для данного случая, вариант с mapcar естественнее.

troy-harder
()
(labels ((rec (A B C collection)
           (if (and A B C)
               (rec (rest A)
                    (rest B)
                    (rest C)
                    (cons (if (plusp (first C))
                              (first A)
                              (first B))
                          collection))
               collection)))
  (nreverse (rec A B C nil)))
ados ★★★★★
()
Ответ на: комментарий от no-such-file

Код супер, ты loop мне второй раз пишешь, просто супер. Я же подвис на таких конструкциях

(setq A '(1 2 3 4 5))
(setq B '(6 7 8 9 10))
(setq C '(11 -12 13 -14 -15))
(setq D nil)
(defun mm (a b c d)
  (if (eq (car c) nil)
  d
  (PROGN
  (if (> (car c) 0)
      (push (car a) d)
    (push (car b) d))
  (mm (cdr a) (cdr b) (cdr c) d))))
saufesma
() автор топика
Ответ на: комментарий от ados

Рабочий код с label вообще первый раз в жизни вижу.

saufesma
() автор топика
Ответ на: комментарий от troy-harder

во как надо

Выгибоны на любителя. Этот ваш iter вообще как собаке пятая нога: если хочешь скобочки, возьми уже нормальный do и не мучай жопу.

взяли и выкинули скобки

Это фича, чтобы троллить питономакак писать на естественном языке типовые циклы. Кастомизация заключается в том чтобы намутить dsl, а не в том чтобы усложнять и так сложное. ИМХО iter это вообще не lisp-way хоть и со скобочками, а самый настоящий питонорак.

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

возьми уже нормальный do и не мучай жопу.

да ты вообще не в курсе походу. нахрен мне do? do это примитивный кал для простейших циклов. зачем ты его приплел?

усложнять и так сложное

найди хоть один пример где итер будет сложнее лупа.

lisp-way

что это именно?

питон

причем тут питон?

Кастомизация заключается в том чтобы намутить dsl

а еще она заключается в том что бы кастомизировать dsl. не передергивай.

у тебя же просто синдром утенка.

лучше скажи мне одно: зачем мне :do? вопрос риторический, если что.

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

найди хоть один пример где итер будет сложнее лупа

Да хоть твой пример.

нахрен мне do

А нахрен тебе iter?

просто синдром утенка

Ты просто глупенький, и не понял вообще в чём мотивация iter vs loop.

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

Да хоть твой пример.

срсли? ты троллишь?

распиши мне этот пример на лупе:

(itr (for i below 10)
     (cond ((> i 5) (collect i into other))
           ((> i 3) (maximize (+ i 1) into max))
           ((> i 1) (minimize (+ i 10) into min)))
     (finally (return (list min max other))))

А нахрен тебе iter?

он лучше луп, это же очевидно.

Ты просто глупенький, и не понял вообще в чём мотивация iter vs loop.

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

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

Ахаха, это прекрасно! Ненужно vs ненужно в ненужно. Аргументы:

iter — скооообачки, как в лишпе!
loop — eDSL, как в лишпе!

Запасаемся попкорном.

filosofia
()
Ответ на: комментарий от troy-harder

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

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

ЗЫ Не пишу на лиспе больше десяти лет %)

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

что чуть менее громоздкий.

перепиши пожалуйста пример который я привел выше с cond

Лично я бы писал функционально, оно более «нативно» в скобках.

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

Вообще цикл — как раз та конструкция, где явно нужен синтаксис. Без синтаксиса получаются вот эти вот все выкрутасы.

синтаксис с кейвордами что-ли? с чего он там нужен? про какие выкрутасы речь? :do - это не выкрутас?

defmacro-clause там ессно не обязателен, просто дело в том что в итере он есть, а в лупе нет. без него луп пример переводится 1 в 1, только без ублюдских кевордов.

ЗЫ Не пишу на лиспе больше десяти лет %)

тогда мне не ясно почему ты не называешь iter edsl’ем.

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

На поставленный вопрос я получил несколько супер ответов. А могли бы вы вместо перепалки взять меня на практику. Поделится своим кодом и опытом написания программ на LISP.

saufesma
() автор топика

:D

#include <stdio.h>
#define SIZE 5

int main(int argc, char *argv[])
{
    int a[SIZE] = {1,2,3,4,5};
    int b[SIZE] = {6,7,8,9,10};
    int c[SIZE] = {11,-12,13,-14,-15};

    for (int i = 0; i != SIZE; ++i)
    {
        if(c[i] > 0){
           printf("%i ",a[i]);

        }else if(c[i] < 0){
           printf("%i ",b[i]);

        }else if(c[i] == 0){
           printf("😱 ");
        }
    }
    return 0;
}
LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от LINUX-ORG-RU

Иль покороче

#include <stdio.h>
#define SIZE 5

int main(int argc, char *argv[])
{
    int a[SIZE] = {1,2,3,4,5};
    int b[SIZE] = {6,7,8,9,10};
    int c[SIZE] = {11,-12,13,-14,-15};

    for (int i = 0; i != SIZE; (c[i]>0) ? printf("%i ",a[i++]) : printf("%i ",b[i++]) );

    return 0;
}
LINUX-ORG-RU ★★★★★
()
Ответ на: комментарий от troy-harder

перепиши пожалуйста пример который я привел выше с cond

Я уже слишком стар для всего этого дерьма =) Во-вторых, я ни с кем не спорю.

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

Тащем-то да. Смысл функциональщины ведь не в хвостовой рекурсии, а композиции функций высшего порядка. Я знаю, что наиболее распространенное и популярное мнение состоит в том, что CommonLisp (как самый правильный из лиспов, лол) является мультипарадигменным языком бла-бла-бла. Но лично я не воспринимаю его императивные и ООП возможности.

синтаксис с кейвордами что-ли? с чего он там нужен? про какие выкрутасы речь? :do - это не выкрутас?

Ну да. Весь синтаксис, реализующий семантику «цикл». for (auto &v : container) {}, for (int i = 0; i < N; ++i) {}, for x in container:, ну и прочие вариации в разных языках. В CL приходится выкрутасничать на скобках и атомах. И получается либо громоздко, либо чужеродно.

тогда мне не ясно почему ты не называешь iter edsl’ем.

Я утрировано назвал два главных поинта противоборствующих сторон, на протяжении уже лет тридцати, если не больше. Loop чужеродный, зато явно реализует концепцию eDSL (со своим «синтаксисом»). Iter более гомогеный, зато скобчатый.

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

не воспринимаю его императивные и ООП возможности

не сказать что функциональные возможности лиспа какие-то взбудораживающие. даже curry в сраной александрии. люди вон coalton запилили. гарантированной хвостовой рекурсии нет.

а клос очень даже крут и юзабелен.

Iter более гомогеный и скобчатый.

пофиксил. плюсы у скобок есть, уже названные - кастомизируемость и возможность записывать конструкции типа cond’a кондом [spoiler], а не божественной лесенкой из if/else [/spoiler].

реализует концепцию eDSL (со своим «синтаксисом»).

итерейт - тот же едсл - embedded domain specific language. for, collect, maximize, minimize etc etc - все часть этого edsl, это не какие-то же функции.

и да, что хейтеры скобок потеряли в лиспе?

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

на протяжении уже лет тридцати

ну, и какие у луп-дедов аргументы накопились за 30 лет?

единственный честный что я пока слышал - лень учить что-то новое.

troy-harder
()
Ответ на: комментарий от Nervous

ммм сдвиги, завязывание на представление и реализацию, киндер пингви я люблю.

abcq ★★
()
Ответ на: комментарий от troy-harder

Я понимаю, что iter — тоже edsl, не надо это повторять. Поинт был в том, что loop как бы более явно демонстрирует «смотри как могу». Насколько я знаю, у общелисперов есть заскок куда ни плюнь писать или хотя бы использовать edsl с как бы особенными синтаксисами. Поэтому они прутся с loop.

Мне запомнилось, что loop позволяет короче записывать наиболее распространённые паттерны. А ещё он есть из коробки.

единственный честный что я пока слышал - лень учить что-то новое.

Хаха. Ты тоже к этому придёшь со временем скорее всего =)

filosofia
()
Ответ на: комментарий от troy-harder

единственный честный что я пока слышал - лень учить что-то новое.

Подумав ещё, мне пришла в голову мысль, что это наверное полезное качество: перестать учить новое, но начать использовать и оттачивать то, что знаешь. Утрируя: с третьей, пятой, ну уж точно с десятой попытки изучения очередного edsl циклов ты тоже наверное скажешь: «ну его нахуй, я уже умею писать циклы в лиспе!». И будешь абсолютно прав.

Посмотри на джаваскриптеров. Они каждый год что-то «новое» и «более эффективное» учат, а до сих пор ничего не знают =)

filosofia
()
Ответ на: комментарий от troy-harder

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

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

Поинт был в том, что loop как бы более явно демонстрирует «смотри как могу».

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

Ты тоже к этому придёшь со временем скорее всего

как сказал хантер томпсон, после 50 - уже пох что будет. ну или что то в этом духе.

десятой попытки изучения очередного edsl циклов ты тоже наверное скажешь: «ну его нахуй, я уже умею писать циклы в лиспе!». И будешь абсолютно прав.

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

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

Мда. Занятно это все было прочитать на ЛОРе, уж простите за оффтоп :)

paddlewan
()
Ответ на: комментарий от troy-harder

распиши мне этот пример на лупе

(loop
  for i below 10
  when (> i 5) collect i into other
  else when (> i 3) maximize (+ i 1) into max
  else when (> i 1) minimize (+ i 10) into min
  finally (return (list min max other)))

он лучше луп, это же очевидно.

Очевидно, что «лучше» понятие относительное. loop лучше в своей сфере применения - типовые циклы которые пишут руками.

объясни

Попробуй сообразить для чего сделали loop. И почему сделали iter когда уже был loop.

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

и зачем мне эта лестница из елсе вен когда у меня есть конд? как ты вообще мне про «питоний рак» что-то можешь говорить после этого кода?

Попробуй сообразить для чего сделали loop

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

И почему сделали iter когда уже был loop.

потому-что луп кривой, вот почему

это в мануале популярно расписано, тут не никаких скрытых камней

хватить шланговать, чэд, приводи свои аргументы.

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

для чего сделали loop

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

если твой ответ, к мне выше написали: «смотри как могу», то это очевидно кал, а не аргумент

troy-harder
()
Ответ на: комментарий от filosofia

iter — скооообачки, как в лишпе! loop — eDSL, как в лишпе!

Скобочки нужны не ради скобочек, а ради возможности работать с кодом как с данными. loop это dsl для конечного потребителя. Там не нужны скобочки, там нужна читаемость и простота использования.

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

когда у меня есть конд

Как будто там не лесенка.

потому-что луп кривой, вот почему

ЛОЛ, нет. Луп прекрасен. Но есть нюанс. Программно его хер распарсишь без бутылки. ЛИСП это во многом про преобразование кода. Луп это слишкам сложна, т.к. чтобы его корректно преобразовать нужен полный парсер этого самого лупа. iter в этом смысле гораздо проще, т.к. он сохраняет код в виде готового дерева. Поэтому-то он и расширяемый. Это как бы совершенно разные инструменты для разных задач. И в целом нужность iter в его нише сомнительна, т.к. как я уже сказал есть кондовый do. iter это такая попытка изобрести комбайн на все случаи жизни, и в пир и в мир, т.е. питонорак в чистом и незамутненном виде.

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

поздравляю, это самое идиотское

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

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

под иф/елсе лесенкой подразумевают обычно то что ты и написал. это самый тривиальный из примеров.

Луп это слишкам сложна, т.к. чтобы его корректно преобразовать нужен полный парсер

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

Это как бы совершенно разные инструменты для разных задач.

это инструменты для одной задачи - для итерация. вылезай из манямира.

есть кондовый do

и как я сказал, do - это примитивный кал

iter это такая попытка изобрести комбайн на все случаи жизни

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

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

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

опять да попробуй, да может.

да может, да не может. приводи не маняаргументы или пешком отсюда иди.

я тебе показал где твой луп говно - на простейшем примере, на который ты мне привел питонокод. но ты необучаемый и говоришь мне: «это говно - не говно! оно для конечного потребителя! твой изюм слишком универсален!!11»

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