| Правила | Регистрация | Пользователи | Сообщения за день |  Справка по форуму | Файлообменник |

Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Безграмотность лиспописателей

Безграмотность лиспописателей

Ответ
Поиск в этой теме
Непрочитано 24.05.2010, 11:47 #1
Безграмотность лиспописателей
gomer
 
строю, ломаю
 
Украина
Регистрация: 03.04.2008
Сообщений: 5,515

Это, конечно, личное дело каждого пишущего, но мне, если честно, уже надоело видеть в кодах названия переменных и польз. функций, написанные с ошибками
Просмотров: 14753
 
Непрочитано 24.05.2010, 11:52
#2
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


Цитата:
Это, конечно, личное дело каждого пишущего, но мне, если честно, уже надоело видеть в кодах названия переменных и польз. функций, написанные с ошибками
Нда? А пример?
Укажи, будь добёр, на ошибки:
Код:
[Выделить все]
(defun _kpblc-get-appload-list (/ reg res profile)
  (setq reg (strcat "HKEY_CURRENT_USER\\"
                    (vlax-product-key)
                    "\\Profiles\\"
                    (setq profile
                           (vla-get-activeprofile
                             (vla-get-profiles
                               (vla-get-preferences (vlax-get-acad-object))
                               ) ;_ end of vla-get-profiles
                             ) ;_ end of vla-get-activeprofile
                          ) ;_ end of setq
                    "\\Dialogs"
                    ) ;_ end of strcat
        res (vl-sort
              (vl-remove-if-not
                (function
                  (lambda (x)
                    (findfile (cdr x))
                    ) ;_ end of lambda
                  ) ;_ end of function
                (mapcar
                  (function
                    (lambda (x)
                      (cons x
                            (vl-registry-read
                              (strcat reg "\\Appload\\Startup")
                              x
                              ) ;_ end of vl-registry-read
                            ) ;_ end of cons
                      ) ;_ end of lambda
                    ) ;_ end of function
                  (vl-remove-if-not
                    (function
                      (lambda (x)
                        (wcmatch (strcase x) "[1-9]*STARTUP*")
                        ) ;_ end of lambda
                      ) ;_ end of function
                    (vl-registry-descendents
                      (strcat reg "\\Appload\\Startup")
                      ""
                      ) ;_ end of vl-registry-descendents
                    ) ;_ end of vl-remove-if-not
                  ) ;_ end of mapcar
                ) ;_ end of vl-remove-if-not
              (function
                (lambda (a b)
                  (< (atoi (car a)) (atoi (car b)))
                  ) ;_ end of lambda
                ) ;_ end of function
              ) ;_ end of vl-sort
        ) ;_ end of setq
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 24.05.2010, 12:17
#3
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Алексей, Вы - пример для подражания многим... И я, чесно говоря, не ожидал вас в этой теме... вот к примеру один из студенческих лиспов, не самый плохой...
Код:
[Выделить все]
;; 1. Get spisok SP_HEAD - format:
;;   ((name fild; type fild; length fild; !!REM nambe symbol on the point)...)
;; 2. Get spisok RECORD_ALL - format:
;;    ((valua fild) (valua fild) ..........)              			

;;%%%%%%%%%%%%%%%%%%%%%%%%%%%%
(defun blok (bn)     
(setq sp_record nil) (setq n_name nil) (setq chh nil) (setq shra 0)
  (repeat 10 (setq chh (nth bn all_char))                          ;; N
          (if (and (= shra 0) (/= chh 0))                          ;; !! shra
		  (setq n_name (cons (chr chh) n_name)) (setq shra 1))     ;;    L2 LS
          (setq bn (+ bn 1))                                       ;; A
  )                                                                ;;
     (setq q 1) (setq n_str (nth 0 n_name))                        ;; M
	  (while (< q (length n_name))                                 ;;
      (setq n_str (strcat (nth q n_name) n_str))                   ;; E
	  (setq q (+ q 1))                                             ;;
	  )                                                            ;; fild
	  (setq sp_record (cons n_str sp_record))                      ;; 
	  
(setq sp_record (cons (chr (nth (+ bn 1) all_char)) sp_record))  ;; N or C
	                                                             
(setq sp_record (cons (nth (+ bn 6) all_char) sp_record))  ;;length integer

;;(setq sp_record (cons (nth (+ bn 7) all_char) sp_record))  ;;length real-point

(setq sp_record (reverse sp_record))
;(print sp_record)  
;(if (= "CODE" (nth 0 sp_record)) (getstring))

)
;;DEFUN___  DEFUN___ DEFUN___ DEFUN___ DEFUN___ DEFUN___ DEFUN
(defun dbf_sp (file_n)

         (setq fnn0 file_n)
         (setq fdd0 (open fnn0 "r"))   ; ...and can read the file?
		 (setq ar 0) (setq all_char nil)    
	 (while (setq chh (read-char fdd0))                     ;; MAKE
	 (setq all_char (cons chh all_char)) (setq ar (+ ar 1)) ;; spisok
;	 (if (and (> ar 40) (< ar 50))  
;	 (progn  (prin1 "    ") (prin1  ar) (prin1 chh)  ))
	 )              (close fdd0)                            ;; all_char
	 (setq all_char (reverse all_char))                     ;;
	 (setq len_all_char (length all_char))                  

                                                 ;; n_byte - border value
		 (setq l_byte (nth 8 all_char))          ;;          record
		 (setq h_byte (nth 9 all_char))		     ;; LIMIT - name record 127!!!
		 (setq n_byte (+ (* h_byte 256) l_byte)) ;;

     (setq n 1) (setq sp_head nil)  (setq nb 32) ;;  make SPISOK
         (while (<= n (/ (- n_byte 32) 32))      ;; 
		 (blok nb)                               ;;(filds_name; type; 
		 (setq nb (+ nb 32))                     ;;  nambe symbol;
		 (setq sp_head (cons sp_record sp_head)) ;;  !REM  nambe symbol 
		 (setq n (+ n 1))                        ;;      on the point;)
		 )                                       ;; 
         (setq sp_head (reverse sp_head))		 ;;
         (setq len (length sp_head))		         ;;
		   
;;Fo All record__		  Fo All record__		 Fo All record__		 
         (setq record_all nil) (setq n_r (+ 1 n_byte))   
         (while (< n_r len_all_char)				
   
;; Fo 1 record______ Fo 1 record_____ Fo 1 record______ Fo 1 record
        (setq n 0) (setq record nil) 
    		 (while (< n len)	 
  (setq atom_st nil) (setq q 1)
  (setq len_fild (nth 2 (nth n sp_head)))  
	                             (setq a_r n_r)
                             (setq n_r (- (+ len_fild n_r) 1))
			 (setq atom_st (chr (nth n_r all_char)))
				 (setq n_r (- n_r 1))
    (repeat (- len_fild 1) (setq c_h (nth n_r all_char))        
            (setq atom_st (strcat (chr c_h) atom_st))
            (setq n_r (- n_r 1))                                          
    )                             (setq n_r (+ a_r len_fild))
	           
	           (while (= (substr atom_st 1 1) " ")   ;; Erase " " 
	   (setq atom_len (strlen atom_st))             ;; befo atom_len
		   (setq atom_st (substr atom_st 2 (- atom_len 1)))   ;;
			    )

     	     (setq record (cons atom_st record))
             (setq n (+ n 1))      
    		 )
			 (setq n_r (+ n_r 1))
;; End 1 record------ End 1 record-------- End 1 record		 
     (setq record_all (cons (reverse record) record_all)) 
    		 )                                          
;;All record__ All record__ All record__ All record
   )
С уважением
gomer вне форума  
 
Непрочитано 24.05.2010, 13:29
#4
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


Конкретно в этом лиспе я бы обращал внимание не на ошибки наименования переменных и (или) функций. Тут концептуальных ошибок хватает...
  1. Почему несколько setq не объединены в один?
  2. Почему принципиально не используются локальные переменные?
  3. Как-то странно сделана работа с файлами:
    Код:
    [Выделить все]
    (defun dbf_sp (file_n)
      (setq fnn0 file_n);<...>
    - зачем fnn0 присваивать уже переданный параметр?
  4. Почему обращение к dbf-файлу (если я верно понял код) осуществляется именно через чтение файла, а не средствами ADO, например? Конечно, головняка там больше, но и работа на порядок эффективнее.
  5. Опять же, в коде работы с файлом - существуют "лишние" переменные (ar). Хотя, если это всего лишь часть более общей системы, и код "выдран" откуда-то еще... Короче, претензия только наполовину.
Как бы я попробовал сделать код (не вникая в логику, ее понять может только автор и то только если с момента написания кода прошло не больше недели):
Код:
[Выделить все]
;; 1. Get spisok SP_HEAD - format:
;;   ((name fild; type fild; length fild; !!REM nambe symbol on the point)...)
;; 2. Get spisok RECORD_ALL - format:
;;    ((valua fild) (valua fild) ..........)              			

;;%%%%%%%%%%%%%%%%%%%%%%%%%%%%
(defun blok (bn all_char / sp_record n_name chh shra q n_str)
  (setq sp_record nil
        n_name nil
        chh nil
        shra 0
        ) ;_ end of setq
  (repeat 10
    (setq chh (nth bn all_char))
    (if (and (= shra 0) (/= chh 0))
      (setq n_name (cons (chr chh) n_name))
      (setq shra 1)
      ) ;_ end of if
    (setq bn (1+ bn))
    ) ;_ end of repeat
  (setq q     1
        n_str (nth 0 n_name)
        ) ;_ end of setq
  (while (< q (length n_name))
    (setq n_str (strcat (nth q n_name) n_str)
          q     (1+ q)
          ) ;_ end of setq
    ) ;_ end of while
  (setq sp_record (cons n_str sp_record)
        sp_record (cons (chr (nth (+ bn 1) all_char)) sp_record)
        sp_record (cons (nth (+ bn 6) all_char) sp_record)
        sp_record (reverse sp_record)
        ) ;_ end of setq
  ) ;_ end of defun

(defun dbf_sp (file_name /         fdd0      ar        all_char  chh       len_all_char        l_byte    n_byte
               n         n_r       sp_head   nb        len       record_all          record    atom_st   atom_len
               q         len_fild  a_r       fild      c_h
               )
  (setq fdd0     (open file_name "r")
        ar       0
        all_char nil
        ) ;_ end of setq
  (while (setq chh (read-char fdd0))
    (setq all_char (cons chh all_char)
          ar       (1+ ar)
          ) ;_ end of setq
    ) ;_ end of while
  (close fdd0)
  (setq all_char     (reverse all_char)
        len_all_char (length all_char)
        l_byte       (nth 8 all_char)
        h_byte       (nth 9 all_char)
        n_byte       (+ (* h_byte 256) l_byte)
        ) ;_ end of setq
  (setq n 1
        sp_head nil
        nb 32
        ) ;_ end of setq
  (while (<= n (/ (- n_byte 32) 32))
    (blok nb all_char)
    (setq nb      (+ nb 32)
          sp_head (cons sp_record sp_head)
          n       (1+ n)
          ) ;_ end of setq
    ) ;_ end of while
  (setq sp_head    (reverse sp_head)
        len        (length sp_head)
        record_all nil
        ) ;_ end of setq
  (setq n_r (+ 1 n_byte))
  (while (< n_r len_all_char)
    (setq n 0)
    (setq record nil)
    (while (< n len)
      (setq atom_st  nil
            q        1
            len_fild (nth 2 (nth n sp_head))
            a_r      n_r
            n_r      (- (+ len_fild n_r) 1)
            atom_st  (chr (nth n_r all_char))
            n_r      (- n_r 1)
            ) ;_ end of setq
      (repeat (- len_fild 1)
        (setq c_h     (nth n_r all_char)
              atom_st (strcat (chr c_h) atom_st)
              n_r     (- n_r 1)
              ) ;_ end of setq
        ) ;_ end of repeat
      (setq n_r (+ a_r len_fild))
      (while (= (substr atom_st 1 1) " ")
        (setq atom_len (strlen atom_st)
              atom_st  (substr atom_st 2 (- atom_len 1))
              ) ;_ end of setq
        ) ;_ end of while
      (setq record (cons atom_st record)
            n      (+ n 1)
            ) ;_ end of setq
      ) ;_ end of while
    (setq n_r        (+ n_r 1)
          record_all (cons (reverse record) record_all)
          ) ;_ end of setq
    ) ;_ end of while
  ) ;_ end of defun
А так, для написания нормального кода - надо знать задачу. Полностью.
---
P.S. Меня - один, ко мне - на "ты", пожалуйста. Иначе я среди себя теряться начинаю
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 24.05.2010, 13:57
#5
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Да, код вырван... куском... Это не принципиально... Может кто и задумается над своим творчеством...
Вопрос! Если переменная указана локально в (списке параметров) зачем ее в nil устанавливать... Еще бывает так, что это делается в начале и в конце программы, без указания на локальность... например
Код:
[Выделить все]
(defun test ()
  (setq somevar nil)
  ;; здесь код
  ;; ....................
  (setq somevar nil)
  (princ)
)

Последний раз редактировалось gomer, 24.05.2010 в 16:05.
gomer вне форума  
 
Непрочитано 24.05.2010, 14:16
#6
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


gomer, у меня на анализ и переработку кода было примерно минут 5. "шо же вы хочете?" (с)
Если переменная в начале работы функции выставляется в nil, это не означает, что эта переменная получит nil в конце. Пример:
Код:
[Выделить все]
(defun test ()
  (setq var 10.5)
  (/ 50. 0.)
  (setq var nil)
  ) ;_ end of defun

_$ (setq var nil)
nil
_$ (test)
; error: divide by zero
_$ var
10.5
_$
В то же время:
Код:
[Выделить все]
(defun test1 (/ var)
  (setq var 10.5)
  (/ 50. 0.)
  ) ;_ end of defun

_$ (setq var nil)
nil
_$ 
; 1 form loaded from #<editor "<Untitled-0> loading...">
_$ (test1)
; error: divide by zero
_$ var
nil
_$
P.S. Кстати о птичках. То бишь об ошибках...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.

Последний раз редактировалось Кулик Алексей aka kpblc, 24.05.2010 в 16:15.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 24.05.2010, 16:06
2 | 1 #7
Евгений А.

Армспорт
 
Регистрация: 18.07.2006
Ейск
Сообщений: 355


Цитата:
Сообщение от gomer Посмотреть сообщение
Это, конечно, личное дело каждого пишущего, но мне, если честно, уже надоело видеть в кодах названия переменных и польз. функций, написанные с ошибками
А что конкретно имело ввиду ваше величество?
О простите, простите. Впредь буду у вас спрашивать совета (разрешения) на имя переменной или функции...

Я улыбаюсь с такой самоуверенности в своих познаниях! Надо бы как-то скромнее быть, что ли...
Умный человек никогда не будет бегать и орать что он жутко умный, а вот дурень - запросто!
Евгений А. вне форума  
 
Автор темы   Непрочитано 24.05.2010, 16:23
#8
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Я не эстет, но давно заметил, что самые полезные программы пишутся на чудовищных диалектах
Хотя, если код не доступен пользователю, все гладко Почему-то заморские программисты не выставляют себя людьми недалекими... А пишут без Ашипок...
зы пишу все это без претензий и зла ни на кого не держу, а для таких шибко умных, как я, есть kelv.exe
gomer вне форума  
 
Непрочитано 24.05.2010, 21:00
#9
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от gomer Посмотреть сообщение
Почему-то заморские программисты не выставляют себя людьми недалекими... А пишут без Ашипок...
Если бы...
Слишком много раз, пытаясь разобраться с подробнейшими комментариями в кодах, я не мог их понять, а переводчик не мог перевести - мало того, что слова с ошибками, да еще каша из нескольких языков.
Елпанов Евгений вне форума  
 
Непрочитано 24.05.2010, 21:26
| 1 #10
357

бывший...
 
Регистрация: 13.08.2009
Краснодар
Сообщений: 1,171
<phrase 1=


Цитата:
Сообщение от gomer Посмотреть сообщение
Это, конечно, личное дело каждого пишущего, но мне, если честно, уже надоело видеть в кодах названия переменных и польз. функций, написанные с ошибками
А это к чему вообще-то? Надоело - не читай, никто ведь не заставляет, верно? А читаешь и находишь ошибки - помоги человеку их исправить. Люди вон с инженерным образованием по-русски пишут с ошибками (не путать с опечатками), а ты в лиспе грамотности и изящества хочешь.
357 вне форума  
 
Непрочитано 24.05.2010, 23:03
#11
mmax

Программист широкого профиля.
 
Регистрация: 08.09.2005
Челябинск
Сообщений: 722


Цитата:
Сообщение от gomer Посмотреть сообщение
Почему-то заморские программисты не выставляют себя людьми недалекими... А пишут без Ашипок...
Ну хотя бы потому что они хорошо знают свой родной английский язык.
Заморский программист пишет:
Код:
[Выделить все]
(defun Hello_World ()
;;;
)
А нашему проще написать:
Код:
[Выделить все]
(defun privet_mir ()
;;;
)
mmax вне форума  
 
Автор темы   Непрочитано 24.05.2010, 23:14
#12
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от 357 Посмотреть сообщение
читаешь и находишь ошибки - помоги человеку их исправить. Люди вон с инженерным образованием по-русски пишут с ошибками (не путать с опечатками), а ты в лиспе грамотности и изящества хочешь
Вот этого люди больше всего и не любят Но это другая тема... Просто я от некоторых программ на форуме получаю эстетическое удовольствие, от друих нет... Побольше бы программ красивых и полезных

>mmax: Это не худший вариант... Он напоминает эру первых мобильных телефонов...

Код:
[Выделить все]
(defun Привет_мир ()
;;;
)
Тоже ведь подойдет...

Код:
[Выделить все]
(defun Превед_медвед ( / медвед)
;;;
  медвед
)
Это уже не смешно

Последний раз редактировалось gomer, 24.05.2010 в 23:23. Причина: Ашипки и Очипятки в тексте
gomer вне форума  
 
Непрочитано 24.05.2010, 23:27
| 1 #13
Mozgunov

Начинающий проектировщик
 
Регистрация: 07.02.2008
Санкт-Петербург
Сообщений: 443
<phrase 1=


gomer Вы такой красноречивый и правильный. Поделитесь красивыми собственноручно написанными программами полезными проектировщикам. Критиковать то голословно проще всего... Крик души? Флуд? Мне кажется что флуд... Поправьте меня если я не прав. Я такой правильный и меня вымораживает когда в коде делают ошибки...Ваши слова! Бесполезная тема для меня во всяком случае... Думал что-то новое узнаю... Зря потратил время
Mozgunov вне форума  
 
Автор темы   Непрочитано 24.05.2010, 23:44
#14
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


>Mozgunov: Возможно, вы правы... и это флуд...
сравните:
Код:
[Выделить все]
 (setq AcApp (vlax-get-acad-object))
и
Код:
[Выделить все]
 (setq *vlaAcApp* (vlax-get-acad-obgect))
Первый код будет работать, не смотря на неуклюжесть...
Второй - нет... названия встроенных функций, свойств и методов приходится писать правильно... Так почему бы правильно не писать и все остальное?
gomer вне форума  
 
Непрочитано 25.05.2010, 00:00
#15
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


gomer, а если верно писать имена встроенных функций, то оба кода будут работать:
Код:
[Выделить все]
_$ (setq *vlaAcApp* (vlax-get-acad-object))
#<VLA-OBJECT IAcadApplication 00000001409b2e28>
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Автор темы   Непрочитано 25.05.2010, 00:41
#16
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
(setq *vlaAcApp* (vlax-get-acad-object))
  1. Указание на то, что переменная глобальна;
  2. Указание на тип (vla-указатель);
  3. Собственно что мы запоминаем

Неужели, так сложно... пора задумываться о стандартизации в лисп-программировании
gomer вне форума  
 
Непрочитано 25.05.2010, 00:45
#17
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


Я глобальные переменные могу именовать и так:
global-pointer-current-document-text-style
obj-acad
А внедокументные, например, так:
ext-list
bb-value
И что? Имена переменных и внутренних функций никому кроме программиста, как правило, неинтересны.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 25.05.2010, 01:08
#18
Елпанов Евгений

программист
 
Регистрация: 20.12.2005
Москва
Сообщений: 1,439
Отправить сообщение для Елпанов Евгений с помощью Skype™


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
И что? Имена переменных и внутренних функций никому кроме программиста, как правило, неинтересны.
Я, обычно, местные переменные делаю из одной буквы, или буквы и цифры.
например:
Код:
[Выделить все]
(lambda(a b c)...
или
Код:
[Выделить все]
(setq a1 5 
        a2 15 
        a3 25)
Елпанов Евгений вне форума  
 
Автор темы   Непрочитано 25.05.2010, 01:25
#19
gomer

строю, ломаю
 
Регистрация: 03.04.2008
Украина
Сообщений: 5,515


Цитата:
Сообщение от Елпанов Евгений Посмотреть сообщение
(setq a1 5
a2 15
a3 25)
Вот здесь все понятно: углы 1, 2, 3 равны соответственно 5 15 и 25
gomer вне форума  
 
Непрочитано 25.05.2010, 01:53
#20
Кулик Алексей aka kpblc
Moderator

LISP, C# (ACAD 200[9,12,13,14])
 
Регистрация: 25.08.2003
С.-Петербург
Сообщений: 39,835


Совсем необязательно...
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
Ответ
Вернуться   Форум DWG.RU > Программное обеспечение > Программирование > LISP > Безграмотность лиспописателей

Размещение рекламы