...that was a lie. They do work... Now I'm confused.

On 7/14/23 00:59, Bryce Carson wrote:

Silly me... I put a (debug) in each lambda and I could see that my pcase is indeed incorrectly matching.

The keyword documentation is strange, however.

On 7/14/23 00:56, Bryce Carson wrote:

I forgot to attach the screenshot of the in-error appearance in the customize buffer when using these lambdas to convert betwixt internal and internal values.

In the customize buffer, the button appears as invalid (nil). Perhaps my pcase is incorrect, but it's rather simple matching so I don't see why it'd be the cause (though it would not match any of the choice-items if none of the patterns are matching [nil would be returned]).

On 7/14/23 00:52, Bryce Carson wrote:

Further, I can't seem to get these functions to work as documented or expected.

Without these defined when I'm creating a widget with the following code, I do get a button but the internal value is displayed in the clickable button. I'd like the external value to be displayed in the button %v, just as the menu-tag is is "externally facing".

<<widget>>=
(define-widget 'project-widget 'list
  :tag (let ((s "\n\tProject"))
         (put-text-property 0 (length s) 'face 'bold s) s)
  :format "%t\n%v "
  :offset 0
  :indent 0
  :convert-widget 'widget-types-convert-widget
  :args '((menu-choice
           :tag "EmacSQL-supported backend"
           :format "%[%t%]: %[%v%]"
           :value "sqlite"
           :value-to-external <<menu-choice internal value to external lambda>>
           :value-to-internal <<menu-choice external value to internal lambda>>
           (choice-item :menu-tag "MySQL" :value "mysql")
           (choice-item :menu-tag "PostgreSQL" :value "postgresql")
           (choice-item :menu-tag "SQLite" :value "sqlite"))))
<<menu-choice internal value to external lambda>>=
(lambda (widget internal-value)
  "Converts lowercase, internal values to the casing of trademarks."
  (pcase internal-value
    ("mysql" "MySQL")
    ("sqlite" "SQLite")
    ("postgresql" "PostgreSQL")))
<<menu-choice external value to internal lambda>>=
(lambda (widget external-value)
  "Converts the casing of trademarked names to lowercase, internal values."
  (pcase external-value
    ("MySQL" "mysql")
    ("SQLite" "sqlite")

On 7/14/23 00:32, Bryce Carson wrote:

In the section Defining New Widgets, the following quotation reveals a bug, I believe. I added emphasis for the last sentence of each description of the keywords. I believe that for the :value-to-external function, the last sentence is not supposed to be present.

:value-to-internal
	Function to convert the value to the internal format. The function takes two
	arguments, a widget and an external value, and returns the internal value. The
	function is called on the present :value when the widget is created, and on any
	value set later with widget-value-set.
:value-to-external
	Function to convert the value to the external format. The function takes two
	arguments, a widget and an internal value, and returns the external value. The
	function is called on the present :value when the widget is created, and on any
	value set later with widget-value-set.

It looks like the author or editor of the descriptions coped them, which is fine. It doesn't make sense that :value-to-external would be called when the widget is created, nor when new values are set with widget-value-set.

Other places in the manual state that the value of the :value keyword, when creating or defining widget, should be in the external form, more evidence that the last sentence is a bug.

--
It's a GNU system, I don't know this!
    --- Mirror universe Lex Murphy, in Cenozoic Zoo
--
It's a GNU system, I don't know this!
    --- Mirror universe Lex Murphy, in Cenozoic Zoo
--
It's a GNU system, I don't know this!
    --- Mirror universe Lex Murphy, in Cenozoic Zoo
--
It's a GNU system, I don't know this!
    --- Mirror universe Lex Murphy, in Cenozoic Zoo