От: | korvin_ | ||
Дата: | 28.03.23 20:48 | ||
Оценка: | +2 |
V>typedef struct {
V> int i, j;
V>} S;
V>S func1(S arg); // ошибка компиляции
V>
V>typedef struct {
V> int i, j;
V>} S;
V>void func1(const S * arg, S * result); // OK
V>
V>Строго говоря, первоклассной сущностью в C# являются ссылки на объекты, но не сами объекты, внезапно.V>>>Expression<T> и его наследники не являются first class citizen.
НС>>В языке C# — являются.
V>Только в том смысле, что наследуются от Object, который first class citizen.
V>Так можно про любой GC-тип дотнета сказать. ))
(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))