Re[17]: понимание ООП Алана Кея
От: korvin_  
Дата: 28.03.23 20:48
Оценка: +2 :)
Здравствуйте, vdimas, Вы писали:

V>Во времена, когда этот мем появился, чаще нельзя было передавать пользовательские типы данных по значению.


При чём тут мемы?

V>Например, в языке Си:

V>
V>typedef struct {
V>    int i, j;
V>} S;

V>S func1(S arg); // ошибка компиляции
V>


V>Но можно передать по указателю:

V>
V>typedef struct {
V>    int i, j;
V>} S;

V>void func1(const S * arg, S * result); // OK
V>

V>Соответственно, структура S не являлась первоклассной сущностью, а указатель являлся.

V>Первоклассные сущности имели неизвестную структуру, именно поэтому вопросы передачи и возврата таких значений тогдашние компиляторы были вынуждены брать на себя.


Какая неизвестная структура у указателя?

V>"Ортогональность" появилась позже, по мере развития ЯВУ, но тогда и определение надо было доработать.


Определение и доработали, я приводил цитату из 4-х пунктов.

V>И да, на твоё замечание я уже отвечал рядом:

V>

V>>>Expression<T> и его наследники не являются first class citizen.
НС>>В языке C# — являются.

V>Только в том смысле, что наследуются от Object, который first class citizen.
V>Так можно про любой GC-тип дотнета сказать. ))

V>Строго говоря, первоклассной сущностью в C# являются ссылки на объекты, но не сами объекты, внезапно.

Строго говоря, это словоблудие. Косвенность сегодня никого особо не волнует.

V>В общем, Expression<T> не являются отдельной первоклассной сущностью AST, по крайней мере не большей, чем некий MyExpression<T>, то бишь никакого уникального признака "first citizen" у них нет. И даже не являются встроенными типами неизвестной структуры. Это просто вынужденный костыль, бо разработка Roslyn была только в проекте.


V>Для сравнение, результат typeof(T) в дотнете можно с некоторой натяжкой назвать отдельной первоклассной сущностью.

V>Хотя тип Type и описан как "обычный объект", но это просто обертка (Decorator) к типу неизвестной (непрозрачной) структуры, представляющей из себя бинарные кишки платформы.
V>Такими непрозрачными типами являются TypeHandle, GCHandle и т.д.



V>Напротив, иерархия Expression<T> строится на абсолютно прозрачных типах юзверского уровня, и определение этих типов, разумеется, даётся в библиотечном виде.


Ещё раз: «прозрачность» не имеет никакого значения для определения, что является first-class citizen, а что — нет.

P. S. Дополнение к примеру syntax-case:

(library (syntax-utils)

  (export syntax-car
          syntax-cdr
          syntax-cadr
          syntax-null?
          ids?
          unique-ids?)
  (import (rnrs))

  (define (syntax-car x)
    (syntax-case x ()
      ((car . cdr) #'car)))

  (define ids?
    (lambda (ls)
      (or (null? ls)
          (and (identifier? (car ls)) (ids? (cdr ls))))))
    
  (define unique-ids?
    (lambda (ls)
      (or (null? ls)
          (and (not (memp
                     (lambda (x) (bound-identifier=? x (car ls)))
                     (cdr ls)))
               (unique-ids? (cdr ls))))))
    
  (define (syntax-cdr x)
    (syntax-case x ()
      ((car . cdr) #'cdr)))

  (define (syntax-cadr x)
    (syntax-car (syntax-cdr x)))
    
  (define (syntax-null? x)
    (syntax-case x ()
      (()          #t)
      ((car . cdr) #f)))

  'end)

...
(import (rnrs)
        (for (r6rs-ext syntax-utils) expand))

(define-syntax let
  (lambda (x)
    (syntax-case x ()
      ((_ . body)
       (if (syntax-null? (syntax-cdr #'body))
           (error 'let "invalid syntax")
           (let loop ((vars    '())
                      (exprs   '())
                      (bindings (syntax-car #'body)))
             (cond ((not (syntax-null? bindings))
                    (let* ((binding (syntax-car bindings))
                           (var  (syntax-car  binding))
                           (expr (syntax-cadr binding)))
                      (loop (cons var   vars)
                            (cons expr  exprs)
                            (syntax-cdr bindings))))
                   ((and (ids? vars) (unique-ids? vars))
                    #`((lambda #,(reverse vars) #,@(syntax-cdr #'body)) #,@(reverse exprs)))
                   (else
                    (error 'let "invalid syntax")))))))))


(let ((x 1)
      (y 2))
  (display (+ x y))
  (newline))

— всё, никаких шаблонов. Да и syntax-case можно убрать вообще, убрав даже (_ . body)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.