> 1 <

Автор Сообщение

Яков Замир Кацман

Members


Статус

38 сообщений

Где: France
Род занятий:
Возраст:

#7567   2015-04-05 21:26 GMT+3 часа(ов)      
 
CL-USER 1 > (defun ret (i)
(declare (type integer i))
(return-from ret i)
)
RET
CL-USER 2 > (ret 1)
1
CL-USER 3 > (ret 1.01)
1.01


Таким способом ничего не выходит. Подскажите как это делается?


CL-USER 2 > (declare (ftype (function (integer) integer) fname))
 
CL-USER 3 > (defun fname (i)
(return-from fname "p")
)
FNAME
CL-USER 4 > (fname 1)
"p"

Так тоже ничего не выходит?

 
CL-USER 6 > (proclaim '(ftype (function (integer) integer) square))
T
(defun square (x) (* 0.02 0.01))
CL-USER 7 > (defun square (x) (* 0.02 0.01))
SQUARE
 
CL-USER 8 > (square 1)
2.0E-4


Чего-то я не понимаю....

отредактировал(а) Яков Замир Кацман: 2015-04-05 22:37 GMT+3 часа(ов)
Море литературы по Лисп-у и смежным технологиям.

misha

Moderators


Статус

1273 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#7568   2015-04-05 22:37 GMT+3 часа(ов)      
Используйте оператор the.

Яков Замир Кацман

Members


Статус

38 сообщений

Где: France
Род занятий:
Возраст:

#7569   2015-04-05 22:52 GMT+3 часа(ов)      
CL-USER 1 > (defun fname (i)
(the float i)
)
FNAME
 
CL-USER 2 > (fname 1.01)
1.01
 
CL-USER 3 > (fname "1.01")


Error: The value "1.01" does not satisfy the type specifier FLOAT.

Да заработало Спасибо! Скажите а почему не заработали type ftype?
Море литературы по Лисп-у и смежным технологиям.

skelter

Members


Статус

34 сообщений

Где: ---
Род занятий:
Возраст:

#7570   2015-04-06 00:38 GMT+3 часа(ов)      
Наверно, декларировать тип функции надо было на этапе компиляции с помощью declaim. Вот что у меня получилось на SBCL:
(declaim (ftype (function (fixnum) fixnum) fname))
 
(defun fname (i)
i)
 
(defun g (i)
(1+ (fname i)))
 
(defun h (i)
(1+ i))

И для сравнения код, порождаемый g и h:
CL-USER> (disassemble 'g)
; disassembly for G
; Size: 81 bytes. Origin: #x1004C3CD9C
; 9C: 498B4C2460 MOV RCX, [R12+96] ; thread.binding-stack-pointer
; no-arg-parsing entry point
; A1: 48894DF8 MOV [RBP-8], RCX
; A5: 488D5C24F0 LEA RBX, [RSP-16]
; AA: 4883EC18 SUB RSP, 24
; AE: 488BD6 MOV RDX, RSI
; B1: 488B0588FFFFFF MOV RAX, [RIP-120] ; #<FDEFINITION for FNAME>
; B8: B902000000 MOV ECX, 2
; BD: 48892B MOV [RBX], RBP
; C0: 488BEB MOV RBP, RBX
; C3: FF5009 CALL QWORD PTR [RAX+9]
; C6: 480F42E3 CMOVB RSP, RBX
; CA: 488B75F0 MOV RSI, [RBP-16]
; CE: 48D1FA SAR RDX, 1
; D1: 48FFC2 INC RDX
; D4: 48D1E2 SHL RDX, 1
; D7: 710C JNO L0
; D9: 48D1DA RCR RDX, 1
; DC: 41BBE0050020 MOV R11D, 536872416 ; ALLOC-SIGNED-BIGNUM-IN-RDX
; E2: 41FFD3 CALL R11
; E5: L0: 488BE5 MOV RSP, RBP
; E8: F8 CLC
; E9: 5D POP RBP
; EA: C3 RET
; EB: CC10 BREAK 16 ; Invalid argument count trap
NIL
 
 
CL-USER> (disassemble 'h)
; disassembly for H
; Size: 38 bytes. Origin: #x1004CB0D0C
; 0C: 498B4C2460 MOV RCX, [R12+96] ; thread.binding-stack-pointer
; no-arg-parsing entry point
; 11: 48894DF8 MOV [RBP-8], RCX
; 15: BF02000000 MOV EDI, 2
; 1A: 488BD3 MOV RDX, RBX
; 1D: 41BBA0010020 MOV R11D, 536871328 ; GENERIC-+
; 23: 41FFD3 CALL R11
; 26: 488B5DF0 MOV RBX, [RBP-16]
; 2A: 488BE5 MOV RSP, RBP
; 2D: F8 CLC
; 2E: 5D POP RBP
; 2F: C3 RET
; 30: CC10 BREAK 16 ; Invalid argument count trap
NIL

Тут в h присутствует GENERIC-+, а в g его нет, то есть g знает, что складывает fixnum с fixnum-ом.

А пример, возвращающий "p", компилируется с предупреждением.

Вообще, эффект деклараций целиком зависит от реализации.

(Кстати, если определять функцию defun-ом, она возвращает результат последнего выражения, поэтому явно писать return-from практически никогда не приходится.)

misha

Moderators


Статус

1273 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#7571   2015-04-06 01:26 GMT+3 часа(ов)      
Стандарт не предусматривает наличие удобной системы контрактов, так что все приходится разруливать самостоятельно (в учебниках это есть). А типы необходимо указывать прежде всего для того, чтобы компилятор смог лучше оптимизировать код. Но злоупотреблять этим не стоит, ибо иногда это может вызвать серьезные трудности при отладке.

Яков Замир Кацман

Members


Статус

38 сообщений

Где: France
Род занятий:
Возраст:

#7572   2015-04-06 10:33 GMT+3 часа(ов)      
Просто это не типы совсем. Это скорее фасеты что-ли на онтологии....
Дело не в компиляции.


Создание своего типа

CL-USER 13 : 7 > (deftype my-val() '(satisfies integerp))
CL-USER 14 : 7 > (typep 2 'my-val)
T
CL-USER 15 : 7 > (typep 2.0 'my-val)
NIL
 
Сложные типы:
CL-USER 5 : 1 > (deftype my-val-2() '(array short-float (4)))
CL-USER 4 : 1 > (setq a (make-array 4 :initial-element 1.1))
#(1.1 1.1 1.1 1.1)
CL-USER 7 : 2 > (typep a 'my-val-2)
T
CL-USER 8 : 2 > (setq b (make-array 40 :initial-element 1))
#(1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1)
CL-USER 9 : 2 > (typep b 'my-val-2)
NIL




Компилятор ни как не связывает, настолько я понимаю два ниже следующих стейтмента друг с другом

CL-USER 5 : 1 > (deftype my-val-2() '(array short-float (4)))

CL-USER 4 : 1 > (setq a (make-array 4 :initial-element 1.1))

отредактировал(а) Яков Замир Кацман: 2015-04-06 11:34 GMT+3 часа(ов)
Море литературы по Лисп-у и смежным технологиям.

misha

Moderators


Статус

1273 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#7573   2015-04-07 17:19 GMT+3 часа(ов)      
Лисп изначально имеет динамическую типизацию, поэтому ни о каком связывании (а тем более выводе типов) не может быть и речи.

Яков Замир Кацман

Members


Статус

38 сообщений

Где: France
Род занятий:
Возраст:

#7594   2015-04-15 12:08 GMT+3 часа(ов)      
Лисп изначально имеет динамическую типизацию, поэтому ни о каком связывании (а тем более выводе типов) не может быть и речи.

Остается последний вопрос. Что определяет здесь type-of?

 
CL-USER > (defstruct (point :conc-name ) (x 0) (y 0))
POINT
 
 
CL-USER > (setf p1 (make-point :x 1 :y 30))
#S(POINT :X 1 :Y 30)
 
CL-USER > (mapcar 'x (list p1))
(1)
 
CL-USER > (print (type-of p1))
POINT


(исправлено)

отредактировал(а) Яков Замир Кацман: 2015-04-16 15:03 GMT+3 часа(ов)
Море литературы по Лисп-у и смежным технологиям.

Valko

Members


Статус

29 сообщений

Где: ---
Род занятий:
Возраст:

#7596   2015-04-15 20:53 GMT+3 часа(ов)      
Новая структура, означает новый тип данных. Теперь type-of возвращает тип экземпляра структуры. Думаю мануал по структурам легко найдете.
Цитата
Яков Замир Кацман :
 
CL-USER > (mapcar 'x (list p1))
1
 



Как это сработало, ничего не пропущено?

Яков Замир Кацман

Members


Статус

38 сообщений

Где: France
Род занятий:
Возраст:

#7597   2015-04-15 22:56 GMT+3 часа(ов)      
CL-USER 3 > (mapcar 'x (list p1))
(1)


вроде все работает...
Море литературы по Лисп-у и смежным технологиям.

misha

Moderators


Статус

1273 сообщений
http://racket-lang.org/
Где: Yemen
Род занятий:
Возраст:

#7598   2015-04-15 23:33 GMT+3 часа(ов)      
Цитата
Яков Замир Кацман :
CL-USER 3 > (mapcar 'x (list p1))
(1)


вроде все работает...

Может все-таки point-x?

Яков Замир Кацман

Members


Статус

38 сообщений

Где: France
Род занятий:
Возраст:

#7599   2015-04-16 14:59 GMT+3 часа(ов)      
Я понял в чем ваш вопрос:


CL-USER 1 > (defstruct (point  :conc-name )  (x 0) (y 0))
 
 
 
 
 
Море литературы по Лисп-у и смежным технологиям.
> 1 <


Онлайн :

0 пользователь(ей), 10 гость(ей) :




Реклама на сайте: