1. Куча / Говнокод #26741

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    #lang racket
    
    (require racket/syntax)
    
    (define-syntax (_total stx)
      (syntax-case stx ()
        [(_total item price amount)
         (let ([make-id
                (lambda (template . ids)
                  (let ([str (apply format template (map syntax->datum ids))])
                    (datum->syntax stx (string->symbol str))))])
           (with-syntax ([total-item-price (make-id "~a-price" #'item)]
                         )
             #'(begin
                 (total-item-price price amount)
                 )))]
        )
      )
    
    (define-syntax-rule (total item price amount)
      (cond [(eq? item 'apple) (_total apple price amount)]
            [(eq? item 'grape) (_total grape price amount)]
            [else (_total general price amount)]
            )
      )
      
    
    (define (apple-price price amount)
      (* price (- amount (/ amount 2)))
      )
    
    (define (grape-price price amount)
      (* price (if (> amount 1) (/ (* amount 4) 5) amount))
      )
    
    (define (general-price price amount)
      (* amount price)
      )
    
    (define apples '(apple 10 4))
    (define grapes '(grape 20 3))
    (define other '(peach 30 1))
    
    (foldl (λ (lst result)
             (+ result (total (car lst) (cadr lst) (caddr lst)))
             )
           0
           (list apples grapes other)
     )

    Когда у тебя есть macroмолоток, всё остальное кажется гвоздями.

    Запостил: Desktop, 07 Июня 2020

    Комментарии (16) RSS

    • #macroperde
      Ответить
      • gost, не хочешь сделать на ngk поиск по хешам? Чтобы хеши в комментариях были интерактивными и по нажатию на хеш открывался список комментариев с его упоминанием. Говнотвиттер такой себе.
        Ответить
        • Передали в инженерный отдел. В принципе, на первый взгляд достаточно на клиенте просто расставить ссылки на https://gcode.space/#!/search?q="%23хэштег". А вот серверная оптимизация этого добра… Хм, таблица с тегами, таблица «comment_id,tag_id», при добавлении сканировать коммент на предмет тегов и добавлять кортеж (comment_id, tag_id), в поиске получать tag_id… По идее, можно и заморочиться.
          Ответить
          • Да, плюс питонячьи комментарии надо как-то отличать.

            Что-то сложно выходит.
            Ответить
    • > (car lst) (cadr lst) (caddr lst)
      > '(apple 10 4))

      Ну вот и «массив» из той задачи. Даже в лиспах выглядит изящно.
      А у джавашка «типы мосивов в ЙАЖ_VM», «питумизированные пирименные», прочий пирдолинг.
      Ответить
    • Фу, квадратные скобки
      Ответить
      • Да, зашквар какой-то.

        З.Ы. Интересно, они имеют какой-то особый смысл или просто все сорта скобок можно юзать?
        Ответить
        • Погуглил... Один чувак на «ЛОРе» написа́л, что навелосипедил квадратные скобки в «Лиспе»:
          https://github.com/Lovesan/bike/blob/master/src/syntax.lisp

          Т. е. в «Лиспе» нужно сочинять специальный макрос, чтобы они обрабатывались.

          А вот в «Racket», оказывается, круглые и квадратные взаимозаменяемы. Два типа скобок, чтобы программа была не «write-only», т. е. чтобы программисту самому было легче отследить баланс скобок.
          Ответить
          • > Lovesan
            - рэкетоненавистник, кстати
            Ответить
            • С ненавистью использует квадратные скобки в «Лиспе», чтобы рэкетолюбам сделать неприятно.
              Ответить
        • The use of square brackets for cond clauses is a convention. In Racket, parentheses and square brackets are actually interchangeable, as long as ( is matched with ) and [ is matched with ]. Using square brackets in a few key places makes Racket code even more readable.

          https://docs.racket-lang.org/guide/syntax-overview.html

          Т. е. для «читаемости» принято условия записывать в квадратных скобках, остальное — в круглых. Это как одинарные и двойные кавычки в жопоскрипте.
          Ответить
          • Всё же не условия, а скорее элементы перечисления. Посмотри, например, на
            let*
            Ответить

    Добавить комментарий