Как снять кавычки в схеме GIMP

Я никогда не использовал никаких других реализаций, кроме GIMP script-fu, и я даже новичок в схеме GIMP. Так что, возможно, я ошибаюсь. Однако в консоли Script-Fu не работает следующее:

(define x 13)
(define s 'x) ; or (define s `x)
,s => Error: eval: unbound variable: unquote 

так же

(unquote s) => Error: eval: unbound variable: unquote 

Мне кажется, что "," планировалось сработать, но раскаты не реализованы. Если да, то как решить следующую проблему?

(define x 13)
(define y 7)
; define procedure to swap x and y
(define (swap) 
  (let ((t 0))
    (set! t ,'x)
    (set! x ,'y)
    (set! y t)
  )
)

Это должно выполняться несколько раз, поэтому (set! t x)... не сработает.


person FERcsI    schedule 07.10.2013    source источник
comment
unquote работает не так, как вы думаете, в любой реализации. Кроме того, я не понимаю, что вы подразумеваете под (set! t x), не будет работать.   -  person Chris Jester-Young    schedule 07.10.2013
comment
В частности, unquote не является eval, и для этого также не следует использовать eval.   -  person Chris Jester-Young    schedule 07.10.2013
comment
Сначала я попробовал (set! t x), но это не сработало. Он поменял местами значения только один раз и никогда больше. Я думал, что значения x и y были оценены во время определения. Сейчас еще раз попробовал, работает. Не знаю, что я сделал не так. Спасибо.   -  person FERcsI    schedule 08.10.2013


Ответы (1)


Ваша функция swap будет работать как:

(define (swap)
  (let ((t 0))
    (set! t x)
    (set! x y)
    (set! y t)))

потому что set! — это синтаксическое ключевое слово, которое специально оценивает свои аргументы. Первый аргумент (t в первом выражении set! в swap выше) не оценивается; скорее он используется для определения местоположения. Второй аргумент (x) оценивается и в данном случае возвращает значение, хранящееся в местоположении, на которое ссылается идентификатор (x).

Синтаксическое ключевое слово define работает аналогично. Первый аргумент не оценивается; используется для создания новой локации; оценивается второй аргумент. Итак, для вашего примера unquote не нужно, просто используйте:

(define s x)

Если вы пытаетесь определить s так, чтобы он возвращал текущее значение x, а не значение, связанное с x, когда выделяется s, то сделайте s функцией:

(define (s) x)

Тогда выражение (s) вернет то, к чему в данный момент привязано x.

person GoZoner    schedule 07.10.2013
comment
Это было первое, что я попробовал, но это не сработало (об этом я написал в своем посте). Он поменял местами значения только один раз и никогда больше. Я думал, что значения x и y были оценены во время определения. Сейчас еще раз попробовал, работает. Не знаю, что я сделал не так. Спасибо. - person FERcsI; 08.10.2013