DrSensor / nusa

incremental runtime that bring both simplicity and power into webdev (buildless, cross-language, data-driven)
MIT License
4 stars 0 forks source link

eval-syntax #74

Open DrSensor opened 11 months ago

DrSensor commented 11 months ago

Expose an eval syntax. Similar to new Function() (used by AlpineJS) or eval() but doesn't expose global variable and Web API. Also no new variable creation a.k.a let or const. No declaration, no statement, no loop. It just an expression. However, it may have ternary operation and range/slice bound.

Some ideas:


Operator that exclusive for string, list/array, and vector/matrix are denoted in [ops]. There's some ops-syntax borrowed from other lang.

concat (inspired by Lua)

<span ~ #text="
  ret:sepByComma<~`(scale3d[..][0,0,0])
">…</span>

same as

span.textContent = sepByComma(
  scale3d.concat([0, 0, 0])
)

scalar add on vector

<span ~ #text="
  ret:sepByComma<~`(scale3d[+]5)
">…</span>

same as

span.textContent = sepByComma(
  scale3d.map(it => it + 5)
)

addition between vector

<span ~ #text="
  ret:sepByComma<~`(scale3d[+]pos2d)
">…</span>

roughly same as

span.textContent = sepByComma(
  Array.from(
    { length: Math.max(scale3d.length, pos2d.length) },
    (_, i) => (scale3d[i] ?? null) + (pos2d[i] ?? null),
  )
)

Note that to enter eval-syntax, the expression should be wrapped in `()

DrSensor commented 11 months ago

Not related to eval-syntax but from the example seems I got a design issues in the implementation detail of rust (and potentially other) binding.

use libnusa::{number, Vector, Null};

#[no_mangle]
fn sepByComma(
  list: Vector<Null<number::f32>>
  // okay so where to store this temporary value? 
  // which memory?
  // which offset?
) {}

Should I treat it as Buffer 🤔