Есть ли способ конвертировать (список 1 2 3) просто в 1 2 3 в Racket (схема)? - PullRequest
0 голосов
/ 26 апреля 2020
#lang racket
(require syntax/parse/define)
(require racket/draw)

(define thickness 1.99)

(define color-set 
  (hash
   `black `(0 0 0)
   `white `(255 255 255)
   `light-grey `(229 229 229)
   `dark-grey `(153 153 153)))

(define font-set
  (hash
    `default (make-font #:size 17 #:family 'script #:weight '550 #:smoothing `smoothed) 
    `index (make-font #:size 11 #:family 'modern #:weight '400 #:smoothing `smoothed)
    `comment (make-font #:size 11 #:family 'modern #:weight '400 #:smoothing `smoothed)))


(define-syntax-parser grab
  #:datum-literals (pen brush font)

  [(_ pen color alpha)
   (send dc set-pen (make-color ,@(hash-ref color-set (quasiquote color)) alpha))]

  [(_ pen color)
   (send dc set-pen (make-color ,@(hash-ref color-set (quasiquote color)) 1))]

  [(_ brush color style)
   (send dc set-brush (make-color ,@(hash-ref color-set (quasiquote color)) alpha) (quasiquote style))]

  [(_ brush color)
   (send dc set-brush (make-color ,@(hash-ref color-set (quasiquote color)) alpha) 'solid)]

  [(_ font mode)
   (send dc set-font (hash-ref font-set (quasiquote mode)))]) 

Этот вопрос касается базового c ракетного макроса. Я делаю что-то с ракеткой / ничьей. и я хочу сделать свою собственную функцию захвата, чтобы сделать set-pen, set-font, set-bru sh более интуитивным. Но я столкнулся с проблемой.

я пытался сделать с (make-color ,@(hash-ref color-set (quasiquote color)) 1), я хочу создать (make-color 255 255 255 1). (Если цвет черный)

, но я получил сообщение об ошибке: unquote-splicing: not in quasiquote in: (unquote-splicing (hash-ref color-set (quasiquote color)))

Кажется, что ,@ можно использовать только для (list 1 @,(list 1 2 3) 2 3). не для (list 255 255 255) до 255 255 255.

Что я могу сделать? Спасибо.

1 Ответ

3 голосов
/ 26 апреля 2020

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

(define color-set 
  (hash
   'black '(0 0 0)
   'white '(255 255 255)
   'light-grey '(229 229 229)
   'dark-grey '(153 153 153)))

Это просто сделать то, что вы хотите, не прибегая к квазицитатуре, нам просто нужно построить список параметров, как требуется, и apply процедура:

(apply make-color (append (hash-ref color-set color) (list 1)))

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

(define-namespace-anchor a)
(define ns (namespace-anchor->namespace a))
(eval `(make-color ,@(hash-ref color-set color) 1) ns)
...