Hi Matt,
Operator precedence in the ersatz parser was not correct, so I have now
fixed it. Expressions consisting of several operators, e.g. {{ if not a >
b}} should work without having to be parenthesized. I have also added
procedures sexpr->tvalue and tvalue->sexpr for easy conversion between
s-expressions and template values. So now you can write code such as this:
(define (alist->models xs)
(map (lambda (x) (cons (car x) (sexpr->tvalue (cdr x)))) xs))
(from-string "{% if not (x == 1) %}not one{% endif %}"
models: (alist->models '((x . 2)))))
Please try out version 1.4 of ersatz and let me know if I need to fix
anything else. Thanks for your feedback.
-Ivan
On Thu, Mar 14, 2013 at 2:05 PM, Matt Gushee <[email protected]> wrote:
> Hi, Ivan+group--
>
> On Wed, Mar 13, 2013 at 6:39 PM, Ivan Raikov <[email protected]>wrote:
>
>>
>> 1) {% endblock <block_name> %}: the current grammar does not accept
>> identifiers after endblock. Is this something required by Jinja?
>>
>
> It's not required, but it's allowed. And, as should be obvious, it doesn't
> really do anything, just possibly makes the template structure more
> readable.
>
>
> 3) {% if not loop.last %}: this should work. Can you check whether
> "if loop.last" works?
>
> Okay, I just tried the following two templates:
>
> A)
> {% for word in words %}
> {{ word }}{% if loop.last %}!{% endif %}
> {% endfor %}
>
> B)
> {% for word in words %}
> {{ word }}{% if not loop.last %},{% endif %}
> {% endfor %}
>
> A works for me, but B does not. The error looks like this:
>
> Error: (ident-expr->name) invalid identifier expression: #<texpr>
>
> Call history:
>
> runtime.scm:52: loop
> runtime.scm:50: utf8#string-length
> runtime.scm:52: loop
> runtime.scm:50: utf8#string-length
> runtime.scm:961: Tstr
> runtime.scm:325: tmpl-ctx-buffer
> runtime.scm:324: display
> ersatz-lib.scm:204: datatype#invoke-variant-case
> ersatz-lib.scm:204: display
> eval.scm:291: eval-statement
> eval.scm:238: datatype#invoke-variant-case
> eval.scm:280: select-case
> eval.scm:275: eval-expr
> eval.scm:25: datatype#invoke-variant-case
> eval.scm:84: ident-expr->name
> runtime.scm:125: error <--
>
> I thought the error I got before was in the parser, but I'm not really
> sure now. I ran the current exercise in CSI, whereas the code I had trouble
> with before was compiled. By the way, I have Chicken 4.8.0.1 on Arch Linux
> 32-bit, with Ersatz 1.3.
>
> 5) Tvalues: I am an SML/Ocaml groupie and fanatical believer in types :-D
>> But if it will help, I will add a sexpr->tvalue and tvalue->sexpr
>> procedures that can convert between Scheme values and template values.
>>
>
> I wouldn't mind that.
>
>
>> 6) Yes, you can build templates "in-memory". Take a look at the
>> template-statement data type. I will add this to the documentation as well.
>>
>
> Okay; I thought that might be the case, but I didn't really understand how
> to use statements. Maybe now that I've used the library a bit, I'll take
> another look at statements.
>
>
>> 7) Name: 'tori' is a bit too generic, I think. Presumably German is the
>> native language of Chicken, so I chose what I think expresses the nature of
>> templates, yet is somewhat self-deprecating, as ersatz usually means 'poor
>> substitute' in English and my native Bulgarian.
>>
>
> Not tori, torii! Okay, I'll explain this. You didn't say whether you got
> my (possibly not-so-funny) joke or not, but perhaps others will find it
> slightly amusing.
>
> So, this templating library is derived from Jinja. Jinja in Japanese means
> a Shinto shrine (and by the way, certain shrines are called "jingu"--hence
> the name of the OCaml library, Jingoo). Well, most Shinto shrines have a
> distinctive type of gateway called a *torii*--I'm sure everyone here has
> seen pictures of them. And note the double 'i'--that signifies a long, or
> more precisely, doubled vowel sound. Well, now, consider the word 'tori'
> (with a single 'i'). The fundamental meaning of *tori* is 'bird'--however,
> when used in reference to food, it usually means a particular kind of bird:
> chicken!
>
> So there you have it! I think it's pretty clever, but if you really prefer
> Ersatz, I guess I can live with that. But be warned: if you ever get tired
> of maintaining the egg and I happen to take it over, I will probably change
> the name (<evil laughter>).
>
> Oh, and by the way [if you're not a (human) language geek, you can skip
> this part], I am curious as to whether my pun makes sense to Japanese
> people. See, the distinction between the long and short vowel sounds (as in
> *torii* vs. *tori*) is often difficult for non-native Japanese
> speakers--they really sound very similar if your ears are not accustomed to
> it. Yet, whenever I have complained about this to Japanese people, their
> response is almost invariable some version of "What do you mean? They're
> completely different." On the other hand, I'm pretty sure I have heard
> Japanese comedians on a number of occasions making puns in exactly this way.
>
> --
> Matt Gushee
>
> _______________________________________________
> Chicken-users mailing list
> [email protected]
> https://lists.nongnu.org/mailman/listinfo/chicken-users
>
>
_______________________________________________
Chicken-users mailing list
[email protected]
https://lists.nongnu.org/mailman/listinfo/chicken-users