История изменений
Исправление Zubok, (текущая версия) :
В SBCL, когда возвращается несколько значений, первые три возвращаются через регистры, а потом - через стек. Это на x86-64, резумеется. Разные реализации по-разному будут делать. По сути своей values - это больше для оптимизации:
* (defun test () (values 1.1 1.2 'a 123))
TEST
* (disassemble 'test)
; disassembly for TEST
; Size: 51 bytes. Origin: #x52C29447 ; TEST
; 47: 488B15D2FFFFFF MOV RDX, [RIP-46] ; 1.1
; 4E: 488B3DC3FFFFFF MOV RDI, [RIP-61] ; 1.2
; 55: 488B35B4FFFFFF MOV RSI, [RIP-76] ; 'A
; 5C: 48C745F0F6000000 MOV QWORD PTR [RBP-16], 246 ; 123
; 64: 488D5D10 LEA RBX, [RBP+16]
; 68: B908000000 MOV ECX, 8
; 6D: F9 STC
; 6E: 488D65F0 LEA RSP, [RBP-16]
; 72: 488B6D00 MOV RBP, [RBP]
; 76: FF73F8 PUSH QWORD PTR [RBX-8]
; 79: C3 RET
NIL
* (defun test () (values 1.1 1.2 'a))
WARNING: redefining COMMON-LISP-USER::TEST in DEFUN
TEST
* (disassemble 'test)
; disassembly for TEST
; Size: 36 bytes. Origin: #x52C29506 ; TEST
; 06: 488B15D3FFFFFF MOV RDX, [RIP-45] ; 1.1
; 0D: 488B3DC4FFFFFF MOV RDI, [RIP-60] ; 1.2
; 14: 488B35B5FFFFFF MOV RSI, [RIP-75] ; 'A
; 1B: 488D5D10 LEA RBX, [RBP+16]
; 1F: B906000000 MOV ECX, 6
; 24: F9 STC
; 25: 488BE5 MOV RSP, RBP
; 28: 5D POP RBP
; 29: C3 RET
NIL
*
Исходная версия Zubok, :
В SBCL, когда возвращается несколько значений, первые три возвращаются через регистры, а потом - через стек. Это на x86-64, резумеется. Разные реализации по-разному будут делать. По сути своей values - это больше для оптимизации:
* (defun test () (values 1.1 1.2 'a 123))
TEST
* (disassemble 'test)
; disassembly for TEST
; Size: 51 bytes. Origin: #x52C29447 ; TEST
; 47: 488B15D2FFFFFF MOV RDX, [RIP-46] ; 1.1
; 4E: 488B3DC3FFFFFF MOV RDI, [RIP-61] ; 1.2
; 55: 488B35B4FFFFFF MOV RSI, [RIP-76] ; 'A
; 5C: 48C745F0F6000000 MOV QWORD PTR [RBP-16], 246
; 64: 488D5D10 LEA RBX, [RBP+16]
; 68: B908000000 MOV ECX, 8
; 6D: F9 STC
; 6E: 488D65F0 LEA RSP, [RBP-16]
; 72: 488B6D00 MOV RBP, [RBP]
; 76: FF73F8 PUSH QWORD PTR [RBX-8]
; 79: C3 RET
NIL
* (defun test () (values 1.1 1.2 'a))
WARNING: redefining COMMON-LISP-USER::TEST in DEFUN
TEST
* (disassemble 'test)
; disassembly for TEST
; Size: 36 bytes. Origin: #x52C29506 ; TEST
; 06: 488B15D3FFFFFF MOV RDX, [RIP-45] ; 1.1
; 0D: 488B3DC4FFFFFF MOV RDI, [RIP-60] ; 1.2
; 14: 488B35B5FFFFFF MOV RSI, [RIP-75] ; 'A
; 1B: 488D5D10 LEA RBX, [RBP+16]
; 1F: B906000000 MOV ECX, 6
; 24: F9 STC
; 25: 488BE5 MOV RSP, RBP
; 28: 5D POP RBP
; 29: C3 RET
NIL
*