Форум программистов, компьютерный форум, киберфорум
Наши страницы
Clojure
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг 4.52/21: Рейтинг темы: голосов - 21, средняя оценка - 4.52
_Ivana
4062 / 1896 / 237
Регистрация: 01.03.2013
Сообщений: 5,147
Записей в блоге: 22
1

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

25.01.2016, 23:16. Просмотров 4330. Ответов 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
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
25.01.2016, 23:16
Ответы с готовыми решениями:

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

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

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

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

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

61
_Ivana
4062 / 1896 / 237
Регистрация: 01.03.2013
Сообщений: 5,147
Записей в блоге: 22
18.09.2016, 22:12  [ТС] 41
Цитата Сообщение от Catstail Посмотреть сообщение
у Вас шарики друг с другом сталкиваются? Или только со стенками?
В данном примере только со стенками. Можно написать и друг с другом, но потребуется больше расчетов, что для небыстрого интерпретатора критично.

vlisp, я использую интероп с джавой и работаю с ее классами и их методами через рефлекшн. То есть, на уровне платформы реализации это вполне себе ООП. Семантика же моего Лискрипта очень похожа на Схему, где также можно накостылить свое ООП на замыканиях. У меня было (и есть) 2 принципиально разных кода этого примера - здесь показан максимально использующий структуры данных, классы и методы java - так получается быстрее и больше шариков летает без замедления. Но есть и код, по минимуму использующий платформу реализации (только методы создания окна и рисования в нем) - он конечно медленнее.
0
nullxdth
1878 / 843 / 64
Регистрация: 12.03.2013
Сообщений: 3,914
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
budden
198 / 99 / 4
Регистрация: 16.08.2015
Сообщений: 193
19.09.2016, 11:17 44
Цитата Сообщение от nullxdth Посмотреть сообщение
К сожалению, документации или туториала я с ходу не нашёл.
Сейчас в основном занимаемся средой разработки, и она находится в плачевном состоянии. То ли новый SBCL плох, то ли мы что-то испортили. Не лучшее время для анонсов, но сайт здесь: https://bitbucket.org/budden/yar - там найдёте анонс с описанием планируемых фич, видео с демонстрацией удаления поля в классе на ходу, описание следующей версии языка в той мере, в какой оно готово, исходные тексты текущей версии языка и среды.
0
19.09.2016, 11:17
ИсмаилПркопенко
Заблокирован
19.09.2016, 13:05 45
Цитата Сообщение от budden Посмотреть сообщение
удаления поля в классе на ходу
Круто.
Т.е. в runTime можно изменять структура класса?
0
budden
198 / 99 / 4
Регистрация: 16.08.2015
Сообщений: 193
19.09.2016, 13:28 46
Да. Это взято из CLOS (там можно так) вот есть старая тема про мой язык, правда в ней ссылки уже устарели, а поправить нельзя
0
_Ivana
4062 / 1896 / 237
Регистрация: 01.03.2013
Сообщений: 5,147
Записей в блоге: 22
19.09.2016, 16:05  [ТС] 47
Кстати, Catstail, у вас в HomeLisp есть макросы? У вас же, насколько я понимаю, интерпретатор, без компиляции. Значит, макросы (если они есть) раскрываются на предварительной стадии перед интерпретацией (собственно компиляции нет, значит есть стадия макрораскрытия)?
У меня то как раз проще решено - макросы раскрываются прямо в рантайме, по ходу интерпретации, никаких предварительных стадий компиляции\макрораскрытия нет.
0
Catstail
Модератор
24603 / 12511 / 2284
Регистрация: 12.02.2012
Сообщений: 20,328
19.09.2016, 16:18 48
_Ivana, макро есть. Реализовано как у Вас - раскрытие а рантайме.
0
Catstail
Модератор
24603 / 12511 / 2284
Регистрация: 12.02.2012
Сообщений: 20,328
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)))
В реальности диаграмма вращается.
1
Миниатюры
Какие интересные концепции есть в Лиспе?  
_Ivana
4062 / 1896 / 237
Регистрация: 01.03.2013
Сообщений: 5,147
Записей в блоге: 22
19.09.2016, 16:34  [ТС] 50
Catstail, рульно! У кого что есть, тот на нем и едет - я на java reflection API, вы на VB/VBA со всеми изкоробочными плюшками!
0
Catstail
Модератор
24603 / 12511 / 2284
Регистрация: 12.02.2012
Сообщений: 20,328
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_))
Правда этот код имеет недостаток - при наезде на окно изображение не перерисовывается...
0
Миниатюры
Какие интересные концепции есть в Лиспе?  
_Ivana
4062 / 1896 / 237
Регистрация: 01.03.2013
Сообщений: 5,147
Записей в блоге: 22
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
Catstail
Модератор
24603 / 12511 / 2284
Регистрация: 12.02.2012
Сообщений: 20,328
19.09.2016, 17:00 53
_Ivana, бросьте. Это скорее я должен признать поражение. Добавить этих возможностей (то, что я показал) - дело не особо хитрое. Суть - в языке. Свою реализацию я ориентировал на CL. А Вы по сути создали действительно вариант Лиспа (и довольно интересный).
0
Catstail
Модератор
24603 / 12511 / 2284
Регистрация: 12.02.2012
Сообщений: 20,328
19.09.2016, 17:01 54
Цитата Сообщение от _Ivana Посмотреть сообщение
я ее даже реализовал, но не знаю, шлифовать ли до релиза.
- конечно! Возможность для Java вполне обоснованная!
0
_Ivana
4062 / 1896 / 237
Регистрация: 01.03.2013
Сообщений: 5,147
Записей в блоге: 22
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
korvin_
2705 / 1983 / 354
Регистрация: 28.04.2012
Сообщений: 6,773
13.11.2016, 20:58 57
Цитата Сообщение от _Ivana Посмотреть сообщение
Дописал 4 строчки кода в интерпретатор и реализовал давно лежащую на поверхности идею - вычисления в любом переданном контексте (окружении). Новая ядерная особая форма eval-in, принимает лямбду (ибо у меня нет окружений как объектов первого класса, но это и не требуется, ибо лямбды содержат их в себе как замыкания) и список, который надо вычислить в окружении этой переданной лямбды. Пример:
Это выглядит довольно неочевидно. Почему бы просто не сделать окружение — объектом первого класса, с конструктором и селекторами/мутаторами? А то у тебя получилось что-то вроде динамических переменных CL, но как-то инвертировано, если не сказать извращённо.
1
budden
198 / 99 / 4
Регистрация: 16.08.2015
Сообщений: 193
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
asmquest
Заблокирован
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
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.01.2017, 11:53

Определить, какие из этих имен встречаются во всех классах, какие есть хотя бы в двух классах, и какие - только в одном классе
Для каждого из четырех классов указаны имена девочек, обучающихся в них. Определить, какие из этих...

Множества. Какие газеты не поступают ни в один из киосков; какие газеты бывают в каждом; какие есть хотя бы в одном
В три газетных киоска поступают газеты из имеющегося списка. Определить какие газеты не поступают...

Разработка и маркетинг если есть интересные идеи
Готов взятся за исполнение и маркетинг интересных идей за долю в проекте Сам был в такой...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru