Форум программистов, компьютерный форум, киберфорум
Языки JVM
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/11: Рейтинг темы: голосов - 11, средняя оценка - 4.55
13 / 13 / 1
Регистрация: 24.09.2012
Сообщений: 61
1

Clojure Всё время NIL

22.06.2014, 13:23. Показов 1957. Ответов 18
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Доброго времени!
Задача:
Напишите функцию, производящую взаимную замену в списке S выражения X на Y, т.е. X->Y, Y->X. Не использовать встроенную функцию замены SUBST.
Моё решение:
Lisp
1
2
3
4
5
6
7
8
9
(defun my-subs (mylist)
    (cond
        ((null '(mylist)) nil)
        ((eq (car '(mylist)) 'x ) 
            (cons 
                (set (car '(mylist)) 'y ) (my-subs (cdr '(mylist)))))
        ((eq (car '(mylist)) 'y ) 
            (cons 
                (set (car '(mylist)) 'x ) (my-subs (cdr '(mylist)))))))
Функция объявлена, но при вызове с фактическими параметрами, например:
Lisp
1
(MY-SUBS '(Y W E R X))
даёт NIL.

Помогите разобраться в чём моя ошибка, несколько дней уже верчу и так, и этак. Работаю с CLISP.
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.06.2014, 13:23
Ответы с готовыми решениями:

Clojure Как полностью удалить пакеты Clojure и Leiningen в убунту
Всем доброе время суток! Подскажите, пожалуйста. как полностью удалить из убунту пакеты clojure и...

Clojure Ошибка при запуске локального сервера на Clojure в IntellijIDEA
Выводится ошибка по строке, которой даже нет. По отдельности все функции компилируются без...

Clojure Почему невозможно настроить intellij idea для работы с clojure? windows
Получается только emacs. Плюсы emacs - интерактивный встроенный туториал. Даже если и с emacs...

Clojure Присвоение ввода с клавиатуры переменной в Clojure
Мне нужен код делающий следующее : 1. Присвоить ввод с клавы переменной. 2. "Сложить" её со...

18
Модератор
Эксперт функциональных языков программированияЭксперт Python
37302 / 20736 / 4272
Регистрация: 12.02.2012
Сообщений: 34,127
Записей в блоге: 14
22.06.2014, 14:09 2
Если кратко - много лишних скобок и апострофов. Да и set здесь не нужен:

Lisp
1
2
3
4
5
6
7
8
9
10
11
(defun my-subs (mylist)
    (cond ((null mylist) nil)
          ((eq (car mylist) 'x ) (cons 'y (my-subs (cdr mylist))))
          ((eq (car mylist) 'y ) (cons 'x (my-subs (cdr mylist))))
          (t (cons (car mylist) (my-subs (cdr mylist))))))
 
==> my-subs
 
(MY-SUBS '(Y W E R X))
 
==> (x w e r y)
3
13 / 13 / 1
Регистрация: 24.09.2012
Сообщений: 61
22.06.2014, 14:46  [ТС] 3
Цитата Сообщение от Catstail Посмотреть сообщение
Если кратко - много лишних скобок и апострофов. Да и set здесь не нужен:
Вы меня вдохновили, огромная благодарность. Не так уж всё и плохо, оказывается. Насчет set я понял, насчет скобок и квотирования тоже (это следствие лихорадочного поиска причин ошибочного кода). Но это ещё не всё? Если можно - чуть подробнее, в частности об этой строчке:
Lisp
1
(t (cons (car mylist) (my-subs (cdr mylist))))
Добавлено через 3 минуты
Я так понимаю, эта строчка обрабатывается в случае, если очередная голова списка не является искомой?
1
Модератор
Эксперт функциональных языков программированияЭксперт Python
37302 / 20736 / 4272
Регистрация: 12.02.2012
Сообщений: 34,127
Записей в блоге: 14
22.06.2014, 14:48 4
Эта строчка "работает" в том случае, когда очередной элемент списка - не X и не Y. В этом случае его нужно сохранить, т.е. присоединить первым к результату применения функции на хвосте списка.
3
Заблокирован
22.06.2014, 16:17 5
Цитата Сообщение от Мусульманин Посмотреть сообщение
Помогите разобраться в чём моя ошибка, несколько дней уже верчу и так, и этак. Работаю с CLISP.
Lisp
1
2
3
4
(defun swap ( a b w / tmp)
  (subst b
        (setq tmp 'koran)
        (subst a b (subst tmp a w))))
2
13 / 13 / 1
Регистрация: 24.09.2012
Сообщений: 61
22.06.2014, 19:26  [ТС] 6
Цитата Сообщение от ur_naz Посмотреть сообщение
А разобраться с заданием религия не позволяет???
Вместо ничем не обоснованного сарказма, пиши по сути вопроса, либо не пиши вовсе, если чем-то что-то не устраивает. И вообще, вопрос уже решён, если ты не заметил.
0
Заблокирован
22.06.2014, 19:50 7
Цитата Сообщение от Мусульманин Посмотреть сообщение
Попробовал бы ты мне такое в глаза сказать
Это в каком университете учатся столь вежливые, интеллигентные люди?
0
13 / 13 / 1
Регистрация: 24.09.2012
Сообщений: 61
22.06.2014, 20:12  [ТС] 8
Что тебе надо, Юра? Пиши в личку, если угомониться не можешь, не надо флуда.
0
Заблокирован
22.06.2014, 21:24 9
Цитата Сообщение от Мусульманин Посмотреть сообщение
не надо флуда
Какой же тут флуд? Я тебе показал, что код со встроенным subst намного короче, как ни крути. Не хочешь с subst, вот тебе без subst.
Lisp
1
2
3
(defun swap (a b w)
  (mapcar #'(lambda (x)
              (cadr (member x (list a b a x x)))) w))
Как видишь, тут уже намного больше букаф.
Любишь рекурсию? Вот тот же метод...
Lisp
1
2
(defun swap (a b w &aux (x (car w)))
  (if w (cons (cadr (member x (list a b a x x))) (swap a b (cdr w)))))
это еще чуть больше...
или по простому
Lisp
1
2
(defun swap (a b w &aux (x (car w)))
  (if w (cons (cond ((eq x a) b)((eq x b) a) (x)) (swap a b (cdr w)))))
Еще +1
А религия тут действительно ни причем, это устойчивое выражение, если ты не в курсе
2
1978 / 1082 / 87
Регистрация: 29.11.2013
Сообщений: 3,353
22.06.2014, 23:34 10

Не по теме:

Мусульманин, Не обращайте внимания. В большинстве своем техно элита атеистического вероисповедания.


Lisp
1
2
3
4
5
;; racket
(define (foo new old lst)
  (map (lambda (i) (if (eq? i old) new (if (eq? i new) old i))) lst))
;(foo 'x 'y '(x y x y x y))
;'(y x y x y x)
1
505 / 511 / 42
Регистрация: 12.12.2013
Сообщений: 484
22.06.2014, 23:47 11
Clojure:
Lisp
1
2
3
4
5
6
7
8
9
10
11
(defn task [a b coll]
  (let [acc (atom nil)]
    (doseq [v (reverse coll)]
      (cond (= v a) (swap! acc conj b)
            (= v b) (swap! acc conj a)
            :else (swap! acc conj v)))
    @acc))
;; => #'user/task
 
(task 'x 'y '(1 x a y 2 x y b 3 y x))
;; => (1 y a x 2 y x b 3 x y)
2
13 / 13 / 1
Регистрация: 24.09.2012
Сообщений: 61
23.06.2014, 07:53  [ТС] 12
ur_naz,
Не использовать встроенную функцию замены SUBST.
Ты сам задание-то читал? И к совершенствованию кода стремиться для меня сейчас не приоритет, меня вполне устроит начальное решение с поправками для первого раза. Дальше, возможно, будут претензии на перфекционизм, но явно не нынче.
0
korvin_
23.06.2014, 16:28
  #13

Не по теме:

Цитата Сообщение от castorsky Посмотреть сообщение
техно элита
Смешно...

0
castorsky
23.06.2014, 19:18
  #14

Не по теме:

Скорее печально...

0
13 / 13 / 1
Регистрация: 24.09.2012
Сообщений: 61
15.03.2015, 18:30  [ТС] 15
JustForFun
F#
Код
open System

[<EntryPoint>]
let main (args : string[]) = 
    let s = Console.ReadLine()
    let substr = List.map(fun a -> match a with
                                      | 'x' -> 'y'
                                      | 'X' -> 'Y'
                                      | 'y' -> 'x'
                                      | 'Y' -> 'X'
                                      | _ -> a) (List.ofArray(s.ToCharArray()))
    printfn "%O" (new String(List.toArray(substr)))
    0
3
13 / 13 / 1
Регистрация: 24.09.2012
Сообщений: 61
24.10.2015, 19:35  [ТС] 16
Поступила новая вводная по этой задаче - список на входе может быть вложенным и заменяющие друг-друга элементы должны передаваться в параметрах.

Первую часть реализовал так

Lisp
1
2
3
4
5
6
7
8
9
10
(defun my-subs (mylist)
    (cond ((null mylist) nil)
          ((not (atom(car mylist))) (cons (my-subs (car mylist)) (my-subs (cdr mylist))))
          ((eq (car mylist) 'x ) (cons 'y (my-subs (cdr mylist))))
          ((eq (car mylist) 'y ) (cons 'x (my-subs (cdr mylist))))    
          (t (cons (car mylist) (my-subs (cdr mylist))))))
 
(my-subs '(q w (s c (y y y) x) y i))
 
=> (Q W (S C (X X X) Y) X I)
Со второй, вроде бы, ничего сложного, но вот такой код

Lisp
1
2
3
4
5
6
7
8
(defun my-subs (x y mylist)
    (cond ((null mylist) nil)
          ((not (atom(car mylist))) (cons (my-subs (car mylist)) (my-subs (cdr mylist))))
          ((eq (car mylist) x ) (cons y (my-subs (cdr mylist))))
          ((eq (car mylist) y ) (cons x (my-subs (cdr mylist))))      
          (t (cons (car mylist) (my-subs (cdr mylist))))))
 
(my-subs 'a 'b '(q w (s c (y y y) x) y i))
Вызывает ошибку "Слишком мало параметров - 1, вместо как минимум 3-х". Помогите разобраться.
1
1057 / 951 / 109
Регистрация: 04.11.2012
Сообщений: 992
24.10.2015, 20:03 17
Везде где вызывается my-subs нужно указывать все параметры например вместо
Lisp
1
(my-subs (cdr mylist))
нужно
Lisp
1
(my-subs x y (cdr mylist))
В тестовом примере нет символов a и b в списке:
Lisp
1
(my-subs 'x 'y '(q w (s c (y y y) x) y i))
теперь меняет x и y
2
13 / 13 / 1
Регистрация: 24.09.2012
Сообщений: 61
25.10.2015, 07:55  [ТС] 18
Цитата Сообщение от Lambdik Посмотреть сообщение
нужно
1
(my-subs x y (cdr mylist))
Надо же, такая нелепая оплошность, а два часа мучился. Спасибо.

Добавлено через 11 часов 40 минут
Теперь можно передавать в параметрах списки. Надеюсь, что задача исчерпана)

Lisp
1
2
3
4
5
6
7
8
9
(defun foo (x y L)
    (cond ((null L) nil)
          ((not (atom(car L))) (if (equal (car L) x) (cons y (foo x y (cdr L))) 
                                   (if (equal (car L) y) (cons x (foo x y (cdr L))) (cons (foo x y (car L)) (foo x y (cdr L))))))
          ((equal (car L) x) (cons y (foo x y (cdr L))))
          ((equal (car L) y) (cons x (foo x y (cdr L))))      
          (t (cons (car L) (foo x y (cdr L))))))
 
(foo '(y y y) 'x '(q w (s c (y y y) ((x x)) x y z)))
1
2304 / 1063 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
27.10.2015, 14:55 19
Цитата Сообщение от Мусульманин Посмотреть сообщение
fun a -> match a with
Boilerplate. Для этого в OCaml и F# есть специальный сахар (см. function ключевое слово).

Добавлено через 8 часов 36 минут
Lisp
1
2
3
4
5
6
7
(defun f (list)
  (mapcar (lambda (a)
            (case a
              (x 'y)
              (y 'x)
              (otherwise a)))
          list))
2
27.10.2015, 14:55
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.10.2015, 14:55
Помогаю со студенческими работами здесь

Clojure Clojure, lein-droid, Android ламерство
Пытаюсь разбираться с программированием под Андройд на Lisp'е. Сразу скажу -- имею очень...

Clojure Clojure. Последовательность создается задом-наперед
Делаю из SICP задание &quot;треугольник Пифагора&quot;. Вот процедура, которая принимает на вход...

Clojure Ввод данных пользователем в Clojure
Как получать данные от пользователя? На такой код ругается: (defn sum (apply +...

Clojure Найти все совершенные числа меньше n
Здравствуйте, помогите реализовать. Натуральное число n называется совершенным, если сумма всех...

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

Clojure Функция, удаляющая все отрицательные элементы
Здравствуйте. Начинаю разбираться в языке Лисп, и возникли трудности. Есть задание Определить...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru