Closed jaybonthius closed 2 years ago
Hi!
I have a list of hashes called
hash_list
.
Note that the code that you wrote has missing parens, and is not a list of hashes. The list of hashes probably should be:
'(#hasheq((video . "path/to/example_0000.mp4"))
#hasheq((video . "path/to/example_0001.mp4")))
Here's my attempt:
There are two possible mistakes here.
Notice that in the output, you have (video [[src ("path/to/example_0000.mp4")]])
. This doesn't make sense, because the attribute src
should be associated with a string value, not a list of strings.
The fix could be done by changing video-env
to consume exactly one argument instead of making it consume variadic arguments. That is, you would need to make a definition like this instead:
(define (video-env text)
`(video [[src ,text]]))
(Notice the absence of dot. Also, people usually use -
instead of _
in names)
Notice that in the output, you have ((video ...) (video ...))
. This again doesn't make sense, because the body of the document should not be a list of elements. There are several ways to fix this. One possibility is:
(apply @ (map .......))
So, your final code might look like this:
;; test.html.pm
#lang pollen
◊(define hash-list
'(#hasheq((video . "path/to/example_0000.mp4"))
#hasheq((video . "path/to/example_0001.mp4"))))
◊(define (video-env text)
`(video [[src ,text]]))
◊(define (root . xs)
(apply @ (map (λ (hash) (video-env (hash-ref hash 'video))) hash-list)))
which produces test.html
after raco pollen render test.html.pm
<html>
<head><meta charset="UTF-8"/></head>
<body>
<video src="path/to/example_0000.mp4"></video>
<video src="path/to/example_0001.mp4"></video>
</body>
</html>
@sorawee That did the trick! Thank you so much for pointing out both errors and putting me on the right path. I'm beaming 😄
I dropped some parens in the hash lists when I wrote the question. Whoops!
FWIW:
default-tag-function
.@
explicitly and instead use for/splice
(which gathers the results of the iteration under a @
automatically)So if you wished, you could simplify this example like so:
;; test2.html.pm
#lang pollen
◊(define videos
'("path/to/example_0000.mp4"
"path/to/example_0001.mp4"))
◊(for/splice ([v videos])
(video #:src v))
@mbutterick My hash table comes from parsing a .json
with multiple values per record, which isn't obvious from my oversimplified example. Sorry about that. But your points on default-tag-function
and for/splice
are taken! And thanks for giving an example, I appreciate it.
I have a list of hashes called
hash_list
.I want to iterate through
hash_list
and generate a<video src="path/to/my/file.mp4" >
for each "video" key.Here's my attempt:
I'm getting a
decode-elements: contract violation
error, where it expectstxexpr-elements?
, and in thegiven
, I seeI might be wrong, but I think
decode-elements
would be happy if it was given this:Regardless, I'm not sure how to fix this. Would anyone mind pointing me in the right direction? Thanks!