|
|
|
CL простой web паук. Как выходят из алгоритма в CL.
|
|||
|---|---|---|---|
|
#18+
Написал простой 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. Работает как ожидалось. Все устраивает. Но есть ряд вопросов: 1) Как корректно завершиться, если после проверки, того, что больше нету ссылок в базе для скачивания в блоке Код: plaintext 1. 2. 3. 4. 5. 2) Ну и вообще, как мне показалось совсем не используется Функциональный стиль программирования. Программа выглядит как на паскале. Что посоветуете в этом направлении. 3) Где в коде видны 100% косяки. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2009, 17:36:46 |
|
||
|
CL простой web паук. Как выходят из алгоритма в CL.
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.09.2009, 18:49:17 |
|
||
|
CL простой web паук. Как выходят из алгоритма в CL.
|
|||
|---|---|---|---|
|
#18+
AlexGru, (if |что-то| |делать| nil) обычно сворачивают в (when |что-то| |делать|) Постоянно дергаешь study:* ты же уже написал in-package и спецификатор излишен. обертки типа hp имеет смысл писать впростой или символ макры (если ты не собираешся передавать ее параметром) в ex в первой строчке я бы передавл функцию а не значение,хотя это не догма не многи делают как ты. Плюс у тебя много if-ов c этим что-то делать надо. P.S. Код выровняй. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2009, 10:33:24 |
|
||
|
CL простой web паук. Как выходят из алгоритма в CL.
|
|||
|---|---|---|---|
|
#18+
AlexGru, (if |что-то| |делать| nil) обычно сворачивают в (when |что-то| |делать|) Постоянно дергаешь study:* ты же уже написал in-package и спецификатор излишен. обертки типа hp имеет смысл писать впростой или символ макры (если ты не собираешся передавать ее параметром) в ex в первой строчке я бы передавл функцию а не значение,хотя это не догма не многи делают как ты. Плюс у тебя много if-ов c этим что-то делать надо. P.S. Код выровняй. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2009, 10:35:39 |
|
||
|
CL простой web паук. Как выходят из алгоритма в CL.
|
|||
|---|---|---|---|
|
#18+
AlexGru, (if |что-то| |делать| nil) обычно сворачивают в (when |что-то| |делать|) Постоянно дергаешь study:* ты же уже написал in-package и спецификатор излишен. обертки типа hp имеет смысл писать впростой или символ макры (если ты не собираешся передавать ее параметром) в ex в первой строчке я бы передавл функцию а не значение,хотя это не догма не многи делают как ты. Плюс у тебя много if-ов c этим что-то делать надо. P.S. Код выровняй. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2009, 10:38:32 |
|
||
|
CL простой web паук. Как выходят из алгоритма в CL.
|
|||
|---|---|---|---|
|
#18+
AlexGru, в file-string предпоселдний values ничего не выводит а последний равносилен просто data (без скобок) C *links* ты делаешь что совсем извратное. Там внутреннее состояние фунции вылазит в глобальную переменную - это совсем нехорошо. Не совсем аонял из чего корректный выход. Если из функции то return, return-from. А еще лучше завернуть остальные вызовы в проверку условия. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 07.09.2009, 10:55:15 |
|
||
|
|

start [/forum/topic.php?fid=16&msg=36181346&tid=1344274]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
185ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
37ms |
get tp. blocked users: |
1ms |
| others: | 193ms |
| total: | 446ms |

| 0 / 0 |
