LINUX.ORG.RU

История изменений

Исправление monk, (текущая версия) :

«size», 10.0,

Тут даже не _string ...

Можно сочинить что-то такое:

(define (node-new-child gegl params)
  (define (get-type x)
    (cond
     [(integer? x) _int]
     [(flonum? x) _float]
     [(string? x) _string]
     [else _pointer]))
  (define-values (args arg-types)
    (let loop ([args null] [arg-types null] [params params])
      (if (null? params)
          (values (reverse (cons #f args) (reverse (cons _pointer arg-types)))
          (let ([param (car params)])
            (loop (list* (cdr param) (symbol->string (car param)) args)
                  (list* (get-type (cdr param)) _string arg-types)
                  (cdr params))))))
  (defgegl gegl-node-new-child (_cprocedure arg-types _pointer))
  (apply gegl-node-new-child gegl args))

И использовать как

(node-new-child gegl `((operation "gegl:text")
                       (size 10.0)
                       (color ,(gegl-color-new "rgb(1.0,1.0,1.0)"))))

Кстати, если в defgegl имя и c-id отличаются только дефисами, то c-id не нужен.

А можно сделать как в Haskell. Там стоит

(defgegl gegl-node-new-child (_fun _pointer (_string = "operation") _string (_pointer = #f) -> _pointer)

А дальнейшие поля заполняются через gegl-node-set.

Исходная версия monk, :

«size», 10.0,

Тут даже не _string ...

Можно сочинить что-то такое:

(define (node-new-child gegl params)
  (define (get-type x)
    (cond
     [(integer? x) _int]
     [(flonum? x) _float]
     [(string? x) _string]
     [else _pointer]))
  (define-values (args arg-types)
    (let loop ([args null] [arg-types null] [params params])
      (if (null? params)
          (values (reverse (cons #f args) (reverse (cons _pointer arg-types)))
          (let ([param (car params)])
            (loop (list* (cdr param) (symbol->string (car param)) args)
                  (list* (get-type (cdr param)) _string arg-types)
                  (cdr params))))))
  (defgegl gegl-node-new-child (_cprocedure arg-types _pointer))
  (apply gegl-node-new-child gegl args))

И использовать как

(node-new-child gegl `((operation "gegl:text)
                       (size 10.0)
                       (color ,(gegl-color-new "rgb(1.0,1.0,1.0)"))))

Кстати, если в defgegl имя и c-id отличаются только дефисами, то c-id не нужен.

А можно сделать как в Haskell. Там стоит

(defgegl gegl-node-new-child (_fun _pointer (_string = "operation") _string (_pointer = #f) -> _pointer)

А дальнейшие поля заполняются через gegl-node-set.