?

Log in

No account? Create an account
Scheme Community
 
[Most Recent Entries] [Calendar View] [Friends]

Below are the 20 most recent journal entries recorded in Russian Scheme Language Community's LiveJournal:

[ << Previous 20 ]
Friday, September 2nd, 2016
12:23 pm
[bashusha]
Просуммировать по длине вектора, новичковое

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

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

Saturday, September 10th, 2011
9:30 am
[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?
Friday, September 17th, 2010
8:31 am
[ztarlitz]
Thursday, September 9th, 2010
11:21 pm
[ztarlitz]
SICP по-русски.
Сделал перевод первых двух лекций SICP.



Если кому-нибудь интересно вторую лекцию искать здесь ЦКУНК! 
Если кто-то не в курсе SICP это вводный курс по программированию читался в MIT, в начале 80х. Не смотря на то что прошло уже четверть века, актуальности лекции не потеряли. 
Monday, July 12th, 2010
1:57 pm
[voins]
Премодерацию включил. Добавил alexott в число модераторов, так что теперь нас трое. Будет плохо - поправим по ходу.
Thursday, July 8th, 2010
11:09 am
[voins]
Может премодерацию введём? А то, честно говоря, уже несколько поднадоело спам чистить. Возражения есть?
Tuesday, April 13th, 2010
5:39 pm
[vannadis]
Kawa теперь можно использовать для разработки под Google Android.

Статья на официальном сайте:
http://per.bothner.com/blog/2009/AndroidHelloScheme/
Wednesday, March 10th, 2010
11:07 pm
[city_idiot]
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
Saturday, December 12th, 2009
9:02 pm
[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++.

Благодарю за ответы :)
Thursday, December 3rd, 2009
12:51 pm
[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))


Только не понятно как такой макрос написать :(
Monday, November 30th, 2009
12:40 pm
[zhengxi]
Почему такой код не валидный:
(define (f)
  (define x 1)
  (printf "~a~n" x)
  (define y 2)  ; тут ошибка - нельзя define после вызова функции
  (void))
А такой валидный:
(define (f2)
  (define x 1)
  (define _ (printf "~a~n" x))
  (define y 2)
  (void))


Какой смысл на запрет define после вызова функции ?
Tuesday, November 24th, 2009
6:12 pm
[aawee]
PLT Схема..
Изучая PLT Scheme, не могу найти ответы на ряд вопросов.

1) пользуюсь т.н. средой разработки Dr.Scheme. Здесь при выборе опции Choose Language (выбрать язык) появляется много вариантов - в чем суть этих "языков"? Какой из них ближе к собственно Scheme?

2) как конкатенировать (объединять) строки?

3) пытаюсь написать класс..
(define point% (class object%
(init xin)
(init yin)
(define x xin)
(define y yin)
(super-new)
))
поля получаются автоматически private. как сделать public поля?
имею догадку что такой возможности нет, из-за идеи "правильного программирования" у функциональных языков. Но нигде не нашел упоминания что это невозможно..
Friday, November 20th, 2009
1:12 pm
[zhengxi]
Как называется стандартная функция, которая делает вот такое?
; (indexed-zip '(1 0 0 2 1) ; список чисел от 0 до N-1
;              '("A" "B" "C") '("a" "b" "c") '("!" "@" "#")) ; N списков
;
; результат:        '("a" "A" "B" "!" "b")
;                      |   |   |   |   |
; значения взяты из   1го 0го 0го 2го 1го списков, согласно первому списку
Wednesday, October 14th, 2009
2:45 am
[asphyx_lj]
Вопрос новичка: «выполнимые» и «невыполнимые» списки
Странный, возможно, вопрос: где определяется, выполняется ли список на месте, или нет? К примеру, можно ли рассмотреть конструкцию

(define (blah x) (...))

как вызов некой встроенной в интерпретатор функции "define"? Если да, то, получается, что обработчик этой "функции" сам определяет, eval ли ему его аргументы, или не eval. Тогда почему явное указание "не eval"

(define '(blah x) '(...))

не верно? Нам ведь нужно взять тело функции как есть, в виде списка, и связать его с именем "blah". В чём я заблуждаюсь?
Monday, October 5th, 2009
8:33 pm
[xsbos]
Вызов лямбда-функции из списка
Приветствую! Изучаю Scheme (среда DrScheme, язык mzscheme) и никак не могу разобраться, как вызвать лямбда-функцию из списка (например, первую)

Т.е. пусть есть список
(define lst
  '(
    (lambda (x) (+ x 1))
    (lambda (x) (+ x 4))
    )
  )

((car lst) 3) ; ошибка!

Подскажите, пожалуйста, как это делается
Tuesday, August 25th, 2009
3:44 pm
[udpn]
MIT-GNU Scheme newbie problem
Доброе. Установил интерпретатор от MIT. Дабл-ЛКМ по иконке. Открывается Edwin. Что нужно в нем нажать, чтобы наконец начать интерпретацию? Можно ли этим редактором открыть файл, созданный в другой программе, как это сделать и какая у файла должна быть кодировка? Видел кто-нибудь нормальный юзер мануал на английском или русском? Стоит ли перейти на другой, более вменяемый интерпретатор Scheme?
Tuesday, August 4th, 2009
11:50 am
[yoschi]
COM-объекты в PLT-Scheme
Приветствую!

Два вопроса к тем, кто пользует MysterX в PLT-Scheme.

1) Есть ли способ остановить процесс, запущенный при создании com-объекта приложения? Нечто навроде vlax-release-object из автокадного VL. А то ведь он остается висеть в памяти даже после полного выключения программы.

2) Программы, в которых используется COM-технология довольно часто падают - хоть из DrScheme запускай, хоть откомпилированую. Причем, никаких общих признаков нет - то нормально работает, то вырубается безо всякой видимой причины со стандартным виндовским сообщением вида "PLT Scheme GUI application - обнаружена ошибка. Приложение будет закрыто". С чем это может быть связано?
Wednesday, July 8th, 2009
3:55 pm
[smalgin]
PLTScheme - (current-milliseconds)
Простой вопрос, наверное.

есть такая процедура в MIT Scheme , называется (runtime).

Типичное использование (display (- (runtime) start-time))

Я у себя держу PLT Scheme, там этой штуки нет. Зато есть (current-milliseconds)

Фишка в том, что (display (- (current-milliseconds) start-time)) внутри моего кода всегда выдает 0. Иногда почему-то 16.

В чем грабли, об которые я уже полдня натыкаюсь?

под катом код (упражнение 1.20 из SICP)
Collapse )
8:46 pm
[tentaclius]
Изменение пространства имен символа
Доброго времени суток.
Долго шарил по разным учебникам в поисках ответа на такой вопрос. Увы пока безуспешно.
Подскажите пожалуйста, кто сталкивался с подобным...

Вот пример кода:

(define (some-function a-symbol)
  (define z 11)
  (eval a-symbol))

(some-function 'z)


Естественно, в данном случае интерпретатор отрапортует об ошибке, поскольку с символом z, передаваемым в some-function не связанно значение. Вопрос в следующем: как мне сделать именно так как хочется :), тоесть, чтобы внутри функции передаваемый символ связать с новым пространством имен.

В plt-scheme достаточно много различных функций по работе с пространствами имен. Можно их создавать, выбирать и т.д. Самым, кажется, связанным с данной темой является следующий пример:

  (let ((ns (make-base-namespace)))
    (parameterize ((current-namespace ns))
      (define z 11)
      (eval '(define z 14) ns)
      (display z)
      (newline)
      (display (eval 'z)))))

но тут я наталкиваюсь на другую проблему: получается что (define z 11) и (eval '(define z 14)) действуют в различных областях имен. Т.е., как я понимаю (parameterize ((current-namespace ns)) ...) действует только для оператора (eval ...) ?
Но мне хотелось бы именно совместить определенный символ в текущем контексте (при помощи (define ...)) с передаваемым в качестве аргумента функции символом. Подскажите пожалуйста как можно (и можно ли) подобного достичь?

Спасибо заранее.
Wednesday, June 17th, 2009
1:34 am
[arhirat]
Обратные функции
Я в свободное время люблю пофантазировать на тему языков программирования, различных парадигм в программировании и всяких фишек, которые могли быть полезны. Например сегодня я хотел бы немного порассуждать на тему функций и передачи данных в них.
Ведь что такое функция? Это некоторый черный ящик, в который мы подаем данные, а на выходе получаем результат.

В качестве входных данных могут быть переменные, а так же результат выполнения других функций. В результате у нас получается дерево, при чем данные передаются всегда от вершины дерева к корню (слева на право).

В данном примере мы вычисляем логическое значение, является ли Y суммой X и 5.
А теперь вопрос на засыпку, а кто сказал, что данные должны обязательно передаваться от вершин к корню? Почему бы нам не поменять направление в некоторых ветвях, например так.

Присвоить Y значение, равное сумме X и 5. Или еще лучше вот так.

Присвоить X такое значение, чтобы его сумма с 5 равнялась Y.
Во всех языках программирования операция присвоения нового значения переменной и операция логического сравнения - это две совершенно разные операции. Обычно обозначаются либо разными символами (в C++ это = и ==), либо разными функциями. Хотя по сути это одно и то же! Мы просто в одном случае спрашиваем, а равны ли X и Y, а в другом случае утверждаем что X равен Y. Т.е. логически это одна и та же операция, только направление движения данных отличается.
Конечно, далеко не все функции обратимы как операция сложения, но все-таки это было бы очень удобно. Например операция andmap и map в каком-то смысле одинаковые, только опять же данные движутся в другом направлении. В одном случае мы спрашиваем, а будет ли истиной какое-то выражение для всех значений списка, а в другом случае мы утверждаем, что некоторое выражение является истиной для всех значений списка.
А если взять и абстрагироваться от конкретных направлений, а просто взять и объявить некоторую формулу, например "X+5=Y". Вот имеется такая взаимосвязь переменных. А потом эту формулу использовать по своему усмотрению, в одном случае мы присваиваем Y значение суммы, в другом случае мы присваиваем X нужное значение, а в третьем мы просто хотим проверить истинно ли данное выражение.
Короче, я от слов к делу. Я немного поэкспериментировал на эту тему и вот что получилось.

#lang scheme
(define (sv! f v) (keyword-apply f '(#:value) (list v) '()))
(define (gv? f) (apply f '()))
(define-syntax-rule (g? x) (lambda () x))
(define-syntax-rule (s! x) (lambda (#:value value) (set! x value)))
(define-syntax-rule (defun fun x y value getter setter)
(define (fun x y)
(lambda (#:value (value 'novalue))
(if (eq? value 'novalue)
getter
setter))))
(defun summ x y value
(+ (gv? x) (gv? y))
(sv! x (- value (gv? y))))
(defun eqv x y value
(= (gv? x) (gv? y))
(if (eq? value #t)
(sv! x (gv? y))
#f))

(define x 56)
(define (formula x y z) (eqv (summ x y) z)) ;запоминаем формулу x+y=z
(sv! (eqv (summ (s! x) (g? 5)) (g? 9)) #t) ;вычислить x такое, чтобы x+5=9
x ;возвращает 4
(sv! (formula (s! x) (g? 3) (g? 10)) #t) ;вычислить то же самое с использованием формулы
x ;возвращает 7
(gv? (formula (g? x) (g? 5) (g? 12))) ;вычислить логичекое выражение x+5=12
;возвращает ИСТИНУ
Кстати, у нас получилась определенная ленивость. Например выражение
(sv! (eqv (summ (s! x) (g? 5)) (g? 9)) #f)
не будет изменять значение x, т.к. мы передаем #f.
По-моему идея, запихнуть результат обратно функции в ж..., довольно интересна и стоит размышлений :)
[ << Previous 20 ]
About LiveJournal.com