Lisp 如何在Scheme中创建具有可扩展关键字的字符串?

Lisp 如何在Scheme中创建具有可扩展关键字的字符串?,lisp,scheme,gimp,script-fu,Lisp,Scheme,Gimp,Script Fu,我正在编写一个GIMP脚本来将层导出到文件。我想提供一个用户指定的字段,在该字段中,他们可以为要导出的文件名提供格式,并为每个元素提供波浪形字符组合(即,一个名为“foo”的文件,其图层为“bar”和“baz”,输出文件名格式为“~f-~l.png”,将输出“foo bar.png”和“foo baz.png”)。我知道在Lua我会怎么做: localnameformat=“~f-~l.png” 本地功能层\导出\名称(文件名、层名称) 返回string.gsub(nameformat,“~.”

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

localnameformat=“~f-~l.png”
本地功能层\导出\名称(文件名、层名称)
返回string.gsub(nameformat,“~.”,{f=filename,l=layername})
结束
我如何在GIMP的方案中做到这一点


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

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

(format "~a-~a.png" filename layername)
。。。假设layername是一个字符串(我不清楚您的问题是否如此)

我猜TinyScheme中没有racket的“格式”,但几乎可以肯定有“字符串附加”:

如果layername是字符串,您可能还需要使用number->string函数,如下所示:

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

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

(format "~a-~a.png" filename layername)
。。。假设layername是一个字符串(我不清楚您的问题是否如此)

我猜TinyScheme中没有racket的“格式”,但几乎可以肯定有“字符串附加”:

如果layername是字符串,您可能还需要使用number->string函数,如下所示:

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

没有标准的方案程序来执行此操作。我用高效但可移植的程序编写了以下内容:

(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"

如果您的方案实施提供了一个就地修改字符串的过程,请使用该过程,而不是使用
字符串追加

执行此操作没有标准方案过程。我用高效但可移植的程序编写了以下内容:

(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"

如果您的方案实施提供了一个修改字符串的过程,请使用该过程,而不是使用
字符串附加

,因为该过程不允许用户指定在何处使用文件名和在何处使用层名称。根据您上面的说明,我发现我完全误解了您的问题。我的语言语义学家认为字符串实际上不是一个非常健壮的规范,但我认为它是一个方便的规范。维杰的答案看起来不错!这不允许用户指定在何处使用文件名和在何处使用layername。根据您上面的说明,我发现我完全误解了您的问题。我的语言语义学家认为字符串实际上不是一个非常健壮的规范,但我认为它是一个方便的规范。维杰的答案看起来不错!它并不漂亮,但它利用可用的资源做了它应该做的事情。我如何将此函数定义嵌套在另一个函数的范围内?@Stuart P.Bentley在Scheme中您可以这样做:
(define(func)(define(nested func)(…)…)
@Stuart P.Bentley尝试一下:
(define(func)(让((nested func)(lambda()))…)
这并不漂亮,但它用可用的资源做了它应该做的。我如何将此函数定义嵌套在另一个函数的范围内?@Stuart P.Bentley在Scheme中您可以这样做:
(定义(func)(定义(嵌套func)(…)…)
@Stuart P.Bentley尝试一下:
(定义(func)(让((嵌套func))(lambda())…)