Просуммировать по длине вектора, новичковое

Есть кто живой? Спасите-помогите-мы-сами-не-местные.
Записываю музыку в lilypond-е, который написан на scheme guile
Хочу (и не могу сказать :) ) написать функцию, которой передавать вектор из скольких-то N чисел, не знаю из скольки (каждый раз сколько понадобится), а она бы склеивала столько N раз строку из заготовок. Термин "хвостовая рекурсия" уже паники не вызывает )

Подскажите, как узнать число элементов в векторе (или листе, если вектора не окажется в доступных из lilypond'а типах)
Спасибо!

Морда-1
  • yushi

Встроенная Схема и указатель на объект

Здравствуйте!

Есть проект на C++, к некоторым классам которого автоматически создаются привязки с помощью SWIG. Есть желание прикрутить к нему скрипты на Scheme. Вопрос: есть ли какой-то способ вызвать из кода на C++ схемную функцию, передав ей в качестве аргумента указатель на объект? (Желательно обёрнутый в SWIG-овский тип, но если у какой-то из встраиваемых Схем, не обязательно из числа поддерживаемых SWIG, есть для этого собственные средства, в крайнем случае сгодятся и они.)

Самостоятельно я способа это сделать в документации на SWIG и на три поддерживаемых им интерпретатора (CHICKEN, Guile, Racket) не нашёл. Пока остановился на таком решении: есть уникальный индентификатор объёкта (в моём случае оказалось удобно использовать обычную C-шную строку, char*) и C-шная функция, получающая по этому идентификатору указатель на объект. В схемную функцию передаётся идентификатор, а в написанных на C++ функциях, экспортируемых в Схему, по этому идентификатору снова получается указатель на объект. Но мне самому это решение не нравится, и ручной работы получается многовато, и архитектура выходит, на мой вкус, уродливой.

Кстати, все три Схемы, которые поддерживаются SWIG, показались мне не очень подходящими для прикручивания к плюсовому проекту. В Guile 1.8 тип SCM несовместим со стандартом C++ (в 2.0 это вроде поправили, но 2.0 поставишь сильно не во всякое окружение, уж больно новых библиотек он хочет). В CHICKEN очень расстроила тамошняя система пакетов, работающая в обход пакетного менеджера ОС, что гарантирует танцы с бубном при деплое (у меня не удалось заставить её нормально и стабильно работать). В Racket — количество телодвижений, необходимых, чтобы дёрнуть интерпретатор из своего C-шного кода.

Кто использовал скрипты на Scheme в своих приложениях на C++? Каким интерпретатором для этого пользовались? Насколько реально прикрутить в этих целях, например, Gambit?

SICP по-русски.

Сделал перевод первых двух лекций SICP.



Если кому-нибудь интересно вторую лекцию искать здесь ЦКУНК! 
Если кто-то не в курсе SICP это вводный курс по программированию читался в MIT, в начале 80х. Не смотря на то что прошло уже четверть века, актуальности лекции не потеряли. 
2010
  • voins

(no subject)

Премодерацию включил. Добавил alexott в число модераторов, так что теперь нас трое. Будет плохо - поправим по ходу.
2010
  • voins

(no subject)

Может премодерацию введём? А то, честно говоря, уже несколько поднадоело спам чистить. Возражения есть?
recycled

tail recursion [closed]

Даны две функции:
(define accumulate-if-1 (lambda (test? lst init)
                    (define iter (lambda (lst acc)
                                   (cond ((empty? lst) acc)
                                         ((test? (car lst)) (iter (cdr lst) (+ acc (car lst))))
                                         (else (iter (cdr lst) acc)))))
                    (iter lst init)))

(define accumulate-if-2 (lambda (test? lst init)
                          (cond ((empty? lst) init)
                                ((test? (car lst)) (accumulate-if-2 test? (cdr lst) (+ init (car lst))))
                                (else (accumulate-if-2 test? (cdr lst) init)))))
Судя по затратам памяти и процессорного времени вторая функция не желает разворачивать в цикл. Объясните, пожалуйста, почему? Заранее благодарен.
  • Current Mood
    quixotic quixotic
george
  • aawee

Связь PLT Scheme и C(++,#)

Приходилось ли вам реализовывать описанное здесь http://docs.plt-scheme.org/inside/index.html ? Имеется ввиду возможность вызова на Схеме функций из Си-библиотек.

Одно из первых что надо сделать в п.1.2.1 http://docs.plt-scheme.org/inside/overview.html
- это "скомпилировать" C-файл при помощи mzc.exe - при этом он не компилирует его сам, а использует найденный компилятор.

Вопрос - какой использовать компилятор, чтобы mzc его видел? (Windows) У меня только Ms Visual студия - mzc говорит "compile-extension: can't find an installed C compiler".

И реально ли связать Схему именно с C#? потому что я видел упоминания только о C/C++.

Благодарю за ответы :)
  • zhengxi

specialize

Вопрос не про этот конкретный пример, это как-бы паттерн.
На примере проще объяснить.
; допустим есть функция
(define (vector-cmp-2? vec-length vec-ref ; интерфейс вектора
                       val=? val<?        ; интерфейс элемента вектора
                       a b)               ; сравниваемые вектора
                                          ; -1 если a < b
                                          ;  0 если a = b
                                          ;  1 если a > b
  (let ((a-len (vec-length a))
        (b-len (vec-length b)))
    (let loop ((i 0))
      (let ((a-end (= i a-len))
            (b-end (= i b-len)))
        (cond
          ((and a-end b-end) 0)
          (a-end -1)
          (b-end 1)
          (else 
           (let ((a-val (vec-ref a i))
                 (b-val (vec-ref b i)))
             (if (val=? a-val b-val)
                 (loop (+ 1 i))
                 (if (val<? a-val b-val) -1 1)))))))))

; частные случаи
(define (string-cmp? a b)
  (vector-cmp-2? string-length string-ref char=? char<? a b))

(define (string-cmp-ci? a b)
  (vector-cmp-2? string-length string-ref char-ci=? char-ci<? a b))

(define (bytes-cmp? a b)
  (vector-cmp-2? bytes-length bytes-ref = < a b))

; ну и так далее


Всё бы хорошо, но медленно.
Что делать?
Можно несколько раз скопипейстить тушку функцию vector-cmp-2
Можно превратить vector-cmp-2 в макрос.
Будет быстрее раза в 4.

Но оба варианта, на мой взгляд, не очень красивые.

Хочется иметь макрос specialize, оставить vector-cmp-2 и писать так:

(define (string-cmp? a b)
  (specialize vector-cmp-2? string-length string-ref char=? char<? a b))

(define (string-cmp-ci? a b)
  (specialize vector-cmp-2? string-length string-ref char-ci=? char-ci<? a b))

(define (bytes-cmp? a b)
  (specialize vector-cmp-2? bytes-length bytes-ref = < a b))


Только не понятно как такой макрос написать :(