Форум программистов, компьютерный форум, киберфорум
Lisp
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.69/186: Рейтинг темы: голосов - 186, средняя оценка - 4.69
92 / 59 / 8
Регистрация: 09.11.2011
Сообщений: 443

Полезные коды и авторские программы на Lisp

30.10.2014, 09:43. Показов 44269. Ответов 132
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Расскажите, пожалуйста, что на лиспе пишите? вкратце, хотя бы. Очень интересно.
Понятно, что студенты пишут лабы, но вот все остальные, чем занимаются?
Сам пока ничего не пишу, а учу язык, но есть задумки написать веб-сервер для парсинга отчетов от АТС-ки. Заходит админ на него и смотрит кто куда и во сколько звонил по офису, статистика всякая там и прочее.
В общем не стесняйтесь, похвастайтесь, может сумеете заинтересовать случайного прохожего языком.
1
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
30.10.2014, 09:43
Ответы с готовыми решениями:

Полезные коды и проекты на VBA
В этой теме предлагаю выкладывать различные коды и готовые проекты VBA, которые, на Ваш взгляд, могут помочь новичкам в разработке как...

Полезные коды для PascalABC.NET
В этой теме размещаются полезные исходники программ, различные процедуры и функции, а так же готовые решения на часто задаваемые вопросы,...

Готовые решения и полезные коды на Visual Basic 6.0
Запрещаются любые обсуждения выложенных здесь работ (читаем спойлер). Собственно тут буду публиковать разные коды (как собственные или...

132
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38226 / 21158 / 4314
Регистрация: 12.02.2012
Сообщений: 34,773
Записей в блоге: 14
16.05.2020, 10:08
Студворк — интернет-сервис помощи студентам
Зачем это нужно? Ты слышал такое слово "визаулизация"? Для наглядности. А кавычки... Даже не знаю. Видимо, этот простой код неловко называть "рисованием". Хотя по сути это так и есть.
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
16.05.2020, 11:52
Как запустить этот код, чтобы увидеть визуализацию?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38226 / 21158 / 4314
Регистрация: 12.02.2012
Сообщений: 34,773
Записей в блоге: 14
16.05.2020, 12:40
Бери приаттаченный файл и загружай в HomeLisp. Он запустится автоматически.
Вложения
Тип файла: zip draw-expr.zip (663 байт, 5 просмотров)
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
16.05.2020, 15:03
Благодарю, получилось. А это только профессионалы на основе такого кода могут визуализировать или там несложно всё при знании некоторых неосвещенных пока что моментов?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38226 / 21158 / 4314
Регистрация: 12.02.2012
Сообщений: 34,773
Записей в блоге: 14
16.05.2020, 19:20
supmener, да код-то мой не сильно хорош... Писал от скуки. К тому же, если список по-настоящему сложный, то возникнут наложения... Вообще, визуализация - это очень интересная тема. И весьма сейчас популярная.
0
 Аватар для supmener
87 / 95 / 15
Регистрация: 26.06.2013
Сообщений: 4,755
16.05.2020, 20:03
Встречал в книге такое задание, рисовать эти схемы. Много ли потеряю, если не буду рисовать?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38226 / 21158 / 4314
Регистрация: 12.02.2012
Сообщений: 34,773
Записей в блоге: 14
16.05.2020, 20:05
Цитата Сообщение от supmener Посмотреть сообщение
Много ли потеряю, если не буду рисовать?
- практически ничего не потеряешь. Для работы это не сильно нужно.
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38226 / 21158 / 4314
Регистрация: 12.02.2012
Сообщений: 34,773
Записей в блоге: 14
16.05.2020, 20:09
Вот мой аниматор обхода графов на HomeLisp:

Lisp
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
(setq *i* '((r a) (r b) (r c) (a 1) (a 2) (b 1) (b 2) (c 1) (c 2)))
(setq *g* '((A B) (A C) (B D) (D E) (E F) (E A) (E B)))
(setq *h* '((a b) (a c) (b c) (b d) (c e) (d e) (e f) (e g) (e h) (g h)))
 
(setq *ww* 250 *hh* 250)
 
(defun get-vert (v g p)
 (iter (for pair in g)
   (when (and (eq v (car pair)) (not (member (cadr pair) p))) (return (cadr pair)))
   (when (and (eq v (cadr pair)) (not (member (car pair) p))) (return (car pair)))))
 
(defun get-lvert (v g p)
  (let ((r nil))
        (iter (for pair in g)
          (when (and (eq v (car pair)) (not (member (cadr pair) p))) (collecting (cadr pair) into r))
          (when (and (eq v (cadr pair)) (not (member (car pair) p))) (collecting (car pair) into r))) r))
 
(defun dfs! (g pth stk)
  (cond ((null stk) pth)
        (t (let ((h (get-vert (car stk) g pth)))
                 (if (null h) (dfs! g pth (cdr stk))
                              (dfs! g (cons h pth) (cons h stk)))))))
(defun dfs (start g)
  (dfs! g (list start) (list start)))
 
(defun bfs! (g pth que)
  (cond ((null que) pth)
        (t (let ((h (get-lvert (car que) g pth)))
                 (if (null h) (bfs! g pth (cdr que))
                              (bfs! g (append pth h) (append (cdr que) h)))))))
(defun bfs (start g)
  (bfs! g (list start) (list start)))
 
(defun a2s (x)
 (strUcase (implode (cons '&DQ (append (explode x) (list '&DQ))))))  
  
(defun get-num (a vs)
  (iter (for i upfrom 0) (for x in vs) (when (eq x a) (return i))))  
  
(defun draw-graph (g)
  (let* ((w (gensym 'w))
         (vs (setof (apply 'append g)))
         (n  (length vs))
         (coords nil)   
         (fi (/ (* 2 _pi) n)))
    (iter (for i from 1 to n) (collecting (list (* 150 (cos (* (- i 1) fi))) (* 150 (sin (* (- i 1) fi)))) into coords))
    (grwCreate w *ww* *hh* "" _WHITE)
    (grwScale w -200 200 -200 200)
    (grwShow w)
    (iter (for pair in coords) (grwCircle w (car pair) (cadr pair) 10 _RED) (grwFill w (car pair) (cadr pair) _RED _RED))
    (iter (for pair in g) 
          (let* ((n1 (get-num (car pair) vs))
                 (n2 (get-num (cadr pair) vs))
                 (x1 (car (nth n1 coords)))
                 (y1 (cadr (nth n1 coords)))
                 (x2 (car (nth n2 coords)))
                 (y2 (cadr (nth n2 coords))))
            (grwLine w x1 y1 x2 y2 _RED)))       
    (iter (for i from 1 to n) (for a in vs) (grwPrint w (* 180 (cos (* (- i 1) fi))) (* 180 (sin (* (- i 1) fi))) (a2s a) _RED))))
        
 
(defun dfs!! (g pth stk w coords vs)
  (cond ((null stk) pth)
        (t (let ((h (get-vert (car stk) g pth)))
                 (if (null h) (dfs!! g pth (cdr stk) w coords vs)
                              (progn 
                                 (let* ((n1 (get-num h vs))
                                        (n2 (get-num (car stk) vs))
                                        (x1 (car (nth n1 coords)))
                                        (y1 (cadr (nth n1 coords)))
                                        (x2 (car (nth n2 coords)))
                                        (y2 (cadr (nth n2 coords))))                
                                    (grwCircle w x1 y1 10 _BLUE)
                                    (grwFill w x1 y1 _BLUE _BLUE)
                                    (grwCircle w x2 y2 10 _BLUE)
                                    (grwFill w x2 y2 _BLUE _BLUE)
                                    (grwLine w x1 y1 x2 y2 _BLUE)
                                    (sleep* 500)                                    
                                    (dfs!! g (cons h pth) (cons h stk)w coords vs))))))))
 
(defun draw-dfs (g)
  (let* ((w (gensym 'w))
         (vs (setof (apply 'append g)))
         (n  (length vs))
         (coords nil)   
         (fi (/ (* 2 _pi) n)))
    (iter (for i from 1 to n) (collecting (list (* 150 (cos (* (- i 1) fi))) (* 150 (sin (* (- i 1) fi)))) into coords))
    (grwCreate w *ww* *hh* "DFS" _WHITE)
    (grwSetParm  w 2 1 _RED _RED)
    (grwScale w -200 200 -200 200)
    (grwShow w)
    (iter (for pair in coords) (grwCircle w (car pair) (cadr pair) 10 _RED) (grwFill w (car pair) (cadr pair) _RED _RED))
    (iter (for pair in g) 
          (let* ((n1 (get-num (car pair) vs))
                 (n2 (get-num (cadr pair) vs))
                 (x1 (car (nth n1 coords)))
                 (y1 (cadr (nth n1 coords)))
                 (x2 (car (nth n2 coords)))
                 (y2 (cadr (nth n2 coords))))
            (grwLine w x1 y1 x2 y2 _RED)))       
    (iter (for i from 1 to n) (for a in vs) (grwPrint w (* 180 (cos (* (- i 1) fi))) (* 180 (sin (* (- i 1) fi))) (a2s a) _RED))
     (dfs!! g (list (car vs)) (list (car vs)) w coords vs)
     ;;(say "OK!")
      ))
 
 
(defun bfs!! (g pth que w coords vs)
  (cond ((null que) pth)
        (t (let ((h (get-lvert (car que) g pth)))
                 (if (null h) (bfs!! g pth (cdr que) w coords vs)
                              (progn 
                                  (let* ((n1 (get-num (car que) vs))
                                         (x1 (car (nth n1 coords)))
                                         (y1 (cadr (nth n1 coords))))
                                       (iter (for pp in h) 
                                             (let* ((n2 (get-num pp vs))
                                                    (x2 (car (nth n2 coords)))
                                                    (y2 (cadr (nth n2 coords)))) 
                                                  (grwCircle w x1 y1 10 _BLUE)
                                                  (grwFill w x1 y1 _BLUE  _BLUE)
                                                  (grwCircle w x2 y2 10 _BLUE)
                                                  (grwFill w x2 y2 _BLUE _BLUE)
                                                  (grwLine w x1 y1 x2 y2 _BLUE)
                                                  (sleep* 500)))                                    
                                       (bfs!! g (append pth h) (append (cdr que) h) w coords vs))))))))  
                            
(defun draw-bfs (g)
  (let* ((w (gensym 'w))
         (vs (setof (apply 'append g)))
         (n  (length vs))
         (coords nil)   
         (fi (/ (* 2 _pi) n)))
    (iter (for i from 1 to n) (collecting (list (* 150 (cos (* (- i 1) fi))) (* 150 (sin (* (- i 1) fi)))) into coords))
    (grwCreate w *ww* *hh* "BFS" _WHITE)
    (grwSetParm  w 2 1 _RED _RED)
    (grwScale w -200 200 -200 200)
    (grwShow w)
    (iter (for pair in coords) (grwCircle w (car pair) (cadr pair) 10 _RED) (grwFill w (car pair) (cadr pair) _RED _RED))
    (iter (for pair in g) 
          (let* ((n1 (get-num (car pair) vs))
                 (n2 (get-num (cadr pair) vs))
                 (x1 (car (nth n1 coords)))
                 (y1 (cadr (nth n1 coords)))
                 (x2 (car (nth n2 coords)))
                 (y2 (cadr (nth n2 coords))))
            (grwLine w x1 y1 x2 y2 _RED)))       
    (iter (for i from 1 to n) (for a in vs) (grwPrint w (* 180 (cos (* (- i 1) fi))) (* 180 (sin (* (- i 1) fi))) (a2s a) _RED))
     (bfs!! g (list (car vs)) (list (car vs)) w coords vs)
     ;;(say "OK!")
      ))                            
     
(draw-dfs *h*)
 
(grwShowall -1)
 
(draw-bfs *h*)
 
(grwShowall -1)
 
(draw-dfs *i*)
 
(grwShowall -1)
 
(draw-bfs *i*)
 
(grwShowall -1)
 
(draw-dfs *g*)
 
(grwShowall -1)
 
(draw-bfs *g*)
 
(grwShowall -1)
Миниатюры
Полезные коды и авторские программы на Lisp  
4
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38226 / 21158 / 4314
Регистрация: 12.02.2012
Сообщений: 34,773
Записей в блоге: 14
16.05.2020, 20:18
Рисование двоичного дерева с возможностью поворота на заданный угол:

Lisp
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
(defun draw-tree (n fi)
  (let ((w (gensym 'w))
        (xy (rot-list (draw-t 0 100 40 20 n) fi)))
    (grwCreate w 300 300 "Binary tree" _WHITE)
    (grwScale w -100 100 -100 100)
    
     (grwSetParm  w 2 1 _RED _WHITE)
 
    (grwShow w)
    (mapcar (lambda (pair) (grwLine w (nth 0 pair) (nth 1 pair) (nth 2 pair) (nth 3 pair) _RED)) xy)
    'OK))
 
(defun draw-t (x y dx dy n &optional (r nil))
  (cond ((zerop n) r)
        (t (let ((ll (draw-t (+ x dx) (- y dy) (* dx 0.45) (* dy 1.1) (- n 1) r))
                 (rr (draw-t (- x dx) (- y dy) (* dx 0.45) (* dy 1.1) (- n 1) r)))
               (append ll rr (list (list x y (+ x dx) (- y dy)) (list x y (- x dx) (- y dy)))))))) 
    
(defun rot (x y f)
  (let* ((fi (* _pi (/ f 180.0)))
         (cosfi (cos fi))
         (sinfi (sin fi))
         (x1 (+ (* cosfi x) (* sinfi y)))
         (y1 (- (* cosfi y) (* sinfi x))))
    (list x1 y1)))
 
(defun rot-list (lst fi)
  (mapcar (lambda (p)
    (let ((x1 (nth 0 p))
          (y1 (nth 1 p))
          (x2 (nth 2 p))
          (y2 (nth 3 p)))
     (append (rot x1 y1 fi) (rot x2 y2 fi)))) lst))
 
(draw-tree (str2fix (ask "Число уровней")) (str2flo (ask "Угол поворота в градусах")))
Миниатюры
Полезные коды и авторские программы на Lisp  
3
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38226 / 21158 / 4314
Регистрация: 12.02.2012
Сообщений: 34,773
Записей в блоге: 14
17.05.2020, 23:02
Вот рисование треугольника Серпинского:

Lisp
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
(defun start (&optional (lv 3))
  (let ((w (gensym 'w)))
    (grwCreate w 500 500 "Треугольник Серпинского" _WHITE)
    (grwShow w)
    (grwScale w -100 100 -100 100)
    (grwSetParm w 3 1 _WHITE)
    (triangle w (list -90 -90 0 90 90 -90) lv)))
    
    
(defun triangle (w coord &optional (lv 3))
   (when (plusp lv)
     (let ((x1 (nth 0 coord))
           (y1 (nth 1 coord))
           (x2 (nth 2 coord))
           (y2 (nth 3 coord))
           (x3 (nth 4 coord))
           (y3 (nth 5 coord)))
       (grwLine w x1 y1 x2 y2 _RED)
       (grwLine w x1 y1 x3 y3 _RED)
       (grwLine w x2 y2 x3 y3 _RED)
       (grwFill w (/ (+ x1 x2 x3) 3.0) (/ (+ y1 y2 y3) 3.0) _RED _RED)
       (let ((xx1 (* 0.5 (+ x1 x2)))
             (yy1 (* 0.5 (+ y1 y2)))
             (xx2 (* 0.5 (+ x2 x3)))
             (yy2 (* 0.5 (+ y2 y3)))
             (xx3 (* 0.5 (+ x1 x3)))
             (yy3 (* 0.5 (+ y1 y3))))  
            (grwLine w xx1 yy1 xx2 yy2 _WHITE)
            (grwLine w xx1 yy1 xx3 yy3 _WHITE)
            (grwLine w xx2 yy2 xx3 yy3 _WHITE)
            (grwFill w (/ (+ xx1 xx2 xx3) 3.0) (/ (+ yy1 yy2 yy3) 3.0) _WHITE _WHITE)
            (triangle w (list x1 y1 xx1 yy1 xx3 yy3) (- lv 1))
            (triangle w (list xx1 yy1 x2 y2 xx2 yy2) (- lv 1))
            (triangle w (list xx3 yy3 xx2 yy2 x3 y3) (- lv 1))))))
Миниатюры
Полезные коды и авторские программы на Lisp  
1
 Аватар для chessman2
165 / 145 / 10
Регистрация: 21.10.2012
Сообщений: 503
12.01.2021, 11:12
Сделал небольший полезный скрипт
работающий по принципу программы fortune
из мира *NIXов.
К нему частотный англо-русский словарь
на 2000 слов зашитыx в лисповские списки.
Ну и простейший GUI для удобства.

Добавлено через 8 минут
Кому интересно, ссылка для скачивания
https://www.dropbox.com/s/jgqa... t.zip?dl=0
1
Заблокирован
31.01.2021, 11:45
Никак руки не доходят закончить порогу одну - осталось меню сварганить. Работы на час-два, но никак не соберусь. Меню должно быть четырех уровненным. Лень заела)
Под катом может быть полезный код - регистрация и верификация пользователя. Как-правило это довольно шаблонный код.
Код рассчитан на пользователей *NIX систем. Но это легко исправить небольшими изменениями в коде.


Lisp
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
#lang racket
 
(require racket/serialize)
(require racket/date)
 
(define database (void))
(define password (void))
(define name     (void))
(define created-user (void))
 
(serializable-struct user (login                ;Структура описывающая нашего пользователя.
                           password                     ;У вас она дожна быть своя: со своими вводными.
                           reg-time    
                           block-time  
                           last-visit  
                           tests       
                           zero-exam  
                           tre-exam    
                           random-exam) #:mutable)
 
(define dir-path (string-append (path->string (find-system-path 'home-dir)) ".mtable")) ;Определяем пути к папке
(define database-path  (string-append dir-path "/.database"))  ;И файлу с базой данных наших зарегистрированных пользователей.
 
;Функция для скрытого чтения пароля из терминала.
(define (read-pswd)
  (system "stty -echo")
  (begin0 (read-line (current-input-port))
    (system "stty echo")
    (newline))) 
 
:Превращаем текущую дату в строку.
(define (date-to-string date)
  (let* ((day    (number->string (date-day date)))
         (month  (number->string (date-month date)))
         (year   (number->string (date-year date)))
         (hour   (number->string (date-hour date)))
         (minute (number->string (date-minute date)))
         (second (number->string (date-second date))))
    (string-append day "/" month "/" year "/" hour ":" minute ":" second)))
 
;Читаем из пути(базы данных).
(define (read-from-path path)
                (call-with-input-file path
                   (λ (input) (read input))))
 
;Пишем в базу данных.
(define (write-data-to-file path)
                    (call-with-output-file database-path
                      (λ (output)
                                (write   (serialize database) output))
                      #:exists 'replace))
 
;Функция проверяет существует ли путь к базе данных:
;Если папка отсутствует, то создает папку. То же  самое с файлом.
;Если существует, но пуст, то пишет туда хеш-таблицу куда мы будем складывать наши данные о пользователях.
;Таким образом программа будет работать даже если пользователь случайно удалить файл или папку с данными.
 
(define (check-path-and-set!)
  (if (directory-exists? dir-path)
      (if (file-exists? database-path)
          (if (serializable? (read-from-path database-path))
          (set! database
               (call-with-input-file database-path
                 (λ (input) (deserialize (read input)))))
          (begin
            (call-with-output-file database-path
                  (λ (output) (write (serialize (make-hash)) output)) #:exists 'replace)
            (check-path-and-set!)))
          (begin
            (display-to-file (serialize (make-hash)) database-path)
            (check-path-and-set!)))
      (begin
        (make-directory dir-path)
        (check-path-and-set!))))
 
;Проверка наличия в строке цифр и букв.
(define (letter+num pswd)
  (if (empty? (regexp-match* #px"\\d+[a-z, A-Z | a-я, А-Я]|[a-z, A-Z | а-я, А-Я]+\\d" pswd))
      empty
      (list 'not-empty)))
 
;Проверяем пароль, который придумал пользователь, чтобы не был слабым и тд.
(define (test-password)
  (printf "Придумайте пароль: ")
  (flush-output)
  (let ((pswd (read-line (current-input-port))))
    (cond
      ((equal? pswd "б")
       "base")
      ((< (string-length pswd) 6)
       (begin
         (printf "Пароль должен быть не короче 7 символов,
а так же состоять из букв и цифр.\n")
         (test-password)))
       ((empty? (letter+num pswd))
        (begin
         (printf "Пароль должен быть не короче 7 символов,
а так же состоять из букв и цифр.\n")
         (test-password)))
       ((regexp-match #rx" " pswd)
        (begin
          (printf "Пароль не должен содержать пробелов и табуляции\n")
          (test-password)))
       ((regexp-match #rx"\t" pswd)
        (begin
          (printf "Пароль не должен содержать пробелов и табуляции\n")
          (test-password)))
        ((< (length (regexp-match* #px"\\d" pswd)) 3)
         (begin
           (printf "Слабый пароль. Придумайте получше.
Колличество цифр в пароле должно быть не меньше трех.\n")                   
           (test-password)))
        ((equal? (regexp-match #px"\\d\\d\\d" pswd) (list "123"))
         (begin
           (printf "Слабый пароль: содержит ряд чисел 123.\n")
           (test-password)))
        ((set! password pswd)))))
 
;Проверяем логин.
(define (test-login)
  (printf "Придумайте логин: ")
  (flush-output)
  (let ((login (read-line (current-input-port))))
    (cond
      ((equal? login "б") "base")
      ((not (equal? "free" (hash-ref database login "free")))
       (begin
         (printf "Это имя уже занято. Придумайте другое\n")
         (test-login)))
      ((not (regexp-match #rx"[a-z, A-Z | а-я, А-Я]" login))
       (begin
         (printf "Имя должно соcтоять из букв\n")
         (test-login)))
       ((regexp-match #rx" " login)
        (begin
          (printf "Имя не должено содержать пробелов и табуляции\n")
          (test-login)))
       ((regexp-match #rx"\t" login)
        (begin
          (printf "Имя не должен содержать пробелов и табуляции\n")
          (test-login)))
       ((< (string-length login) 3)
        (begin
          (printf "Имя не должно быть короче трех букв\n")
          (test-login)))
        ((set! name login)))))
 
;Cоздаем пользователя на текущий сеанс: заполняем из хеш-таблицы поля структуры.
(define (create-user)
  (set! created-user (user name password (date-to-string (current-date)) 0 (date-to-string (current-date)) empty (vector #f 0) (vector #f 0) (vector #f 0)))
  (hash-set! database name created-user))
 
:Регистрация пользователя.
(define (registration)
  (printf "Для возврата в меню: б\n")
  (if (equal? "base" (test-login))
      "base"
      (if (equal? "base" (test-password))
          "base"
          (begin
              (create-user)
              (write-data-to-file database-path)
              (set! created-user (void))
              (printf "Вы удачно зарегестрированы, ~a.\n" name)))))
 
;Проверяем логин, при авторизации.
(define (verify-login)
  (printf "Логин: ")
  (flush-output)
  (let ((login (read-line (current-input-port))))
    (cond
      ((equal? "б" login) "base")
      ((equal? "free" (hash-ref database login "free"))
       (begin
         (printf "Неверный логин.\n")
         (verify-login)))
       ((begin
          (set! name login)
          (void)))))) 
 
;Проверяем логин при входе в программу, когда пользователь уже зарегистрировался.
;После пяти неудачных попыток ввести пароль предлагается подождать 5 мин и вспомнить пароль. Дальнейшие попытки авторизации блокируются на 5 мин.
(define (verify-password [acc 0])
  (printf "Пароль: ")
  (flush-output)
  (let ((block-time (user-block-time (hash-ref database name)))
        (password (read-pswd)))
    (cond
      ((equal? "б" password) "base")
      ((and (not (equal? block-time 0))
            (< (- (current-seconds) block-time) 300))
       (begin
         (printf "Пропробуйте снова через ~a мин.\n" (if (< (/ (- 300 (- (current-seconds) block-time)) 60) 1)
                                                         1
                                                         (round (/ (- 300 (- (current-seconds) block-time)) 60))))
         (verify-password acc)))
      ((eq? acc 5)
       (begin
         (set-user-block-time!  (hash-ref database name) (current-seconds))
         (printf "Попытайтесь вспомнить пароль и попробоват позже.\n")
         (sleep 3)
         "base"))
          ((equal? password (user-password (hash-ref database name)))
           (begin
             (set-user-block-time! (hash-ref database name) 0)
             (void)))
          ((begin
             (printf "Неверный пароль.\n")
             (verify-password (add1 acc)))))))
 
;Авторизация для меню.
;Нужно переиминовать функцию в авторизацию или как-то так.
(define (login)
  (printf "Для возврата в меню: б\n")
  (if (equal? "base" (verify-login))
      "base"
      (if (equal? "base" (verify-password))
          "base"
          (begin
            (printf "Рады тебя видеть, ~a.\n" name) ;Потом удалить эту строку. И в других местах тоже, если есть
            (set-user-last-visit! (hash-ref database name) (date-to-string (current-date)))
            (set! password (void))
            (void)))))
 
;Вызываем соответсвующие функции для проверки.
(check-path-and-set!)
(registration)
(login)
1
 Аватар для vlisp
1071 / 992 / 153
Регистрация: 10.08.2015
Сообщений: 5,447
31.01.2021, 13:38
зачем столько лишних функций?
1
 Аватар для chessman2
165 / 145 / 10
Регистрация: 21.10.2012
Сообщений: 503
31.01.2021, 13:41
Опечатки в 31 и 153 строках.
После запуска выдает это;
Добро пожаловать в DrRacket, версия 7.9 [3m].
Язык: racket, with debugging; memory limit: 128 MB.
Для возврата в меню: б
Придумайте логин: proba
Придумайте пароль: 123456789
Пароль должен быть не короче 7 символов,
а так же состоять из букв и цифр.
Придумайте пароль: q1234567
Слабый пароль: содержит ряд чисел 123.
Придумайте пароль: q3214567
Вы удачно зарегестрированы, proba.
Для возврата в меню: б
Логин: proba
Пароль: stty: 'стандартный ввод': Неприменимый к данному устройству ioctl

Поясните подробнее, что делает программа и как это использовать?

PS Видимый пароль при вводе, это не есть хорошо.
0
Заблокирован
31.01.2021, 18:18
Цитата Сообщение от vlisp Посмотреть сообщение
зачем столько лишних функций?
например?

Добавлено через 2 минуты
Цитата Сообщение от chessman2 Посмотреть сообщение
Пароль: stty: 'стандартный ввод': Неприменимый к данному устройству ioctl
у тебя linux?
Цитата Сообщение от chessman2 Посмотреть сообщение
Поясните подробнее, что делает программа и как это использовать?
'это не программа, а её кусок - код описывающий регистрацию/авторизацию пользователя который вы можете с изменениями под вашу программу, использовать для своей программы.
0
 Аватар для chessman2
165 / 145 / 10
Регистрация: 21.10.2012
Сообщений: 503
31.01.2021, 18:57
Цитата Сообщение от RatPoison Посмотреть сообщение
у тебя linux?
Да, openSUSE
0
Заблокирован
31.01.2021, 19:08
Цитата Сообщение от chessman2 Посмотреть сообщение
Да, openSUSE
надо смотреть что ты делал, так как у меня никаких ошибок нет.
там скрытое введение пароля на той стадии, где у тебя ошибка.
что ты делал на этой стадии?
0
Заблокирован
31.01.2021, 19:13
вот мой тест только что.
Миниатюры
Полезные коды и авторские программы на Lisp  
0
Заблокирован
31.01.2021, 19:18
chessman2, да, забыл сказать: у тебя теперь в домашней директории есть скрытая папка .matable где хранится файл с данными пользователей. Не забудь удалить потом)

Добавлено через 1 минуту
Цитата Сообщение от chessman2 Посмотреть сообщение
Видимый пароль при вводе, это не есть хорошо.
он видим только тогда, когда его пользователь придумывает. то есть при регистрации.
можно скрыть, но тогда пользователь может ошибиться при наборе придуманного пароля и так об этом и не узнать.
Потом будет тщетно пытаться авторизироваться.
А вот при авторизации пароль уже скрыт.

Добавлено через 2 минуты
Цитата Сообщение от chessman2 Посмотреть сообщение
Придумайте пароль: q1234567
Слабый пароль: содержит ряд чисел 123.
Придумайте пароль: q3214567
а вот ту интересно. возможно вообще запретить возврастающие и убывающий последовательности, если они идут подряд.
0
 Аватар для chessman2
165 / 145 / 10
Регистрация: 21.10.2012
Сообщений: 503
31.01.2021, 20:24
Цитата Сообщение от RatPoison Посмотреть сообщение
надо смотреть что ты делал,
делал то, что просила программа
Code
1
2
3
4
5
6
7
8
9
Для возврата в меню: б
Придумайте логин: proba
Это имя уже занято. Придумайте другое
Придумайте логин: proba1
Придумайте пароль: q3214567
Вы удачно зарегестрированы, proba1.
Для возврата в меню: б
Логин: proba1
Пароль: stty: 'стандартный ввод': Неприменимый к данному устройству ioctl
Как удалить логин proba?

Добавлено через 1 минуту
Цитата Сообщение от RatPoison Посмотреть сообщение
запретить
не надо ни чего запрещать,
это дело конечного пользователя.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
31.01.2021, 20:24

Готовые решения и полезные коды на Visual Basic .NET (Часть-1)
Предлагаю в этой теме размещать ответы на часто задаваемые вопросы и просто делиться полезными кодами. Обращаю внимание на некоторые...

Программы на 1С и авторские права
На форуме много сильных программистов, полагаю, что кто-то пишет и отдельные программы. Интересует вот что: 1) можно ли в 1С 7.7...

Поменять авторские права в описании программы
Народ подскажите как поменять авторские права в описании программы, срочно надо. Пож-та

Авторские программы, библиотеки, надстройки и шаблоны
Коллектив модераторов раздела оставляет за собой право использовать данный пост аналитики для размещения и обновления оглавления темы. ...

Полезные программы для програмистов под VB
Предлагаю сюда скидывать все программы которые упрощают жизнь програмисту. Например: - Программа для генерации MsgBox в виде готовой...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
100
Ответ Создать тему
Новые блоги и статьи
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
GitHub Copilot в JetBrains: модель по умолчанию, Fix и контроль MCP
and_y87 12.10.2026
10 октября 2026 года GitHub обновил Copilot для JetBrains: добавил настройки стартовой модели, исправления из диагностики и управление автозапуском MCP. Поддержка IDE 2025. 1 прекращена — требуется. . .
День 5 из 28: Codex подсказывает следующий запрос
and_y87 12.10.2026
9 октября 2026 года OpenAI запустила бету Composer predictions — подсказок следующего сообщения в текущем диалоге Codex. Это помощь с формулировкой запроса, а не автоматическое продолжение задачи. . . .
Запустил конкурс "тем и промптов для текстовых квестов созданных почти чисто ИИ"
Adler 06.10.2026
Всем привет! За последние три-четыре дня я создал более 16 текстовых квестовых игр используя преимущественно по одному запросу к ИИ на игру. Мне так понравилось смотреть все ветки/ сцены во всех. . .
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru