LINUX.ORG.RU

SICP Упражнение 1.4


0

0

Читаю sicp, пишу на CL.
Не могу въехать, почему процедура из упражнения 1.4 не работает у меня на сбцл. Или я что-то не так понимаю?

(defun a-plus-abs-b (a b)
(if( (> b 0) + -) a b ))


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

Спасибо.
Это что бы не вычислялось значение операторов плюс и минус? Думал о чем-то таком, но не знал как написать.
А почему на схеме они этого не делают?

dont
() автор топика

У тебя записано, во-первых, неправильно

 % mzscheme
Welcome to MzScheme v4.0.1 [3m], Copyright (c) 2004-2008 PLT Scheme Inc.
> (define (a-plus-abs-b a b)
           ((if (> b 0) + -) a b))
> (a-plus-abs-b 10 2)
12
> (a-plus-abs-b 10 -2)
12

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

Потому что я пока начинающий в лиспе, схемы не было, дело было вечером, делать было нечего, под рукой был только slime настроеный под сбцл и sicp.

Кстати, а кто мне раскажет как использовать схему со slime? Читал что вроде только мит-схема с ним дружит. Как вообще люди схемой пользуются? Был бы благодарен за ссылку на хорошую статью или просто объяснения.

И еще, очень удивился, когда не нашел мит-схему в джентушных портах.

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

> Кстати, а кто мне раскажет как использовать схему со slime?

Со slime можно только scheme48, используя slime48, но все довольно корявенько и не все работает. Лучше использовать mzscheme, мне кажется, а как: есть пара модов для имакса, ну и repl, этого должно быть достаточно для ваших задач.

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

> Что у меня записано не правильно? Ты написал на схеме, я на Common Lisp.

(define (a-plus-abs-b a b) (_(if (> b 0) + -)_ a b))

Тогда в результате вычисления (if (> b 0) + -) вернется функция +/-.

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

А можно более подробно?
Всю свою сознательную линуксячую жизнь вимом пользовался, с емаксом пока еще не окончательно подружился.

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

Путаюсь в терминологии, под функцией вы имеете ввиду оператор?
Так нам видь это и нужно было.

Проблемы была в том, что CL пытался вычислить этот оператор, а добрый анонимус в самом первом посте показал мне как это обойти.

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

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

А что подробней?

(setq scheme-program-name "mzscheme")

:)

Расширения quake.el и cmuscheme.el, вроде так называется, это для mzscheme. А если scheme48, то slime48, все есть вгугле.

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

> Только до сих пор не могу понять, почему в схеме не нужно явно указывать "не вычислять оператор".

Functions (often called procedures) are first-class objects in Scheme. They can be arguments to other functions and be returned by them. They can be assigned to variables.

в CL видимо нет.

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

В любом случае для понимания данных различий, нужно почитать про различия Lisp 1 и Lisp 2

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

В CL пространства имён переменных и функций разные. Для этого и нужен синтаксический мусор, вроде #' и funcall

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

Ничего хорошего в этом нет.

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

Все, разобрался, спасибо.
Дописал еще такую процедуру
(defun run-mzscheme ()
"Run MZScheme Scheme in an Emacs buffer."
(interactive)
(require 'quack)
(let ((scheme-program-name "/usr/bin/mzscheme"))
(run-scheme scheme-program-name)))

Теперь меня интересует, можно ли сделать комплишн имен процедур по табу как в slime?

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