|
Жить не можем без проблем!
|
|
|
| парочка вопросов |
[Apr. 7th, 2012|12:39 pm] |
В процессе изучения Лиспа натыкаюсь на некоторые моменты, с которыми пока не могу разобраться.
1) sbcl & nunion
Введём такой простой код в repl clisp, gcl и sbcl (setf a '(1 2 3)) (setf b '(4 5 6)) (nunion a b) ; clisp, gcl => '(1 2 3 4 5 6) ; sbcl => '(3 2 1 4 5 6)
А теперь узнаем значение a: в clisp и gcl получим '(1 2 3 4 5 6), а в sbcl -- '(1 4 5 6).
Вопрос: кто неправ? У clisp и gcl результат логичный и ожидаемый, у sbcl -- не пойми что. Если поведение sbcl правильное, то каков смысл в существовании nunion?
HyperSpec ситуацию не прояснил.
2) gcl
Возьмём такую простую программку для проверки:
(defun test (a) (print a))
(test 6)
$ gcl -f test.lisp
Error: The variable A is unbound. Fast links are on: do (si::use-fast-links nil) for debugging Error signalled by SYSTEM::SET-UP-TOP-LEVEL. Backtrace: PRINT
Если в начало добавить (si::use-fast-links nil), то запускается. Чего он хочет? |
|
|
| Безусловный интерпретатор LISP на LISP |
[Feb. 27th, 2012|10:30 am] |
Здравствуйте!
У меня возникла задача, которую можно сформулировать целиком в терминах языка LISP.
Требуется найти такие функции encode, decode и reduce, что
(decode (reduce … (reduce (encode (quote expr))) … ))
для некоторого конечного количества применений reduce является результатом интерпретации выражения expr, в котором можно ограничиться переменными и lambda одного аргумента, причем возвращаемое значение encode — это рекурсивное S-выражение memory с циклами без атомов, а функция reduce должна иметь следующий вид:
(lambda (memory)
(set (c[ad]*r memory) (c[ad]*r memory))
(set (c[ad]*r memory) (c[ad]*r memory))
…
(set (c[ad]*r memory) (c[ad]*r memory))
memory
) Был бы признателен за помощь в решении данной задачи.
Заранее спасибо. |
|
|
| group |
[Feb. 17th, 2012|09:22 am] |
Доброго времени суток. Нужна была функция, которая группирует список группами по несколько элементов. Получился не совсем красивый велосипед. Никто из сообщества не поделиться более элегантным решением?
(define (group lst n) (define (group2 n2 lst2 group grouped) (cond ((<= (length lst2) n2) (append grouped (list lst2))) ((= n2 0) (group2 n lst2 '() (append grouped (list (reverse group))))) (else (group2 (- n2 1) (mcdr lst2) (cons (car lst2) group) grouped)))) (group2 n lst '() '() ))
[UPD] Спасибо всем за ответы. В комментариях подали идею сделать более функциональную реализацию. Получилось что-то такое:
(define (split n lst) (map (lambda(x)(take n x)) (append (list lst) (reverse (cdr (unfold (lambda(x)(drop n x)) lst empty?) )))))
(define (unfold func init pred) (define (unfold2 func init pred res) (let ((x (func init))) (if (pred init) res (unfold2 func x pred (cons x res) )))) (unfold2 func init pred '()))
(define (drop n lst) (if (or (= n 0) (empty? lst)) lst (drop (- n 1) (cdr lst))))
(define (take n lst) (define (take2 lst n res) (if (or (empty? lst) (= n 0)) (reverse res) (take2 (cdr lst) (- n 1) (cons (car lst) res)))) (take2 lst n '())) |
|
|
| скобки в Scheme |
[Feb. 13th, 2012|11:39 am] |
Возможно достаточно глупый вопрос, но я не совсем понимаю в какую сторону копать.
(define def1 (let ( (i 0) ) (lambda () (set! i (+ i 1)) i)))
(define (def2) (let ( (i 0) ) (lambda () (set! i (+ i 1)) i)))
Почему одна из функций увеличивает внутреннюю переменную, а другая все время возвращает один и тот же результат. Я понимаю, что дело в скобках, но не совсем ясно как это работает. |
|
|
| вопрос новичка |
[Mar. 2nd, 2011|02:52 pm] |
В чём принципиальное отличие операторов set, setq и setf? Как я понял, set связывает имя и значение, setq связывает атом и значение, setf связывает ячейку памяти и значение. Не могли бы вы объяснить мне на каком-нибудь ярком примере разницу в работе и применении на практике этих операторов? |
|
|
| Точность вычислений - числа с плавающей точкой. Экспонента считается неверно? |
[Jan. 23rd, 2011|01:29 am] |
Нашел баг в библиотеке alexandria: субфакториалы (http://en.wikipedia.org/wiki/Subfactorial) читаются неверно, начиная с 11.
Формула там верная - (floor (/ (+ 1 (factorial n)) (exp 1)))
Но, например, для 11 получается (/ 39916801 2.7182817) => 1.4684571e7, после округления получаем 14684571 вместо 14684570.
Ладно, точность (exp 1) маленькая, пишем явно (/ 39916801 2.7182818284590452353602874713526624977572470936999595749669), но все равно получаем 1.4684571e7
Python, например, считает точнее: >>> 39916801 / 2.7182818284590452353602874713526624977572470936999595749669 14684570.445231671
Как это побороть (считать с большей точностью)?
Компилятор - SBCL
P.S. Обнаружил, что экспонента считается неверно. CL-USER> (exp 1) 2.7182817
А более точное значение - 2.7182818284590452353602874713526624977572470936999595749669..., т.е.должно округляться до 2.7182818
P.P.S Уже подсказали, что надо писать (exp 1d0), тогда проблемы с точностью решаются. В общем-то, это и будет фиксом для alexandria:subfactorial, но только для чисел до 18 включительно. Другая формула нужна. |
|
|
| Почему LISP? |
[Jan. 13th, 2011|02:05 pm] |
|
Как говорил Ворошилов, вопрос к Знатокам (к знатокам LISP-а в данном случае)! Почему таки LISP? Или, если конкретнее, вопроса три:
- Для каких именно задач LISP подходит больше, чем другие языки?
- За счёт чего для них он подходит больше?
- В чём именно выражается его преимущество?
Если не в лом, приведите, pls, коротенькие иллюстрации на LISP-е (или ссылочку на них). Заранее благодарен!
Исходно данный пост был размещён в сообществе ru_programming, но там Знатоков, способных ответить внятно и по сути, увы, не нашлось :( |
|
|
| Code Review Request: Studious Student |
[Jan. 11th, 2011|04:46 pm] |
Решил вернуться к изучению Common Lisp, в рамках чего порешал задачки на квалификации Facebook Hacker Cup.
Под катом мое решение задачи "Studious Student". Прошу посмотреть код и подсказать, что можно сделать лучше (быстрее, проще). ( Read more... ) |
|
|
| Сводный псто. |
[Dec. 7th, 2010|11:30 am] |
В помощь выбирающему языг:
задан список файлов в командной строке, надо вывести последовательно 1-ю строку из 1-го файла 1-ю строку из 2-го файла 1-ю строку из 3-го файла ... 1-ю строку из N-го файла 2-ю строку из 1-го файла 2-ю строку из 2-го файла 2-ю строку из 3-го файла ... 2-ю строку из N-го файла
ну и так далее, причем количество строк в файлах разное
( Haskell, Lisp, OCaml, Java, Perl, Python, Ruby, C#, C++ ) |
|
|
| SICP по-русски. |
[Sep. 17th, 2010|08:36 am] |
Сделал перевод третьей лекции SICP, пусть здесь повисит, может кому-нибудь будет интересно.
Предыдущие две лекции искать где-то здесь: http://ztarlitz.livejournal.com/32317.html |
|
|
| navigation |
| [ |
viewing |
| |
most recent entries |
] |
| [ |
go |
| |
earlier |
] |
| |
|
|