// defer_reflection.vr — demonstrates the Batch-A features: `defer` cleanup, // the `in` membership operator, `type_info()` reflection, and `range()`. // // vr run examples/defer_reflection.vr fn summarize(v) { // reflection: inspect any value and build a description let ti = type_info(v) let kind = ti.kind if ti.is_number { return "a number " + str(v) } else if ti.is_string { return "a string of length " + str(ti.len) + ": \"" + v + "\"" } else if ti.is_array { return "an array with " + str(ti.len) + " elements" } else if ti.is_struct { return "a record with fields " + str(ti.fields) } else if ti.is_none { return "nothing" } return "a " + kind } fn grep_lines(docs, term) { // demonstrate `in` on strings + arrays, with deferred cleanup let matches = [] defer println(" -> searched " + str(len(docs)) + " docs for \"" + term + "\"") for d in docs { if term in d { // substring membership push(matches, d) } } return matches } fn main() { // range + in + type_info let nums = range(1, 6) // [1, 2, 3, 4, 5] println("nums = " + str(nums)) println("3 present? " + str(3 in nums)) println("7 present? " + str(7 in nums)) println(summarize(42)) println(summarize("hello")) println(summarize([1, 2, 3])) println(summarize({x: 1, y: 2})) println(summarize(none)) println("---") let docs = ["Introducing VuurRaaf", "A tiny language", "VuurRaaf: daily driver"] let hits = grep_lines(docs, "VuurRaaf") println("hits: " + str(hits)) }