Как я могу создать строку с расширяемыми ключевыми словами в схеме? - PullRequest
1 голос
/ 28 июня 2011

Я пишу 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?

Повторюсь: мне нужно заменить ключевыми словами в строке . Мне не нужна функция, которая создает строку, которую я уже определил.

Ответы [ 2 ]

4 голосов
/ 28 июня 2011

Для этого не существует стандартной процедуры 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"

Если ваша реализация Схемы предоставляет процедуру для изменения строки на месте, используйте ее вместо string-append.

0 голосов
/ 28 июня 2011

BIG CAVEAT: я знаю много схем, но не много схем GIMP - по-видимому, TinyScheme.Например, в Racket вы написали бы

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

..., предполагая, что имя слоя является строкой (из вашего вопроса мне не ясно, так ли это).

IЯ предполагаю, что у вас нет "формата" ракетки в TinyScheme, но у вас почти наверняка есть "string-append":

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

Если layername является строкой, вы, вероятно, также захотите использоватьфункция number-> string, например:

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