LINUX.ORG.RU

[lisp] тяжело в учении - шанс не дожить до боя.

 


0

0

0] (cdadar '((1 (2 (3 4 true)))))
|
((3 4 TRUE))

0] (car '((3 4 true)))
|
(3 4 TRUE)

0] (cadadar '((1 (2 (3 4 true)))))
;
|
; Warning: This function is undefined:
; CADADAR
; Error in KERNEL:%COERCE-TO-FUNCTION: the function CADADAR is undefined.
Error flushed ...

пожалуйста, объясните мне, дураку, что сие значит и какого х. оно не работает?
CMU Common Lisp CVS 19d 19d-release (19D);

ну и по такому поводу исчо вопросик:
как задать функцию, первый элемент в списке, с помощью выражения? ну, например,

0] ((car '(+ -)) 4 5)
Illegal function call.
Error flushed ...

то ись я хочу, чтобы (car '(+ -)) мне выдал "+", а далее (+ 4 5) выдало "9".

0] (+ (cons '+ '(4 5)) nil)
Argument X is not a NUMBER: (+ 4 5).
Error flushed ...

от этого я ожидал, что (+ (+ 4 5) nil) выдаст 9.

ну и до кучи: в чем разница между NIL и (NIL)? я понимаю, что (nil) - это список, хоть и пустой, а nil - это, типа, ничто, но практической разницы между ними не вижу.

ну и совсем уж до кучи, как добавить в коммон лисп поддержку кирилицы?

андрей.

anonymous

> ; Warning: This function is undefined:
> ; CADADAR

> что сие значит и какого х. оно не работает?

Английским по синему ж написано: нет такой функции, CADADAR.

> ((car '(+ -)) 4 5)

(funcall (car (list #'+ #'-)) 4 5)

> как добавить в коммон лисп поддержку кирилицы?

Ы? В какое место? У меня работает (SBCL 1.0.12; LANG=ru_RU.UTF-8):

* (setq переменная 5)

5
* переменная

5

watashiwa_daredeska ★★★★
()

> я понимаю, что (nil) - это список, хоть и пустой, а nil - это, типа, ничто

nil -- это не ничто, а пустой список. (nil) -- это список с одним элементом: пустым списком.

watashiwa_daredeska ★★★★
()

>ну и совсем уж до кучи, как добавить в коммон лисп поддержку кирилицы?

Если речь о slime, то добавь в .emacs

(setq slime-net-coding-system 'utf-8-unix)

anonymous
()
Ответ на: комментарий от watashiwa_daredeska

спасибв огромная, все понял, кроме главного - у мя в учебнике написано, что в лиспе последовательность (car (cdr (car (cdr (....))))) равносильна (cadad...r) ну, где последовательность символов "a" и "d", между символами "c" и "r" соответствует "(car " и "(cdr " , не так?
андрей

anonymous
()
Ответ на: комментарий от anonymous

> не так?

Так, но эти функции определены в явном виде для наиболее частых случаев, а не разворачиваются автоматически в вызовы car/cdr. Поэтому всяких хитрых комбинаций может и не быть.

В принципе, если очень нужны длинные хитрые последовательности car/cdr, можно написать макрос, который будет вызываться как-нибуть так: (cxr 'adada lst) и разворачиваться в вызовы car/cdr на этапе компиляции.

watashiwa_daredeska ★★★★
()
Ответ на: комментарий от Macil

>Не мучь свой моск, перейди лучше на хаскель.

Не мучь других, уйди лучше на х*й.

anonymous
()
Ответ на: комментарий от watashiwa_daredeska

> nil -- это не ничто, а пустой список.

не только:

nil - the empty list, the boolean (or generalized boolean) representing false, and the name of the empty type.

asgard
()
Ответ на: комментарий от asgard

> не только:

Ну, это примерно из той же оперы, что "0 -- это не только 0, но и false, и нулевой указатель" в C++ :) За исключением того, что nil еще и тип обозначает.

watashiwa_daredeska ★★★★
()
Ответ на: комментарий от asgard

угу.. не только это еще и костыль, о чем подробно рассказанно в sicp

UrbanSerj
()
Ответ на: комментарий от watashiwa_daredeska

Забавно, я сам с таким же успехом как и зачинатель этого топика пытался сделать то же самое, но со временем понимание ко мне пришло.

>(funcall (car (list #'+ #'-)) 4 5)

А funcall принимает не только функции, но и символы:

(funcall (first '(+ -)) 4 5)

>0] ((car '(+ -)) 4 5) >Illegal function call. >Error flushed ...

>то ись я хочу, чтобы (car '(+ -)) мне выдал "+", а далее (+ 4 5) >выдало "9".

Лисп имеет раздельные пространства имен, для функций и для значений переменных. Таким образом (let ((a (lambda (x y) (+ x y)))) (a 4 5)) не получится без (funcall a 4 5)

((car '(+ -)) 4 5) - это просто ошибка синтаксиса. Первым элементом формы должна быть функция или lambda. Например: ((lambda (x y) (+ x y)) 4 5) => 9

lambda имеет специальную поддержку, при разборе выражения она заменяется вызовом функции, для всего остального в начале исполняемой формы должен быть символ. Поставить в качестве этого символа переменную можно либо макросом, либо применив функцию FUNCALL (funcall my-var-which-stores-fun 4 5) или сразу (funcall (car (list '+ '-)) 4 5).

Макрос для исполнения выражений: (defmacro op (operand &rest args) (if (atom operand) `(,operand ,@args)) `(funcall ,operand ,@args)))

(op + 4 5) (op (car '(+ -)) 4 5)

anonymous
()
Ответ на: комментарий от watashiwa_daredeska

Забавно, я сам с таким же успехом как и зачинатель этого топика пытался сделать то же самое, но со временем понимание ко мне пришло.

>(funcall (car (list #'+ #'-)) 4 5) 

А funcall принимает не только функции, но и символы:

(funcall (first '(+ -)) 4 5)

>0] ((car '(+ -)) 4 5) 
>Illegal function call. 
>Error flushed ... 

>то ись я хочу, чтобы (car '(+ -)) мне выдал "+", а далее (+ 4 5) >выдало "9". 

Лисп имеет раздельные пространства имен, для функций и для значений переменных. Таким образом (let ((a (lambda (x y) (+ x y)))) (a 4 5))
не получится без (funcall a 4 5)

((car '(+ -)) 4 5) - это просто ошибка синтаксиса. Первым элементом формы должна быть функция или lambda. Например: 
((lambda (x y) (+ x y)) 4 5) => 9

lambda имеет специальную поддержку, при разборе выражения она заменяется вызовом функции, для всего остального в начале исполняемой формы должен быть символ. Поставить в качестве этого символа переменную можно либо макросом, либо применив функцию FUNCALL
(funcall my-var-which-stores-fun 4 5) или
сразу (funcall (car (list '+ '-)) 4 5).

Макрос для исполнения выражений:
(defmacro op (operand &rest args)
  (if (atom operand)
     `(,operand ,@args))
     `(funcall ,operand ,@args)))

(op + 4 5)
(op (car '(+ -)) 4 5)










anonymous
()

>ну и до кучи: в чем разница между NIL и (NIL)? я понимаю, что (nil) - это список, хоть и пустой, а nil - это, типа, ничто, но практической разницы между ними не вижу. 

NIL - это ничто (в том числе и пустой список), аналог NULL в Си.

(NIL) - не пустой список, это список из одного элемента,значение которого равно NIL.
В виде CONS ячеек (потребуется всего одна) это выглядит как (NIL . NIL)

Создать такой список можно (cons nil nil) или (list nil).

К тому же:
(length '(nil)) => 1

anonymous
()

> (+ (cons '+ '(4 5)) nil) 

Разберем, что ты тут делаешь.

(+ (cons '+ '(4 5)) nil) 
=>
(funcall '+ (funcall 'cons '+ '(4 5)) nil)

Вызвать функцию + с аргументами 
1) вызвать функцию CONS с аргументами + и списоком (4 5)
2) NIL

Ошибка уже видна, NIL не является числом, а + работает только с числами.

Далее получается:
Вызвать функцию + с аргументами
1) Список (+ 4 5)
2) NIL

Нельзя с помощью + сложить список и NIL :-)

Если очень надо, то можно использовать EVAL, который принимает список
и выполняет его:


(cons (eval (cons '+ '(4 5))) NIL) => (9)

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.