Lisp 如何在Scheme中创建具有可扩展关键字的字符串?
我正在编写一个GIMP脚本来将层导出到文件。我想提供一个用户指定的字段,在该字段中,他们可以为要导出的文件名提供格式,并为每个元素提供波浪形字符组合(即,一个名为“foo”的文件,其图层为“bar”和“baz”,输出文件名格式为“~f-~l.png”,将输出“foo bar.png”和“foo baz.png”)。我知道在Lua我会怎么做: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,“~.”
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())…)