let? ... let

let - определяет локальные переменные. Значение символа sym - или значения символов sym в списке второй формы - сохраняются, и символы привязываются к вычисленным аргументам any. Аргументы lst во второй форме могут состоять только из символов и подсписков и соответствовать аргументу any (деструктурирующая привязка). prg выполняется, затем символы восстанавливаются до своих исходных значений. Возвращается результат prg. Передача NIL в качестве аргумента sym является условием ошибки. В шаблонах деструктуризации NIL обозначает позицию "неважно".

let? - условное связывание и выполнение локальной переменной: если any вычисляется как NIL, возвращается NIL. В противном случае значение символа sym сохраняется, и sym привязывается к вычисленному аргументу any. prg выполняется, затем sym восстанавливается до своего исходного значения. Возвращается результат prg. Передача NIL в качестве аргумента sym является условием ошибки. (let? sym 'any ..) эквивалентно (when 'any (let sym @ ..)).

https://picolisp.tiddlyhost.com/#let

Очень часто можно встретить в коде. Собственно, один из способов синтаксически выразить механизм организации памяти и, в частности, поименовать её фрагмент (блок). Синтаксический сахар. Особенно для деклартивного стиля или когда декларируется, что все данные, все динамично (и даже “связывание”). В принципе, примитивная функция перехода от имени параметра к его значению, в этом случае её описание, где было бы достаточно продемонстрировать просто как пару, а при необходимости скобками, специфицируя последние, например. А, вообще, можно и не специфицировать локальные и глобальные переменные, организуя и глобальные одним объектом (функциональным). В системе vlang, например, все переменные “привязываются в контексте функций“. И, более того, как уже выше замечено, объявление переменной или определение - это не что иное как примитивная, ориентированный переход вычислительного шага.