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

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

25.01.2016, 23:16. Показов 7911. Ответов 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
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
18.09.2016, 22:12  [ТС]
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от Catstail Посмотреть сообщение
у Вас шарики друг с другом сталкиваются? Или только со стенками?
В данном примере только со стенками. Можно написать и друг с другом, но потребуется больше расчетов, что для небыстрого интерпретатора критично.

vlisp, я использую интероп с джавой и работаю с ее классами и их методами через рефлекшн. То есть, на уровне платформы реализации это вполне себе ООП. Семантика же моего Лискрипта очень похожа на Схему, где также можно накостылить свое ООП на замыканиях. У меня было (и есть) 2 принципиально разных кода этого примера - здесь показан максимально использующий структуры данных, классы и методы java - так получается быстрее и больше шариков летает без замедления. Но есть и код, по минимуму использующий платформу реализации (только методы создания окна и рисования в нем) - он конечно медленнее.
0
 Аватар для nullxdth
2305 / 1064 / 77
Регистрация: 12.03.2013
Сообщений: 4,987
19.09.2016, 09:30
Цитата Сообщение от vlisp Посмотреть сообщение
как по мне в лиспе за полвека так ничего путевого и не создали...
Это по тебе. Ты просто не в курсе.
Цитата Сообщение от vlisp Посмотреть сообщение
Тот же лазарь уделает любое лиспоподелье по всем фронтам...
Lazarus уделать не может никого. Это беспомощное творение. Жалкая пародия на RAD Delphi. Может быть интересен только школьникам в отсталых школах, где до сих пор учат программировать на Pascal (хотя давно уже понятно, что нужно брать Python).

Добавлено через 12 минут
Цитата Сообщение от vlisp Посмотреть сообщение
Если нет, то это не выживет...
Мне кажется, что у проекта _Ivana нет цели выживать. Насколько я понял, он создан для того, что бы ближе познакомиться с базовыми идеями Lisp-а и получить какой-то опыт в языкостроении. Как мне кажется, вполне себе отличный и профессиональный подход. Тебе в голову не приходило, что люди когда что-то делают ставят разные цели? Или тебе кажется, что любой язык, любой прототип просто обязан быть сравнён с господствующими языками и быть непременно осмеян?
1
19.09.2016, 11:08
 Комментарий модератора 
уважаемые, перечитайте правила. особенно внимательно - пункт 3.1
0
199 / 102 / 4
Регистрация: 16.08.2015
Сообщений: 209
19.09.2016, 11:17
Цитата Сообщение от nullxdth Посмотреть сообщение
К сожалению, документации или туториала я с ходу не нашёл.
Сейчас в основном занимаемся средой разработки, и она находится в плачевном состоянии. То ли новый SBCL плох, то ли мы что-то испортили. Не лучшее время для анонсов, но сайт здесь: https://bitbucket.org/budden/yar - там найдёте анонс с описанием планируемых фич, видео с демонстрацией удаления поля в классе на ходу, описание следующей версии языка в той мере, в какой оно готово, исходные тексты текущей версии языка и среды.
0
Заблокирован
19.09.2016, 13:05
Цитата Сообщение от budden Посмотреть сообщение
удаления поля в классе на ходу
Круто.
Т.е. в runTime можно изменять структура класса?
0
199 / 102 / 4
Регистрация: 16.08.2015
Сообщений: 209
19.09.2016, 13:28
Да. Это взято из CLOS (там можно так) вот есть старая тема про мой язык, правда в ней ссылки уже устарели, а поправить нельзя
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
19.09.2016, 16:05  [ТС]
Кстати, Catstail, у вас в HomeLisp есть макросы? У вас же, насколько я понимаю, интерпретатор, без компиляции. Значит, макросы (если они есть) раскрываются на предварительной стадии перед интерпретацией (собственно компиляции нет, значит есть стадия макрораскрытия)?
У меня то как раз проще решено - макросы раскрываются прямо в рантайме, по ходу интерпретации, никаких предварительных стадий компиляции\макрораскрытия нет.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38214 / 21147 / 4313
Регистрация: 12.02.2012
Сообщений: 34,761
Записей в блоге: 14
19.09.2016, 16:18
_Ivana, макро есть. Реализовано как у Вас - раскрытие а рантайме.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38214 / 21147 / 4313
Регистрация: 12.02.2012
Сообщений: 34,761
Записей в блоге: 14
19.09.2016, 16:28
Не помню, показывал ли раньше. Вот так в HomeLisp выглядит известный Microsoft-овский пример управления Excel из скрипта:

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
(defun fun-excel nil
  (let ((xlsApp    (gensym 'xlsApp))
        (xlsBooks  (gensym 'xlsBooks))
        (xlsBook   (gensym 'xlsBook))
        (xlsSheet  (genSym 'xlsSheet))
        (xlsCell   (genSym 'xlsCell))
        (xlsRange  (genSym 'xlsRange))
        (xlsCharts (genSym 'xlsCharts))
        (xlsChart  (genSym 'xlsChart)))
        (comCreateObject xlsApp "Excel.Application")
        (comPropGetO xlsApp "WorkBooks" xlsBooks)
        (comPropLet xlsApp "Visible" -1)
        (comPropLet xlsApp "displayalerts" 0)
        (comMethodO xlsBooks "ADD" xlsBook)
        (compropGetO xlsBook "Sheets" xlsSheet 1)
        (compropGetO xlsSheet "cells" xlsCell 1 1)
        (comPropLet xlsCell "Value" 5)
        (comDestroyObject xlsCell)
        (compropGetO xlsSheet "cells" xlsCell 1 2)
        (comPropLet xlsCell "Value" 10)
        (comDestroyObject xlsCell)
        (compropGetO xlsSheet "cells" xlsCell 1 3)
        (comPropLet xlsCell "Value" 15)
        (comDestroyObject xlsCell)
        (comPropGetO xlsSheet "range" xlsRange "A1:C1")
        (comMethod xlsRange "select")
        (comPropGetO xlsApp "charts" xlsCharts)
        (comMethodO xlsCharts "ADD" xlsChart)
        (comPropLet xlsChart "Type" -4100)
        (iter (for i from 1 to 36) (for j from 5 to 180 by 5)
              (comPropLet xlsChart "Rotation" j)
              (sleep* 200))
        (iter (for i from 1 to 36) (for j from 180 to 5 by -5)
              (comPropLet xlsChart "Rotation" j)
              (sleep* 200))
        (comDestroyObject xlsBooks)
        (comDestroyObject xlsBook)
        (comDestroyObject xlsSheet)
        (comDestroyObject xlsCharts)
        (comDestroyObject xlsChart)
        (comDestroyObject xlsRange)
        (comMethod xlsApp "quit")
        (comDestroyObject xlsApp)))
В реальности диаграмма вращается.
Миниатюры
Clojure Какие интересные концепции есть в Лиспе?  
1
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
19.09.2016, 16:34  [ТС]
Catstail, рульно! У кого что есть, тот на нем и едет - я на java reflection API, вы на VB/VBA со всеми изкоробочными плюшками!
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38214 / 21147 / 4313
Регистрация: 12.02.2012
Сообщений: 34,761
Записей в блоге: 14
19.09.2016, 16:42
_Ivana, спасибо! Я еще планирую интерфейс с DirectX сделать. А интерфейс с winAPI уже есть:

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
//
//  Программа отображения диалога _Dlg_
//
 
(prog nil
 
      (try (dlgDestroy '_Dlg_) except Nil)
      (dlgCreate '_Dlg_ 510 406 "Проба" &H8000000F)
      (dlgAddControl '_Dlg_ '_BUT_1 _BUTTON 380 326 100 36 '("Tahoma" 8,25 1 0 0) "Закрыть")
      (dlgAddControl '_Dlg_ '_BUT_2 _BUTTON 267 326 100 36 '("Tahoma" 8,25 1 0 0) "Выполнить")
      
      (defun f (x) (* (exp (* x -0.3))(sin (* 8 x))))
      
      (defun scale (x y wXmin wXmax wYmin wYmax x0 y0 W H) 
             (list (+ x0 (flo2fix (/ (* (- x wXmin) W) (- wXmax wXmin 0.0))))
                   (+ y0 (flo2fix (/ (* (- wYmax y) H) (- wYmax wYmin 0.0))))))
 
      (defun Graphic ()
          (let* ((user32 (loadlibrary "user32.dll"))
                 (gdi32  (loadlibrary "gdi32.dll")) 
                 (hwnd   (callAPI user32 "GetActiveWindow"))
                 (hdc    (callAPI user32 "GetDC" (list 'val hwnd)))
                 (penR   (callAPI gdi32  "CreatePen" (list 'val (bit2fix (QBColor 12))) (list 'val 3) (list 'val 1)))
                 (penB   (callAPI gdi32  "CreatePen" (list 'val (bit2fix (QBColor 8)))  (list 'val 1) (list 'val 1)))
                 (hbr    (callAPI gdi32 "CreateSolidBrush" (list 'val (bit2fix (QBColor 15)))))
                 (lp     (gensym 'lp))
                 (flg    t))
 
                (bloCreate lp 100)
 
                (callAPI gdi32 "SelectObject" (list 'val hbr) (list 'val hdc))
                (callAPI gdi32 "Rectangle" (list 'val 300) (list 'val 500) (list 'val 2) (list 'val 2) (list 'val hdc))
                (callAPI gdi32 "DeleteObject" (list 'val hbr))
 
                (callAPI gdi32 "SelectObject" (list 'val penB) (list 'val hdc)) 
                
                (iter (for xx from 0.0 to 10.9 by 1.0)
                  (let ((l1 (scale xx -1.0 -0.1 11.0 -1.1 1.1 2 2 500 300))
                        (l2 (scale xx  1.0 -0.1 11.0 -1.1 1.1 2 2 500 300)))
                       (callAPI gdi32 "MoveToEx" (list 'ref lp) (list 'val (cadr l1)) (list 'val (car l1)) (list 'val hdc))
                       (callAPI gdi32 "LineTo" (list 'val (cadr l2)) (list 'val (car l2)) (list 'val hdc))))
 
                (iter (for yy from -1.0 to 1.0 by 0.2)
                  (let ((l1 (scale -0.1  yy -0.1 10.9 -1.1 1.1 2 2 500 300))
                        (l2 (scale 10.9  yy -0.1 10.9 -1.1 1.1 2 2 500 300)))
                       (callAPI gdi32 "MoveToEx" (list 'ref lp) (list 'val (cadr l1)) (list 'val (car l1)) (list 'val hdc))
                       (callAPI gdi32 "LineTo" (list 'val (cadr l2)) (list 'val (car l2)) (list 'val hdc))))
 
 
                (callAPI gdi32 "DeleteObject" (list 'val penB))
 
                (callAPI gdi32 "SelectObject" (list 'val penR) (list 'val hdc)) 
 
                (iter (for xx from 0.01 to 10.9 by 0.05)
                   (let* ((yy (f xx))
                          (ll (scale xx yy -0.1 11.0 -1.1 1.1 2 2 500 300)))
                         (if flg
                          (callAPI gdi32 "MoveToEx" (list 'ref lp) (list 'val (cadr ll)) (list 'val (car ll)) (list 'val hdc))
                          (callAPI gdi32 "LineTo" (list 'val (cadr ll)) (list 'val (car ll)) (list 'val hdc)))
                          (setq flg nil)))
 
               (bloDestroy lp)           
               (callAPI gdi32 "DeleteObject" (list 'val penR))
               (freeLibrary gdi32)
               (freeLibrary user32)
               (gc)))      
      
      //
      // Пролог загрузки диалога _DLG_
      //
      (Prog () 
 
      )
      //
      // Обработчик события CLICK для кнопки _BUT_1
      //
      (defun _BUT_1_Click  Nil 
         (dlgHide '_DLG_)
         (dlgDestroy '_DLG_)
      )
      //
      //   Назначение процедуры-события _BUT_1_Click  контролу _BUT_1
      //
      (dlgSetEvent '_BUT_1 '_BUT_1_Click )
      //
      // Обработчик события CLICK для кнопки _BUT_2
      //
      (defun _BUT_2_Click  Nil 
          (Graphic)      
       )
      //
      //   Назначение процедуры-события _BUT_2_Click  контролу _BUT_2
      //
      (dlgSetEvent '_BUT_2 '_BUT_2_Click )
      //
      //   Отображение диалога _Dlg_
      //
      (dlgShow '_Dlg_))
Правда этот код имеет недостаток - при наезде на окно изображение не перерисовывается...
Миниатюры
Clojure Какие интересные концепции есть в Лиспе?  
1
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
19.09.2016, 16:55  [ТС]
Catstail, меня впечатляет, признаЮ поражение своего скрипта в неофициальном фичевом зачете

ЗЫ хотя у меня намедни еще одна киллер-фича наклюнулась - я ее даже реализовал, но не знаю, шлифовать ли до релиза. Это возможность прямо в рантайме (при исполнении, что называется) компилировать java-класс из текста кода, написанного в интерпретаторе. То есть такое уже работает:
Lisp
1
2
3
4
(def cls (compile "class Test {public int tst() {return 33;}}"))
(def cls-obj (java cls 'new))
(java cls-obj 'tst)
=> 33
Типа асм-вставок на языке реализации ядра. Но не факт, что будет удобно, хотя можно написать много чего таким образом
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38214 / 21147 / 4313
Регистрация: 12.02.2012
Сообщений: 34,761
Записей в блоге: 14
19.09.2016, 17:00
_Ivana, бросьте. Это скорее я должен признать поражение. Добавить этих возможностей (то, что я показал) - дело не особо хитрое. Суть - в языке. Свою реализацию я ориентировал на CL. А Вы по сути создали действительно вариант Лиспа (и довольно интересный).
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38214 / 21147 / 4313
Регистрация: 12.02.2012
Сообщений: 34,761
Записей в блоге: 14
19.09.2016, 17:01
Цитата Сообщение от _Ivana Посмотреть сообщение
я ее даже реализовал, но не знаю, шлифовать ли до релиза.
- конечно! Возможность для Java вполне обоснованная!
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
12.11.2016, 10:11  [ТС]
Дописал 4 строчки кода в интерпретатор и реализовал давно лежащую на поверхности идею - вычисления в любом переданном контексте (окружении). Новая ядерная особая форма eval-in, принимает лямбду (ибо у меня нет окружений как объектов первого класса, но это и не требуется, ибо лямбды содержат их в себе как замыкания) и список, который надо вычислить в окружении этой переданной лямбды. Пример:
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
; генератор замыканий ;
(defn f (x y) lambda ())
; создание пары объектов-замыканий с разными параметрами ;
(def a (f 1 2) b (f 10 20))
; вычисления в контексте переданного замыкания ;
(print (eval-in a (+ x y)) \n)
(print (eval-in b (def x 30) (+ x y)) \n)
 
........
 
=> 3
50
OK
В качестве списка, который надо вычислить в указанном окружении, можно хоть целую программу написать. Разумеется, при этом вычислении доступны все мутирующие окружение особые формы (типа def и set!), так что можно не только лазить в переданное окружение за значениями, но и создавать в нем новые связи имя-значение или менять существующие - семантика языка работает точно так же. Помимо всего прочего это значит, что можно не только создавать объекты-замыкания с определенным набором "методов" (в терминах Алана Кея - реагирующих на определенные сообщения), но и в рантайме (вообще-то другого тайма и нет ) менять состав их "полей" и "методов" произвольным образом.

Добавлено через 7 часов 39 минут
По прошествии времени подумалось мне, что можно выпилить эту особую форму обратно из языка, ибо имхо того же можно добиться следующим образом: замыкание возвращает унарную лямбду, ожидающую на входе нульарный макрос, который она будет вычислять в своем окружении. Макрос у нас гражданин первого класса, может передаваться в качестве параметра в функции, и по семантике своего замкнутого окружения не имеет и будет вычисляться в окружении вызова, откуда и будет черпать свои свободные переменные:
Lisp
1
2
3
4
5
6
7
; генератор замыканий, принимающих макрос для выполнения в своем контексте ;
(defn f (x y) lambda (m) m)
; создание пары объектов-замыканий с разными параметрами ;
(def a (f 1 2) b (f 10 20))
; вычисления макросов в контексте переданного замыкания ;
(print (a (macro () + x y)) \n)
(print (b (macro () (def x 30) (+ x y))) \n)
Добавлено через 12 минут
UPD не факт, что этот вариант изоморфен по возможностям - например, создание новых переменных тут происходит в контексте лямбды, и не меняет контекст f, в отличие от варианта с eval-in. Макросами можно изменять значения переменных контекста f, но не добавлять новые. Хотя может можно придумать, как обойти это ограничение.
2
Заблокирован
12.11.2016, 13:56
_Ivana, А не могли бы Вы объяснить что делает Ваш код для тех, кто никогда на Лиспе не программировал и вообще ни на каком языке не программировал.

А?

И в чем преимущество Вашего кода по сравнению с решениями этой задачи на других ЯВУ?

Добавлено через 3 минуты
А то то отдельные слова ("мутирующий", "макрос", "лямбда", "контекст"/"окружение", "арность") - это мои любимые слова для гугления. И их смысл я понимаю.
А вот общий смысл сказанного Вами, пардон, никак понять не могу

Добавлено через 47 секунд
Это имеет какое-то отношение к самомодифицирующемуся коду или нет?
0
Эксперт функциональных языков программированияЭксперт Java
 Аватар для korvin_
4576 / 2775 / 491
Регистрация: 28.04.2012
Сообщений: 8,782
13.11.2016, 20:58
Цитата Сообщение от _Ivana Посмотреть сообщение
Дописал 4 строчки кода в интерпретатор и реализовал давно лежащую на поверхности идею - вычисления в любом переданном контексте (окружении). Новая ядерная особая форма eval-in, принимает лямбду (ибо у меня нет окружений как объектов первого класса, но это и не требуется, ибо лямбды содержат их в себе как замыкания) и список, который надо вычислить в окружении этой переданной лямбды. Пример:
Это выглядит довольно неочевидно. Почему бы просто не сделать окружение — объектом первого класса, с конструктором и селекторами/мутаторами? А то у тебя получилось что-то вроде динамических переменных CL, но как-то инвертировано, если не сказать извращённо.
1
199 / 102 / 4
Регистрация: 16.08.2015
Сообщений: 209
29.12.2016, 12:18
Есть концепции логического программирования - я бы выделил недетерминизм и унификацию. Они обычно ассоциируются с Прологом, но можно приспособить и к Лиспу. Например, есть вот такой проект

Мне тоже понадобился недетерминизм (для гибкости в написании парсеров) и я его реализовал.
Code
1
2
3
4
5
6
> (defun-tfi Ндт-20-двоичное ()
       (+ (Ветвление 0 2) (Ветвление 0 1)))
; определяем недетерминированную функцию "сложи (0 или 2) с (0 или 1)"
 
> (Поиск-в-глубину 'Ндт-20-двоичное nil))
; результат: (0 1 2 3)
Есть оператор отсечения и неудачи (fail), а также восстанавливаются значения локальных переменных при возврате в точку выбора:
Code
1
2
3
4
5
6
7
(defun-tfi Локальная-переменная-восстанавливается ()
  (let ((П 0))
    (Ветвление (incf П) (incf П))))
 
(def-trivial-test::! Тест-Локальная-переменная-восстанавливается
  '(1 1)
  (Поиск-в-глубину 'Локальная-переменная-восстанавливается nil))
Быстродействие "игрушечное" - целью реализации была общность, а не эффективность. В каждой точке выбора полностью копируется состояние интерпретатора.

Ссылка на исходники
2
Заблокирован
20.01.2017, 21:05
В современных мейнстримных диалектах кроме продолжений ничего интересного нет, это алголоподобные языки. Исторически, же, очень много интересого. Рефлексия, эквивалентность кода и данных, дефолтный динамический биндинг, кроме того, диалект лиспа Planner включал бектрекинг, логическое программирование, паттерн-матчинг, ООП(в форме акторов), и многое другое. В давние времена лиспы были катализаторами развития CS
0
Заблокирован
21.01.2017, 11:53
Цитата Сообщение от asmquest Посмотреть сообщение
эквивалентность кода и данных
Точнее сказать: выполнение данных как кода

Добавлено через 1 минуту
Цитата Сообщение от asmquest Посмотреть сообщение
кроме того, диалект лиспа Planner
Уточню: плэнэр - это диалект пролога
Цитата Сообщение от asmquest Посмотреть сообщение
В давние времена лиспы были катализаторами развития CS
Не CS, а AI
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
21.01.2017, 11:53

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
60
Ответ Создать тему
Новые блоги и статьи
Часы электронные
Uhbif79 12.08.2026
Выкладываю программу часов. Программа позволяет: 1. Использовать системное время и дату, 2. Есть возможность вводить время и дату вручную. 3. Реализованы 2 будильника: начало и конец рабочего дня. . . .
Часы с будильником на основе класса QLCDNumber
Uhbif79 12.08.2026
Всем добрый день, выкладываю программу часов с будильником на основе класса QLCDNumber. Здесь я пробовал самостоятельно создавал классы, впервые столкнулся с видимостью переменной одного класса из. . .
Установка MinGW GCC 16.2 и CMake
8Observer8 10.08.2026
VK Видео: https:/ / vkvideo. ru/ video-240781534_456239017 YouTube: eY5-5PyI9NM Текстовая версия
Неделя из жизни имитационной модели склада: мои кривые руки растут, откуда надо
anaschu 10.08.2026
Неделя из жизни имитационной модели склада: как я почти написал неправильную логику и что с этим делать Работаю сейчас над учебно-рабочим проектом: строю в AnyLogic имитационную модель процессов. . .
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru