4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
1

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

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

Author24 — интернет-сервис помощи студентам
В смысле, что бы еще попробовать реализовать. На 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.01.2016, 23:16
Ответы с готовыми решениями:

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

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

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

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

61
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
18.09.2016, 22:12  [ТС] 41
Author24 — интернет-сервис помощи студентам
Цитата Сообщение от Catstail Посмотреть сообщение
у Вас шарики друг с другом сталкиваются? Или только со стенками?
В данном примере только со стенками. Можно написать и друг с другом, но потребуется больше расчетов, что для небыстрого интерпретатора критично.

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

Добавлено через 12 минут
Цитата Сообщение от vlisp Посмотреть сообщение
Если нет, то это не выживет...
Мне кажется, что у проекта _Ivana нет цели выживать. Насколько я понял, он создан для того, что бы ближе познакомиться с базовыми идеями Lisp-а и получить какой-то опыт в языкостроении. Как мне кажется, вполне себе отличный и профессиональный подход. Тебе в голову не приходило, что люди когда что-то делают ставят разные цели? Или тебе кажется, что любой язык, любой прототип просто обязан быть сравнён с господствующими языками и быть непременно осмеян?
1
magirus
19.09.2016, 11:08
  #43
 Комментарий модератора 
уважаемые, перечитайте правила. особенно внимательно - пункт 3.1
0
199 / 102 / 4
Регистрация: 16.08.2015
Сообщений: 209
19.09.2016, 11:17 44
Цитата Сообщение от nullxdth Посмотреть сообщение
К сожалению, документации или туториала я с ходу не нашёл.
Сейчас в основном занимаемся средой разработки, и она находится в плачевном состоянии. То ли новый SBCL плох, то ли мы что-то испортили. Не лучшее время для анонсов, но сайт здесь: https://bitbucket.org/budden/yar - там найдёте анонс с описанием планируемых фич, видео с демонстрацией удаления поля в классе на ходу, описание следующей версии языка в той мере, в какой оно готово, исходные тексты текущей версии языка и среды.
0
Заблокирован
19.09.2016, 13:05 45
Цитата Сообщение от budden Посмотреть сообщение
удаления поля в классе на ходу
Круто.
Т.е. в runTime можно изменять структура класса?
0
199 / 102 / 4
Регистрация: 16.08.2015
Сообщений: 209
19.09.2016, 13:28 46
Да. Это взято из CLOS (там можно так) вот есть старая тема про мой язык, правда в ней ссылки уже устарели, а поправить нельзя
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
19.09.2016, 16:05  [ТС] 47
Кстати, Catstail, у вас в HomeLisp есть макросы? У вас же, насколько я понимаю, интерпретатор, без компиляции. Значит, макросы (если они есть) раскрываются на предварительной стадии перед интерпретацией (собственно компиляции нет, значит есть стадия макрораскрытия)?
У меня то как раз проще решено - макросы раскрываются прямо в рантайме, по ходу интерпретации, никаких предварительных стадий компиляции\макрораскрытия нет.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36578 / 20308 / 4218
Регистрация: 12.02.2012
Сообщений: 33,607
Записей в блоге: 13
19.09.2016, 16:18 48
_Ivana, макро есть. Реализовано как у Вас - раскрытие а рантайме.
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36578 / 20308 / 4218
Регистрация: 12.02.2012
Сообщений: 33,607
Записей в блоге: 13
19.09.2016, 16:28 49
Не помню, показывал ли раньше. Вот так в 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
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
19.09.2016, 16:34  [ТС] 50
Catstail, рульно! У кого что есть, тот на нем и едет - я на java reflection API, вы на VB/VBA со всеми изкоробочными плюшками!
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36578 / 20308 / 4218
Регистрация: 12.02.2012
Сообщений: 33,607
Записей в блоге: 13
19.09.2016, 16:42 51
_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
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
19.09.2016, 16:55  [ТС] 52
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
36578 / 20308 / 4218
Регистрация: 12.02.2012
Сообщений: 33,607
Записей в блоге: 13
19.09.2016, 17:00 53
_Ivana, бросьте. Это скорее я должен признать поражение. Добавить этих возможностей (то, что я показал) - дело не особо хитрое. Суть - в языке. Свою реализацию я ориентировал на CL. А Вы по сути создали действительно вариант Лиспа (и довольно интересный).
0
Модератор
Эксперт функциональных языков программированияЭксперт Python
36578 / 20308 / 4218
Регистрация: 12.02.2012
Сообщений: 33,607
Записей в блоге: 13
19.09.2016, 17:01 54
Цитата Сообщение от _Ivana Посмотреть сообщение
я ее даже реализовал, но не знаю, шлифовать ли до релиза.
- конечно! Возможность для Java вполне обоснованная!
0
4817 / 2278 / 287
Регистрация: 01.03.2013
Сообщений: 5,947
Записей в блоге: 28
12.11.2016, 10:11  [ТС] 55
Дописал 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 56
_Ivana, А не могли бы Вы объяснить что делает Ваш код для тех, кто никогда на Лиспе не программировал и вообще ни на каком языке не программировал.

А?

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

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

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

Мне тоже понадобился недетерминизм (для гибкости в написании парсеров) и я его реализовал.
Код
> (defun-tfi Ндт-20-двоичное ()
       (+ (Ветвление 0 2) (Ветвление 0 1)))
; определяем недетерминированную функцию "сложи (0 или 2) с (0 или 1)"

> (Поиск-в-глубину 'Ндт-20-двоичное nil))
; результат: (0 1 2 3)
Есть оператор отсечения и неудачи (fail), а также восстанавливаются значения локальных переменных при возврате в точку выбора:
Код
(defun-tfi Локальная-переменная-восстанавливается ()
  (let ((П 0))
    (Ветвление (incf П) (incf П))))

(def-trivial-test::! Тест-Локальная-переменная-восстанавливается
  '(1 1)
  (Поиск-в-глубину 'Локальная-переменная-восстанавливается nil))
Быстродействие "игрушечное" - целью реализации была общность, а не эффективность. В каждой точке выбора полностью копируется состояние интерпретатора.

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

Добавлено через 1 минуту
Цитата Сообщение от asmquest Посмотреть сообщение
кроме того, диалект лиспа Planner
Уточню: плэнэр - это диалект пролога
Цитата Сообщение от asmquest Посмотреть сообщение
В давние времена лиспы были катализаторами развития CS
Не CS, а AI
0
21.01.2017, 11:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
21.01.2017, 11:53
Помогаю со студенческими работами здесь

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

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

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

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


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru