В схеме я продолжаю получать Error: ( : 1) car: аргумент 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, которая является более полной реализацией Scheme.   -  person Terje D.    schedule 21.04.2014
comment
это то, что я не люблю, когда делают другие, даже я, но вот что: если вы пытаетесь выучить схему или шепелявить, ладно, вперед. Но если вы пытаетесь сделать что-то с помощью скриптов или плагинов 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. Кроме того, по какой-то причине я не мог найти, что у Схемы был 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)) массивом. Поэтому его аргумент 'index' должен иметь больше, чем одно целое число. Но, возможно, aset — это просто vector-ref в варианте сценария GIMP.

[EDIT: чтобы быть более конкретным] Я прокомментировал ваш код

(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