В схемата продължавам да получавам грешка: ( : 1) кола: аргумент 1 трябва да бъде: чифт, защо?

Намерих тази страница, обясняваща, че някои от функциите на gimp няма да връщат стойности последователно, така че внедрих do while цикъл, за да се уверите, че функциите връщат двойки, преди да използвате car. Все пак получавам грешката Error: ( : 1) car: argument 1 must be: pair, но не съм сигурен как е възможно това, тъй като трябва да продължи да изпълнява функцията, докато не върне двойка.

(define (script-fu-scratchpad drawable)
  (let* ((imgHeight 0)
         (imgWidth)
         (bpp)
         (pixel))
    (set! imgHeight (gimp-drawable-height drawable))
    (do ()
        [(pair? imgHeight)]
      (set! imgHeight (gimp-drawable-height drawable)))
    (set! imgHeight (car imgHeight))

    (set! imgWidth (gimp-drawable-width drawable))
    (do ()
        [(pair? imgWidth)]
      (set! imgWidth (gimp-drawable-width drawable)))
    (set! imgWidth (car imgWidth))

    (set! bpp (gimp-drawable-bpp drawable))
    (do ()
        [(pair? bpp)]
      (set! bpp (gimp-drawable-bpp drawable)))
    (set! bpp (car bpp))

    (display bpp) (newline)
    (set! pixel (cons-array bpp 'byte))
    (aset pixel 0 150)
    (aset pixel 1 150)
    (aset pixel 2 150)
    (aset pixel 3 0)

    (gimp-drawable-set-pixel drawable (/ imgHeight 2) (/ imgWidth 2) bpp pixel)
    (gimp-context-set-background '(100 100 100))
    (define county 0)
    (define countx 0)
    (do ()
        [(= countx imgWidth)]
      (do ()
          [(= county imgHeight)]
        (gimp-drawable-set-pixel drawable county countx bpp pixel)
        (set! county (+ county 1)))
      (set! countx (+ countx 1)))))

В отговор на GoZoner го редактирах и получих следната грешка: Error: (:1) car: argument 1 must be: pair

(define
    (script-fu-scratchpad drawable)
    (let*
        ( 
            (imgHeight 0)
            (imgWidth 0)
            (bpp 0)
            (pixel 0)
        )

        (set! imgHeight (gimp-drawable-height drawable))    
        (set! imgWidth (gimp-drawable-width drawable))

        (set! bpp (gimp-drawable-bpp drawable))
        (do ()
            [(pair? bpp)]
            (set! bpp (gimp-drawable-bpp drawable))
        )
        (set! bpp (car bpp))

        (display bpp) (newline)
        (set! pixel (cons-array bpp 'byte))
        (aset pixel 0 150)
        (aset pixel 1 150)
        (aset pixel 2 150)
        (aset pixel 3 0)

        (gimp-drawable-set-pixel drawable (/ imgHeight 2) (/ imgWidth 2) bpp pixel)
        (gimp-context-set-background '(100 100 100))
        (define county 0)
        (define countx 0)
        (do ()
            [(= countx imgWidth)]
            (do ()
                [(= county imgHeight)]
                (gimp-drawable-set-pixel drawable county countx bpp pixel)
                (set! county (+ county 1))
            )
            (set! countx (+ countx 1))
        )
    )
)

person JVE999    schedule 21.04.2014    source източник
comment
Докато гуглих, прочетох, че while е единствената циклична конструкция в Script-fu. И така, какво е do?   -  person uselpa    schedule 21.04.2014
comment
@uselpa Информацията, която намерихте, изглежда е остаряла. SIOD нямаше do, но gimp сега използва TinyScheme, което е по-пълна реализация на схемата.   -  person Terje D.    schedule 21.04.2014
comment
това е нещо, което не обичам другите да правят, дори и аз, но ето го: ако се опитвате да научите схема или lisp, добре, давайте. Но ако се опитвате да правите нещата със скриптове или плъгини на GIMP, може би трябва да опитате вместо това да използвате Python. Като по-високо ниво и императивен език ще намерите много по-лесно да давате нареждания на GIMP, без да се налага да се притеснявате за такива дребни езикови подробности като как да проверите дължината на списък или как да извлечете конкретен елемент от списък.   -  person jsbueno    schedule 21.04.2014
comment
@jsbueno След като научих първия си език за програмиране през 90-те, лесно е да се съглася с теб, но това е само защото Python е познат алголски диалект. Ако все още не знаете диалект, LISP е също толкова лесен за научаване, колкото и ALGOL. В Python този запис SO би бил TypeError: 'int' object has no attribute '__getitem__' или може би IndexError: list index out of range с добавено защо в края.   -  person Sylwester    schedule 21.04.2014
comment
Преди известно време направих въведение в Python на Gimp, но се оказа по-ангажиращо от Script-fu с TinyScheme. Освен това по някаква причина не можах да открия, че Scheme има while, всъщност само do. Не знаех, че TinyScheme има do, а Scheme има while.   -  person JVE999    schedule 24.04.2014


Отговори (1)


Няколко неща.

  1. Във вашето най-високо ниво let* трябва да инициализирате всяка от променливите, а не само imgHeight или нито една от тях. Действителната схема изисква всички да бъдат инициализирани.

  2. Въз основа на името заедно, не бих очаквал (gimp-drawable-height drawable) да върне списък/против; трябва да върне височина като число. Следователно:

    • Не мога да си представя (pair? imgHeight) някога да е истина

    • Бих очаквал (car imgHeight) да се провали - и това очевидно се основава на грешката, която сте докладвали.

  3. Функцията aset вероятно действа върху многоизмерен ((>= rank 2)) масив. Следователно неговият аргумент „индекс“ трябва да има повече от едно цяло число. Но може би aset е просто vector-ref във варианта за скриптове на GIMP.

[РЕДАКТИРАНЕ: за да бъда по-конкретен] Анотирах вашия код

(set! bpp (gimp-drawable-bpp drawable))         ; bpp is NOT a pair
(do ()
    [(pair? bpp)]                               ; bpp is NOT a pair
 (set! bpp (gimp-drawable-bpp drawable)))
(set! bpp (car bpp))                            ; bpp is NOT a pair => ERROR
person GoZoner    schedule 21.04.2014
comment
Вече бях пробвал стъпка 2 и получих грешка. Продължих и го изпробвах. Не съм сигурен как бих приложил съвета от списък номер 3. Новата грешка е Error: (:1) car: argument 1 must be: pair - person JVE999; 24.04.2014
comment
Може би (set! bpp (car bpp)) се проваля, защото bpp е число, а не двойка? - person GoZoner; 24.04.2014
comment
Предполага се. Мислех обаче, че кодът ще се увери, че връща чифт. - person JVE999; 25.04.2014
comment
Вашият bpp никога не е чифт. Така (car bpp) се проваля. Вижте документацията: gint gimp_drawable_bpp (gint32 drawable_ID); Връща се цяло число, а не двойка, car е неуспешно. Моля, гласувайте и маркирайте този отговор. - person GoZoner; 25.04.2014