diff --git a/crates/typst/src/eval/flow.rs b/crates/typst/src/eval/flow.rs index 93d6da859..a68be95ba 100644 --- a/crates/typst/src/eval/flow.rs +++ b/crates/typst/src/eval/flow.rs @@ -145,8 +145,8 @@ impl Eval for ast::ForLoop<'_> { iter!(for pattern in array); } (_, Value::Dict(dict)) => { - // Iterate over pairs of dict. - iter!(for pattern in dict.pairs()); + // Iterate over key-value pairs of dict. + iter!(for pattern in dict.iter()); } (Pattern::Normal(_) | Pattern::Placeholder(_), Value::Str(str)) => { // Iterate over graphemes of string. diff --git a/crates/typst/src/foundations/cast.rs b/crates/typst/src/foundations/cast.rs index cb0099129..6a40ceccf 100644 --- a/crates/typst/src/foundations/cast.rs +++ b/crates/typst/src/foundations/cast.rs @@ -9,7 +9,7 @@ use smallvec::SmallVec; use unicode_math_class::MathClass; use crate::diag::{At, SourceResult, StrResult}; -use crate::foundations::{repr, NativeElement, Packed, Repr, Type, Value}; +use crate::foundations::{array, repr, NativeElement, Packed, Repr, Str, Type, Value}; use crate::syntax::{Span, Spanned}; #[rustfmt::skip] @@ -182,6 +182,12 @@ impl IntoValue for Value { } } +impl IntoValue for (&Str, &Value) { + fn into_value(self) -> Value { + Value::Array(array![self.0.clone(), self.1.clone()]) + } +} + impl IntoValue for Cow<'_, T> { fn into_value(self) -> Value { self.into_owned().into_value() diff --git a/docs/reference/scripting.md b/docs/reference/scripting.md index 6e64cebbb..9a04bfb9d 100644 --- a/docs/reference/scripting.md +++ b/docs/reference/scripting.md @@ -195,6 +195,8 @@ For loops can iterate over a variety of collections: - `{for pair in dict {..}}` \ Iterates over the key-value pairs of the [dictionary]($dictionary). The pairs can also be destructured by using `{for (key, value) in dict {..}}`. + It is more efficient than `{for pair in dict.pairs() {..}}` because it doesn't + create a temporary array of all key-value pairs. - `{for letter in "abc" {..}}` \ Iterates over the characters of the [string]($str). Technically, it iterates