- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 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.06.2020 19:35 # 0
Desktop 07.06.2020 19:36 # 0
gost 07.06.2020 19:41 # +1
Desktop 07.06.2020 19:42 # 0
Что-то сложно выходит.
3.14159265 08.06.2020 00:12 # 0
> '(apple 10 4))
Ну вот и «массив» из той задачи. Даже в лиспах выглядит изящно.
А у джавашка «типы мосивов в ЙАЖ_VM», «питумизированные пирименные», прочий пирдолинг.
bormandinho 12.06.2020 19:33 # 0
bormand 12.06.2020 20:23 # 0
З.Ы. Интересно, они имеют какой-то особый смысл или просто все сорта скобок можно юзать?
nemyx 12.06.2020 20:38 # 0
https://github.com/Lovesan/bike/blob/master/src/syntax.lisp
Т. е. в «Лиспе» нужно сочинять специальный макрос, чтобы они обрабатывались.
А вот в «Racket», оказывается, круглые и квадратные взаимозаменяемы. Два типа скобок, чтобы программа была не «write-only», т. е. чтобы программисту самому было легче отследить баланс скобок.
Desktop 12.06.2020 20:44 # 0
- рэкетоненавистник, кстати
nemyx 12.06.2020 20:47 # +1
nemyx 12.06.2020 20:41 # 0
https://docs.racket-lang.org/guide/syntax-overview.html
Т. е. для «читаемости» принято условия записывать в квадратных скобках, остальное — в круглых. Это как одинарные и двойные кавычки в жопоскрипте.
Desktop 12.06.2020 20:46 # +1
nemyx 12.06.2020 20:48 # 0
MAKAKA 12.06.2020 21:53 # 0
nemyx 12.06.2020 22:44 # 0
KOPOHABuPYC 13.06.2020 00:26 # 0
Perevedi_na_PHP 16.10.2021 20:41 # 0