Форум программистов, компьютерный форум, киберфорум
Языки JVM
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.88/34: Рейтинг темы: голосов - 34, средняя оценка - 4.88
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,984
Записей в блоге: 32

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

25.01.2016, 23:16. Показов 7228. Ответов 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,984
Записей в блоге: 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,984
Записей в блоге: 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,984
Записей в блоге: 32
01.02.2016, 13:56  [ТС]
Это все через ограниченный механизм reflection. А вчера мне сказали, что это все баловство и можно оказывается вообще любой текст java-кода на лету скомпилировать и в приложение загрузить - попробую внедрить и это, если получится.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,679
Записей в блоге: 14
01.02.2016, 14:15
_Ivana, странно, что в коде x вычисляется с исп. синуса, а y - косинуса. Обычно бывает наоборот.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,984
Записей в блоге: 32
01.02.2016, 14:20  [ТС]
Catstail, ну у меня не наработаны еще эти стереотипы И в 6 часов ночи срабатывают более простые правила - изоморфность и изотропность осей и направлений (с точностью до поворота монитора) и то, что традиционно первые в парах x и sin, а вторые - y и cos, я даже a и b сообразно этому принципу распределил Но Вы можете поменять

ЗЫ матчер мой там конечно для выпендрежа, из-за ntimes, принимающей функцию одного аргумента, можно было просто хвостовую рекурсию с 4 параметрами написать.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,679
Записей в блоге: 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,984
Записей в блоге: 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
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,679
Записей в блоге: 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,984
Записей в блоге: 32
03.02.2016, 19:40  [ТС]
Catstail, ну небрежность имхо все-таки не совсем объективный параметр. Что одному небрежно, другому нормально. Лишний параметр - есть, но это последний код, рисующий рябины. Для предыдущей картинки с ростом и взрослением дерева он использовался - задавал номер картинки и как следствие, максимальный диапазон размаха ветвей (он у меня там расширяется от первой картинки к последней). Да и вообще, это не весь полный кот (чтобы не загромождать ветку лишним), а только его собственно содержательная часть. Однако, вам хватило ее, чтобы реализовать в вашей системе. А большего от кода и не требовалось
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,679
Записей в блоге: 14
04.02.2016, 13:17
_Ivana, да упаси Боже, я не имел в виду Вас задеть! Просто разобраться было нужно. А так-то - дело житейское.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,984
Записей в блоге: 32
04.02.2016, 14:05  [ТС]

Не по теме:

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



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

Не по теме:

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

0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,984
Записей в блоге: 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,984
Записей в блоге: 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
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,679
Записей в блоге: 14
18.09.2016, 18:25
ИсмаилПркопенко, в общем - да.

Добавлено через 1 час 0 минут
_Ivana, у Вас шарики друг с другом сталкиваются? Или только со стенками?
0
 Аватар для vlisp
1059 / 980 / 153
Регистрация: 10.08.2015
Сообщений: 5,317
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
Ответ Создать тему
Новые блоги и статьи
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru