1

The following works:

(rx-let ((headers (? (or "From" "To" "Cc") ":"))) (list "mail.amazon" (rx bol headers anything "amazon" anything) ;; ("mail.amazon" "^\\(?:\\(?:Cc\\|From\\|To\\):\\)?[^z-a]amazon[^z-a]") )) 

But the following fails:

(rx-let ((headers (bol (or "From" "To" "Cc") ":"))) (list "mail.amazon" (rx headers anything "amazon" anything) ;; rx--translate-form: Unknown rx form ‘bol’ )) 

Why is rx-let having issues with rx forms like bol? I've also tried its alias, line-start, but the result was the same.

2
  • 2
    Each rx-let binds a single rx form to a name. (? ...) is a single form (? takes any number of rx forms as arguments), but (bol ...) is not a valid rx form (bol is an rx form of its own, without taking an argument list). Try (: bol ...), (seq bol ...), or similar instead. Commented Jan 9, 2024 at 22:19
  • It works! Make an answer out of it and I can accept it Commented Jan 10, 2024 at 15:37

1 Answer 1

2

The docstring of rx-let describes the expected format of each binding (^^ emphasis mine):

rx-let is an autoloaded Lisp macro in ‘rx.el’. (rx-let BINDINGS BODY...) Evaluate BODY with local BINDINGS for ‘rx’. BINDINGS is an unevaluated list of bindings each on the form (NAME [(ARGS...)] RX). ^^ 

Note that it binds a single RX form to each NAME.

(rx-let ((headers (? (or "From" "To" "Cc") ":"))) ...) 

This first example works because (? ...) is a valid rx form (which in turn takes other rx forms as arguments).

(rx-let ((headers (bol (or "From" "To" "Cc") ":"))) ...) 

But the error message for this example is expected, since (bol ...) is not a valid rx form: bol is an atomic rx form that does not take an argument list.

The forms bol, (or ...), and ":" can be sequenced/wrapped as a single rx form using the seq form (alias :):

(rx-let ((headers (seq bol (or "From" "To" "Cc") ":"))) ...) 

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.