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

Вернуться   Форум DWG.RU > Сообщество > Разное > В чем зло VBA?

В чем зло VBA?

Закрытая тема
Поиск в этой теме
 
Непрочитано 11.11.2008, 23:27 Lisp+COM=VisualLisp
#141
ganjour


 
Регистрация: 16.10.2008
Сообщений: 45


Цитата:
Сообщение от ShaggyDoc Посмотреть сообщение
"Зло VBA" заключается в том, что оно калечит мозги.
а разве использование COM в Lisp не есть нечто подобное использованию VBA, на днях на caduser.ru некто привел вот такой код:
Код:
[Выделить все]
;;;процедура преобразования вектора из вида |расстояние,градусы,минуты,секунды,| в вид |расстояние<градусыdминуты'секунды"
  (defun zapros	()
    (setq pnt
	   (getstring
	     (strcat
	       "Ведите точку в виде |расстояние,угол_в_градусах,минуты,секунды, |: "
	     )
	   )
    )
    (if	(= pnt "")
      (command "_ucs" "_w")
      ""
    )
    (setq is (strlen pnt))
    (if	(not (zerop is))
      (progn
	(setq is_1 (1- is))
	(if (not (vl-string-search "," pnt is_1))
	  (setq pnt (strcat pnt ","))
	)
	(while (setq n_dis (vl-string-search "," pnt))
	  (setq pnt (vl-string-subst "<" "," pnt))
	  (while (setq n_dis (vl-string-search "," pnt))
	    (setq pnt (vl-string-subst "d" "," pnt))
	    (while (setq n_dis (vl-string-search "," pnt))
	      (setq pnt (vl-string-subst "'" "," pnt))
	      (while (setq n_dis (vl-string-search "," pnt))
		(setq pnt (vl-string-subst (chr 34) "," pnt))
	      )
	    )
	  )
	)
      )
    )
  )
просто применяет COM функцию vl-string-subst для замены символа, ведь это почти тот же VBA, хотя тоже можно сделать на чистом Autolisp например так:
Код:
[Выделить все]
;;;процедура преобразования вектора из вида |расстояние,градусы,минуты,секунды,| в вид |расстояние<градусыdминуты'секунды"| отредактировано
  (defun zapros	()
    (setq pnt
	   (getstring
	     "Ведите точку в виде |расстояние,угол_в_градусах,минуты,секунды, |: "
	   )
    )

    (if	(= pnt "")
      (command "_ucs" "_w")
      ""
    )
    (setq is (strlen pnt))
    (if	(not (zerop is))
      (progn
	(if (/= (substr pnt is 1) ",")
	  (setq pnt (strcat pnt ","))
	)

	(setq slist (list))
	(setq i 0)
	(setq sbegin 1)

	(while (< i 4)
	  (setq sbegin0 sbegin)
	  (while (/= (substr pnt sbegin 1) ",")
	    (setq sbegin (+ sbegin 1))
	  )
	  (setq sbegin (+ sbegin 1))
	  (setq i (+ i 1))
	  (setq spnt (substr pnt sbegin0 (- sbegin sbegin0 1)))
	  (setq slist (cons spnt slist))
	)
	(setq slist (reverse slist))
	(setq pnt "")
	(setq i 0)
	(while slist
	  (setq	pnt
		 (cond
		   ((= i 0) (strcat pnt (car slist) "<"))
		   ((= i 1) (strcat pnt (car slist) "d"))
		   ((= i 2) (strcat pnt (car slist) "'"))
		   ((= i 3) (strcat pnt (car slist) (chr 34)))
		 )
	  )
	  (setq slist (cdr slist))
	  (setq i (+ i 1))
	)
      )
    )
  )
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
ganjour, аргументируй. А то можно "нарваться" на ответ типа "кривыми руками ничего не прямо".
Может быть COM в Lisp тоже способен "калечить мозги" как VBA, а?
ganjour вне форума  
 
Непрочитано 11.11.2008, 23:40
#142
Кулик Алексей aka kpblc
Moderator

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


Что первый, что второй коды - с точки зрения программирования написаны отвратительно, если ты это хотел знать.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 11.11.2008, 23:51
#143
ganjour


 
Регистрация: 16.10.2008
Сообщений: 45


Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Что первый, что второй коды - с точки зрения программирования написаны отвратительно, если ты это хотел знать.
Так Кулик Алексей aka kpblc оказывается познал великую истину "точки зрения программирования"
ganjour вне форума  
 
Непрочитано 12.11.2008, 01:00
#144
Кулик Алексей aka kpblc
Moderator

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


Цитата:
Сообщение от ganjour Посмотреть сообщение
Так Кулик Алексей aka kpblc оказывается познал великую истину "точки зрения программирования"
Как обычный человек я расцениваю это как наезд. Как модератор - пока в недоумении. Как программист: на слабО решил взять? Ну на, держи тебе вариант кода:
Код:
[Выделить все]
(defun conv-string-to-string (lst                      /
                              res                      fun_conv-string-to-list
                              fun_get-symbol-pos       fun_conv-string->list
                              fun_conv-double-to-string
                              )
                             ;|
*    Преобразование строки из вида <Расстояние>,<УголГрадусы>,<УголМинуты>,<УголСекунды>
* в расстояние<градусыdминуты'секунды
*    Параметры вызова:
	lst	либо строка вида "Расстояние,УголГрадусы,УголМинуты,УголСекунды"
		либо список вида '("Расстояние" "УголГрадусы" "УголМинуты" "УголСекунды")
*    Возвращает строку
*    Неуказанные параметры принимаются равными 0
*    Допустимые значения lst:
"0,16,32.65,32"
'(nil nil 32.65 32)
'(160.65)
*    Примеры вызова:
$ ( conv-string-to-string '(0 nil 16))
"0<0d16'0''"
_$ ( conv-string-to-string "0,,5")
"0<0d5'0''"
_$ ( conv-string-to-string "0,5")
"0<5d0'0''"
|;

  (defun fun_conv-double-to-string (value)
    (cond
      ((member (type value) (list 'int 'real)) (rtos value 2))
      ((= (type value) 'str) value)
      (t "")
      ) ;_ end of cond
    ) ;_ end of defun

  (defun fun_conv-string-to-list (string separator / i)
                                 ;|
*    Функция разбора строки. Возвращает список либо точечную пару.
*    Параметры вызова:
*	string		разбираемая строка
*	separator	символ, используемый в качестве разделителя частей
*    Примеры вызова:
(fun_conv-string-to-list "1;2;3;4;5;6" ";")	;'(1 2 3 4 5 6)
(fun_conv-string-to-list "1;2" ";")		;'(1 2)
*    За основу взяты уроки Евгения Елпанова по рекурсиям
|;
    (cond
      ((= string "") nil)
      ((setq i (fun_get-symbol-pos string separator))
       (cons (substr string 1 i)
             (fun_conv-string-to-list
               (substr string (+ (strlen separator) 1 i))
               separator
               ) ;_ end of fun_conv-string-to-list
             ) ;_ end of cons
       )
      (t (list string))
      ) ;_ end of cond
    ) ;_ end of defun

  (defun fun_conv-string->list (str / count res)
                               ;|
*    Преобразование строки в список символов
|;
    (setq count 0)
    (repeat (strlen str)
      (setq res (cons (ascii (substr str (setq count (1+ count)) 1)) res))
      ) ;_ end of repeat
    (reverse res)
    ) ;_ end of defun

  (defun fun_get-symbol-pos (str sep / len)
                            ;|
(fun_get-symbol-pos "abcdef" "c") 	; 2
(fun_get-symbol-pos "a,b,d,c" ",")	; 1
*    Многосимвольные разделители не обрабатываются
|;
    (if (wcmatch (strcase str) (strcat "*" (strcase sep) "*"))
      (if
        (/= (setq len (length (member (ascii sep) (fun_conv-string->list str))))
            0
            ) ;_ end of /=
         (- (strlen str) len)
         ) ;_ end of if
      ) ;_ end of if
    ) ;_ end of defun

  (cond
    ((= (type lst) 'str)
     (setq res (conv-string-to-string (fun_conv-string-to-list lst ",")))
     )
    ((and lst
          (listp lst)
          ) ;_ end of and
     (setq res
            (strcat (cond
                      ((and (car lst)
                            (/= (car lst) "")
                            ) ;_ end of and
                       (fun_conv-double-to-string (car lst))
                       )
                      (t "0")
                      ) ;_ end of cond
                    "<"
                    (cond ((and (cadr lst) (/= (cadr lst) ""))
                           (fun_conv-double-to-string (cadr lst))
                           )
                          (t "0")
                          ) ;_ end of cond
                    "d"
                    (cond ((and (caddr lst) (/= (caddr lst) ""))
                           (fun_conv-double-to-string (caddr lst))
                           )
                          (t "0")
                          ) ;_ end of cond
                    "'"
                    (cond ((and (cadddr lst) (/= (cadddr lst) ""))
                           (fun_conv-double-to-string (cadddr lst))
                           )
                          (t "0")
                          ) ;_ end of cond
                    "''"
                    ) ;_ end of strcat
           ) ;_ end of setq
     )
    ) ;_ end of cond
  res
  ) ;_ end of defun
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 12.11.2008, 06:35
#145
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
...просто применяет COM функцию vl-string-subst для замены символа, ведь это почти тот же VBA...
Вот они, искалеченные мозги. С какого это бодуна это стало COM-функцией? И с чего это вдруг "почти VBA"?

То, что в VisualLisp становятся доступными дополнительные функции после выполнения (vl-load-com) никак не говорит о "почти VBA". Это всего лишь дополнительная библиотека, которую решили не встраивать в ядро, чтобы всё не перелопачивать. Эта библиотека, в числе обычных дополнительных функций наподобие vl-string-subst даёт доступ из LISP к COM-технологиям, то есть доступ к любым COM-объектам, как самого AutoCAD, так и любых других, зарегистрированных на компьютере.

COM это технология, на которой построена Windows и многие приложения к ней. VBA - всего лишь несложная система программирования, предназначенная для встраивания в другие приложения. И работающая с основным приложением исключительно через COM-технологии. VBA очень хорошо вписывается в Microsoft Office. Для него VBA и разрабатывался, там он к месту.

Подобных систем программирования много бывает. Далеко не все фирмы попались в лапы Microsoft, и начали встраивать VBA в свои системы. А вот Autodesk заглотила наживку. Вместо того, чтобы доработать LISP в "вижуальной" части, решили - пусть эти придурки на VBA диалоги делают. А за это получим ящик печенья и банку варенья.
ShaggyDoc вне форума  
 
Непрочитано 14.11.2008, 21:17
#146
Baldares


 
Регистрация: 17.10.2008
Саратов
Сообщений: 426


Ой чую погибаю я с этим VBA, как последний нарик.
Совет всем, берегитесь его, засосет, а сделать ничего путного нельзя.

Ощущаю балдежность лиспа, и безграничные возможности арха.
Только бы соскочить...
Baldares вне форума  
 
Непрочитано 15.11.2008, 08:13
#147
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
...балдежность лиспа, и безграничные возможности арха
Вот такое определение мне нравится. И наиболее эффективным для практических целей является сочетание балдежности и безграничных возможностей.
ShaggyDoc вне форума  
 
Непрочитано 15.11.2008, 08:27
#148
MMV


 
Регистрация: 13.09.2005
Челябинск
Сообщений: 1,014


Гм... Люди, посоветуйте, у нас тут организовываются курсы повышения квалификации в универе, есть выбор - основы программирования в делфи, или основы программирования на платформе net... Я пока записался на net...

Последний раз редактировалось MMV, 15.11.2008 в 22:00.
MMV вне форума  
 
Непрочитано 15.11.2008, 20:29
#149
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,692


Цитата:
Сообщение от Baldares Посмотреть сообщение
Ой чую погибаю я с этим VBA, как последний нарик.Совет всем, берегитесь его, засосет, а сделать ничего путного нельзя.Ощущаю балдежность лиспа, и безграничные возможности арха.Только бы соскочить...
Чую, пора открывать курсы/тренинги. Что-то типа "Избавлю от VBA-зависимости за один сеанс"; "Легкий способ бросить писать на basic"; "От VBA к Lisp. Путь к свободе. Исцеление по методике доктора ShaggyDoc".
AlexV вне форума  
 
Непрочитано 15.11.2008, 20:44
#150
Кулик Алексей aka kpblc
Moderator

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


"Гарантия 100%. Постоянным клиентам скидка"
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 15.11.2008, 23:54
1 | #151
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


Не знаю как с VBA а на Делфях мне нравится писать програмки
Код:
[Выделить все]
uses
  CRT;

const
  MHOrO_TEKCTOB     = 15;
  nPOPEXA           = nil;

type
  A_KTO_EBO_3HAET   = (HO_KTO_TO_BEgb_3HAET, BCE_ETO_BECbMA_CTPAHHO);

  HyMEP             = Byte;

  CTPOKA            = String[15];

  TEKCTuK           = record
                            OHA: CTPOKA;
                            TOPMO3: HyMEP;
                          end;

  TAM_ABTOMAT       = ^ABTOMAT;

  ABTOMAT           = object
                        MOE_X, MOE_Y: HyMEP;
                        TEKCTOB_BCEBO: HyMEP;
                        TEKCTbl: array[1..MHOrO_TEKCTOB] of TEKCTuK;
                        KAKOE: HyMEP;
                        TOPMO3uM: HyMEP;
                        XPEH_EMy: TAM_ABTOMAT;

                        constructor BOT_EBOHOE_MECTO(X, Y: HyMEP);
                        procedure BOH_ETOT_XPEH
                                  (KOMy_XPEH: TAM_ABTOMAT);
                        procedure ETO_CTPOKA(OHA_CAMA: CTPOKA;
                                             EE_TOPMO3: HyMEP);
                        procedure BblBOg;
                      end;

  XMblPb            = object
                        HE_KACEKOB: A_KTO_EBO_3HAET;
                        KTO_TAM_CAMOE_TAKOE: TAM_ABTOMAT;

                        constructor Hy_HuKAK_MHE_EBO_HE_HA3BATb;
                        procedure B_nyTb;
                        procedure u_EBO_TO3E
                        (uMEHHO_ETO_MOXHATOE_OHO_CAMOE: TAM_ABTOMAT);
                      end;


procedure BAM_TEMHO;
begin
  ClrScr;
end;


procedure TOPMO3HyTb(CKOKO: HyMEP);
begin
  Delay(CKOKO);
end;


procedure rge_EMy_KBACuTb(EBO_X, EBO_Y: HyMEP);
begin
  GoToXY(EBO_X, EBO_Y);
end;


function WyXEP: Boolean;
begin
  WyXEP: = KeyPressed;
end;


constructor ABTOMAT.BOT_EBOHOE_MECTO(X, Y: HyMEP);
begin
  MOE_X: = X;
  MOE_Y: = Y;
  TEKCTOB_BCEBO: = 0;
  KAKOE: = 0;
  TOPMO3uM: = 0;
end;


procedure ABTOMAT.BOH_ETOT_XPEH(KOMy_XPEH: TAM_ABTOMAT);
begin
  XPEH_EMy: = KOMy_XPEH;
end;


procedure ABTOMAT.ETO_CTPOKA(OHA_CAMA: CTPOKA; EE_TOPMO3: HyMEP);
begin
  if TEKCTOB_BCEBO < MHOrO_TEKCTOB then begin
    Inc(TEKCTOB_BCEBO);
    with TEKCTbl[TEKCTOB_BCEBO] do begin
      OHA: = OHA_CAMA;
      TOPMO3: = EE_TOPMO3;
    end;
  end;
end;


procedure ABTOMAT.BblBOg;
begin
  if TEKCTOB_BCEBO > 0 then begin
    if TOPMO3uM = 0 then begin
      Inc(KAKOE);
      if KAKOE > TEKCTOB_BCEBO then KAKOE: = 1;
      rge_EMy_KBACuTb(MOE_X, MOE_Y);
      with TEKCTbl[KAKOE] do begin
         Write(OHA);
         TOPMO3uM: = TOPMO3;
      end;
    end;
    Dec(TOPMO3uM);
  end;
end;


constructor XMblPb.Hy_HuKAK_MHE_EBO_HE_HA3BATb;
begin
  KTO_TAM_CAMOE_TAKOE: = nPOPEXA;
  HE_KACEKOB: = BCE_ETO_BECbMA_CTPAHHO;
end;


procedure XMblPb.u_EBO_TO3E
          (uMEHHO_ETO_MOXHATOE_OHO_CAMOE: TAM_ABTOMAT);
begin
  if KTO_TAM_CAMOE_TAKOE = nPOPEXA then begin
    KTO_TAM_CAMOE_TAKOE: = uMEHHO_ETO_MOXHATOE_OHO_CAMOE;
    uMEHHO_ETO_MOXHATOE_OHO_CAMOE^.XPEH_EMy: 
                           = uMEHHO_ETO_MOXHATOE_OHO_CAMOE;
  end
  else begin
    uMEHHO_ETO_MOXHATOE_OHO_CAMOE^.XPEH_EMy: 
                           = KTO_TAM_CAMOE_TAKOE^.XPEH_EMy;
    KTO_TAM_CAMOE_TAKOE^.XPEH_EMy: 
                           = uMEHHO_ETO_MOXHATOE_OHO_CAMOE;
  end;
end;


procedure XMblPb.B_nyTb;
var
  ETOT_PAXuT: TAM_ABTOMAT;

begin
  ETOT_PAXuT: = KTO_TAM_CAMOE_TAKOE;

  while not WyXEP do
    with ETOT_PAXuT^ do begin
      BblBOg;
      ETOT_PAXuT: = XPEH_EMy;
      rge_EMy_KBACuTb(1, 10);
      TOPMO3HyTb(10);
    end;
end;


procedure BAM_XOPOWO;
begin
  BAM_TEMHO;
  WriteLN('OH TOPMO3 v1.0  Copyright The Future Hackers, 1993');
  WriteLN("  Written by Kirill Shirokov 
            and Dmitry Moskovich, May 93');
  WriteLN;
end;


var
  EBO_3EHKu,
  EBO_HOC,
  EBO_POT,
  EBO_XBOCT: ABTOMAT;

  KACEKOB: XMblPb;


begin
  with KACEKOB do begin
    Hy_HuKAK_MHE_EBO_HE_HA3BATb;
    with EBO_3EHKu do begin
      BOT_EBOHOE_MECTO(1, 1);
      ETO_CTPOKA('-  -', 20);
      ETO_CTPOKA('o  o', 3);
      ETO_CTPOKA('O  O', 16);
      ETO_CTPOKA('0  0', 23);
      ETO_CTPOKA('O  O', 14);
      ETO_CTPOKA('o  o', 5);
    end;
    u_EBO_TO3E(@EBO_3EHKu);

    with EBO_HOC do begin
      BOT_EBOHOE_MECTO(1, 2);
      ETO_CTPOKA('..", 21);
      ETO_CTPOKA(" oo ", 16);
    end;
    u_EBO_TO3E(@EBO_HOC);

    with EBO_POT do begin
      BOT_EBOHOE_MECTO(1, 3);
      ETO_CTPOKA(" -- ", 22);
      ETO_CTPOKA(" == ", 4);
      ETO_CTPOKA('-==-', 6);
      ETO_CTPOKA('/--\', 19);
      ETO_CTPOKA('-!! -', 16);
      ETO_CTPOKA('\==/', 21);
      ETO_CTPOKA('-!! -', 3);
    end;
    u_EBO_TO3E(@EBO_POT);

    BAM_TEMHO;
    B_nyTb;
    BAM_XOPOWO;
  end;
end.
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 16.11.2008, 09:28
#152
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


Цитата:
Сообщение от MMV Посмотреть сообщение
Гм... Люди, посоветуйте, у нас тут организовываются курсы повышения квалификации в универе, есть выбор - основы программирования в делфи, или основы программирования на платформе net... Я пока записался на net...
Выбор правильный. Изучение .NET - это изучение технологии. Относительно новой, тут надо понять основы. Зная технологию, потом можно с ней работать в любых конкретных системах программирования.

Изучение Delphi - это изучение конкретной среды, то есть более узкий вопрос. На курсах по Delphi просто физически могут дать самый минимум - "батонокидательство". А это легко изучить самостоятельно, это - самое простое.

Основы .NET вполне могут преподнести и на курсах. Зная основы, можно работать с .NET и в Delphi. Но не наоборот.
ShaggyDoc вне форума  
 
Непрочитано 16.11.2008, 09:33
#153
MMV


 
Регистрация: 13.09.2005
Челябинск
Сообщений: 1,014


ShaggyDoc, Спасибо
MMV вне форума  
 
Непрочитано 16.11.2008, 09:52
#154
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


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

Текст программы пишется человеком и прежде всего для человека. Но его еще должен понять компилятор. Поэтому в Pascal обязательно объявление типа данных.

В твоем примере объявлен тип
A_KTO_EBO_3HAET = (HO_KTO_TO_BEgb_3HAET, BCE_ETO_BECbMA_CTPAHHO) с двумя возможными значениями. И, если ты в своей програме допустишь опечатку, например применишь, BCE_ЭTO_BECbMA_CTPAHHO, то компилятор укажет на ошибку. Если обратиться к необъявленной переменной также будет сообщение об ошибке, но при компиляции программы, а не во время работы.

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

Впоследствии в Delphi была релизована и очень удачная и простая (по сравнению с Pascal) система ООП. А также чрезвычайно удобная среда програмирования.

А вот в LISP объявление типов не требуется. Там сознательно это сделано, чтобы придать языку "балдёжность". А не для того, чтобы дать возможность разгильдяям не описывать переменные.
ShaggyDoc вне форума  
 
Непрочитано 16.11.2008, 10:00
#155
DEM

YngIngKllr
 
Регистрация: 29.03.2005
СПб
Сообщений: 12,968


ShaggyDoc
Угу синтаксис Языка уже немного понимаю, в сравнении с Lisp более строг, и как правильно вы заметили большинство ошибок с объявлением переменых отлавливаются еще на стадии компиляции.
Да и потом в режиме отладки легко найти ошибки.
__________________
Работаю за еду.
Working for food.
Für Essen arbeiten.
العمل من أجل الغذاء
Працую за їжу.
DEM вне форума  
 
Непрочитано 16.11.2008, 13:48
#156
Елпанов Евгений

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


Цитата:
Сообщение от ganjour Посмотреть сообщение
а разве использование COM в Lisp не есть нечто подобное использованию VBA, на днях на caduser.ru некто привел вот такой код:
Код:
[Выделить все]
;;;процедура преобразования вектора из вида |расстояние,градусы,минуты,секунды,| в вид |расстояние<градусыdминуты'секунды"
  (defun zapros	()
    (setq pnt
	   (getstring
	     (strcat
	       "Ведите точку в виде |расстояние,угол_в_градусах,минуты,секунды, |: "
	     )
	   )
    )
    (if	(= pnt "")
      (command "_ucs" "_w")
      ""
    )
    (setq is (strlen pnt))
    (if	(not (zerop is))
      (progn
	(setq is_1 (1- is))
	(if (not (vl-string-search "," pnt is_1))
	  (setq pnt (strcat pnt ","))
	)
	(while (setq n_dis (vl-string-search "," pnt))
	  (setq pnt (vl-string-subst "<" "," pnt))
	  (while (setq n_dis (vl-string-search "," pnt))
	    (setq pnt (vl-string-subst "d" "," pnt))
	    (while (setq n_dis (vl-string-search "," pnt))
	      (setq pnt (vl-string-subst "'" "," pnt))
	      (while (setq n_dis (vl-string-search "," pnt))
		(setq pnt (vl-string-subst (chr 34) "," pnt))
	      )
	    )
	  )
	)
      )
    )
  )
просто применяет COM функцию vl-string-subst для замены символа, ведь это почти тот же VBA, хотя тоже можно сделать на чистом Autolisp например так:
Код:
[Выделить все]
;;;процедура преобразования вектора из вида |расстояние,градусы,минуты,секунды,| в вид |расстояние<градусыdминуты'секунды"| отредактировано
  (defun zapros	()
    (setq pnt
	   (getstring
	     "Ведите точку в виде |расстояние,угол_в_градусах,минуты,секунды, |: "
	   )
    )

    (if	(= pnt "")
      (command "_ucs" "_w")
      ""
    )
    (setq is (strlen pnt))
    (if	(not (zerop is))
      (progn
	(if (/= (substr pnt is 1) ",")
	  (setq pnt (strcat pnt ","))
	)

	(setq slist (list))
	(setq i 0)
	(setq sbegin 1)

	(while (< i 4)
	  (setq sbegin0 sbegin)
	  (while (/= (substr pnt sbegin 1) ",")
	    (setq sbegin (+ sbegin 1))
	  )
	  (setq sbegin (+ sbegin 1))
	  (setq i (+ i 1))
	  (setq spnt (substr pnt sbegin0 (- sbegin sbegin0 1)))
	  (setq slist (cons spnt slist))
	)
	(setq slist (reverse slist))
	(setq pnt "")
	(setq i 0)
	(while slist
	  (setq	pnt
		 (cond
		   ((= i 0) (strcat pnt (car slist) "<"))
		   ((= i 1) (strcat pnt (car slist) "d"))
		   ((= i 2) (strcat pnt (car slist) "'"))
		   ((= i 3) (strcat pnt (car slist) (chr 34)))
		 )
	  )
	  (setq slist (cdr slist))
	  (setq i (+ i 1))
	)
      )
    )
  )
Может быть COM в Lisp тоже способен "калечить мозги" как VBA, а?
Все это написано с VBA-шным подходом.
На лиспе, это должно выглядеть примерно так:
Код:
[Выделить все]
(defun test (s a)
  ;;(test "4,5,6,7" "<d'\"")
  (cond
    ((= s "") a)
    ((= (substr s 1 1) ",")
     (strcat (substr a 1 1) (test (substr s 2) (substr a 2)))
    )
    (t (strcat (substr s 1 1) (test (substr s 2) a)))
  )
)
ps. Алексей написал более расширенную программу, а я только пример другого мышления...
Елпанов Евгений вне форума  
 
Непрочитано 18.11.2008, 23:24
#157
ganjour


 
Регистрация: 16.10.2008
Сообщений: 45


Цитата:
Сообщение от Елпанов Евгений Посмотреть сообщение
Все это написано с VBA-шным подходом.
На лиспе, это должно выглядеть примерно так:
Цитата:
Сообщение от Кулик Алексей aka kpblc Посмотреть сообщение
Как программист: на слабО решил взять? Ну на, держи тебе вариант кода:
Не знаю что такое "уроки Евгения Елпанова по рекурсиям" и вообще признаюсь - я не понимаю рекурсии и понимать не желаю , wcmatch - а что это такое, может объяснишь?
А этот cadddr дыр-дыр-дыр ты чё там трактор заводишь что ли?
Переведи с марсианского!
То-то я смотрю программы стали разрастаться до немыслимых размеров при минимальной функциональности - aka kpblc хотел показать всю свою значительность? мой тебе совет - спустись с небес на землю.
Подобный код с "мышлением на лиспе" только оттолкнет новичка от лиспа в сторону VB.
Ну держите теперь мой вариант кода Помня заветы дедушки Вирта постарался быть минималистом в использовании встроенных функций. По крайней мере в 1.5 раза короче варианта kpblc, расширена функциональность и надеюсь этот код будет понятен также людям с мышлением не на лиспе ответы типа "отвратительно" прошу аргументировать
Код:
[Выделить все]
;|
***** Преобразование любой строки к виду *<*d*'*" (расстояние/градусы/минуты/секунды) *****
Примеры ввода:
что желаешь то и вводи :)
разделителем может служить что угодно, кроме цифр разумеется:
54,45,32,23
54,,,45,,32,,,,,,,23
54<45d32'23
54<<<<<45ddd32'''''23""""""""
54влалападпп45апавп32,уйцекгн23
54,45,32
54,45
54

Вызов: загрузи и введи в текстовом окне команду test
|;

;;; Преобразование строки в список
(defun input_string->list (inp_string / char_list islen)
  (setq islen (strlen inp_string))
  (setq char_list (list ""))
  (while (< 0 islen)
    (setq char_list (cons (substr inp_string islen 1) char_list))
    (setq islen (1- islen))
  )					; end of while
  char_list
)					; end of input_string->list

;;; Преобразует список в строку необходимого вида
(defun result_list (inp_string	 /	      element	   i
		    j		 symbol_list  char_list	   int_matrix
		    out_string
		   )
;;;  Инициализация
  (setq symbol_list (list "<" "d" "'" "\""))
  (setq int_matrix (list 0 1 2 3))
  (setq i 0)
  (setq element "")
  (setq out_string "")
;;;  Извлечение и группирование элементов списка char_list 
  (setq char_list (input_string->list inp_string))
  (while char_list
;;;    Если элемент цифра
    (if	(and (<= (ascii (car char_list)) 57)
	     (>= (ascii (car char_list)) 48)
	)
      (progn
	(setq element (strcat element (car char_list)))
	(setq j t)
      )
;;;      Если элемент не цифра
      (progn
	(if j
	  (progn
	    (setq int_matrix (subst element i int_matrix))
	    (setq element "")
	    (setq j nil)
	    (setq i (1+ i))
	  )
	)
      )
    )
;;;    Следующий элемент
    (setq char_list (cdr char_list))
  )					; end of while
;;;  Очищаю список на всякий случай
  (setq char_list nil)
;;;  Если введенных данных недостаточно
  (while (< i 4)
    (setq int_matrix (subst "0" i int_matrix))
    (setq i (1+ i))
  )					; end of while
;;;  Преобразую список int_matrix в строку и добавляю необходимые символы "<" "d" "'" "\""
  (while symbol_list
    (setq out_string
	   (strcat out_string (car int_matrix) (car symbol_list))
    )
;;;    Следующий элемент
    (setq int_matrix (cdr int_matrix))
    (setq symbol_list (cdr symbol_list))
  )					; end of while
  out_string
)					; end of result_list

;;; Функция тестирования
(defun C:test (/ inp_string)
  (setvar "cmdecho" 0)
  (setq inp_string (getstring "Строка: "))
  (princ (result_list inp_string))
  (terpri)
  (setvar "cmdecho" 1)
)					; end of test
ganjour вне форума  
 
Непрочитано 19.11.2008, 00:00
#158
Кулик Алексей aka kpblc
Moderator

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


А я не хочу что бы то ни было доказывать. Код написан под конкретные задачи, исходя из того, что было заявлено. Короче и быстрее Елпанова все равно не напишешь:
Код:
[Выделить все]
(BENCHMARK '((conv-string-to-string "4,5,6,7") (result_list "4,5,6,7") (test "4,5,6,7" "<d'\"")))
Benchmarking ................Elapsed milliseconds / relative speed for 8192 iteration(s):

    (TEST "4,5,6,7" "<d'\"")..............3328 / 1.47 <fastest>
    (CONV-STRING-TO-STRING "4,5,6,7").....4046 / 1.21
    (RESULT_LIST "4,5,6,7")...............4906 / 1 <slowest>
Кстати, а как ты собираешься обрабатывать "пропущенные" символы? Например, надо строку вида "16,15,,1" преобразовать в "16<15d0'1''. Чего делать будем? Этот момент в задании не был оговорен, вот и пошли кто во что горазд.
Ты при написании функции учитывай все возможные варианты. И невозможные тоже. Тогда и длина кода будет сопоставима.
По коду:
  1. Зачем делать несколько строк с setq, когда можно обойтись одним? Имеется в виду заменить
    Код:
    [Выделить все]
    (setq symbol_list (list "<" "d" "'" "\""))
      (setq int_matrix (list 0 1 2 3))
      (setq i 0)
      (setq element "")
      (setq out_string "")
      (setq char_list (input_string->list inp_string))
    на
    Код:
    [Выделить все]
    (setq symbol_list (list "<" "d" "'" "\"")
            int_matrix  (list 0 1 2 3)
            i           0
            element     ""
            out_string  ""
            char_list   (input_string->list inp_string)
            ) ;_ end of setq
    Скорость выполнения будет выше.
  2. У тебя не учитывается (точнее, неверно учитывается) вариант десятых долей секунд. Попробуй запустить (result_list "16,15,,1.16") и сравни, например, с (conv-string-to-string "16,15,,1.16"). Кстати, (test) выдаст свой результат.
  3. В коде присутствуют лишние progn.
Читать тебе лекции по штатным функциям AutoLISP'a у меня нет никакого желания, особенно учитывая тональность, в которой ты общаешься.
__________________
Моя библиотека lisp-функций
---
Обращение ко мне - на "ты".
Все, что сказано - личное мнение.
Кулик Алексей aka kpblc вне форума  
 
Непрочитано 19.11.2008, 00:25
#159
AlexV

Инженер
 
Регистрация: 02.10.2008
С-Пб
Сообщений: 3,692


Цитата:
...и вообще признаюсь - я не понимаю рекурсии и понимать не желаю
Главное, что компилятор понимает..
AlexV вне форума  
 
Непрочитано 19.11.2008, 06:31
#160
ShaggyDoc

Thượng Tá Quân Đội Nhân Dân Việt Nam
 
Регистрация: 14.03.2005
44d32'44"С, 33d26'51"В
Сообщений: 13,372


А что, ветка про "зло" превращается в очередные "уроки"?
"Не знаю что такое", "не понимаю, и понимать не желаю", но "а что это такое", "дыр-дыр".

Это уже "медицинский факт" (С).
ShaggyDoc вне форума  
Закрытая тема
Вернуться   Форум DWG.RU > Сообщество > Разное > В чем зло VBA?



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Пароль к VBA karp_b Программирование 24 29.08.2013 12:43
Юмор 2007 Огурец Разное 1172 29.12.2007 11:16
Чем можно удалить файл, занятый не понятно чем? G.A.W. Разное 4 08.10.2007 15:12
ActiveX Automation из VBA karp_b Программирование 5 14.09.2007 18:05
VBA vs LISP Kosenko Sasha LISP 23 06.03.2007 02:56