4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32

Clojure Какие интересные концепции есть в Лиспе?

25.01.2016, 23:16. Показов 8036. Ответов 61
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В смысле, что бы еще попробовать реализовать. На Call-CC все засматриваюсь, но для начала надо понять что это вообще такое. F-expr (функции с ленивыми аргументами) - а нужны ли они? Если значения входящих аргументов можно заквотировать. Окружение, как объект первого класса? Но ведь можно его захватить замыканием и использовать когда надо.

Добавлено через 4 минуты
Пока балуюсь подобными вещами, но это несложно:
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
defn f (i) (cond (< i 2) 1 (* i (f (- i 1))))
OK
defn g (i a) (cond (< i 2) a (g (- i 1) (* i a)))
OK
tray f 3
  1 <- (f 3)
    2 <- f
    2 -> (lambda (i) (cond (< i 2) 1 (* i (f (- i 1)))))
    2 <- (cond (< i 2) 1 (* i (f (- i 1))))
      3 <- (< i 2)
        4 <- i
        4 -> 3
      3 -> false
      3 <- (* i (f (- i 1)))
        4 <- i
        4 -> 3
        4 <- (f (- i 1))
          5 <- f
          5 -> (lambda (i) (cond (< i 2) 1 (* i (f (- i 1)))))
          5 <- (- i 1)
            6 <- i
            6 -> 3
          5 -> 2
          5 <- (cond (< i 2) 1 (* i (f (- i 1))))
            6 <- (< i 2)
              7 <- i
              7 -> 2
            6 -> false
            6 <- (* i (f (- i 1)))
              7 <- i
              7 -> 2
              7 <- (f (- i 1))
                8 <- f
                8 -> (lambda (i) (cond (< i 2) 1 (* i (f (- i 1)))))
                8 <- (- i 1)
                  9 <- i
                  9 -> 2
                8 -> 1
                8 <- (cond (< i 2) 1 (* i (f (- i 1))))
                  9 <- (< i 2)
                    10 <- i
                    10 -> 1
                  9 -> true
                8 -> 1
              7 -> 1
            6 -> 2
          5 -> 2
        4 -> 2
      3 -> 6
    2 -> 6
  1 -> 6
6
tray g 3 1
  1 <- (g 3 1)
    2 <- g
    2 -> (lambda (i a) (cond (< i 2) a (g (- i 1) (* i a))))
    2 <- (cond (< i 2) a (g (- i 1) (* i a)))
      3 <- (< i 2)
        4 <- i
        4 -> 3
      3 -> false
      3 <- (g (- i 1) (* i a))
        4 <- g
        4 -> (lambda (i a) (cond (< i 2) a (g (- i 1) (* i a))))
        4 <- (- i 1)
          5 <- i
          5 -> 3
        4 -> 2
        4 <- (* i a)
          5 <- i
          5 -> 3
          5 <- a
          5 -> 1
        4 -> 3
      3 -> FUNCALL: {a=3, i=2}
    2 -> FUNCALL: {a=3, i=2}
    2 <- (cond (< i 2) a (g (- i 1) (* i a)))
      3 <- (< i 2)
        4 <- i
        4 -> 2
      3 -> false
      3 <- (g (- i 1) (* i a))
        4 <- g
        4 -> (lambda (i a) (cond (< i 2) a (g (- i 1) (* i a))))
        4 <- (- i 1)
          5 <- i
          5 -> 2
        4 -> 1
        4 <- (* i a)
          5 <- i
          5 -> 2
          5 <- a
          5 -> 3
        4 -> 6
      3 -> FUNCALL: {a=6, i=1}
    2 -> FUNCALL: {a=6, i=1}
    2 <- (cond (< i 2) a (g (- i 1) (* i a)))
      3 <- (< i 2)
        4 <- i
        4 -> 1
      3 -> true
      3 <- a
      3 -> 6
    2 -> 6
  1 -> 6
6
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.01.2016, 23:16
Ответы с готовыми решениями:

Какие есть интересные функции в C#?
Какие есть интересные функции в C#? P.S Чтобы приукрасить свою работу

Кто во что сейчас играет и какие есть интересные браузерные игры?
Поделитесь информацией, кто во что сейчас играет? Какие есть интересные браузерные игры? Так хочется чего-то новенького!

Может у вас в архивчике есть какие нибудь интересные задачи на тему Word такие по сложнее.
Здравствуйте. Вам постоянно задают различные вопросы и присылают задачи. Может у вас в архивчике есть какие нибудь интересные задачи на...

61
30.01.2016, 00:05
Студворк — интернет-сервис помощи студентам

Не по теме:

Значит я этого не заметил. Надеюсь Вы не в обиде на меня за то что я так мало уделял внимания Вашему диалекту =)

0
30.01.2016, 00:11  [ТС]

Не по теме:

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

0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
01.02.2016, 04:15  [ТС]
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
(def window-size 500)
(def image (java (class "java.awt.image.BufferedImage") "new" window-size window-size 1))
(def imageGraphics (java image "getGraphics"))
 
(defmacro v-s () (java (* window-size (java (class "java.lang.Math") "random")) "intValue"))
(defn random-line (p)
    (def x (v-s) y (v-s))
    (java imageGraphics "drawLine" (car p) (cadr p) x y)
    (cons x y))
(ntimes 50 random-line (cons (v-s) (v-s)))
 
(def icon (java (class "javax.swing.ImageIcon") "new"))
(java icon "setImage" image)
(def label (java (class "javax.swing.JLabel") "new"))
(java label "setIcon" icon)
(def labelComponent (java label "castComponent"))
 
(def window (java (class "javax.swing.JFrame") "new"))
(java window "add" labelComponent)
(java window "setVisible" true)
(java window "pack")
Миниатюры
Clojure Какие интересные концепции есть в Лиспе?  
5
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
01.02.2016, 06:10  [ТС]
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
(defn demo (delta a b phi)
    (def image (java (class "java.awt.image.BufferedImage") "new" w-s w-s 1))
    (def imageGraphics (java image "getGraphics"))
    (defmacro p-x (alpha) (norm (sin (+ (* a alpha) phi))))
    (defmacro p-y (alpha) (norm (cos (* b alpha))))
 
    (defn next-line (args)
        (match args '(alpha x0 y0))
        (def x (p-x alpha) y (p-y alpha))
        (java imageGraphics "drawLine" x0 y0 x y)
        (cons (+ alpha delta) x y))
 
    (ntimes 500 next-line (cons 0 (p-x 0) (p-y 0)))
    (add-image window image))
 
(def window (java (class "javax.swing.JFrame") "new"))
(java window "setLayout" (java (class "java.awt.FlowLayout") "new"))
(demo 2.5 1 1 0)
(demo 2   2 1 0)
(demo 2   1 2 0.3)
(demo 1   1 3 0.5)
(demo 1   3 1 0.5)
(demo 0.6 3 2 0.5)
(java window "setVisible" true)
(java window "pack")
Миниатюры
Clojure Какие интересные концепции есть в Лиспе?  
5
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
01.02.2016, 13:56  [ТС]
Это все через ограниченный механизм reflection. А вчера мне сказали, что это все баловство и можно оказывается вообще любой текст java-кода на лету скомпилировать и в приложение загрузить - попробую внедрить и это, если получится.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,766
Записей в блоге: 14
01.02.2016, 14:15
_Ivana, странно, что в коде x вычисляется с исп. синуса, а y - косинуса. Обычно бывает наоборот.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
01.02.2016, 14:20  [ТС]
Catstail, ну у меня не наработаны еще эти стереотипы И в 6 часов ночи срабатывают более простые правила - изоморфность и изотропность осей и направлений (с точностью до поворота монитора) и то, что традиционно первые в парах x и sin, а вторые - y и cos, я даже a и b сообразно этому принципу распределил Но Вы можете поменять

ЗЫ матчер мой там конечно для выпендрежа, из-за ntimes, принимающей функцию одного аргумента, можно было просто хвостовую рекурсию с 4 параметрами написать.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,766
Записей в блоге: 14
01.02.2016, 18:08
Мне захотелось посмотреть, как это будет выглядеть в 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
(defun main ()
  (iter (for parms in (list (list 2.5 1.0 1.0 0.0 _RED)
                            (list 2.0 2.0 1.0 0.0 _GREEN) 
                            (list 2.0 1.0 2.0 0.3 _BLUE) 
                            (list 1.0 1.0 3.0 0.5 _YELLOW) 
                            (list 1.0 3.0 1.0 0.5 _SILVER) 
                            (list 0.6 3.0 2.0 0.5 _NAVY)))
         (apply 'make-pic parms))
   (grwShowAll -1))
    
(defun make-pic (delta a b phi color)
  (let ((w (gensym 'w))
        (x-0 0)
        (y-0 0)
        (x-1 0)
        (y-1 0)
        (alpha 0))  
   (grwCreate w 300 300 "" _WHITE)
   (grwScale w -1.1 1.1 -1.1 1.1)
   (iter (for i from 1 to 400)
     (setq x-1 (sin (+ (* a alpha) phi))
           y-1 (cos (* b alpha)))
     (when (> i 1) (grwLine w x-0 y-0 x-1 y-1 color))
     (setq alpha (+ alpha delta) x-0 x-1 y-0 y-1))))
Кстати, когда икс с игреком перепутаны, симпатичнее выходит...
Миниатюры
Clojure Какие интересные концепции есть в Лиспе?  
5
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
02.02.2016, 12:02  [ТС]
Catstail, хорошо, следующий раунд - цвета и заливка полигонов
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
(defn tree (graph n x y d d0 l v i)
    (def x1 (round (+ x (* l (cos d)))) y1 (round (+ y (* l (sin d)))))
    (def p (java (class "java.awt.Polygon") "new"))
    (java p "addPoint" x y)
    (java p "addPoint" x1 y1)
    (def kl (/ l 5))
    (def x0 (round (- x (* kl (cos d0)))) y0 (round (- y (* kl (sin d0)))))
    (java p "addPoint" x0 y0)
    (java graph "setColor" BROWN)
    (java graph "fillPolygon" p)
    (java graph "drawPolygon" p)
    (cond (> n 0)
             ((defmacro delta () (* v (rand (/ pi 20) (/ pi 4.5))))
              (tree graph (- n 1) x1 y1 (- d (delta)) d (/ l 1.2) (- 0 v) i)
              (tree graph (- n 2) x1 y1 (+ d (delta)) d (/ l 1.2) (- 0 v) i))
             ((java graph "setColor" RED)
              (java graph "fillOval" (- x1 10) (- y1 10) 20 20)
              (cond (< (rnd) 0.7)
                    ((java graph "setColor" BLACK)
                     (java graph "fillOval" (- x1 2) (- y1 6) 4 4))) )))
Миниатюры
Clojure Какие интересные концепции есть в Лиспе?   Clojure Какие интересные концепции есть в Лиспе?  
5
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,766
Записей в блоге: 14
03.02.2016, 10:38
_Ivana, Ваш код довольно небрежен... У функции tree, к примеру, лишний (не используемый) параметр...

В 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
;; Главная функция
 
(defun main (&optional (x-start 0)  (y-start -100))
  (let ((w (gensym 'w)))
    (grwCreate w 500 500 "Дерево" _WHITE)
    (grwSetParm w 2 0 _WHITE)
    (grwScale w -100 100 -100 100)
    (grwShow w)
    (tree w 8 x-start y-start (* 0.5 _pi) (* 0.3 _pi) 40 0.6)))
 
;; Дать случайный элемент списка
    
(defun random-value (&rest lst)
  (nth (mod (rnd 1000) (length lst)) lst))
 
;; Нарисовать треугольник
    
(defun draw-triangle (w x1 y1 x2 y2 x3 y3 color)
    (grwLine w x1 y1 x2 y2 color)
    (grwLine w x2 y2 x3 y3 color)
    (grwLine w x1 y1 x3 y3 color)
    (let* ((bx (/ (+ x1 x2 x3) 3.0))
           (by (/ (+ y1 y2 y3) 3.0)))
       (grwFill w  bx  by color color)))
 
;; Изобразить дерево
 
(defun tree (w n x y d d0 l v)
  (let* ((x1 (+ x (* l (cos d))))
         (y1 (+ y (* l (sin d))))
         (kl (/ l 5.0))
         (x0 (- x (* kl (cos d0))))         
         (y0 (- y (* kl (sin d0))))
         (delta (* v (random-value (/ _pi 3.0) (/ _pi 4.5)))))
        (draw-triangle w x y x0 y0 x1 y1 _BROWN)
        (cond ((plusp n)
                (tree w (- n 1) x1 y1 (- d delta) d (/ l 1.2) (- v))
                (tree w (- n 2) x1 y1 (+ d delta) d (/ l 1.2) v))
              (t (grwCircle w x1 y1 5 _RED)
                 (grwFill w x1 y1 _RED _RED)
                 (grwPset w x1 y1 _BLACK)))))
Миниатюры
Clojure Какие интересные концепции есть в Лиспе?  
5
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
03.02.2016, 19:40  [ТС]
Catstail, ну небрежность имхо все-таки не совсем объективный параметр. Что одному небрежно, другому нормально. Лишний параметр - есть, но это последний код, рисующий рябины. Для предыдущей картинки с ростом и взрослением дерева он использовался - задавал номер картинки и как следствие, максимальный диапазон размаха ветвей (он у меня там расширяется от первой картинки к последней). Да и вообще, это не весь полный кот (чтобы не загромождать ветку лишним), а только его собственно содержательная часть. Однако, вам хватило ее, чтобы реализовать в вашей системе. А большего от кода и не требовалось
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,766
Записей в блоге: 14
04.02.2016, 13:17
_Ivana, да упаси Боже, я не имел в виду Вас задеть! Просто разобраться было нужно. А так-то - дело житейское.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
04.02.2016, 14:05  [ТС]

Не по теме:

Catstail, при всей моей обидчивости, у меня к Вам весьма большой (честно заработанный) кредит расположения :)



ЗЫ анонс - на очереди Тетрис: 2 потока (в двух закладках интерпретатора), общее пространство имен, один меняет геймстейт по таймеру, другой - в циклическом ожидании блокирующего ввода, управляет геймстейтом в зависимости от ввода. Все это дело рефрешится в отдельном графическом окне, которое всегда "он топ".
Единственный недостаток - ввод по контрол+энтеру, слушателя клавиш пока не осилил подключить (без изменения собственно интерпретатора). Ну и еще контейнер хранения пространства имен у меня не потокобезопасный (может пока), поэтому можно самому влепить флаги блокировки изменения стейта и проверять/устанавливать/сбрасывать их - но посмотрим еще, может для простой игрушки и без них сойдет.
1
04.02.2016, 16:36

Не по теме:

Цитата Сообщение от _Ivana Посмотреть сообщение
у меня к Вам весьма большой (честно заработанный) кредит расположения
- взаимно!

0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
06.02.2016, 00:44  [ТС]
Обещанный Тетрис - полный кот. Java используется только для отрисовки ну и пара немутируемых мапов задействована - типы и цвета фигур, хотя их тривиально на списки перевести, там доступ по индексу нужен только.
Как написано выше - 2 потока в двух закладках, в одном запускается timer-thread, в другом user-input.
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
(defmacro rnd () (java (class "java.lang.Math") "random"))
(defmacro color (r g b) (java (class "java.awt.Color") "new" r g b))
 
(def  item-vars (java (class "java.util.HashMap") "new"))
 
(java item-vars "put" 0 '((0 -1) (0 0) (-1 -1) (-1 0)))
(java item-vars "put" 1 '((0 -1) (0 0) (-1 -1) (-1 0)))
(java item-vars "put" 2 '((0 -1) (0 0) (-1 -1) (-1 0)))
(java item-vars "put" 3 '((0 -1) (0 0) (-1 -1) (-1 0)))
 
(java item-vars "put" 10 '((0 -2) (0 -1) (0 0) (0 1)))
(java item-vars "put" 11 '((1 0) (0 0) (-1 0) (-2 0)))
(java item-vars "put" 12 '((0 -2) (0 -1) (0 0) (0 1)))
(java item-vars "put" 13 '((1 0) (0 0) (-1 0) (-2 0)))
 
(java item-vars "put" 20 '((-1 -1) (-1 0) (0 0) (0 1)))
(java item-vars "put" 21 '((1 0) (0 0) (0 1) (-1 1)))
(java item-vars "put" 22 '((-1 -1) (-1 0) (0 0) (0 1)))
(java item-vars "put" 23 '((1 0) (0 0) (0 1) (-1 1)))
 
(java item-vars "put" 30 '((0 -1) (0 0) (-1 0) (-1 1)))
(java item-vars "put" 31 '((-1 0) (0 0) (0 1) (1 1)))
(java item-vars "put" 32 '((0 -1) (0 0) (-1 0) (-1 1)))
(java item-vars "put" 33 '((-1 0) (0 0) (0 1) (1 1)))
 
(java item-vars "put" 40 '((0 -1) (0 0) (0 1) (-1 -1)))
(java item-vars "put" 41 '((1 0) (0 0) (-1 0) (-1 1)))
(java item-vars "put" 42 '((0 -1) (0 0) (0 1) (1 1)))
(java item-vars "put" 43 '((1 0) (0 0) (-1 0) (1 -1)))
 
(java item-vars "put" 50 '((0 -1) (0 0) (0 1) (-1 1)))
(java item-vars "put" 51 '((1 0) (0 0) (-1 0) (1 1)))
(java item-vars "put" 52 '((0 -1) (0 0) (0 1) (1 -1)))
(java item-vars "put" 53 '((1 0) (0 0) (-1 0) (-1 -1)))
 
(java item-vars "put" 60 '((0 -1) (0 0) (0 1) (-1 0)))
(java item-vars "put" 61 '((1 0) (0 0) (-1 0) (0 1)))
(java item-vars "put" 62 '((0 -1) (0 0) (0 1) (1 0)))
(java item-vars "put" 63 '((1 0) (0 0) (-1 0) (0 -1)))
 
(def BLACK (color 0 0 0))
(def WHITE (color 255 255 255))
 
(def  item-colors (java (class "java.util.HashMap") "new"))
(java item-colors "put" 0 (color 240 240 0))
(java item-colors "put" 1 (color 0 240 240))
(java item-colors "put" 2 (color 0 240 0))
(java item-colors "put" 3 (color 240 0 0))
(java item-colors "put" 4 (color 240 160 0))
(java item-colors "put" 5 (color 0 0 240))
(java item-colors "put" 6 (color 160 0 240))
 
(defn coords (i)
    (match i '(t o r c))
    (def coords-basic (java item-vars "get" (+ (* 10 t) o) ))
    (map (lambda (p) (cons (+ r (car p)) (+ c (cadr p)))) coords-basic))
 
(defn draw-coord (r c cur-color)
    (java imageGraphics "setColor" cur-color)
    (java imageGraphics "fillRect"
        (* c sq-size) (* (- rows r 1) sq-size) (- sq-size 1) (- sq-size 1)))
 
(defn draw-item (cur-color)
    (foldl (lambda (p a) (draw-coord (car p) (cadr p) cur-color)) 0 (coords item)))
 
(defn draw-field ()
    (java imageGraphics "clearRect" 0 0 image-width image-height)
    (foldl (lambda (x a) (match x '(r c cur-color)) (draw-coord r c cur-color)) 0 field))
 
(defn try-move (i)
    (defn good-coord (p)
        (def r (car p) c (cadr p))
        (cond (< c 0) false (>= c cols) false (< r 0) false
              (any (lambda (x) (and (= r (car x)) (= c (cadr x)) )) field) false true))
    (cond (all good-coord (coords i)) (
              (draw-item WHITE)
              (set! item i)
              (draw-item (java item-colors "get" (car item)))
              (java window "revalidate")
              (java window "repaint")
              true)
          false))
 
(defn compress-field ()
    (defn collect (e a)
        (def r (car e))
        (cond (null? a) (cons (cons r 1) nil)
              (eq? r (car (car a))) (cons (cons r (+ 1 (car (cdr (car a))))) (cdr a))
              (cons (car a) (collect e (cdr a))) ))
 
    (def full-rows (foldl
        (lambda (x a) (cond (< (cadr x) cols) a (cons (car x) a) ))
        nil (foldl collect nil field)))
 
    (defn low-f-rs-cnt (r) (foldl (lambda (x a) (cond (< x r) (+ 1 a) a)) 0 full-rows))
 
    (defn go (f a)
        (def e (car f) r (car e))
        (cond (null? f) a
              (elem r full-rows) (go (cdr f) a)
                  (go (cdr f) (cons (cons (- r (low-f-rs-cnt r)) (cdr e)) a)) ))
 
    (cond (null? full-rows) false ((set! field (go field nil)) true) ))
 
(defn user-input ()
    (def cmd (read))
    (match item '(t o r c))
    (cond (eq? cmd 'a) (try-move (cons t o r (- c 1)))
          (eq? cmd 'd) (try-move (cons t o r (+ c 1)))
          (eq? cmd 'q) (try-move (cons t (mod (+ o 1) 4) r c))
          (eq? cmd 'e) (try-move (cons t (mod (+ o 3) 4) r c))
          (eq? cmd 's) (fall-down)
          (eq? cmd 'p) (set! game-run false)
          (set! game-run true))
    (user-input))
 
(defn fall-down ()
    (match item '(t o r c))
    (cond (try-move (cons t o (- r 1) c)) (fall-down)))
 
(defn timer-thread ()
    (java (class "java.lang.Thread") "sleep" 1000)
    (match item '(t o r c))
    (cond game-run
        (cond (not (try-move (cons t o (- r 1) c))) (
            (set! field (foldl
                (lambda (p a) (cons (append p (java item-colors "get" (car item))) a))
                field (coords item)))
            (cond (compress-field) (draw-field))
            (set! item (cons (java (* 7 (rnd)) "intValue") 0 (- rows 1) (/ cols 2)))
            (cond (not (try-move item)) (set! game-run false))
            )))
    (timer-thread))
 
; main program ;
 
(def cols 10 rows 20 sq-size 30 field nil game-run false)
(def image-width (+ 1 (* cols sq-size)) image-height (+ 1 (* rows sq-size)))
 
(def image (java (class "java.awt.image.BufferedImage") "new" image-width image-height 1))
(def imageGraphics (java image "createGraphics"))
(java imageGraphics "setBackground" WHITE)
(java imageGraphics "clearRect" 0 0 image-width image-height)
 
(def item (cons (java (* 7 (rnd)) "intValue") 0 (- rows 1) (/ cols 2)))
(draw-item (java item-colors "get" (car item)))
 
(def window (java (class "javax.swing.JFrame") "new"))
(def icon (java (class "javax.swing.ImageIcon") "new"))
(java icon "setImage" image)
(def label (java (class "javax.swing.JLabel") "new"))
(java label "setIcon" icon)
(java window "add" label)
(java window "setVisible" true)
(java window "setAlwaysOnTop" true)
(java window "pack")
 
(timer-thread)
;
call if another thread :
(user-input)
;
"Game over."
Миниатюры
Clojure Какие интересные концепции есть в Лиспе?   Clojure Какие интересные концепции есть в Лиспе?  
5
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
17.09.2016, 08:51  [ТС]
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
; Прыгающие шарики, анимация. ;
; Задаем ширину / высоту окна, количество и максимальный радиус шариков ;
(defn bouncing-balls (w-width w-height n-balls r-ball-max)
 
    ; макросы, которым место в стандартной библиотеке ;
    (defmacro rnd () java (class "java.lang.Math") "random")
    (defmacro round (x) java x "intValue")
 
    ; смещает координату / скорость шарика по одной оси ;
    (defn move-dir (ball ind-x ind-dx x-max)
        (def x (java ball "get" ind-x)
            dx (java ball "get" ind-dx)
             r (java ball "get" 5)
             x-new (+ x dx) m (- x-max r))
        (java ball "put" ind-x  (cond (< x-new r) r (> x-new m) m x-new))
        (java ball "put" ind-dx (cond (<= r x-new m) dx (- 0 dx))) )
 
    ; смещает и отрисовывает шарик ;
    (defn move-draw (ball)
        (move-dir ball 0 1 w-width)
        (move-dir ball 2 3 w-height)
        (def x (java ball "get" 0)
             y (java ball "get" 2)
             r (java ball "get" 5) d (* 2 r))
        (java img-gr "setColor" (java ball "get" 4))
        (java img-gr "fillOval" (- (round x) r) (- (round y) r) d d) )
 
    ; добавляет уникальный шарик со своими координатами, скоростью и цветом;
    (defn add-new-ball ()
        (defn rnd-dx () (def v (+ (* v-max (rnd)) 1)) (cond (< (rnd) 0.5) v (- 0 v)) )
        (defn rnd-rgb () (round (* 200 (rnd)) ))
        (def color (java (class "java.awt.Color") "new" (rnd-rgb) (rnd-rgb) (rnd-rgb)))
        (def ball (java (class "java.util.HashMap") "new"))
        (java ball "put" 0 (/ w-width 2))
        (java ball "put" 1 (rnd-dx))
        (java ball "put" 2 (/ w-height 2))
        (java ball "put" 3 (rnd-dx))
        (java ball "put" 4 color)
        (java ball "put" 5 (+ (round (* (- r-ball-max 5) (rnd))) 5))
        (java balls "put" (+ (java balls "size") 1) ball))
 
    ; анимация - очистка экрана, смещение и отрисовка шариков, обновление окна, пауза ;
    (defn go () while true 
        (java img-gr "clearRect" 0 0 w-width w-height)
        (def n n-balls)
        (while (> n 0) (move-draw (java balls "get" n)) (set! n (- n 1)))
        (java window "repaint")
        (java (class "java.lang.Thread") "sleep" 30))
 
    ; параметры окна и графики, вызываются макросы стандартной библиотеки ;
    (def image (new-image w-width w-height))
    (def img-gr (new-imageGraphics image))
    (java img-gr "setBackground" (java (class "java.awt.Color") "new" 255 255 200))
    (def window (new-window "FlowLayout"))
    (add-image window image)
    (java window "setLocationByPlatform" true)
    (java window "setVisible" true)
    (java window "setAlwaysOnTop" true)
    (java window "setTitle" (java "Bouncing balls" "toString"))
    (java window "pack")
 
    (def balls (java (class "java.util.HashMap") "new"))
    (def v-max 7 n n-balls)
    (while (> n 0) (add-new-ball) (set! n (- n 1)))
    (go))
 
(bouncing-balls 500 400 100 30)
Гифка какая-то дерганная получилась, на экране все плавно...
Миниатюры
Clojure Какие интересные концепции есть в Лиспе?  
3
199 / 102 / 4
Регистрация: 16.08.2015
Сообщений: 209
18.09.2016, 14:54
Ivana, у нас есть один такой пример на Common Lisp и tcl/tk.
https://bitbucket.org/budden/y... at=default
Присоединяйтесь к нам, у нас всё то же самое, но по-взрослому, с компиляцией в двоичный код.
0
Заблокирован
18.09.2016, 14:59
Цитата Сообщение от Catstail Посмотреть сообщение
Самое ценное в Лиспе, это, вероятно, макро. Именно они позволяют называть Лисп "программируемым языком программирования"
Что Вы имеете в виду?
Случайно не это: Выбор языка для программ, анализирующих и меняющих свой же собственный код
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38223 / 21155 / 4314
Регистрация: 12.02.2012
Сообщений: 34,766
Записей в блоге: 14
18.09.2016, 18:25
ИсмаилПркопенко, в общем - да.

Добавлено через 1 час 0 минут
_Ivana, у Вас шарики друг с другом сталкиваются? Или только со стенками?
0
 Аватар для vlisp
1070 / 991 / 153
Регистрация: 10.08.2015
Сообщений: 5,443
18.09.2016, 19:43
А разве сталкивание шариков - это концепция? Вообще обращение с java как с С - это анахронизм. java - классовый язык. А что тут мы видим? Никакого ООП... вот как бы это могло выглядеть, если б было концептуально продумано
Lisp
1
2
3
4
5
6
7
8
9
10
11
(setq jvmObj (jvm-get-or-create-object)
 
      FrameObj  (jvm-CreateFrame jvmObj ... )
 
      CanvasObj (jvm-get-Canvas jvmObj)
 
      CircleObj (jvm-AddCircle CanvasObj '(100 100) 20))
 
(jvm-put-Color CircleObj (jvm-GetTrueColor jvmObj '( 127 255 0)))
 
(jvm-MoveTo CircleObj '(150 150))
Как минимум для следует разделять свойства и методы с помощью конструкций
invoke-method get-property put-property
и только для увеличения читабельности и дифференциации кода можно использовать приставку java-
java-invoke-method java-invoke java-get-property java-put-property
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
18.09.2016, 19:43

Clojure Как пользоваться трассировкой в Лиспе
Пожалуйста, объясните, как пользоваться трассировкой в Лиспе. Приведите пример выполнения программы с трассировкой.

Clojure Как работает классическая сборка мусора в лиспе? Сколько памяти занимает cons-ячейка?
Как работает классическая сборка мусора в лиспе (прочитал в документации, что SBCL использует классическую сборку)? Как работает в данном...

Кто какие знает интересные компоненты VCL
Кто какие знает интересные компоненты VCL( кроме тех, что вошли в шестой билдер:))???

Какие модели из перечисленных, самые интересные по вашему мнению?
Хочу попросить попросить помощи, не могу остановиться на чем то конкретном. Хотелось бы услышать мнение со стороны. Какие модели из...

Реализация циклов на Лиспе, Вложенные циклы на Лиспе
1)реализовать двумя способами (LET, LOOP, DO, DOTIMES) первая картинка 2)Согласно варианту вычислить выражение на основе цикла LOOP и...


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Опции темы

Новые блоги и статьи
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
мат медиц модель 30. презентация проекта
anaschu 27.08.2026
хоп хоп хоп хидахоп, а я кладую))
Как у меня протекала болезнь
zorxor 27.08.2026
Здравствуйте, друзья! Эта запись блога предназначена именно для вас - для моих дорогих друзей, которые знали меня лично. Чтобы ответить на вопрос - а что же со мной произошло на самом деле? Я учился. . .
Нашел вот забавное видео о измерениях. Лучшее что я видел на эту тему
kumehtar 26.08.2026
ILETXiw9bMQ Основная суть и тезисы по измерениям: 0D (Нулевое измерение): точка, не имеющая длины, ширины, высоты или объема. Объект не может перемещаться в 0D. 1D (Первое измерение):. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru