>>394
No you can access only functions from its interface(or more accurately remove functions from the VM).
You can list, create, delete packages. Packages contain symbols, which link to everything else. You can inspect, modify, redefine, make them unbound, undefine, and so on, any symbol, and you can save the new state of the world ( this is usually used when standalone executable are wanted ). You can access private symbols of packages too, for example
cl:car would point to the CAR symbol, which is functionally bound:
CAR
--------------------
The object is a SYMBOL. ..
Name: "CAR"
Package: #<PACKAGE "COMMON-LISP">
Value: #:INSPECT-UNBOUND-OBJECT-581
Function: #<FUNCTION CAR>
Plist: NIL
Let's say i want to look at some internal part of the image, i can do that:
#<PACKAGE "SB-THREAD">
--------------------
The object is a STRUCTURE-OBJECT of type PACKAGE. ..
%NAME: "SB-THREAD"
%NICKNAMES: NIL
%USE-LIST: (#<PACKAGE "SB-KERNEL"> #<PACKAGE "SB-SYS"> #<PACKAGE "SB-INT"> ..)
TABLES: (NIL #<SB-IMPL::PACKAGE-HASHTABLE :SIZE 1425 :FREE 475 :DELETED 0> ..)
%USED-BY-LIST: NIL
INTERNAL-SYMBOLS: #<SB-IMPL::PACKAGE-HASHTABLE :SIZE 188 :FREE 64 :DELETED 0>
EXTERNAL-SYMBOLS: #<SB-IMPL::PACKAGE-HASHTABLE :SIZE 62 :FREE 22 :DELETED 0>
%SHADOWING-SYMBOLS: NIL
DOC-STRING: "public (but low-level): native thread support"
LOCK: T
%IMPLEMENTATION-PACKAGES: NIL
SOURCE-LOCATION: NIL
I can then examine the internal symbols in the package
#<(SIMPLE-VECTOR 251) {223CF917}>
--------------------
Dimensions: (251)
Element type: T
Total size: 251
Adjustable: NIL
Fill pointer: NIL
Contents:
0: SB-THREAD::CALL-WITH-RECURSIVE-SYSTEM-SPINLOCK
1: SB-THREAD::COPY-SESSION
2: 0
3: 0
4: SB-THREAD::MAKE-SESSION
5: SB-THREAD::CALL-WITH-RECURSIVE-SYSTEM-SPINLOCK/WITHOUT-GCING
6: 0
7: SB-THREAD::WITH-SYSTEM-SPINLOCK
8: 0
9: SB-THREAD::FORMS
10: SB-THREAD::SEMAPHORE-P
11: 0
12: SB-THREAD::SET-MUTEX-VALUE
13: SB-THREAD::CALL-WITH-SPINLOCK
...
247: SB-THREAD::WAIT-P
248: SB-THREAD::CALL-WITH-SYSTEM-MUTEX
249: SB-THREAD::NEW-SESSION
250: SB-THREAD::WITH-SPINLOCK
Note that :: which clearly states that the symbol is internal, but if you were to use :: to access it instead of :, it would work.
CL-USER> (fboundp 'SB-THREAD::NEW-SESSION)
T
CL-USER> (disassemble 'SB-THREAD::NEW-SESSION)
; disassembly for SB-THREAD::NEW-SESSION
; 230C9E3E: 8B05089E0C23 MOV EAX, [#x230C9E08] ; 'SB-THREAD:*CURRENT-THREAD*
; no-arg-parsing entry point
; 44: 8B48FD MOV ECX, [EAX-3]
; 47: 83F94A CMP ECX, 74
; 4A: 7453 JEQ L0
; 4C: E8BC6CF3FE CALL #x22000B0D ; ALLOCATE-CONS-TO-EAX
; 51: 8948FD MOV [EAX-3], ECX
; 54: C740010B001022 MOV DWORD PTR [EAX+1], 571473931
; 5B: 8B0D089E0C23 MOV ECX, [#x230C9E08] ; 'SB-THREAD:*CURRENT-THREAD*
; 61: 8B51FD MOV EDX, [ECX-3]
; 64: 83FA4A CMP EDX, 74
; 67: 743B JEQ L1
; 69: E8686CF3FE CALL #x22000AD6 ; ALLOCATE-CONS-TO-ECX
; 6E: 8951FD MOV [ECX-3], EDX
; 71: C741010B001022 MOV DWORD PTR [ECX+1], 571473931
; 78: 8B150C9E0C23 MOV EDX, [#x230C9E0C] ; :THREADS
; 7E: 8BF8 MOV EDI, EAX
; 80: 8B35109E0C23 MOV ESI, [#x230C9E10] ; :INTERACTIVE-THREADS
; 86: 894DF8 MOV [EBP-8], ECX
; 89: 8B05149E0C23 MOV EAX, [#x230C9E14] ; #<FDEFINITION object for SB-THREAD::MAKE-SESSION>
; 8F: B910000000 MOV ECX, 16
; 94: FF7504 PUSH DWORD PTR [EBP+4]
; 97: FF6005 JMP DWORD PTR [EAX+5]
; 9A: CC0A BREAK 10 ; error trap
; 9C: 02 BYTE #X02
; 9D: 18 BYTE #X18 ; INVALID-ARG-COUNT-ERROR
; 9E: 4D BYTE #X4D ; ECX
; 9F: L0: CC0A BREAK 10 ; error trap
; A1: 02 BYTE #X02
; A2: 1A BYTE #X1A ; UNBOUND-SYMBOL-ERROR
; A3: 0E BYTE #X0E ; EAX
; A4: L1: CC0A BREAK 10 ; error trap
; A6: 02 BYTE #X02
; A7: 1A BYTE #X1A ; UNBOUND-SYMBOL-ERROR
; A8: 4E BYTE #X4E ; ECX
NIL
No native code right?
I could just as well, redefine the function if I wanted, but there's no need:
CL-USER> (setf (symbol-function 'SB-THREAD::NEW-SESSION) #'(lambda (...) (...)))
#<FUNCTION (LAMBDA (X)) {24AEF27D}>
I should really stop arguing with you, do some research first.