【问题标题】:How can I make a string with expandable keywords in Scheme?如何在 Scheme 中创建带有可扩展关键字的字符串?
【发布时间】:2011-09-23 20:54:47
【问题描述】:

我正在编写一个 GIMP 脚本来将图层导出到文件。我想提供一个用户可指定的字段,他们可以在其中提供要导出的文件名的格式,以及每个元素的波浪字符组合(即一个名为“foo”的文件,带有“bar”和“baz”层,与输出文件名格式为“~f-~l.png”,将输出“foo-bar.png”和“foo-baz.png”)。我知道我会如何在 Lua 中做到这一点:

local nameformat = "~f-~l.png"
local function layer_export_name(filename, layername)
  return string.gsub(nameformat, '~.', {f=filename, l=layername})
end

如何在 GIMP 的方案中做到这一点?

重申:我需要替换字符串中的关键字。我不需要创建我已经定义的字符串的函数。

【问题讨论】:

    标签: lisp scheme gimp script-fu


    【解决方案1】:

    没有标准的 Scheme 程序可以做到这一点。我编写了以下低效但可移植的程序:

    (define (expand-keywords string tokens)
      (let loop ((slist (string->list string))
                 (in-replace-mode #f)
                 (result ""))
        (if (not (null? slist))        
            (let ((c (car slist)))
              (cond (in-replace-mode
                     (let ((token (car (cdr (assoc c tokens)))))
                       (loop (cdr slist) #f (string-append result token))))
                    ((char=? c #\~)
                     (loop (cdr slist) #t result))
                    (else 
                     (loop (cdr slist) #f (string-append result 
                                                         (make-string 1 c))))))
            result)))
    

    示例用法:

    > (expand-keywords "~f-~l.png" '((#\f "vijay") (#\l "9")))
    "vijay-9.png"
    > (expand-keywords "~f-~l.~e" '((#\f "vijay") (#\l "10") (#\e "jpg")))
    "vijay-10.jpg"
    

    如果您的 Scheme 实现提供了就地修改字符串的过程,请使用该过程而不是 string-append

    【讨论】:

    • 它并不漂亮,但它在可用资源的情况下做了它应该做的事情。
    • 如何将这个函数定义嵌套在另一个函数的范围内?
    • @Stuart P. Bentley 在 Scheme 你可以这样做:(define (func) (define (nested-func) (...)) ...)
    • @Stuart P. Bentley 试试这个:(define (func) (let ((nested-func (lambda () ..))) ..))
    【解决方案2】:

    大警告:我知道很多 Scheme,但不知道很多 GIMP 计划——显然是 TinyScheme。例如,在 Racket 中,你会写

    (format "~a-~a.png" filename layername)
    

    ...假设 layername 是一个字符串(我不清楚你的问题是否是这种情况)。

    我猜你在 TinyScheme 中没有球拍的“格式”,但你几乎肯定有“字符串附加”:

    (string-append filename "-" layername ".png")
    

    如果 layername 是一个字符串,你可能还想使用 number->string 函数,像这样:

    (string-append filename "-" (number->string layername) ".png")
    

    【讨论】:

    • 这不允许用户指定在哪里使用文件名和在哪里使用层名。
    • 根据您上面的说明,我发现我完全误解了您的问题。我的语言语义学家认为字符串并不是一个非常健壮的规范,但我看到它是一个方便的规范。维杰的回答看起来不错!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-29
    • 1970-01-01
    • 2021-08-11
    • 2010-10-24
    • 1970-01-01
    • 2021-06-18
    • 1970-01-01
    相关资源
    最近更新 更多