let? ... let
let - определяет локальные переменные. Значение символа sym
- или значения символов sym
в списке второй формы - сохраняются, и символы привязываются к вычисленным аргументам any
. Аргументы lst
во второй форме могут состоять только из символов и подсписков и соответствовать аргументу any
(деструктурирующая привязка). prg
выполняется, затем символы восстанавливаются до своих исходных значений. Возвращается результат prg
. Передача NIL
в качестве аргумента sym
является условием ошибки. В шаблонах деструктуризации NIL
обозначает позицию "неважно".
let? - условное связывание и выполнение локальной переменной: если any
вычисляется как NIL
, возвращается NI
L. В противном случае значение символа sym сохраняется, и sym
привязывается к вычисленному аргументу any
. prg
выполняется, затем sym восстанавливается до своего исходного значения. Возвращается результат prg
. Передача NIL
в качестве аргумента sym
является условием ошибки. (let? sym 'any ..)
эквивалентно (when 'any (let sym @ ..))
.
https://picolisp.tiddlyhost.com/#let
Очень часто можно встретить в коде. Собственно, один из способов синтаксически выразить механизм организации памяти и, в частности, поименовать её фрагмент (блок). Синтаксический сахар. Особенно для деклартивного стиля или когда декларируется, что все данные, все динамично (и даже “связывание”). В принципе, примитивная функция перехода от имени параметра к его значению, в этом случае её описание, где было бы достаточно продемонстрировать просто как пару, а при необходимости скобками, специфицируя последние, например. А, вообще, можно и не специфицировать локальные и глобальные переменные, организуя и глобальные одним объектом (функциональным). В системе vlang, например, все переменные “привязываются в контексте функций“. И, более того, как уже выше замечено, объявление переменной или определение - это не что иное как примитивная, ориентированный переход вычислительного шага.