powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Программирование [игнор отключен] [закрыт для гостей] / CL простой web паук. Как выходят из алгоритма в CL.
6 сообщений из 6, страница 1 из 1
CL простой web паук. Как выходят из алгоритма в CL.
    #36179655
AlexGru
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Написал простой web паук на CommonLisp. В самом примитивном виде.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
(in-package :study)

(defvar *html   nil)
(defvar *db*    nil)
(defvar *cnt*    0 )
(defvar *links*  0 )

(defun hp(html-content)
  (html-parse:parse-html html-content)
)

(defun file-string (path)
  (with-open-file (s path)
     (let* (
             (len  (file-length s))
             (data (make-string len))
           )
           (values data (read-sequence data s))
           (values data)
     )
  )    
)

(defun get-next-link()
  ;;;TODO
  (car (clsql::query "select id,strf from xxx where id=(select min(id) from xxx where checked=0)"))
  ;(clsql::start-sql-recording)
  ;(clsql::enable-sql-reader-syntax)
  ;(clsql::select [id] [strf] :from [xxx] :where [= [id]  5 ] :field-names nil)
)

(defun mark-this-link(uid)
  (clsql::start-sql-recording)
  (clsql::enable-sql-reader-syntax)
    (clsql::update-records [xxx] :av-pairs'((checked 1)) :where [= [id] uid])
  (clsql::stop-sql-recording)
)

(defun start-robot()
  (if (not 
          (or 
              (eq  (car (study:get-next-link)) 0)
              (eq  (car (study:get-next-link)) nil))
      )
   (study:ex  (car (study:get-next-link)) 
              (car (cdr (study:get-next-link)))
   )
  )
)

(defun ex(id lnk)
 (study:dump-cont2 (study:hp (s-http-client:do-http-request lnk)))
 (study:mark-this-link id)
 (study:start-robot)
)


(defun save-link(lnk)
  (if (not (eq lnk :CLASS))
    (clsql::insert-records :into "xxx" :attributes '(strf) :values  
       (list (concatenate 'string """" (car (list lnk)) """")))
  )
)
 
(defun parse-a(a-list)
   (dolist (buff a-list)
     (if (eq study::*links*  1 ) 
          (study:save-link buff)
     )
     (if (eq buff :HREF)
         (setf  study::*links*  1 )
         (setf  study::*links*  0 )
     )  
   )
)

(defun dump-cont2(cont)
  (if 
   (or
    (atom cont)
    (eq cont nil))
   nil
   (if (eq (car cont) :A)
       (parse-a (cdr cont))
       (progn
         (dump-cont2 (cdr cont))
         (dump-cont2 (car cont))))))


Работает как ожидалось. Все устраивает.
Но есть ряд вопросов:

1) Как корректно завершиться, если
после проверки, того, что больше нету ссылок в базе для скачивания
в блоке
Код: plaintext
1.
2.
3.
4.
5.
  (if (not 
          (or 
              (eq  (car (study:get-next-link))  0 )
              (eq  (car (study:get-next-link)) nil))
      )

2) Ну и вообще, как мне показалось совсем не используется Функциональный стиль программирования. Программа выглядит как на паскале.
Что посоветуете в этом направлении.

3) Где в коде видны 100% косяки.

Спасибо.
...
Рейтинг: 0 / 0
CL простой web паук. Как выходят из алгоритма в CL.
    #36179808
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexGru wrote:


> Работает как ожидалось. Все устраивает.
> Но есть ряд вопросов:
>
> 1) Как корректно завершиться, если
> после проверки, того, что больше нету ссылок в базе для скачивания
> в блоке
>
> (if (not
> (or
> (eq (car (study:get-next-link)) *0*)
> (eq (car (study:get-next-link)) nil))
> )
>
Можешь просто вернуть что-то из этой функции, а снаружи анализировать.
Можно применить нелокальный выход (trow)
Можно применить возбуждение condition (только его надо обрабатывать
как без возможности продолжить).

А лучше всего - кстати -- сделать по-лисповому -- иметь флаг
выхода в виде динамической переменной (special, она же "глобальная",
хотя в лиспе нет глобальных переменных), в цикле её проверять и
крутить цикл, а внутри, неважно где, её устанавливать на
"выходить".


> 2) Ну и вообще, как мне показалось совсем не используется Функциональный
> стиль программирования. Программа выглядит как на паскале.
> Что посоветуете в этом направлении.

Это не страшно. Как раз LISP тем и хорош, что позволяет НЕ ИСПОЛЬЗОВАТЬ
ФП, если оно не нужно. Думаю, тут оно не нужно. Или не очень нужно.

> 3) Где в коде видны 100% косяки.

Оформление кода, оно ужасное. Не по лисповому. Много лишних переводов
строк и "висящие" закрывающие скобки. Надо как в dump-cont2 у тебя написано
писать.
(подумать только, я тоже так писал, когда начинал. сейчас мне это кажется диким).

Далее посмотрим.

> (defun file-string (path)
> (with-open-file (s path)
> (let* (
> (len (file-length s))
> (data (make-string len))
> )
> (values data (read-sequence data s))

это что за зверь, почему два (values ) ?
Оно конечно работать будет, просто первое потеряется.

> (values data)
> )
> )
> )

> (defun start-robot()
> (if (not
> (or
> (eq (car (study:get-next-link)) 0)
> (eq (car (study:get-next-link)) nil))
> )
> (study:ex (car (study:get-next-link))
> (car (cdr (study:get-next-link)))
> )
> )
> )
>

это тоже я не понял.

Ну и ты везде используешь EQ для сравнения, это странно.
Ввозможно, где-то ошибка - нужны EQL или другие сравнения.

Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
CL простой web паук. Как выходят из алгоритма в CL.
    #36181275
antares0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexGru,
(if |что-то|
|делать|
nil)
обычно сворачивают в
(when |что-то| |делать|)

Постоянно дергаешь study:*
ты же уже написал in-package и спецификатор излишен.

обертки типа hp имеет смысл писать впростой или символ макры (если ты не собираешся передавать ее параметром)

в ex в первой строчке я бы передавл функцию а не значение,хотя это не догма не многи делают как ты.
Плюс у тебя много if-ов c этим что-то делать надо.
P.S. Код выровняй.
...
Рейтинг: 0 / 0
CL простой web паук. Как выходят из алгоритма в CL.
    #36181282
antares0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexGru,
(if |что-то|
|делать|
nil)
обычно сворачивают в
(when |что-то| |делать|)

Постоянно дергаешь study:*
ты же уже написал in-package и спецификатор излишен.

обертки типа hp имеет смысл писать впростой или символ макры (если ты не собираешся передавать ее параметром)

в ex в первой строчке я бы передавл функцию а не значение,хотя это не догма не многи делают как ты.
Плюс у тебя много if-ов c этим что-то делать надо.
P.S. Код выровняй.
...
Рейтинг: 0 / 0
CL простой web паук. Как выходят из алгоритма в CL.
    #36181291
antares0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexGru,
(if |что-то|
|делать|
nil)
обычно сворачивают в
(when |что-то| |делать|)

Постоянно дергаешь study:*
ты же уже написал in-package и спецификатор излишен.

обертки типа hp имеет смысл писать впростой или символ макры (если ты не собираешся передавать ее параметром)

в ex в первой строчке я бы передавл функцию а не значение,хотя это не догма не многи делают как ты.
Плюс у тебя много if-ов c этим что-то делать надо.
P.S. Код выровняй.
...
Рейтинг: 0 / 0
CL простой web паук. Как выходят из алгоритма в CL.
    #36181346
antares0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AlexGru,
в file-string
предпоселдний values ничего не выводит а последний равносилен просто data (без скобок)

C *links* ты делаешь что совсем извратное. Там внутреннее состояние фунции вылазит в глобальную переменную - это совсем нехорошо.

Не совсем аонял из чего корректный выход. Если из функции то return, return-from. А еще лучше завернуть остальные вызовы в проверку условия.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / Программирование [игнор отключен] [закрыт для гостей] / CL простой web паук. Как выходят из алгоритма в CL.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]