> 1 <

Автор Сообщение

Познающий

Members


Статус

17 сообщений

Где: ---
Род занятий:
Возраст:

#1665   2010-03-25 15:48 GMT+3 часа(ов)      
на такое написание
(defun расшифровать(е-криптограмма е-ключ)
; е- - естественный язык
 
(let* (
(кг( coerce е-криптограмма 'list)) ; кг- ну так получилось =)
(ключ( coerce е-ключ 'list))
(N (- (length кг) 1))
(key-len (+ (length ключ) 1))
(результат nil )
)
 
(for i from 0 to N do
 
(setq c (- 192(char-int (nth i кг))))
(setq k (- 192 (char-int (nth (mod i key-len) ключ))))
 
;(32+c-k) mod 32
(setq результат
( cons
(
if (= c 32) 32
(int-char (mod (- (+ 32 c) k) 32))
)
результат
); endcons
);end sq результат
);endfor
(list-to-delimited-string (reverse результат) "")
))



мне алегро cl 3.0.1 выражает свое возмущение таким сообщением: A numeric or character function was given an argument NIL of the wrong type in расшифровать

Признаться в понятии циклов не разобрался =( Лазил по дебагу, увы, мало что понял (удивился что у моей функии расшифровать 6 параматров О_о 2 мои и 4 кажется константы)
Кто знает в чем ошибка?

Fallen_s4e

Members


Статус

114 сообщений
http://lisper.ru
Где: Zimbabwe lisper.ru
Род занятий: fallen_s4e
Возраст: 8

#1666   2010-03-25 17:21 GMT+3 часа(ов)      
Это аллегровский макрос for ? Может loop for?
И ошибка при объявлении функции или использовании?

Познающий

Members


Статус

17 сообщений

Где: ---
Род занятий:
Возраст:

#1667   2010-03-25 17:55 GMT+3 часа(ов)      
при использовании. я не знаю, просто по методичке просто фор, а лууп я почитал в мире лиспа финов - просто бесконечный цикл =(
Я только вот осваиваю лисп и то медленно посему не все понимаю *стыдно покраснел*

ЗЫ код 100%-ный. ничего за пределами одного дефана нету

archimag

Members


Статус

48 сообщений

Где: Russia
Род занятий:
Возраст:

#1668   2010-03-25 18:26 GMT+3 часа(ов)      
Цитата
почитал в мире лиспа финов


Выкинь финов, это очень старая и неактуальная книга, читай PCL

Fallen_s4e

Members


Статус

114 сообщений
http://lisper.ru
Где: Zimbabwe lisper.ru
Род занятий: fallen_s4e
Возраст: 8

#1669   2010-03-25 18:27 GMT+3 часа(ов)      
Я знаю что можно так:
(loop for i from 0 to 10 do
(some-lisp-forms))
Хз что предлагает алегро.
Здесь читайте:
http://lisper.ru/pcl/loop-for-black-belts
И здесь:
http://www.cliki.net/iterate

Познающий

Members


Статус

17 сообщений

Где: ---
Род занятий:
Возраст:

#1670   2010-03-25 20:29 GMT+3 часа(ов)      
вот хочется обратить внимание =) взял первую прог-му из методички
 
(defun alfa(d)
(let ((result nil))
(loop for k from 0 to 31
do (setq result (cons (list-to-delimited-string
(list (+ k (- d 1)) '- (int-char (+ 192 k))) "") result))
 
)(list-to-delimited-string (reverse result) ",") ))



а как с ней работать не написано. попробовал (альфа 'a) выдало злосчастную ошибку Error: A numeric or character function was given an argument >>> A <<< of the wrong type in ALFA
а у меня (я даже луп поставил и скобку после ду - кстати говорит: The first element (SETQ C (- 192 (CHAR-INT (NTH I кг)))) of a function application is not a function name. при компиляции) тоже самое только НИЛ стоит. а использую я функцию так: > (расшифровать "ТЬЦПЕЖОЙР" "БОЛВАП")
может в вводе ошибка?

ЗЫ. статьи посмотрел - не понял ничего. ну максимум -встроенный макрос loop, сам я с ним ничего не делал.

Михаил

Members


Статус

120 сообщений

Где: ---
Род занятий:
Возраст:

#1671   2010-03-25 23:30 GMT+3 часа(ов)      
> Выкинь финов, это очень старая и неактуальная книга, читай PCL
> неактуальная книга
А Вы ее читали, уважаемый, чтобы так говорить? И что для Вас в ней неактульно?

Познающий

Members


Статус

17 сообщений

Где: ---
Род занятий:
Возраст:

#1672   2010-03-25 23:35 GMT+3 часа(ов)      
должен был) классика все таки ж))) поначалу конечно нудновато - 70 страниц о философии ЛИСПА но а потом - много для новичка полезного... и все же ЧЕ У МЕНЯ В ПРОГЕ ЗА ПАЛКА В КОЛЕСЕ ??? >_<

archimag

Members


Статус

48 сообщений

Где: Russia
Род занятий:
Возраст:

#1674   2010-03-25 23:52 GMT+3 часа(ов)      
> А Вы ее читали, уважаемый, чтобы так говорить?

Конечно. Теперь думаю, что большого смысла в этом не было. Язык не понятно какой там описан. К современному Common Lisp материал имеет достаточно отдалённое отношение.

Познающий

Members


Статус

17 сообщений

Где: ---
Род занятий:
Возраст:

#1675   2010-03-26 00:14 GMT+3 часа(ов)      
юылин. когда запускаешь по одной буквы в параметр - все работает, но криво. Например должно бы получиться при параметрах "Я" "Б" какое нибудь "Э" на выводе, а выводит один и тот же символ, похожий на мягкий знак
> (расшифровать "Я" "В")
""

но как только > (расшифровать "DFGFHG" "DFHH")
так сразу:
;; Error: A numeric or character function was given an argument NIL of the wrong type in расшифровать




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

 
(defun расшифровать(е-криптограмма е-ключ)
; е- - естественный язык
 
(let* (
(кг( coerce е-криптограмма 'list)) ; кг- ну так получилось =)
(ключ( coerce е-ключ 'list))
(N (- (length кг) 1))
(key-len (+ (length ключ) 1))
(результат nil )
)
 
(loop for i from 0 to N do
 
 
(setq c (- 192(char-int (nth i кг))))
(setq k (- 192 (char-int (nth (mod i key-len) ключ))))
 
;(32+c-k) mod 32
(setq результат
( cons
(
if (= c 32) 32
(int-char (mod (- (+ 32 c) k) 32))
)
результат
); endcons
);end sq результат
; );enddo
);endfor
(list-to-delimited-string (reverse результат) "")
 
))


Кто з в чем трабл? >_<

asbest

Members


Статус

64 сообщений

Где: Russia
Род занятий:
Возраст: 46

#1677   2010-03-26 05:50 GMT+3 часа(ов)      
Цитата
Познающий :
 
(key-len (+ (length ключ) 1))
;зачем +1?
(setq k (- 192 (char-int (nth (mod i key-len) ключ))))
;здесь (mod i key-len) становится равным длине ключа и nth возвращает NIL
 
(int-char (mod (- (+ 32 c) k) 32))
;здесь создаются символы с кодами 0-31, естественно, что они выглядят некрасиво
;надо прибавить например (char-int #\А)
 


Кто з в чем трабл? >_<



Надо пользоваться ylisp, а не каким-то allegro :-)

VH

Members


Статус

289 сообщений

Где: ---
Род занятий:
Возраст:

#1678   2010-03-26 14:44 GMT+3 часа(ов)      
Не проще ли сделать
(defun F (code key)
(if key
(coerce
(DECODE
(coerce code 'LIST)
(coerce key 'LIST))
'STRING)
code))

(defun DECODE (code_list key_list &optional acc)
(if code_list
(if key_list
(cons
((lambda (code_char key_char)
(int-char (mod (- (+ 32 (- 192 code_char)) (- 192 key_char)) 32)))
(char-int (car code_list))
(char-int (car key_list)))
(DECODE (cdr code_list) (cdr key_list) (cons (car key_list) acc)))
(DECODE code_list (reverse acc)))))

Познающий

Members


Статус

17 сообщений

Где: ---
Род занятий:
Возраст:

#1695   2010-03-27 22:57 GMT+3 часа(ов)      
Asbest, len+1 сделано, чтоб симитировать замкнутый цикличиский обход по слову из , допустим 6ми букв (БОЛВАП - ключ) делается мод по i, которое идет от нуля и до конца криптограммы, таким образом по моей задумке должно было бы получиться:

ТЬЦПЕЖОЙР БПУОЫЗИ - это переменная с
|||||||||||||||||
БОЛВАПБОЛВАПБОЛВАП - это переменная к
|||||||||||||||||
СОЛНЕЧНЫЕ БАТАРЕИ - это переменная м

ну а формула в коменте проги есть: m=(d+c-k)modd, d=32 - длина алфавита (без Ё) от 0-А до 31-Я

так. о чем это я?


"здесь (mod i key-len) становится равным длине ключа и nth возвращает NIL" как громом ударило... я не хотел нил я хотел 0, нулевой индекс то есть букавку Б...

";здесь создаются символы с кодами 0-31, естественно, что они выглядят некрасиво"
не понимаю. как так получается блин... я что... добросовестно отнял 192 а прибавить забыл?... это вы хотели сказать словами ";надо прибавить например (char-int #\А)" ?



VH может оно и проще но я ничего не понимаю (почти) =(

VH

Members


Статус

289 сообщений

Где: ---
Род занятий:
Возраст:

#1696   2010-03-27 23:44 GMT+3 часа(ов)      
А что же тут непонятного?
Функция (F) с двумя формальными параметрами code (кодированное сообщение) и key (ключ) при наличии (не-nil) ключа (впрочем, лучше было бы проверять на непустую строку) заставляет сообщение декодироваться посредством вызова функции (DECODE) и преобразует получившийся список символов снова в строку, которую и возвращает.
Функция (DECODE) требует списки code_list и key_list, поэтому при вызове происходит <предварительное> преобразование строк в списки.
Главная задача, как Вы правильно указываете, заключается в циклическом «воссоздании» последовательности знаков ключа при «проходе» по тексту сообщения.
В функции (DECODE) предлагается использовать «необязательный» формальный параметр acc (своего рода накопитель), который изначально пуст и в который на каждом «сдвиге» вдоль списка знаков (все время укорачиваемого) сообщения добавляется спереди текущий первый символ (все время укорачиваемого) ключа. Идея заключается в том, что когда ключ-список оказывается пустым, при очередном рекурсивном вызове функции (DECODE) на его место подставляется перевернутый (так как он наращивается в обратном порядке) накопитель, а накопитель снова пуст.
В общем, от списка-сообщения за шаг рекурсии откусывается один знак и от списка-ключа откусывается один знак, эти знаки используются в воссоздании исходного знака (который поступает в список-результат), а знак ключа отправляется в накопитель. Как только список-ключ пустеет, на его место подставляется <перевернутый> накопитель, и процесс продолжается.
Я полагаю, что это вполне в духе LISPа.

VH

Members


Статус

289 сообщений

Где: ---
Род занятий:
Возраст:

#1698   2010-03-28 00:03 GMT+3 часа(ов)      
Впрочем, можно обойтись и без накопителя, что несколько проще - на каждом шаге рекурсии надо присоединять откусываемый знак к хвосту списка-ключа сзади (заодно и функцию (F) изменим):
(defun F (code key)
(if (equal key "") code
(coerce
(DECODE
(coerce code 'LIST)
(coerce key 'LIST))
'STRING)))

(defun DECODE (code_list key_list)
(if code_list
(cons
((lambda (code_char key_char)
(int-char (mod (- (+ 32 (- 192 code_char)) (- 192 key_char)) 32)))
(char-int (car code_list))
(char-int (car key_list)))
(DECODE
(cdr code_list)
(append
(cdr key_list)
(list (car key_list)))))))

Познающий

Members


Статус

17 сообщений

Где: ---
Род занятий:
Возраст:

#1699   2010-03-28 01:33 GMT+3 часа(ов)      
VH, принялся изучать новые данные)) спасибо))
Меня осенило тут... asbest, а что если сделать "осторожно бред"
 (if  (setq tmp((mod (- (+ 32 c) k) 32)))
(int-char (+ tmp 192)) ; я чесно немного теряюсь по ходу nth забыл
; else
( setq tmp( first key)) ; слыхал что такое ферст но впервые юз так что не бейте =)
);endif
) ;Что я этим вообще хочу сказать? Если мод дает НИЛ то превращаем его в нолик вообще то чего я хочу =)
 

отредактировал(а) Познающий: 2010-03-28 03:25 GMT+3 часа(ов)

asbest

Members


Статус

64 сообщений

Где: Russia
Род занятий:
Возраст: 46

#1713   2010-03-28 19:23 GMT+3 часа(ов)      
Вначале лучше было.
Достаточно не прибавлять единицу к длине ключа и не будет nil. И к кодам прибавить 192, если это число тебе нравится.

Познающий

Members


Статус

17 сообщений

Где: ---
Род занятий:
Возраст:

#1733   2010-03-29 04:22 GMT+3 часа(ов)      
кажется дошло...

Дело не в том что возвращает мод, а НИЛ получается изза того что я обращаюсь к несуществующему элементу?

По ходу так!!!

 
> (second '(1 2))
2
> (second '(1))
> (second '(1))
NIL


Спасибо! =)

Познающий

Members


Статус

17 сообщений

Где: ---
Род занятий:
Возраст:

#1761   2010-04-01 09:28 GMT+3 часа(ов)      
ПОЛУЧИЛОСЬ!!! былин там я просто отнимал от 192 допустим 193 и -1 переводил в аски ну еще тот старый добрый НИЛ вылазил то я тоже исправил благодраря asbest

 
(defun расшифровать(е-криптограмма е-ключ)
; е- - естественный язык
 
(let* (
(кг( coerce е-криптограмма 'list)) ; кг- ну так получилось =)
(ключ( coerce е-ключ 'list))
(N (- (length кг) 1))
(key-len (length ключ))
(результат nil )
)
(loop for i from 0 to N do
 
(setq c (- (char-int (nth i кг)) 192 ))
(setq k (- (char-int (nth (mod i key-len) ключ) ) 192) )
;(32+c-k) mod 32
(setq результат
( cons
(
if (= c 32) 32
( int-char (+ (mod (- (+ 32 c) k) 32) 192 ) )
)
результат
); endcons
);end sq результат
);endfor
(list-to-delimited-string (reverse результат) "")
 
))
 
(расшифровать "ТЬЦПЕЖОЙР" "БОЛВАП")
 
 
>
"СОЛНЕЧНЫЕ"
 




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

Спасибо ребят!))

asbest

Members


Статус

64 сообщений

Где: Russia
Род занятий:
Возраст: 46

#1764   2010-04-01 13:33 GMT+3 часа(ов)      
:-)
Домашнее задание - разобраться с вариантом VH :-)

Познающий

Members


Статус

17 сообщений

Где: ---
Род занятий:
Возраст:

#1768   2010-04-01 15:50 GMT+3 часа(ов)      
былин забыл)) та если чесно застопорился. строку-то я из кучи списков сделал уже, а вот беда - я не могу пробелы и точки вставить как бы... там просто в сообщении один агромный список, в нем несколько списков в которых списки, короче абзац,предложении,слова,слоги, буквы))) вот чуть позже наверное в другой теме выложу вопрос бум решать))

VH

Members


Статус

289 сообщений

Где: ---
Род занятий:
Возраст:

#1769   2010-04-01 16:02 GMT+3 часа(ов)      
Не надо домашних заданий. Осознание того, что (setq) - лишняя функция, внезапно может вызвать когнитивный диссонанс.

Стало быть, теперь функция (DECODE) определяется так:
(defun DECODE (code_list key_list)
(if code_list
(cons
((lambda (code_char key_char)
(int-char (+ (mod (- (+ 32 code_char) key_char) 32) 192)))
(- (char-int (car code_list)) 192)
(- (char-int (car key_list)) 192)) ; <- здесь
(DECODE
(cdr code_list)
(append
(cdr key_list)
(list (car key_list)))))))

отредактировал(а) VH: 2010-04-01 16:45 GMT+3 часа(ов)

Познающий

Members


Статус

17 сообщений

Где: ---
Род занятий:
Возраст:

#1771   2010-04-01 16:11 GMT+3 часа(ов)      
Цитата
VH :
Не надо домашних заданий. Осознание того, что (setq) - лишняя функция, внезапно может вызвать когнитивный диссонанс.



Ниче не вызовет у меня прост запутяться могу малясь)))

ЗЫ хи) алегро это не принял ";; Error: Compilation error: Anonymous lambda expression has incorrect number of arguments."

VH

Members


Статус

289 сообщений

Где: ---
Род занятий:
Возраст:

#1773   2010-04-01 16:46 GMT+3 часа(ов)      
Скобочка не на месте оказалась. Исправлено.
> 1 <


Онлайн :

0 пользователь(ей), 31 гость(ей) :