Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [CL] переменные внутри функции 
V
    Опции темы
anatox91
Дата 11.2.2012, 16:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: нет
Всего: 13



есть задача написать функцию на лиспе с тремя аргументами, которая формирует из них список и выполняет его обработку в соответствии с заданием

Код

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

вот что получилось набросать:
Код

(defun func (x y z)
  (setf mylist (cons 'x (cons 'y (cons 'z nil))))
  (if (or (floatp (second mylist)) (rationalp (second mylist))) 
      (setf (second mylist) (* (second mylist) (second mylist)))
      (butlast mylist))
  )

но этот код почему-то не работает
когда вызываю функцию как
Код

(func 1 2.0 3)

или
Код

(func 1 23/56 4)


 то ничего не выводит
плюс был варнинг что mylist is undefined variable
в чем может быть проблема?
заранее извиняюсь если что, только начал изучать лисп

P.S. eclipse indigo + cups

Это сообщение отредактировал(а) anatox91 - 11.2.2012, 16:41


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
anatox91
Дата 11.2.2012, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: нет
Всего: 13



все, проблема решена, чуть переписал функцию 
Код

(defun func (x y z)
  (setq mylist (list x y z))
  (if (or (floatp (second mylist)) (rationalp (second mylist))) 
      (setf (second mylist) (* (second mylist) (second mylist)))
      (setf mylist (butlast mylist)))
  (print mylist)



и в другой среде (LispWorks) все отлично заработало


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
tzirechnoy
Дата 11.2.2012, 21:06 (ссылка)   | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1173
Регистрация: 30.1.2009

Репутация: нет
Всего: 16



1) И за setf, и за setq в чистых функцыях (от которых не требуется побочных эффектов) надо бить по рукам.
2) За засорение простых имён вроде mylist когда не просят -- второй раз бить по рукам.
3) У функцыи print есть побочные эффекты, которых никто не просил.
Кроме того, выдать значение переменной можно просто написав имя этой переменной. Без скобок. И если это последний оператор в форме -- то его значение и будет результатом формы.

PM MAIL   Вверх
k0rvin
Дата 13.2.2012, 08:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: нет
Всего: 5



Код

(defun func (x y z)
  (let* ((xyz    (list x y z))
         (second (second xyz)))
    (if (or (rationalp second)
            (floatp    second))
        (list (first xyz)
              (expt second 2)
              (third xyz))
        (butlast xyz))))



--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
anatox91
Дата 19.2.2012, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: нет
Всего: 13



да я уже понял все это, просто то было самое первое что пытался написать на лиспе, не привыкнув к функциональному программированию, пытался использовать лисп как с++
теперь уже потихоньку осваиваюсь


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
k0rvin
Дата 20.2.2012, 07:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 442
Регистрация: 24.1.2010

Репутация: нет
Всего: 5



Цитата(anatox91 @ 19.2.2012,  15:18)
да я уже понял все это, просто то было самое первое что пытался написать на лиспе, не привыкнув к функциональному программированию, пытался использовать лисп как с++
теперь уже потихоньку осваиваюсь

При чем тут функциональное программирование? Мой пример переписывается на C++/C/Pascal/whatever один в один


--------------------
“Object-oriented design is the roman numerals of computing.” — Rob Pike
All software sucks
PM MAIL   Вверх
_sg
Дата 22.2.2012, 10:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 16.5.2007

Репутация: 2
Всего: 2



Код

(defun square2nd-or-remove3rd (a b c)
  (if (realp b) (list a (expt b 2) c) (list a b)))

> (square2nd-or-remove3rd 1 2.2 3)
(1 4.84 3)

--------------------
vk.com/ansicommonlisp
PM MAIL   Вверх
_sg
Дата 25.4.2014, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 119
Регистрация: 16.5.2007

Репутация: 2
Всего: 2



Код

(defun square2nd-or-remove3rd (a b c)
  (if (realp b) `(,a ,(expt b 2) ,c) `(,a ,b)))

> (square2nd-or-remove3rd 1 2.2 3)
(1 4.84 3)

--------------------
vk.com/ansicommonlisp
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума LISP
Void
  • Пожалуйста, создавайте темы с содержательными названиями.
  • Lisp — это целое семейство языков. Всегда указывайте в теме используемый диалект (Common Lisp, Scheme и т.д.).
  • Уважаемые учащиеся, здесь всегда рады помочь Вам, но не делать за Вас вашу работу. У вас гораздо больше шансов получить помощь, если Вы приложите усилия и поделитесь с нами проблемами и результатами. В противном случае добро пожаловать в раздел Центр Помощи.
  • Получив ответ на интересующий Вас вопрос, не забудьте пометить его как решённый.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Void.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LISP | Следующая тема »


 




[ Время генерации скрипта: 0.1178 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.