Bug 55284

Summary: woo-get-option не обрабатывает #f параметры
Product: Sisyphus Reporter: Ajrat Makhmutov <rauty>
Component: alteratorAssignee: manowar <manowar>
Status: CLOSED NOTABUG QA Contact: qa-sisyphus
Severity: normal    
Priority: P5 CC: boyarsh, imz, manowar, sem
Version: unstable   
Hardware: x86_64   
OS: Linux   

Description Ajrat Makhmutov 2025-07-20 20:23:15 MSK
alterator/alterator/interfaces/guile/woo.scm:78:
(define (woo-get-option cmd option . default)
  (cond
   ((and (pair? cmd) (plistq option (cdr cmd))) => cdr)
   (else (if (pair? default) (car default) ""))))

Предположим. что наш backend при вызове (woo "is_obraz_building" "/kopidel") возвращает:
(("/kopidel" is_obraz_building #f))

Тогда (woo-get-option (woo "is_obraz_building" "/kopidel") 'is_obraz_building) вернёт пустую строку, хотя должен вернуть #f.
То есть сейчас woo-get-option не может определить - отсутствует ли параметр в cmd или же он выставлен на #f.
Comment 1 manowar@altlinux.org 2025-07-20 22:05:06 MSK
А какой тип данных определён для is_obraz_building? Я уверен на 99%, что существует "официальный" способ вернуть bool из backend3. По-моему, для этого нужно определить тип параметра как "bool", а затем использовать функции write_true() и write_false() в коде. Но возможно, я это придумал
 :) Завтра перепроверю. Но и вы тоже поищите примеры по имеющемуся коду.
Comment 2 Ajrat Makhmutov 2025-07-22 04:08:50 MSK
Был не прав. Нужно вызывать не
(woo-get-option (woo "is_obraz_building" "/kopidel") 'is_obraz_building)
а
(woo-get-option (cond-car (woo "is_obraz_building" "/kopidel")) 'is_obraz_building)

Пример.
scheme@(guile-user) [3]> (woo-get-option '("/a" b #f) 'b)
$3 = #f

Смотрел по примеру woo-read-first, где cond-car сразу используется. :(