Я пытаюсь выполнить сопоставление шаблонов со списками, но по какой-то причине я получаю неожиданное совпадение, когда делаю следующее:
> (define code '(h1 ((id an-id-here)) Some text here))
> (define code-match-expr '(pre ([class brush: python]) ...))
> (match code
[code-match-expr #t]
[_ #f])
#t
Вопрос. Почему code
соответствует code-match-expr
?
Практический вариант использования
Я попробовал это в Racket REPL, потому что на самом деле я хочу решить другую практическую проблему: использовать функции упаковки pygments Pollen для выделения кода, который позже будет выводиться в виде HTML. Для этого я написал следующий код, где возникает проблема:
(define (read-post-from-file path)
(Post-from-content (replace-code-xexprs (parse-markdown path))))
(define (replace-code-xexprs list-of-xexprs)
;; define known languages
(define KNOWN-LANGUAGE-SYMBOLS
(list 'python
'racket
'html
'css
'javascript
'erlang
'rust))
;; check if it matches for a single language's match expression
;; if it mathces any language, return that language's name as a symbol
(define (get-matching-language an-xexpr)
(define (matches-lang-match-expr? an-xexpr lang-symbol)
(display "XEXPR:") (displayln an-xexpr)
(match an-xexpr
[`(pre ([class brush: ,lang-symbol]) (code () ,more ...)) lang-symbol]
[`(pre ([class brush: ,lang-symbol]) ,more ...) lang-symbol]
[_ #f]))
(ormap (lambda (lang-symbol)
;; (display "trying to match ")
;; (display an-xexpr)
;; (display " against ")
;; (displayln lang-symbol)
(matches-lang-match-expr? an-xexpr lang-symbol))
KNOWN-LANGUAGE-SYMBOLS))
;; replace code in an xexpr with highlightable code
;; TODO: What happens if the code is in a lower level of the xexpr?
(define (replace-code-in-single-xexpr an-xexpr)
(let ([matching-language (get-matching-language an-xexpr)])
(cond [matching-language (code-highlight an-xexpr matching-language)]
[else an-xexpr])))
;; apply the check to all xexpr
(map replace-code-in-single-xexpr list-of-xexprs))
(define (code-highlight language code)
(highlight language code))
В этом примере я разбираю файл уценки, который имеет следующее содержимое:
# Code Demo
```python
def hello():
print("Hello World!")
```
И я получаю следующие xexpr
s:
1.
(h1 ((id code-demo)) Code Demo)
2.
(pre ((class brush: python)) (code () def hello():
print("Hello World!")))
Однако ни один из них почему-то не совпадает.