Skip to content

ageldama/tclish

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

36 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

tclish

Much more Lispy(tm) Tcl/Tk 9.0

  • VERSION: 1.0

  • Currenctly only tested under:

    • SBCL 2.6.4 / Linux x86_64
    • libtcl9.0 (9.0.1+dfsg-2)
    • libtk9.0 (9.0.1-3)
  • Suggestions, Patches, Issues and PRs are Welcomed.

...More hacks will be come, anytime soon. ;-)

Table of Contents

  1. tclish
  2. Table of Contents
  3. Introduction
    1. Embedding Tcl/Tk Interpreter in Lisp application
    2. Extending Tcl/Tk in Lisp
    3. Comparison Table
  4. Examples
  5. Dependencies
  6. Supporting
  7. License
  8. APIs
    1. PACKAGE: TCLISH/CFFI
      1. CFFI-FUNCTION: C-MEMCPY
      2. CFFI-FUNCTION: C-MEMSET
      3. CFFI-FUNCTION: C-STRLEN
      4. FUNCTION: C-MEMCPY
      5. FUNCTION: C-MEMSET
      6. FUNCTION: C-PTR-ARRAY-TO-PTR-LIST
      7. FUNCTION: C-STRING-ARRAY-TO-STRING-LIST
      8. FUNCTION: C-STRLEN
      9. FUNCTION: CFFI/ALLOC+BZERO
      10. MACRO: C-MEMSET*
      11. MACRO: MEM-ZERO
    2. PACKAGE: TCLISH/REDIR-TO-OUTSTREAM-CHAN
      1. CFFI-TYPE: CHAN-INSTANCE-COUNTER-T
      2. CLASS: <REDIR-TO-OUTSTREAM-CHAN>
      3. FUNCTION: %NEW-INSTANCE-COUNTER
      4. FUNCTION: %PUT-INSTANCE
      5. FUNCTION: %REM-INSTANCE
      6. METHOD: DEALLOC ((CHAN <REDIR-TO-OUTSTREAM-CHAN>))
      7. METHOD: REGIST ((CHAN <REDIR-TO-OUTSTREAM-CHAN>) &KEY TCL-INTERP-PTR TCL-STD-CHAN-TYPE)
      8. METHOD: UNREGIST ((CHAN <REDIR-TO-OUTSTREAM-CHAN>) &KEY TCL-INTERP-PTR)
      9. VARIABLE: *CHAN-INSTANCE-COUNTER*
      10. VARIABLE: *LOCK*
      11. VARIABLE: *REGISTERED-CHAN-HT*
    3. PACKAGE: TCLISH
      1. CFFI-STRUCT: TCL-EV-QUEUE-CB-EVT-S
      2. CFFI-TYPE: CALL-WHEN-DELETED-CB-COUNTER-T
      3. CFFI-TYPE: CMD-CB-COUNTER-T
      4. CFFI-TYPE: INTERP-TRACE-CB-COUNTER-T
      5. CFFI-TYPE: TCL-EV-QUEUE-CB-COUNTER-T
      6. CFFI-TYPE: TCL-EV-QUEUE-CB-EVT-S-PTR
      7. CFFI-TYPE: TRACE-CMD-CB-COUNTER-T
      8. CFFI-TYPE: TRACE-VAR-CB-COUNTER-T
      9. CLASS: <TCL-ARRAY-LINK>
      10. CLASS: <TCL-CMD-TRACE>
      11. CLASS: <TCL-VAR-LINK-BASE>
      12. CLASS: <TCL-VAR-LINK>
      13. CLASS: <TCL-VAR-TRACE>
      14. CLASS: TCL-EV-QUEUE-CB-EVT-S-TCLASS
      15. CONDITION: <TCL-ERROR>
      16. FUNCTION: %CMD-CB-COUNTER-VALUE-FROM-C
      17. FUNCTION: %CMD-CB-COUNTER-VALUE-FROM-C
      18. FUNCTION: %COMPOSE-NS-FQN
      19. FUNCTION: %TCL-EV-QUEUE-CB-COUNTER/VALUE-FROM-C
      20. FUNCTION: %TCL-EV-QUEUE-CB-COUNTER/VALUE-FROM-C
      21. FUNCTION: ->FLAGS-BITS*
      22. FUNCTION: ->FLAGS-BITS
      23. FUNCTION: ->TCL-STRING-OBJ%
      24. FUNCTION: ->TCL-STRING-OBJ
      25. FUNCTION: <-FLAGS-BITS
      26. FUNCTION: <-TCL-INT-BOOL
      27. FUNCTION: ALIAS/GET
      28. FUNCTION: ALIAS/OBJ
      29. FUNCTION: ALIAS/STR
      30. FUNCTION: ALIST->TCL-DICT
      31. FUNCTION: APPLY-LAMBDA
      32. FUNCTION: CALL-WHEN-DELETED/+ADD
      33. FUNCTION: CALL-WHEN-DELETED/-DEL
      34. FUNCTION: CALL-WHEN-DELETED/ALLOC-COUNTER-CFFI
      35. FUNCTION: CALL-WHEN-DELETED/CB
      36. FUNCTION: CALL-WHEN-DELETED/CB
      37. FUNCTION: CALL-WHEN-DELETED/COUNTER-CFFI
      38. FUNCTION: CALL-WHEN-DELETED/COUNTER-CFFI
      39. FUNCTION: CALL-WHEN-DELETED/DEL-CB
      40. FUNCTION: CALL-WHEN-DELETED/FREE-COUNTER-CFFI
      41. FUNCTION: CALL-WHEN-DELETED/INCR-COUNT
      42. FUNCTION: CALL-WHEN-DELETED/REGIST-CB
      43. FUNCTION: CALL-WHEN-DELETED/ROUTE-BY-CLIENT-DATA
      44. FUNCTION: CALL-WHEN-DELETED/UNREGIST-CB
      45. FUNCTION: CHK-GET/SET-VAR-AS-TYPE
      46. FUNCTION: CMD-INFO/FREE
      47. FUNCTION: CMD-INFO/FROM-CMD-OBJ
      48. FUNCTION: CMD-INFO/FROM-CMD-OBJ
      49. FUNCTION: CMD-INFO/FULL-NAME
      50. FUNCTION: CREATE-ENSEMBLE
      51. FUNCTION: CREATE-OBJ-COMMAND
      52. FUNCTION: CREATE-STRING-COMMAND
      53. FUNCTION: DEF-CMD/P
      54. FUNCTION: DEF-CMD/PP
      55. FUNCTION: ENSEMBLE/EXCLUDE
      56. FUNCTION: ENSEMBLE/INCLUDE
      57. FUNCTION: ENSEMBLE/RENAME
      58. FUNCTION: EVAL-TCL/STR
      59. FUNCTION: EVAL-TCL/TCL-OBJ-LIST
      60. FUNCTION: EVAL-TCL/TCL-OBJV
      61. FUNCTION: EVAL-TCL/TCL-STRING
      62. FUNCTION: EVAL-TCL
      63. FUNCTION: FLAGS-BIT?
      64. FUNCTION: FREE-TCL-OBJV
      65. FUNCTION: GET-VAR/OBJ
      66. FUNCTION: GET-VAR/STR
      67. FUNCTION: GET-VAR
      68. FUNCTION: HT->TCL-DICT
      69. FUNCTION: INTERP-TRACE/+TRACE
      70. FUNCTION: INTERP-TRACE/-DELETE
      71. FUNCTION: INTERP-TRACE/ALLOC-COUNTER-CFFI
      72. FUNCTION: INTERP-TRACE/CB
      73. FUNCTION: INTERP-TRACE/CB
      74. FUNCTION: INTERP-TRACE/COUNTER-CFFI
      75. FUNCTION: INTERP-TRACE/COUNTER-CFFI
      76. FUNCTION: INTERP-TRACE/DEL-CB
      77. FUNCTION: INTERP-TRACE/FREE-COUNTER-CFFI
      78. FUNCTION: INTERP-TRACE/INCR-COUNT
      79. FUNCTION: INTERP-TRACE/REGIST-CB
      80. FUNCTION: INTERP-TRACE/ROUTE-BY-CLIENT-DATA
      81. FUNCTION: INTERP-TRACE/UNREGIST-CB
      82. FUNCTION: INTERP/ACTIVE?
      83. FUNCTION: INTERP/CHILD
      84. FUNCTION: INTERP/CREATE-CHILD
      85. FUNCTION: INTERP/DELETED?
      86. FUNCTION: INTERP/EXPOSE-CMD
      87. FUNCTION: INTERP/HIDE-CMD
      88. FUNCTION: INTERP/INTERP-PATH
      89. FUNCTION: INTERP/PARENT
      90. FUNCTION: INTERP/SAFE?
      91. FUNCTION: LINK/+ARRAY
      92. FUNCTION: LINK/+VAR
      93. FUNCTION: LINK/-UNLINK
      94. FUNCTION: LINK/ALLOC-ARRAY
      95. FUNCTION: LINK/ALLOC-VAR-STR
      96. FUNCTION: LINK/ALLOC-VAR
      97. FUNCTION: LINK/ARRAY-CFFI-TYPE
      98. FUNCTION: LINK/ARRAY-TYPE?
      99. FUNCTION: LINK/COMMON-TYPE?
      100. FUNCTION: LINK/FREE-ARRAY
      101. FUNCTION: LINK/FREE-VAR-STR
      102. FUNCTION: LINK/FREE-VAR
      103. FUNCTION: LINK/READ-ARRAY
      104. FUNCTION: LINK/READ-VAR-STR
      105. FUNCTION: LINK/READ-VAR
      106. FUNCTION: LINK/UPDATE
      107. FUNCTION: LINK/VAR-CFFI-TYPE
      108. FUNCTION: LINK/VAR-TYPE?
      109. FUNCTION: LINK/WRITE-ARRAY
      110. FUNCTION: LINK/WRITE-VAR-STR
      111. FUNCTION: LINK/WRITE-VAR
      112. FUNCTION: LISP-BOOL->C-INT
      113. FUNCTION: LISP-VALUE-OR-NULLPTR
      114. FUNCTION: LIST->TCL-LIST
      115. FUNCTION: LIST->TCL-STRING-LIST
      116. FUNCTION: MNT-ZIPFS
      117. FUNCTION: NULLPTR->NIL
      118. FUNCTION: OBJV->TCL-OBJ-LIST
      119. FUNCTION: PACK-TCL-ERROR
      120. FUNCTION: QUEUE-EVT-FUNC
      121. FUNCTION: REMHASH-BY-VALUE
      122. FUNCTION: RESULT-AS
      123. FUNCTION: SET-TCL-RESULT-FROM-ERROR
      124. FUNCTION: SET-TCL-RESULT-STRING
      125. FUNCTION: SET-VAR/OBJ
      126. FUNCTION: SET-VAR/STR
      127. FUNCTION: SET-VAR
      128. FUNCTION: STR->TCL-ALLOCED-CHARP
      129. FUNCTION: TCL-NS
      130. FUNCTION: TCL-OBJ-LIST->OBJV
      131. FUNCTION: TCL-OBJ-LIST->TCL-LIST
      132. FUNCTION: TCL-RESULT-AS-ERROR
      133. FUNCTION: TRACE-CMD/+TRACE
      134. FUNCTION: TRACE-CMD/-UNTRACE
      135. FUNCTION: TRACE-CMD/ALLOC-COUNTER-CFFI
      136. FUNCTION: TRACE-CMD/CB
      137. FUNCTION: TRACE-CMD/CB
      138. FUNCTION: TRACE-CMD/COUNTER-CFFI
      139. FUNCTION: TRACE-CMD/COUNTER-CFFI
      140. FUNCTION: TRACE-CMD/DEL-CB
      141. FUNCTION: TRACE-CMD/ENFORCE-FLAGS
      142. FUNCTION: TRACE-CMD/FREE-COUNTER-CFFI
      143. FUNCTION: TRACE-CMD/INCR-COUNT
      144. FUNCTION: TRACE-CMD/LIST-ALL
      145. FUNCTION: TRACE-CMD/REGIST-CB
      146. FUNCTION: TRACE-CMD/ROUTE-BY-CLIENT-DATA
      147. FUNCTION: TRACE-CMD/UNREGIST-CB
      148. FUNCTION: TRACE-VAR/+TRACE
      149. FUNCTION: TRACE-VAR/-UNTRACE
      150. FUNCTION: TRACE-VAR/ALLOC-COUNTER-CFFI
      151. FUNCTION: TRACE-VAR/CB
      152. FUNCTION: TRACE-VAR/CB
      153. FUNCTION: TRACE-VAR/COUNTER-CFFI
      154. FUNCTION: TRACE-VAR/COUNTER-CFFI
      155. FUNCTION: TRACE-VAR/DEL-CB
      156. FUNCTION: TRACE-VAR/ENFORCE-FLAGS
      157. FUNCTION: TRACE-VAR/FREE-COUNTER-CFFI
      158. FUNCTION: TRACE-VAR/INCR-COUNT
      159. FUNCTION: TRACE-VAR/LIST-ALL
      160. FUNCTION: TRACE-VAR/REGIST-CB
      161. FUNCTION: TRACE-VAR/ROUTE-BY-CLIENT-DATA
      162. FUNCTION: TRACE-VAR/UNREGIST-CB
      163. FUNCTION: UMNT-ZIPFS
      164. FUNCTION: UNSET-VAR
      165. FUNCTION: WRAP-ERROR*
      166. FUNCTION: WRAP-ERROR
      167. FUNCTION: WRAP-RESULT
      168. MACRO: %DEFUN-CREATE-COMMAND
      169. MACRO: %TCL-CMD-PROC-CFFI-CALLBACK-BODY
      170. MACRO: APP-MAIN
      171. MACRO: DEF-CMD
      172. MACRO: DEF-ENSEMBLE
      173. MACRO: DEF-TCL-CALLBACK-PATTERN
      174. MACRO: DO+CHK
      175. MACRO: NCONCF-IF
      176. MACRO: QUEUE-EVT
      177. MACRO: TRACK-DEF-CMDS
      178. MACRO: WITH-CMD-INFO
      179. MACRO: WITH-INTERP
      180. MACRO: WITH-TCL-ERROR/RESULT
      181. MACRO: WITH-TCL-ERROR/THROWN
      182. MACRO: WITH-TCL-OBJV
      183. METHOD: DESTROY ((ARR-LINK <TCL-ARRAY-LINK>))
      184. METHOD: DESTROY ((VAR-LINK <TCL-VAR-LINK>))
      185. METHOD: LINKED-VALUE-AT ((ARR-LINK <TCL-ARRAY-LINK>) INDEX)
      186. METHOD: LINKED-VALUE-AT (NEW-VALUE (ARR-LINK <TCL-ARRAY-LINK>) INDEX)
      187. METHOD: LINKED-VALUE ((VAR-LINK <TCL-VAR-LINK>))
      188. METHOD: LINKED-VALUE (NEW-VALUE (VAR-LINK <TCL-VAR-LINK>))
      189. METHOD: UNTRACE-CMD ((CMD-TRACE <TCL-CMD-TRACE>))
      190. METHOD: UNTRACE-VAR ((VAR-TRACE <TCL-VAR-TRACE>))
      191. METHOD: UPDATE ((VAR-LINK <TCL-VAR-LINK-BASE>))
      192. VARIABLE: *CALL-WHEN-DELETED-CB-COUNTER*
      193. VARIABLE: *CALL-WHEN-DELETED-CB-HT*
      194. VARIABLE: *CALL-WHEN-DELETED-CB-LOCK*
      195. VARIABLE: *DEF-CMD-NS*
      196. VARIABLE: *DEF-CMD-TRACKER*
      197. VARIABLE: *DEF-CMD-TRACKING-HT*
      198. VARIABLE: *DO+CHK/ERROR?*
      199. VARIABLE: *INTERP-TRACE-CB-COUNTER*
      200. VARIABLE: *INTERP-TRACE-CB-HT*
      201. VARIABLE: *INTERP-TRACE-CB-LOCK*
      202. VARIABLE: *STRINGIFY-FOR-TCL-OBJ-FUNC*
      203. VARIABLE: *TCL-CMD-CB-COUNTER*
      204. VARIABLE: *TCL-CMD-LOCK*
      205. VARIABLE: *TCL-CMD-OBJ-CB-HT*
      206. VARIABLE: *TCL-CMD-STRING-CB-HT*
      207. VARIABLE: *TCL-EV-QUEUE-CB-COUNTER*
      208. VARIABLE: *TCL-EV-QUEUE-CB-HT*
      209. VARIABLE: *TCL-EV-QUEUE-LOCK*
      210. VARIABLE: *TCL-INTERP*
      211. VARIABLE: *TRACE-CMD-CB-COUNTER*
      212. VARIABLE: *TRACE-CMD-CB-HT*
      213. VARIABLE: *TRACE-CMD-CB-LOCK*
      214. VARIABLE: *TRACE-VAR-CB-COUNTER*
      215. VARIABLE: *TRACE-VAR-CB-HT*
      216. VARIABLE: *TRACE-VAR-CB-LOCK*
      217. VARIABLE: *VAR-FLAGS*
      218. VARIABLE: +LINK/ARRAY-CFFI-TYPE-PLIST+
      219. VARIABLE: +LINK/COMMON-CFFI-TYPE-PLIST+
      220. VARIABLE: +LINK/VAR-CFFI-TYPE-PLIST+
      221. VARIABLE: +TCL-TRACE-LEVEL-ANY+
      222. VARIABLE: +TCL-TRACE-LEVEL-ONLY-TOP+
      223. VARIABLE: +TCL-TRACE-LEVEL-ONLY-TOP-AND-ONE-MORE+

Introduction

tclish is a Lisp wrapper around Tcl/Tk 9.0 C APIs, which provides easier ways to interact with Tcl/Tk.

All with Easy and Powerful Lisp DSLs.

Interested? Please refer the "Examples" section below.

Embedding Tcl/Tk Interpreter in Lisp application

(app-main
    (:tk-init? t
     :tk-main-loop? t)

    (eval-tcl "button .btn -text {<esc>:q!} -command {destroy .}"
              "pack .btn"))
  • ZipFS supports builtin, your Lisp executable image is the new Starkit
  • (NOTE Tk DSL will be available soon, I'm working on it😅)

Extending Tcl/Tk in Lisp

(def-cmd ("AWESOME_PROC")
    (format t "HI!: ~a ~a~%" interp args)
    :I-AM-A-RESULT-VALUE)

(eval-tcl "AWESOME_PROC"
          "puts {WAS Awesome}")

Comparison Table

A comparasion table with other great Tcl/Tk libraries for Common Lisp:

Points
tclish based on complete Tcl/Tk 9.0 / CFFI Binding : raw-cffi-tcl9
😅 Need to be careful with DLLs, FFIs.
🐥 Just born yesterday
🐣 Doesn't even have a proper Tk abstrations, (not yet, working on it)
😍 Freely access internals of Tcl/Tk (a bit?)
😅 Not widely tested (not yet)
😍 Focused on integrating Tcl/Tk easily with Lisp
😍 ZipFS supports builtin
🤩 I love working with it!
ltk using wish subprocess + pipe communication, thus not Tcl 8.6/9.0 specific.
😍 No need to worry about DLLs, FFIs.
😍 Very easy to writing a Tk application in Lisp.
😍 Wonderful documentation
nodgui based on ltk
😍 More modern, ttk, megawidgets...
😍 Actively maintained (in 2026)
😍 Wonderful documentation
🙀 More heavier than ltk with OpenGL, SDL...
cl-simple-tk CFFI binding based.
😍 Very easy to write a Tk application in Lisp.
😍 Lightweight CFFI bindings, only binds minimum C functions for writing Tk code.
(not really an expert of this library)

Examples

> (ql:quickload :tclish-examples)
> (tclish/examples/05-tk-main-loop:main-tk-main-loop)
  1. tk_messageBox

    1. Very basic usage of app-main and eval-tcl.
  2. Create Tcl command with ease

    1. Writing new Tcl command written in Lisp.
    2. Getting arguments from Tcl, returning a value, or raising an error.
  3. Threadin in Lisp-side, Tcl Event Queue

    1. Utilise thread in Lisp of custom Tcl command.
    2. and How to give response in thread-safe way to the main Tcl thread, from background thread. (... by using Tcl_ThreadQueueEvent)
  4. Unstable Redirecting Tcl standard channel to Lisp stream

    1. Capture Tcl standard output channels (stdout, stderr) to Lisp streams like *standard-output*
  5. Tk "main-loop"

    1. Creating simple Tcl/Tk application easily with app-main-macro.
  6. def-cmd in namespace

    1. How to regist custom commands within Tcl namespaces with def-cmd-macro.
  7. Tcl Ensembles + def-cmd

    1. How to group custom macros into a Tcl ensembles with def-ensemble and def-cmd macros.
  8. Applying Tcl Lambda

    1. Invoking callback (Tcl lambda list) from custom command written in Lisp.
  9. Getting result value from Tcl code evaluations

  10. Getting, Setting, and Unsetting Tcl variables with Tcl namespaces

  11. Auto-Synchronised Variables between Tcl and Lisp through Link Var/Array:

    1. Link Unsigned Integer Variable
    2. Link String Variable
    3. Link Fixed-Size Array
  12. Interpreter Cleanup Callback

  13. Unstable Tracing Tcl Variables at Lisp

  14. Unstable Tracing Tcl Commands at Lisp

  15. A good base to build a stepping debugger and performance profiler on:

Dependencies

Installation

  • Put a symlink of the .asd file into your $HOME/common-lisp-directory, and:
    > (asdf:clear-configuration)
    > (ql:quickload :tclish)

Supporting

Enjoying this project? Consider supporting its growth via the Ethereum address in my profile.

License

Licensed under the MIT License

Please read the ./LICENSE

APIs

PACKAGE: TCLISH/CFFI

CFFI-FUNCTION: C-MEMCPY

  • SCOPE: EXTERNAL
  • CFFI NAME: memcpy
  • CFFI RETURN-TYPE: POINTER
  • LAMBDA LIST: ((TCLISH/CFFI::DEST :POINTER) (TCLISH/CFFI::SRC :POINTER) (TCLISH/CFFI::N :SIZE))
  • SETF? NIL

CFFI-FUNCTION: C-MEMSET

  • SCOPE: EXTERNAL
  • CFFI NAME: memset
  • CFFI RETURN-TYPE: POINTER
  • LAMBDA LIST: ((TCLISH/CFFI::DEST :POINTER) (TCLISH/CFFI::VALUE :INT) (TCLISH/CFFI::SIZE :SIZE))
  • SETF? NIL

CFFI-FUNCTION: C-STRLEN

  • SCOPE: EXTERNAL
  • CFFI NAME: strlen
  • CFFI RETURN-TYPE: SIZE
  • LAMBDA LIST: ((TCLISH/CFFI::DEST :POINTER))
  • SETF? NIL

FUNCTION: C-MEMCPY

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH/CFFI::DEST TCLISH/CFFI::SRC TCLISH/CFFI::N)
  • SETF? NIL

FUNCTION: C-MEMSET

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH/CFFI::DEST TCLISH/CFFI::VALUE TCLISH/CFFI::SIZE)
  • SETF? NIL

FUNCTION: C-PTR-ARRAY-TO-PTR-LIST

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH/CFFI::PTR COUNT)
  • SETF? NIL

Converts an array of C-pointers (PTR / void**) with length of COUNT into a list of CFFI pointers.

FUNCTION: C-STRING-ARRAY-TO-STRING-LIST

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH/CFFI::PTR COUNT)
  • SETF? NIL

Converts an array of C-strings (PTR / char**) with length of COUNT into a list of lisp strings.

FUNCTION: C-STRLEN

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH/CFFI::DEST)
  • SETF? NIL

FUNCTION: CFFI/ALLOC+BZERO

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH/CFFI::CFFI-TYPE)
  • SETF? NIL

MACRO: C-MEMSET*

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH/CFFI::PTR TCLISH/CFFI::CH TCLISH/CFFI::TYPE-SPEC)
  • SETF? NIL

MACRO: MEM-ZERO

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH/CFFI::PTR TCLISH/CFFI::TYPE-SPEC)
  • SETF? NIL

PACKAGE: TCLISH/REDIR-TO-OUTSTREAM-CHAN

CFFI-TYPE: CHAN-INSTANCE-COUNTER-T

  • SCOPE: INTERNAL
  • BASE-TYPE: :UINT16

CLASS: <REDIR-TO-OUTSTREAM-CHAN>

  • SCOPE: EXTERNAL
  • SLOTS:
    • SLOT NAME / TYPE: STRING
      • ALLOCATION: INSTANCE
      • INITFORM: NIL
      • INITARG: :NAME
      • ACCESSOR: NIL
      • READERS: (TCLISH/REDIR-TO-OUTSTREAM-CHAN:NAME)
      • WRITERS: NIL
    • SLOT LISP-STREAM / TYPE: NIL
      • ALLOCATION: INSTANCE
      • INITFORM: NIL
      • INITARG: :LISP-STREAM
      • ACCESSOR: NIL
      • READERS: (TCLISH/REDIR-TO-OUTSTREAM-CHAN:LISP-STREAM)
      • WRITERS: NIL
    • SLOT TRIM / TYPE: NIL
      • ALLOCATION: INSTANCE
      • INITFORM: NIL
      • INITARG: :TRIM
      • ACCESSOR: NIL
      • READERS: (TCLISH/REDIR-TO-OUTSTREAM-CHAN:TRIM)
      • WRITERS: NIL
      • nil | :left | :right | :both | (func (str) -> str)
    • SLOT SKIP-0-LEN / TYPE: BOOLEAN
      • ALLOCATION: INSTANCE
      • INITFORM: T
      • INITARG: :SKIP-0-LEN
      • ACCESSOR: NIL
      • READERS: (TCLISH/REDIR-TO-OUTSTREAM-CHAN:SKIP-0-LEN)
      • WRITERS: NIL
    • SLOT CHAN-TYPE-PTR / TYPE: NIL
      • ALLOCATION: INSTANCE
      • INITFORM: NIL
      • INITARG: NIL
      • ACCESSOR: NIL
      • READERS: (TCLISH/REDIR-TO-OUTSTREAM-CHAN:CHAN-TYPE-PTR)
      • WRITERS: NIL
    • SLOT CLIENT-DATA / TYPE: NIL
      • ALLOCATION: INSTANCE
      • INITFORM: NIL
      • INITARG: NIL
      • ACCESSOR: NIL
      • READERS: (TCLISH:CLIENT-DATA)
      • WRITERS: NIL
    • SLOT TCL-CHAN / TYPE: NIL
      • ALLOCATION: INSTANCE
      • INITFORM: NIL
      • INITARG: NIL
      • ACCESSOR: NIL
      • READERS: (TCLISH/REDIR-TO-OUTSTREAM-CHAN:TCL-CHAN)
      • WRITERS: NIL
    • SLOT TCL-STD-CHAN-TYPE / TYPE: NIL
      • ALLOCATION: INSTANCE
      • INITFORM: NIL
      • INITARG: NIL
      • ACCESSOR: NIL
      • READERS: (TCLISH/REDIR-TO-OUTSTREAM-CHAN:TCL-STD-CHAN-TYPE)
      • WRITERS: NIL
  • SUPERCLASSES: NIL
  • METACLASS: STANDARD-CLASS
  • DEFAULT-INITARGS: NIL
  • TYPE: NIL

FUNCTION: %NEW-INSTANCE-COUNTER

  • SCOPE: INTERNAL
  • LAMBDA LIST: NIL
  • SETF? NIL

FUNCTION: %PUT-INSTANCE

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH/REDIR-TO-OUTSTREAM-CHAN::CHAN)
  • SETF? NIL

FUNCTION: %REM-INSTANCE

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH/REDIR-TO-OUTSTREAM-CHAN::CHAN)
  • SETF? NIL

METHOD: DEALLOC ((CHAN <REDIR-TO-OUTSTREAM-CHAN>))

  • SCOPE: EXTERNAL
  • LAMBDA LIST: ((TCLISH/REDIR-TO-OUTSTREAM-CHAN::CHAN TCLISH/REDIR-TO-OUTSTREAM-CHAN:<REDIR-TO-OUTSTREAM-CHAN>))
  • SETF? NIL
  • QUALIFIERS: NIL

METHOD: REGIST ((CHAN <REDIR-TO-OUTSTREAM-CHAN>) &KEY TCL-INTERP-PTR TCL-STD-CHAN-TYPE)

  • SCOPE: EXTERNAL
  • LAMBDA LIST: ((TCLISH/REDIR-TO-OUTSTREAM-CHAN::CHAN TCLISH/REDIR-TO-OUTSTREAM-CHAN:<REDIR-TO-OUTSTREAM-CHAN>) &KEY RAW-CFFI-TCL9:TCL-INTERP-PTR TCLISH/REDIR-TO-OUTSTREAM-CHAN:TCL-STD-CHAN-TYPE)
  • SETF? NIL
  • QUALIFIERS: NIL

METHOD: UNREGIST ((CHAN <REDIR-TO-OUTSTREAM-CHAN>) &KEY TCL-INTERP-PTR)

  • SCOPE: EXTERNAL
  • LAMBDA LIST: ((TCLISH/REDIR-TO-OUTSTREAM-CHAN::CHAN TCLISH/REDIR-TO-OUTSTREAM-CHAN:<REDIR-TO-OUTSTREAM-CHAN>) &KEY RAW-CFFI-TCL9:TCL-INTERP-PTR)
  • SETF? NIL
  • QUALIFIERS: NIL

VARIABLE: *CHAN-INSTANCE-COUNTER*

  • SCOPE: INTERNAL
  • INITIAL-VALUE: 0

VARIABLE: *LOCK*

  • SCOPE: INTERNAL
  • INITIAL-VALUE: (BT2:MAKE-LOCK :NAME "*lock*")

VARIABLE: *REGISTERED-CHAN-HT*

  • SCOPE: INTERNAL
  • INITIAL-VALUE: (MAKE-HASH-TABLE)

PACKAGE: TCLISH

CFFI-STRUCT: TCL-EV-QUEUE-CB-EVT-S

  • SCOPE: INTERNAL
  • SLOTS:

CFFI-TYPE: CALL-WHEN-DELETED-CB-COUNTER-T

  • SCOPE: INTERNAL
  • BASE-TYPE: :UINT16

CFFI-TYPE: CMD-CB-COUNTER-T

  • SCOPE: INTERNAL
  • BASE-TYPE: :UINT64

CFFI-TYPE: INTERP-TRACE-CB-COUNTER-T

  • SCOPE: INTERNAL
  • BASE-TYPE: :UINT64

CFFI-TYPE: TCL-EV-QUEUE-CB-COUNTER-T

  • SCOPE: INTERNAL
  • BASE-TYPE: :UINT64

CFFI-TYPE: TCL-EV-QUEUE-CB-EVT-S-PTR

  • SCOPE: INTERNAL
  • BASE-TYPE: (:POINTER (:STRUCT TCLISH::TCL-EV-QUEUE-CB-EVT-S))

CFFI-TYPE: TRACE-CMD-CB-COUNTER-T

  • SCOPE: INTERNAL
  • BASE-TYPE: :UINT64

CFFI-TYPE: TRACE-VAR-CB-COUNTER-T

  • SCOPE: INTERNAL
  • BASE-TYPE: :UINT64

CLASS: <TCL-ARRAY-LINK>

  • SCOPE: EXTERNAL
  • SLOTS:
    • SLOT SIZE / TYPE: NIL
      • ALLOCATION: INSTANCE
      • INITFORM: -1
      • INITARG: :SIZE
      • ACCESSOR: NIL
      • READERS: (TCLISH:SIZE)
      • WRITERS: NIL
    • SLOT INITIAL-CONTENTS / TYPE: NIL
      • ALLOCATION: INSTANCE
      • INITFORM: NIL
      • INITARG: :INITIAL-CONTENTS
      • ACCESSOR: NIL
      • READERS: (TCLISH:INITIAL-CONTENTS)
      • WRITERS: NIL
  • SUPERCLASSES: (TCLISH:<TCL-VAR-LINK-BASE>)
  • METACLASS: STANDARD-CLASS
  • DEFAULT-INITARGS: NIL
  • TYPE: NIL

CLASS: <TCL-CMD-TRACE>

  • SCOPE: EXTERNAL
  • SLOTS:
    • SLOT CMD-NAME / TYPE: NIL
      • ALLOCATION: INSTANCE
      • INITFORM: NIL
      • INITARG: :CMD-NAME
      • ACCESSOR: NIL
      • READERS: (TCLISH:CMD-NAME)
      • WRITERS: NIL
    • SLOT FLAGS / TYPE: NIL
      • ALLOCATION: INSTANCE
      • INITFORM: 0
      • INITARG: :FLAGS
      • ACCESSOR: NIL
      • READERS: (TCLISH:FLAGS)
      • WRITERS: NIL
    • SLOT CB-CLOSURE / TYPE: NIL
      • ALLOCATION: INSTANCE
      • INITFORM: NIL
      • INITARG: :CB-CLOSURE
      • ACCESSOR: NIL
      • READERS: (TCLISH:CB-CLOSURE)
      • WRITERS: NIL
    • SLOT CLIENT-DATA / TYPE: NIL
      • ALLOCATION: INSTANCE
      • INITFORM: NIL
      • INITARG: NIL
      • ACCESSOR: NIL
      • READERS: (TCLISH:CLIENT-DATA)
      • WRITERS: NIL
  • SUPERCLASSES: NIL
  • METACLASS: STANDARD-CLASS
  • DEFAULT-INITARGS: NIL
  • TYPE: NIL

CLASS: <TCL-VAR-LINK-BASE>

  • SCOPE: EXTERNAL
  • SLOTS:
    • SLOT PTR / TYPE: NIL
      • ALLOCATION: INSTANCE
      • INITFORM: (CFFI-SYS:NULL-POINTER)
      • INITARG: NIL
      • ACCESSOR: NIL
      • READERS: (TCLISH:PTR)
      • WRITERS: NIL
    • SLOT TCL-NAME / TYPE: NIL
      • ALLOCATION: INSTANCE
      • INITFORM: NIL
      • INITARG: :TCL-NAME
      • ACCESSOR: NIL
      • READERS: (TCLISH:TCL-NAME)
      • WRITERS: NIL
    • SLOT VAR-TYPE / TYPE: NIL
      • ALLOCATION: INSTANCE
      • INITFORM: NIL
      • INITARG: :VAR-TYPE
      • ACCESSOR: NIL
      • READERS: (TCLISH:VAR-TYPE)
      • WRITERS: NIL
    • SLOT READONLY? / TYPE: NIL
      • ALLOCATION: INSTANCE
      • INITFORM: NIL
      • INITARG: :READONLY?
      • ACCESSOR: NIL
      • READERS: (TCLISH:READONLY?)
      • WRITERS: NIL
    • SLOT INITIAL-ELEMENT / TYPE: NIL
      • ALLOCATION: INSTANCE
      • INITFORM: NIL
      • INITARG: :INITIAL-ELEMENT
      • ACCESSOR: NIL
      • READERS: (TCLISH:INITIAL-ELEMENT)
      • WRITERS: NIL
  • SUPERCLASSES: NIL
  • METACLASS: STANDARD-CLASS
  • DEFAULT-INITARGS: NIL
  • TYPE: NIL

CLASS: <TCL-VAR-LINK>

  • SCOPE: EXTERNAL
  • SLOTS:
  • SUPERCLASSES: (TCLISH:<TCL-VAR-LINK-BASE>)
  • METACLASS: STANDARD-CLASS
  • DEFAULT-INITARGS: NIL
  • TYPE: NIL

CLASS: <TCL-VAR-TRACE>

  • SCOPE: EXTERNAL
  • SLOTS:
    • SLOT VAR-NAME / TYPE: NIL
      • ALLOCATION: INSTANCE
      • INITFORM: NIL
      • INITARG: :VAR-NAME
      • ACCESSOR: NIL
      • READERS: (TCLISH:VAR-NAME)
      • WRITERS: NIL
    • SLOT ARRAY-SUBS / TYPE: NIL
      • ALLOCATION: INSTANCE
      • INITFORM: NIL
      • INITARG: :ARRAY-SUBS
      • ACCESSOR: NIL
      • READERS: (TCLISH:ARRAY-SUBS)
      • WRITERS: NIL
    • SLOT FLAGS / TYPE: NIL
      • ALLOCATION: INSTANCE
      • INITFORM: 0
      • INITARG: :FLAGS
      • ACCESSOR: NIL
      • READERS: (TCLISH:FLAGS)
      • WRITERS: NIL
    • SLOT CB-CLOSURE / TYPE: NIL
      • ALLOCATION: INSTANCE
      • INITFORM: NIL
      • INITARG: :CB-CLOSURE
      • ACCESSOR: NIL
      • READERS: (TCLISH:CB-CLOSURE)
      • WRITERS: NIL
    • SLOT CLIENT-DATA / TYPE: NIL
      • ALLOCATION: INSTANCE
      • INITFORM: NIL
      • INITARG: NIL
      • ACCESSOR: NIL
      • READERS: (TCLISH:CLIENT-DATA)
      • WRITERS: NIL
  • SUPERCLASSES: NIL
  • METACLASS: STANDARD-CLASS
  • DEFAULT-INITARGS: NIL
  • TYPE: NIL

CLASS: TCL-EV-QUEUE-CB-EVT-S-TCLASS

  • SCOPE: INTERNAL
  • SLOTS:
  • SUPERCLASSES: (CFFI::FOREIGN-STRUCT-TYPE CFFI::TRANSLATABLE-FOREIGN-TYPE)
  • METACLASS: STANDARD-CLASS
  • DEFAULT-INITARGS: NIL
  • TYPE: NIL

CONDITION: <TCL-ERROR>

  • SCOPE: EXTERNAL

FUNCTION: %CMD-CB-COUNTER-VALUE-FROM-C

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::C-VAL)
  • SETF? NIL

FUNCTION: %CMD-CB-COUNTER-VALUE-FROM-C

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::NEW-VAL TCLISH::C-VAL)
  • SETF? T

FUNCTION: %COMPOSE-NS-FQN

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::NS TCLISH::NAME)
  • SETF? NIL

FUNCTION: %TCL-EV-QUEUE-CB-COUNTER/VALUE-FROM-C

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::C-VAL)
  • SETF? NIL

FUNCTION: %TCL-EV-QUEUE-CB-COUNTER/VALUE-FROM-C

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::NEW-VAL TCLISH::C-VAL)
  • SETF? T

FUNCTION: ->FLAGS-BITS*

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (&REST TCLISH:ARGS)
  • SETF? NIL

FUNCTION: ->FLAGS-BITS

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::FLAGS-LIST)
  • SETF? NIL

FUNCTION: ->TCL-STRING-OBJ%

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::VAL)
  • SETF? NIL

FUNCTION: ->TCL-STRING-OBJ

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::VAL)
  • SETF? NIL

FUNCTION: <-FLAGS-BITS

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:FLAGS TCLISH::POSSIBLE-FLAGS)
  • SETF? NIL

FUNCTION: <-TCL-INT-BOOL

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::INT-VAL)
  • SETF? NIL

FUNCTION: ALIAS/GET

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::CHILD-CMD)
  • SETF? NIL

Tcl_GetAliasObj => (LIST :target-interp CFFI-PTR :target-cmd STRING :objc NUMBER :objv (LIST TCL-OBJ-PTR))

FUNCTION: ALIAS/OBJ

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (&KEY TCLISH::CHILD-INTERP TCLISH::CHILD-CMD TCLISH::TGT-INTERP TCLISH::TGT-CMD TCLISH::TCL-OBJ-LIST-OBJV)
  • SETF? NIL

Tcl_CreateAliasObj

FUNCTION: ALIAS/STR

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (&KEY TCLISH::CHILD-INTERP TCLISH::CHILD-CMD TCLISH::TGT-INTERP TCLISH::TGT-CMD TCLISH::ARGV)
  • SETF? NIL

Tcl_CreateAlias

FUNCTION: ALIST->TCL-DICT

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:INTERP TCLISH::LST)
  • SETF? NIL

FUNCTION: APPLY-LAMBDA

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::TCL-LAMBDA TCLISH:ARGS &KEY (TCLISH:RESULT-AS :STRING))
  • SETF? NIL

Apply ARGS on Tcl lambda-list (TCL-LAMBDA): https://www.tcl-lang.org/man/tcl/TclCmd/apply.html

:RESULT keyword parameter is (MEMBER (:STRING :OBJ) (See RESULT-AS)

FUNCTION: CALL-WHEN-DELETED/+ADD

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::CLOSURE)
  • SETF? NIL

Registers Tcl interpreter deletion hook callback.

(CALL-WHEN-DELETED/+ADD closure) => client-data

FUNCTION: CALL-WHEN-DELETED/-DEL

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:CLIENT-DATA)
  • SETF? NIL

Unregisters Tcl interpreter deletion hook callback.

FUNCTION: CALL-WHEN-DELETED/ALLOC-COUNTER-CFFI

  • SCOPE: INTERNAL
  • LAMBDA LIST: (&OPTIONAL TCLISH:INITIAL-ELEMENT)
  • SETF? NIL

FUNCTION: CALL-WHEN-DELETED/CB

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::COUNTER)
  • SETF? NIL

FUNCTION: CALL-WHEN-DELETED/CB

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::CLOSURE TCLISH::COUNTER)
  • SETF? T

FUNCTION: CALL-WHEN-DELETED/COUNTER-CFFI

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::COUNTER-PTR)
  • SETF? NIL

FUNCTION: CALL-WHEN-DELETED/COUNTER-CFFI

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::COUNTER TCLISH::COUNTER-PTR)
  • SETF? T

FUNCTION: CALL-WHEN-DELETED/DEL-CB

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::COUNTER)
  • SETF? NIL

FUNCTION: CALL-WHEN-DELETED/FREE-COUNTER-CFFI

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::COUNTER-PTR)
  • SETF? NIL

FUNCTION: CALL-WHEN-DELETED/INCR-COUNT

  • SCOPE: INTERNAL
  • LAMBDA LIST: NIL
  • SETF? NIL

FUNCTION: CALL-WHEN-DELETED/REGIST-CB

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::CLOSURE)
  • SETF? NIL

FUNCTION: CALL-WHEN-DELETED/ROUTE-BY-CLIENT-DATA

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH:CLIENT-DATA &REST TCLISH:ARGS)
  • SETF? NIL

FUNCTION: CALL-WHEN-DELETED/UNREGIST-CB

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH:CLIENT-DATA)
  • SETF? NIL

FUNCTION: CHK-GET/SET-VAR-AS-TYPE

  • SCOPE: INTERNAL
  • LAMBDA LIST: (ITERATE:AS)
  • SETF? NIL

FUNCTION: CMD-INFO/FREE

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::CMD-INFO)
  • SETF? NIL

Deallocates CMD-INFO(Tcl_CmdInfo *) FFI pointer.

FUNCTION: CMD-INFO/FROM-CMD-OBJ

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::CMD-OBJ)
  • SETF? NIL

Gets newly allocated Tcl_CmdInfo * FFI pointer of CMD-OBJ(Tcl_Command FFI pointer)

FUNCTION: CMD-INFO/FROM-CMD-OBJ

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::NEW-CMD-INFO TCLISH::CMD-OBJ)
  • SETF? T

Sets NEW-CMD-INFO(Tcl_CmdInfo * FFI pointer) to CMD-OBJ(Tcl_Command FFI pointer).

FUNCTION: CMD-INFO/FULL-NAME

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::CMD-OBJ)
  • SETF? NIL

Gets FQN name string of CMD-OBJ. (Tcl_Command FFI pointer)

FUNCTION: CREATE-ENSEMBLE

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::NS-FQN TCLISH::ENSEMBLE-MAP-HT &KEY (TCLISH:INTERP TCLISH:*TCL-INTERP*))
  • SETF? NIL

Creates a Tcl ensemble of Tcl namespace (NS-FQN) with (ENSEMBLE-CMD-NAME => CMD-FQN) mapping table (ENSEMBLE-MAP-HT).

Returns FFI pointer of the created ensemble object. (Tcl_Command)

FUNCTION: CREATE-OBJ-COMMAND

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:INTERP TCLISH:CMD-NAME TCLISH::FUNC)
  • SETF? NIL

FUNCTION: CREATE-STRING-COMMAND

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:INTERP TCLISH:CMD-NAME TCLISH::FUNC)
  • SETF? NIL

FUNCTION: DEF-CMD/P

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (&KEY (TCLISH:CMD-NAME "p"))
  • SETF? NIL

Defines CMD-NAME=p Tcl command.

Which simply prints arguments as Tcl strings to *STANDARD-OUTPUT*.

FUNCTION: DEF-CMD/PP

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (&KEY (TCLISH:CMD-NAME "pp"))
  • SETF? NIL

Defines CMD-NAME=pp Tcl command.

Which simply pretty-prints arguments as Tcl strings to *STANDARD-OUTPUT*.

FUNCTION: ENSEMBLE/EXCLUDE

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::ENSEMBLE-NAME)
  • SETF? NIL

Within DEF-ENSEMBLE, excludes subcommand(ENSEMBLE-NAME).

FUNCTION: ENSEMBLE/INCLUDE

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::ENSEMBLE-NAME &KEY TCLISH::CMD-FQN)
  • SETF? NIL

Within DEF-ENSEMBLE, used to include the other command (CMD-FQN) from outside of the namespace with subcommand name(ENSEMBLE-NAME)

FUNCTION: ENSEMBLE/RENAME

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::FROM-ENSEMBLE &KEY TCLISH::TO-ENSEMBLE)
  • SETF? NIL

Within DEF-ENSEMBLE, renames existing subcommand(FROM-ENSEMBLE) as TO-ENSEMBLE.

FUNCTION: EVAL-TCL/STR

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::CMD)
  • SETF? NIL

Evalutes Tcl script CMD and checks the result code.

Affected by *DO+CHK/ERROR?*.

FUNCTION: EVAL-TCL/TCL-OBJ-LIST

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::CMD-LIST)
  • SETF? NIL

Evaluates a list of Tcl string FFI pointers. (CMD-LIST)

Affected by *DO+CHK/ERROR?*.

FUNCTION: EVAL-TCL/TCL-OBJV

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::OBJV TCLISH::OBJC)
  • SETF? NIL

Evaluates an array of Tcl object pointers. (OBJV/OBJC).

Affected by *DO+CHK/ERROR?*.

FUNCTION: EVAL-TCL/TCL-STRING

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::CMD)
  • SETF? NIL

Evaluates a Tcl string FFI pointer. (CMD)

Affected by *DO+CHK/ERROR?*.

FUNCTION: EVAL-TCL

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (&REST TCLISH::CMDS)
  • SETF? NIL

Evaluates given Tcl commands(CMDS) sequentially and returns the last result.

  • if CMDS has a sequence of :RESULT-AS :OBJ or :RESULT-AS :STRING, returning value will be a TCL-OBJ-PTR or a Lisp string.

  • each element of CMDS can be one of:

    • a Lisp string.
    • a Lisp list can be a form of:
      • (LIST :TCL-STRING TCL-STR-PTR)
      • (LIST :TCL-OBJV OBJV-TCL-OBJ-PTR OBJC) where OBJC is a number.
      • or (LIST TCL-OBJ-PTR-1 .. TCL-OBJ-PTR-N)

FUNCTION: FLAGS-BIT?

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::NEEDLE TCLISH::HAYSTACK)
  • SETF? NIL

FUNCTION: FREE-TCL-OBJV

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::OBJV-PTR)
  • SETF? NIL

FUNCTION: GET-VAR/OBJ

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:VAR-NAME &KEY TCLISH:ARRAY-SUBS)
  • SETF? NIL

FUNCTION: GET-VAR/STR

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:VAR-NAME &KEY TCLISH:ARRAY-SUBS)
  • SETF? NIL

FUNCTION: GET-VAR

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:VAR-NAME &KEY TCLISH:ARRAY-SUBS (ITERATE:AS :STRING))
  • SETF? NIL

FUNCTION: HT->TCL-DICT

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:INTERP TCLISH::HT)
  • SETF? NIL

FUNCTION: INTERP-TRACE/+TRACE

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::CLOSURE &KEY (TCLISH::LEVEL TCLISH:+TCL-TRACE-LEVEL-ANY+) (TCLISH:FLAGS (TCLISH:->FLAGS-BITS* RAW-CFFI-TCL9:+TCL-ALLOW-INLINE-COMPILATION+)))
  • SETF? NIL

FUNCTION: INTERP-TRACE/-DELETE

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TRACE)
  • SETF? NIL

FUNCTION: INTERP-TRACE/ALLOC-COUNTER-CFFI

  • SCOPE: INTERNAL
  • LAMBDA LIST: (&OPTIONAL TCLISH:INITIAL-ELEMENT)
  • SETF? NIL

FUNCTION: INTERP-TRACE/CB

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::COUNTER)
  • SETF? NIL

FUNCTION: INTERP-TRACE/CB

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::CLOSURE TCLISH::COUNTER)
  • SETF? T

FUNCTION: INTERP-TRACE/COUNTER-CFFI

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::COUNTER-PTR)
  • SETF? NIL

FUNCTION: INTERP-TRACE/COUNTER-CFFI

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::COUNTER TCLISH::COUNTER-PTR)
  • SETF? T

FUNCTION: INTERP-TRACE/DEL-CB

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::COUNTER)
  • SETF? NIL

FUNCTION: INTERP-TRACE/FREE-COUNTER-CFFI

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::COUNTER-PTR)
  • SETF? NIL

FUNCTION: INTERP-TRACE/INCR-COUNT

  • SCOPE: INTERNAL
  • LAMBDA LIST: NIL
  • SETF? NIL

FUNCTION: INTERP-TRACE/REGIST-CB

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::CLOSURE)
  • SETF? NIL

FUNCTION: INTERP-TRACE/ROUTE-BY-CLIENT-DATA

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH:CLIENT-DATA &REST TCLISH:ARGS)
  • SETF? NIL

FUNCTION: INTERP-TRACE/UNREGIST-CB

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH:CLIENT-DATA)
  • SETF? NIL

FUNCTION: INTERP/ACTIVE?

  • SCOPE: EXTERNAL
  • LAMBDA LIST: NIL
  • SETF? NIL

FUNCTION: INTERP/CHILD

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::CHILD-NAME)
  • SETF? NIL

FUNCTION: INTERP/CREATE-CHILD

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::CHILD-NAME TCLISH::SAFE?)
  • SETF? NIL

FUNCTION: INTERP/DELETED?

  • SCOPE: EXTERNAL
  • LAMBDA LIST: NIL
  • SETF? NIL

FUNCTION: INTERP/EXPOSE-CMD

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::HIDDEN-CMD-NAME TCLISH:CMD-NAME)
  • SETF? NIL

FUNCTION: INTERP/HIDE-CMD

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:CMD-NAME TCLISH::HIDDEN-CMD-NAME)
  • SETF? NIL

FUNCTION: INTERP/INTERP-PATH

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::CHILD-INTERP)
  • SETF? NIL

FUNCTION: INTERP/PARENT

  • SCOPE: EXTERNAL
  • LAMBDA LIST: NIL
  • SETF? NIL

FUNCTION: INTERP/SAFE?

  • SCOPE: EXTERNAL
  • LAMBDA LIST: NIL
  • SETF? NIL

FUNCTION: LINK/+ARRAY

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::ARRAY-NAME TCLISH:VAR-TYPE TCLISH:SIZE &KEY TCLISH:READONLY? TCLISH:INITIAL-ELEMENT TCLISH:INITIAL-CONTENTS)
  • SETF? NIL

FUNCTION: LINK/+VAR

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:VAR-NAME TCLISH:VAR-TYPE &KEY TCLISH:READONLY? TCLISH:INITIAL-ELEMENT)
  • SETF? NIL

FUNCTION: LINK/-UNLINK

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:VAR-NAME)
  • SETF? NIL

FUNCTION: LINK/ALLOC-ARRAY

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:VAR-TYPE TCLISH:SIZE &KEY TCLISH:INITIAL-CONTENTS TCLISH:INITIAL-ELEMENT)
  • SETF? NIL

FUNCTION: LINK/ALLOC-VAR-STR

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH:INITIAL-ELEMENT)
  • SETF? NIL

FUNCTION: LINK/ALLOC-VAR

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:VAR-TYPE &KEY TCLISH:INITIAL-ELEMENT)
  • SETF? NIL

FUNCTION: LINK/ARRAY-CFFI-TYPE

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::ARRAY-TYPE)
  • SETF? NIL

FUNCTION: LINK/ARRAY-TYPE?

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::ARR-TYPE)
  • SETF? NIL

FUNCTION: LINK/COMMON-TYPE?

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TYPE)
  • SETF? NIL

FUNCTION: LINK/FREE-ARRAY

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:PTR TCLISH:VAR-TYPE)
  • SETF? NIL

FUNCTION: LINK/FREE-VAR-STR

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH:PTR)
  • SETF? NIL

FUNCTION: LINK/FREE-VAR

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:PTR TCLISH:VAR-TYPE)
  • SETF? NIL

FUNCTION: LINK/READ-ARRAY

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:PTR TCLISH:VAR-TYPE TCLISH::INDEX)
  • SETF? NIL

FUNCTION: LINK/READ-VAR-STR

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH:PTR)
  • SETF? NIL

FUNCTION: LINK/READ-VAR

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:PTR TCLISH:VAR-TYPE)
  • SETF? NIL

FUNCTION: LINK/UPDATE

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:VAR-NAME)
  • SETF? NIL

FUNCTION: LINK/VAR-CFFI-TYPE

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH:VAR-TYPE)
  • SETF? NIL

FUNCTION: LINK/VAR-TYPE?

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH:VAR-TYPE)
  • SETF? NIL

FUNCTION: LINK/WRITE-ARRAY

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:PTR TCLISH:VAR-TYPE TCLISH::INDEX TCLISH::NEW-VALUE)
  • SETF? NIL

FUNCTION: LINK/WRITE-VAR-STR

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH:PTR TCLISH::NEW-VALUE)
  • SETF? NIL

FUNCTION: LINK/WRITE-VAR

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:PTR TCLISH:VAR-TYPE TCLISH::NEW-VALUE)
  • SETF? NIL

FUNCTION: LISP-BOOL->C-INT

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::VAL)
  • SETF? NIL

FUNCTION: LISP-VALUE-OR-NULLPTR

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::VAL)
  • SETF? NIL

FUNCTION: LIST->TCL-LIST

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::LST)
  • SETF? NIL

(LIST lisp-value-1 tcl-obj-2 ... lisp-value-N) => (VALUES tcl-list tcl-list-length)

FUNCTION: LIST->TCL-STRING-LIST

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::LST)
  • SETF? NIL

(LIST lisp-value-1 tcl-obj-2 ... lisp-value-N) => (LIST tcl-obj-1 tcl-obj-2 ... tcl-obj-N)

FUNCTION: MNT-ZIPFS

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::ZIP-FILENAME &KEY (TCLISH::MNT-POINT "//zipfs:/app") TCLISH::ZIP-PASSWD (TCLISH::TCL-LIBRARY-PATH "/tcl_library") (TCLISH::TK-LIBRARY-PATH "/tk_library"))
  • SETF? NIL

Mounts ZipFS.

  • :ZIP-FILENAME : A .zip filename to be mounted on :ZIPFS-MNT-POINTER. (NIL means "Do not mount zipfs by default")
  • :ZIP-PASSWD : Password of .zip file. (NIL = no-password)
  • :ZIPFS-MNT-POINT : ZipFS mount pointer string.
  • :ZIPFS-TCL-LIBRARY-PATH : Tcl library path under ZipFS, overwrites tcl_library Tcl variable.
  • :ZIPFS-TK-LIBRARY-PATH : Tk library path under ZipFS, overwrites tk_library Tcl variable.

FUNCTION: NULLPTR->NIL

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::CVAL)
  • SETF? NIL

FUNCTION: OBJV->TCL-OBJ-LIST

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::OBJC TCLISH::OBJV-PTR)
  • SETF? NIL

FUNCTION: PACK-TCL-ERROR

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (&REST TCLISH:ARGS &KEY (CONDITION 'TCLISH:<TCL-ERROR>) (TCLISH::THROW? TCLISH:*DO+CHK/ERROR?*) &ALLOW-OTHER-KEYS)
  • SETF? NIL

FUNCTION: QUEUE-EVT-FUNC

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (&KEY TCLISH:INTERP TCLISH:THREAD-ID TCLISH::EV-QUEUE-CB-FDEF (TCLISH::QUEUE-POSITION :TCL-QUEUE-TAIL) (TCLISH::THREAD-ALERT-P T))
  • SETF? NIL

Enqueues an invocation of :EV-QUEUE-CB-FDEF Lisp function value to Tcl's event queue.

  • :INTERP, :THREAD-ID : Tcl interpreter and the thread of interpreter is running in. (can get by TCL-GET-CURRENT-THREAD)
  • :QUEUE-POSITION, one of TCL-QUEUE-POSITION CFFI enum variants.
  • :THREAD-ALERT-P, whether executes Tcl_ThreadAlert() after the callback has been queued.

:EV-QUEUE-CB-FDEF is:

  • takes 3-positional arguments: (INTERP THREAD-ID CB-COUNTER)
  • returns the number 1. (See Tcl_ThreadQueueEvent)

FUNCTION: REMHASH-BY-VALUE

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::VAL TCLISH::HT &KEY (TCLISH::TEST #'EQ))
  • SETF? NIL

FUNCTION: RESULT-AS

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:RESULT-AS)
  • SETF? NIL

FUNCTION: SET-TCL-RESULT-FROM-ERROR

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::AN-ERROR)
  • SETF? NIL

Sets Tcl result state with a string message of Lisp condition AN-ERROR.

FUNCTION: SET-TCL-RESULT-STRING

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::S)
  • SETF? NIL

Sets Tcl result state with Lisp string S.

FUNCTION: SET-VAR/OBJ

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:VAR-NAME TCLISH::NEW-VAL &KEY TCLISH:ARRAY-SUBS)
  • SETF? NIL

FUNCTION: SET-VAR/STR

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:VAR-NAME TCLISH::NEW-VAL &KEY TCLISH:ARRAY-SUBS)
  • SETF? NIL

FUNCTION: SET-VAR

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:VAR-NAME TCLISH::NEW-VAL &KEY TCLISH:ARRAY-SUBS (ITERATE:AS :STRING))
  • SETF? NIL

FUNCTION: STR->TCL-ALLOCED-CHARP

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::S)
  • SETF? NIL

Lisp string => char*

FUNCTION: TCL-NS

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::NS-FQN &KEY TCLISH::EXPORTS (TCLISH:INTERP TCLISH:*TCL-INTERP*))
  • SETF? NIL

FUNCTION: TCL-OBJ-LIST->OBJV

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::TCL-OBJ-LIST)
  • SETF? NIL

(LIST tcl-obj-1 ... tcl-obj-N) => Tcl_Obj*[]

FUNCTION: TCL-OBJ-LIST->TCL-LIST

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::OBJ-LIST)
  • SETF? NIL

(LIST tcl-obj-1 ... tcl-obj-N) => (VALUES tcl-list tcl-list-length)

FUNCTION: TCL-RESULT-AS-ERROR

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (&REST TCLISH:ARGS)
  • SETF? NIL

Extracts Tcl_GetStringResult and Converts it into a Lisp condition.

If *DO+CHK/ERROR?*=T, also raises error condition.

FUNCTION: TRACE-CMD/+TRACE

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:CMD-NAME TCLISH::CLOSURE &KEY (TCLISH:FLAGS 0))
  • SETF? NIL

FUNCTION: TRACE-CMD/-UNTRACE

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:CMD-NAME TCLISH:CLIENT-DATA &KEY (TCLISH:FLAGS 0))
  • SETF? NIL

FUNCTION: TRACE-CMD/ALLOC-COUNTER-CFFI

  • SCOPE: INTERNAL
  • LAMBDA LIST: (&OPTIONAL TCLISH:INITIAL-ELEMENT)
  • SETF? NIL

FUNCTION: TRACE-CMD/CB

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::COUNTER)
  • SETF? NIL

FUNCTION: TRACE-CMD/CB

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::CLOSURE TCLISH::COUNTER)
  • SETF? T

FUNCTION: TRACE-CMD/COUNTER-CFFI

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::COUNTER-PTR)
  • SETF? NIL

FUNCTION: TRACE-CMD/COUNTER-CFFI

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::COUNTER TCLISH::COUNTER-PTR)
  • SETF? T

FUNCTION: TRACE-CMD/DEL-CB

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::COUNTER)
  • SETF? NIL

FUNCTION: TRACE-CMD/ENFORCE-FLAGS

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH:FLAGS)
  • SETF? NIL

FUNCTION: TRACE-CMD/FREE-COUNTER-CFFI

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::COUNTER-PTR)
  • SETF? NIL

FUNCTION: TRACE-CMD/INCR-COUNT

  • SCOPE: INTERNAL
  • LAMBDA LIST: NIL
  • SETF? NIL

FUNCTION: TRACE-CMD/LIST-ALL

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:CMD-NAME)
  • SETF? NIL

FUNCTION: TRACE-CMD/REGIST-CB

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::CLOSURE)
  • SETF? NIL

FUNCTION: TRACE-CMD/ROUTE-BY-CLIENT-DATA

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH:CLIENT-DATA &REST TCLISH:ARGS)
  • SETF? NIL

FUNCTION: TRACE-CMD/UNREGIST-CB

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH:CLIENT-DATA)
  • SETF? NIL

FUNCTION: TRACE-VAR/+TRACE

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:VAR-NAME TCLISH::CLOSURE &KEY (TCLISH:FLAGS 0) TCLISH:ARRAY-SUBS)
  • SETF? NIL

FUNCTION: TRACE-VAR/-UNTRACE

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:VAR-NAME TCLISH:CLIENT-DATA &KEY (TCLISH:FLAGS 0) TCLISH:ARRAY-SUBS)
  • SETF? NIL

FUNCTION: TRACE-VAR/ALLOC-COUNTER-CFFI

  • SCOPE: INTERNAL
  • LAMBDA LIST: (&OPTIONAL TCLISH:INITIAL-ELEMENT)
  • SETF? NIL

FUNCTION: TRACE-VAR/CB

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::COUNTER)
  • SETF? NIL

FUNCTION: TRACE-VAR/CB

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::CLOSURE TCLISH::COUNTER)
  • SETF? T

FUNCTION: TRACE-VAR/COUNTER-CFFI

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::COUNTER-PTR)
  • SETF? NIL

FUNCTION: TRACE-VAR/COUNTER-CFFI

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::COUNTER TCLISH::COUNTER-PTR)
  • SETF? T

FUNCTION: TRACE-VAR/DEL-CB

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::COUNTER)
  • SETF? NIL

FUNCTION: TRACE-VAR/ENFORCE-FLAGS

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH:FLAGS)
  • SETF? NIL

FUNCTION: TRACE-VAR/FREE-COUNTER-CFFI

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::COUNTER-PTR)
  • SETF? NIL

FUNCTION: TRACE-VAR/INCR-COUNT

  • SCOPE: INTERNAL
  • LAMBDA LIST: NIL
  • SETF? NIL

FUNCTION: TRACE-VAR/LIST-ALL

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:VAR-NAME &KEY TCLISH:ARRAY-SUBS)
  • SETF? NIL

FUNCTION: TRACE-VAR/REGIST-CB

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::CLOSURE)
  • SETF? NIL

FUNCTION: TRACE-VAR/ROUTE-BY-CLIENT-DATA

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH:CLIENT-DATA &REST TCLISH:ARGS)
  • SETF? NIL

FUNCTION: TRACE-VAR/UNREGIST-CB

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH:CLIENT-DATA)
  • SETF? NIL

FUNCTION: UMNT-ZIPFS

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (&KEY (TCLISH::MNT-POINT "//zipfs:/app"))
  • SETF? NIL

Unmounts ZipFS

FUNCTION: UNSET-VAR

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:VAR-NAME &KEY TCLISH:ARRAY-SUBS)
  • SETF? NIL

FUNCTION: WRAP-ERROR*

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:INTERP TCLISH::ERR)
  • SETF? NIL

Sets Tcl interpreter's (INTERP) error state variable (Tcl_SetErrorCode()) by ERR Lisp error condition value.

The generated error values are returned as ((LIST error-1 error-2)) where the elements are Tcl_Obj* FFI pointer.

FUNCTION: WRAP-ERROR

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:INTERP TCLISH::ERR)
  • SETF? NIL

Sets Tcl interpreter (INTERP) result state variable with Lisp error condition value ERR, and returns +TCL-ERROR+ to indicate it has error.

FUNCTION: WRAP-RESULT

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:INTERP TCLISH::VAL)
  • SETF? NIL

Wraps and sets Tcl interpreter (INTERP) result state variable with VAL Lisp value into Tcl result value.

Uses Tcl_NewStringObj and Tcl_SetObjResult C APIs.

If VAL is nil, it simply resets the Tcl result state variable using Tcl_ResetResult.

MACRO: %DEFUN-CREATE-COMMAND

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::DEFUN-NAME (&KEY TCLISH::FRLOCK TCLISH::COUNTER TCLISH::CB-HT TCLISH::CMD-PROC-CB (TCLISH::CMD-DEL-CB 'TCLISH::%TCL-CMD-DELETE-PROC-CB) TCLISH::TCL-CREATE-COMMAND-FN))
  • SETF? NIL

`defun-name'으로 create-command* 하는 함수를 등록.

그 함수는 `(interp cmd-name func) => (cons cmd-nr tcl-command-ptr)'

func은 `(interp args) => int'. 리턴값은 +tcl-ok+ / +tcl-error+.

MACRO: %TCL-CMD-PROC-CFFI-CALLBACK-BODY

  • SCOPE: INTERNAL
  • LAMBDA LIST: (&KEY TCLISH::VAR-INTERP TCLISH::VAR-ARGC TCLISH::VAR-ARGV TCLISH::FRLOCK TCLISH::CB-HT TCLISH::ARGC+ARGV-CVTER)
  • SETF? NIL

MACRO: APP-MAIN

  • SCOPE: EXTERNAL
  • LAMBDA LIST: ((&KEY (TCLISH::DO+CHK/ERROR? T) (RAW-CFFI-TCL9:TCL-CREATE-INTERP '(RAW-CFFI-TCL9:TCL-CREATE-INTERP)) TCLISH::TCL-INIT-SUBSYSTEMS? TCLISH::TK-INIT? TCLISH::TK-MAIN-LOOP? TCLISH::ZIP-FILENAME TCLISH::ZIP-PASSWD (TCLISH::ZIPFS-MNT-POINT "//zipfs:/app") (TCLISH::ZIPFS-TCL-LIBRARY-PATH "/tcl_library") (TCLISH::ZIPFS-TK-LIBRARY-PATH "/tk_library") TCLISH::BEFORE-CREATE-INTERP TCLISH::BEFORE-INIT TCLISH::AFTER-INIT TCLISH::BEFORE-DEINIT TCLISH::AFTER-DEINIT TCLISH::STDOUT-STREAM TCLISH::STDERR-STREAM (TCLISH::TERMINATE-WITHOUT-DEINIT NIL)) &REST TCLISH::BODY)
  • SETF? NIL

Tcl/Tk embedding macro: does initializations/deinitialization of Tcl/Tk.

  1. (Optional) use Tk. (use Tcl only)
  2. Initializes and Binds *TCL-INTERP* special variable.
  3. (Optional) Mounts ZipFS for Tcl/Tk deployment
  4. (Optional) Redirects Tcl stdout/stderr channels to Lisp streams.
  5. Various "hooks" for custom initializations/deinitializations.

It evaluates as BODY.

  • :DO+CHK/ERROR? sets *DO+CHK/ERROR?* (Tcl errors as Lisp errors, instead of Lisp string results)

  • :TCL-CREATE-INTERP : a Lisp form used to create new Tcl_Interp *-instance.

  • :TCL-INIT-SUBSYSTEMS? : Applies Tcl_InitSubsystems() during initializations.

  • :TK-INIT? : Initializes Tk using Tk_Init()?

  • :TK-MAIN-LOOP? : Enters Tk_MainLoop() after initializations.

  • :ZIP-FILENAME, :ZIP-PASSWD, :ZIPFS-MNT-POINT, :ZIPFS-TCL-LIBRARY-PATH, :ZIPFS-TK-LIBRARY-PATH : See MNT-ZIPFS.

  • :BEFORE-CREATE-INTERP, :BEFORE-INIT, :AFTER-INIT, :BEFORE-DEINIT, :AFTER-DEINIT : Lisp form, customization hook points.

  • :STDOUT-STREAM, :STDERR-STREAM : Tcl stdout/stderr redirection to Lisp streams, NIL = "No redirections"

  • :TERMINATE-WITHOUT-DEINIT : Skips the deinitializations.

MACRO: DEF-CMD

  • SCOPE: EXTERNAL
  • LAMBDA LIST: ((TCLISH::NAME &KEY (TCLISH:INTERP 'TCLISH:*TCL-INTERP*) (TCLISH::LAMBDA-LIST '(TCLISH:INTERP TCLISH:ARGS)) (TCLISH::ARGS-TYPE :STRINGS) (TCLISH::NS 'TCLISH:*DEF-CMD-NS*) (TCLISH::WRAP-P T)) &REST TCLISH::BODY)
  • SETF? NIL

Define new Tcl command of NAME with the BODY Lisp forms.

  • :LAMBDA-LIST list should have exact 2 elements, positionally, (LIST INTERP ARGS).

  • The ARGS of the :LAMBDA-LIST could be one of a LIST OF STRINGs or LIST OF TCL-OBJ-PTRs. By :ARGS-TYPE, :STRINGS or :OBJS.

  • If :WRAP-P is T, it takes the responsibility of the conversion of the result value of BODY.

  • It also takes care of Lisp error condition during evaluation of BODY into Tcl error state.

  • If :WRAP-P is nil, you should set the Tcl state variables by using Tcl_SetObjResult, Tcl_SetStringResult manually.

  • Also, VERY IMPORTANTLY, the BODY should evaluates as one of +TCL-OK+ or +TCL-ERROR+ when :WRAP-P NIL.

  • :NS specifies Tcl namespace where the new command added.

This macro could be enclosed within DEF-ENSEMBLE.

MACRO: DEF-ENSEMBLE

  • SCOPE: EXTERNAL
  • LAMBDA LIST: ((TCLISH::NS-FQN &KEY (TCLISH:INTERP 'TCLISH:*TCL-INTERP*)) &REST TCLISH::BODY)
  • SETF? NIL

Tcl ensemble defining DSL.

Defines new Tcl ensemble at NS-FQN by evaluating the BODY.

To define subcommands of the ensemble, enclose DEF-CMD-macros.

MACRO: DEF-TCL-CALLBACK-PATTERN

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (&KEY TCLISH::CB-PREFIX TCLISH::ONE-OFF? (TCLISH::COUNTER-CFFI-TYPE :UINT64) (TCLISH::CLOSURE-MAP-INITFORM '(MAKE-HASH-TABLE)))
  • SETF? NIL

Generates definitions & codes for interacting with Tcl C callback mechanisms.

  • :CB-PREFIX is mandatory, and will be used to prefixing every generated definitions and functions.
  • :ONE-OFF? indicates the registered callbak should be cleaned up once it has invoked, never meant to be used twice or more.

This macro defines:

  • ${:CB-PREFIX}-CB-COUNTER-T CFFI type
  • *${:CB-PREFIX}-CB-COUNTER* variable
  • *${:CB-PREFIX}-CB-HT* variable
  • *${:CB-PREFIX}-CB-LOCK* variable
  • ${:CB-PREFIX}/ALLOC-COUNTER-CFFI and ${:CB-PREFIX}/FREE-COUNTER-CFFI functions
  • ${:CB-PREFIX}/COUNTER-CFFI and (SETF ${:CB-PREFIX}/COUNTER-CFFI) functions
  • ${:CB-PREFIX}/INCR-COUNT function
  • ${:CB-PREFIX}/CB and (SETF ${:CB-PREFIX/CB) functions
  • ${:CB-PREFIX}/DEL-CB function
  • ${:CB-PREFIX}/REGIST-CB and ${:CB-PREFIX}/UNREGIST-CB functions
  • ${:CB-PREFIX}/ROUTE-BY-CLIENT-DATA function

Let's take an example, where the :CB-PREFIX is "CALLME" :

  • *CALLME-CB-COUNTER* keep track of last issued "callback number", this number is used to tag passed to C API and passed back from C API callbacks as "clientData" or "closure". This tag is used to find matching Lisp closure to invoke.

  • (CALLME/ALLOC-COUNTER-CFFI counter) and (CALLME/FREE-COUNTER-CFFI returned-counter-ptr-from-alloc-counter-cffi) functions are used to allocate/deallocate heap memory for counter numbers. Also could assign counter. The type of the CFFI allocated variable is CALLME-CB-COUNTER-T.

  • CALLME-CB-COUNTER-T will be a CFFI typedef, usually integer types, like :UINT64,

  • (CALLME/COUNTER counter-ptr) and (SETF (CALLME/COUNTER counter-ptr) counter) reads and writes from/to heap allocated C variable counter-ptr with counter.

  • (CALLME/INCR-COUNT) simply returns new counter number.

  • *CALLME-CB-LOCK* is used to ensure thread-safety of counter and callback registration table.

  • (CALLME/CB counter) look for a registered callback in the registration table. (*CALLME-CB-HT*)

  • (SETF (CALLME/CB counter) (lambda ...)) assigns given function value ((lambda ...)) as the counter, and (CALLME/DEL-CB counter) removes it from the registration table.

  • (CALLME/REGIST-CB (lambda ...)) registers function value to the registration table as the newly generated counter, and returns the new counter value in Lisp value and C FFI allocated pointer: (LIST :counter counter :client-data counter-ptr), In here counter-ptr is the newly allocated counter value for C APIs.

  • (CALLME/UNREGIST-CB client-data) takes counter-ptr or so called client-data returned from CALLME/REGIST-CB. Also deallocates the given client-data.

  • (CALLME/ROUTE-BY-CLIENT-DATA client-data &rest args) finds and invokes the registered callback matching with client-data. If the :ONE-OFF? was T, does CALLME/UNREGIST-CB as well.

  • CALLME/ROUTE-BY-CLIENT-DATA simply does (APPLY -found-func- args), not passing any other data like client-data anything else.

Now, make it a bit more concrete:

  1. To register a callback, using void Regist(MyCallback *callback, void *clientData) C API.
  2. Unregister: void Unregist(MyCallback *callback, void *clientData).
  3. Also: typedef void (*MyCallback)(void *clientData).
(def-tcl-callback-pattern
  :cb-prefix "CALLME"
  :one-off?  nil)

(cffi:defcallback %My-Callback
  :void  ; c-return-type
  ((client-data :pointer)) ; c-param-types
  ;; body:
  (CALLME/ROUTE-BY-CLIENT-DATA client-data))

(defun Do-Regist (lisp-func)
  (let* ((client-data (CALLME/REGIST-CB lisp-func))
         (client-data* (getf client-data :client-data)))
    (cffi:foreign-funcall "Regist"
     :pointer (cffi:callback %My-Callback)
     :pointer client-data
     :void)
    ;;
    client-data))

(defun Do-Unregist (client-data)
  (CALLME/UNREGIST-CB client-data))


;;
(setf token (Do-Regist (lambda (&rest args) (print :OH-HI!))))

(Do-Unregist token)

MACRO: DO+CHK

  • SCOPE: EXTERNAL
  • LAMBDA LIST: ((TCLISH::FN-NAME &KEY (TCLISH:INTERP 'TCLISH:*TCL-INTERP*) (TCLISH::TCL-OK RAW-CFFI-TCL9:+TCL-OK+) (TCLISH::ERROR? 'TCLISH:*DO+CHK/ERROR?*) (TCLISH::INCLUDE-ERROR-INFO? T)) &REST TCLISH:ARGS)
  • SETF? NIL

Runs Tcl C API function (FN) and Checks its result-code.

  • ARGS is a list of arguments to be applied on FN.

  • :INTERP is a Tcl interpreter runs Tcl C API function (FN).

  • :TCL-OK is used to check the result-code of FN, specifies code for "No Errors". (usually +TCL-OK+)

  • :ERROR? asks raising Lisp error condition instead of just returning error message strings.

  • :INCLUDE-ERROR-INFO? asks that Lisp error condition or error message strings should include the contents of Tcl errorInfo variable.

MACRO: NCONCF-IF

  • SCOPE: INTERNAL
  • LAMBDA LIST: (TCLISH::PLACE TCLISH::PRED-FORM TCLISH::LIST-TO-NCONC)
  • SETF? NIL

MACRO: QUEUE-EVT

  • SCOPE: EXTERNAL
  • LAMBDA LIST: ((&REST TCLISH::FWD-OPTS &KEY (TCLISH::CB-RETURN-CODE 1) (TCLISH::LAMBDA-LIST '(TCLISH:INTERP TCLISH:THREAD-ID TCLISH:CB-COUNTER)) &ALLOW-OTHER-KEYS) &REST TCLISH::BODY)
  • SETF? NIL

Enqueues Tcl Event Queue with BODY.

BODY is wrapped within a function takes :LAMBDA-LIST and returns CB-RETURN-CODE.

FWD-OPTS are will be forwarded to QUEUE-EVT-FUNC, as INTERP/THREAD-ID... Consult the docstring.

MACRO: TRACK-DEF-CMDS

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (&REST TCLISH::BODY)
  • SETF? NIL

Gather invocation of (FUNCALL *DEF-CMD-TRACKER* FQN :NS .. :NAME ..) within BODY.

MACRO: WITH-CMD-INFO

  • SCOPE: EXTERNAL
  • LAMBDA LIST: ((&KEY TCLISH::V-CMD-INFO TCLISH::CMD-OBJ TCLISH::MODIFY?) &REST TCLISH::BODY)
  • SETF? NIL

Gets Tcl_CmdInfo*(bind as :V-CMD-INFO) of :CMD-OBJ(Tcl_Command), and evaluates BODY with the binding.

:MODIFY? indicates set back the :V-CMD-INFO bound Tcl_CmdInfo* by using (SETF (CMD-INFO/FROM-CMD-OBJ CMD-OBJ) ...)

MACRO: WITH-INTERP

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH:INTERP &REST TCLISH::BODY)
  • SETF? NIL

MACRO: WITH-TCL-ERROR/RESULT

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (&REST TCLISH::BODY)
  • SETF? NIL

In the BODY, DO+CHK returns error message strings without raising Lisp errors.

MACRO: WITH-TCL-ERROR/THROWN

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (&REST TCLISH::BODY)
  • SETF? NIL

In the BODY, DO+CHK raises Lisp errors.

MACRO: WITH-TCL-OBJV

  • SCOPE: EXTERNAL
  • LAMBDA LIST: ((TCLISH::LST &KEY (TCLISH::V-TCL-OBJV 'TCLISH:TCL-OBJV) (TCLISH::V-TCL-OBJC 'TCLISH:TCL-OBJC)) &REST TCLISH::BODY)
  • SETF? NIL

METHOD: DESTROY ((ARR-LINK <TCL-ARRAY-LINK>))

  • SCOPE: EXTERNAL
  • LAMBDA LIST: ((TCLISH::ARR-LINK TCLISH:<TCL-ARRAY-LINK>))
  • SETF? NIL
  • QUALIFIERS: NIL

METHOD: DESTROY ((VAR-LINK <TCL-VAR-LINK>))

  • SCOPE: EXTERNAL
  • LAMBDA LIST: ((TCLISH::VAR-LINK TCLISH:<TCL-VAR-LINK>))
  • SETF? NIL
  • QUALIFIERS: NIL

METHOD: LINKED-VALUE-AT ((ARR-LINK <TCL-ARRAY-LINK>) INDEX)

  • SCOPE: EXTERNAL
  • LAMBDA LIST: ((TCLISH::ARR-LINK TCLISH:<TCL-ARRAY-LINK>) TCLISH::INDEX)
  • SETF? NIL
  • QUALIFIERS: NIL

METHOD: LINKED-VALUE-AT (NEW-VALUE (ARR-LINK <TCL-ARRAY-LINK>) INDEX)

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::NEW-VALUE (TCLISH::ARR-LINK TCLISH:<TCL-ARRAY-LINK>) TCLISH::INDEX)
  • SETF? T
  • QUALIFIERS: NIL

METHOD: LINKED-VALUE ((VAR-LINK <TCL-VAR-LINK>))

  • SCOPE: EXTERNAL
  • LAMBDA LIST: ((TCLISH::VAR-LINK TCLISH:<TCL-VAR-LINK>))
  • SETF? NIL
  • QUALIFIERS: NIL

METHOD: LINKED-VALUE (NEW-VALUE (VAR-LINK <TCL-VAR-LINK>))

  • SCOPE: EXTERNAL
  • LAMBDA LIST: (TCLISH::NEW-VALUE (TCLISH::VAR-LINK TCLISH:<TCL-VAR-LINK>))
  • SETF? T
  • QUALIFIERS: NIL

METHOD: UNTRACE-CMD ((CMD-TRACE <TCL-CMD-TRACE>))

  • SCOPE: EXTERNAL
  • LAMBDA LIST: ((TCLISH::CMD-TRACE TCLISH:<TCL-CMD-TRACE>))
  • SETF? NIL
  • QUALIFIERS: NIL

METHOD: UNTRACE-VAR ((VAR-TRACE <TCL-VAR-TRACE>))

  • SCOPE: EXTERNAL
  • LAMBDA LIST: ((TCLISH::VAR-TRACE TCLISH:<TCL-VAR-TRACE>))
  • SETF? NIL
  • QUALIFIERS: NIL

METHOD: UPDATE ((VAR-LINK <TCL-VAR-LINK-BASE>))

  • SCOPE: EXTERNAL
  • LAMBDA LIST: ((TCLISH::VAR-LINK TCLISH:<TCL-VAR-LINK-BASE>))
  • SETF? NIL
  • QUALIFIERS: NIL

VARIABLE: *CALL-WHEN-DELETED-CB-COUNTER*

  • SCOPE: INTERNAL
  • INITIAL-VALUE: 0

VARIABLE: *CALL-WHEN-DELETED-CB-HT*

  • SCOPE: INTERNAL
  • INITIAL-VALUE: (MAKE-HASH-TABLE)

VARIABLE: *CALL-WHEN-DELETED-CB-LOCK*

  • SCOPE: INTERNAL
  • INITIAL-VALUE: (BT2:MAKE-LOCK :NAME "*call-when-deleted-cb-lock*")

VARIABLE: *DEF-CMD-NS*

  • SCOPE: EXTERNAL
  • INITIAL-VALUE: ""

VARIABLE: *DEF-CMD-TRACKER*

  • SCOPE: EXTERNAL
  • INITIAL-VALUE: NIL

VARIABLE: *DEF-CMD-TRACKING-HT*

  • SCOPE: EXTERNAL
  • INITIAL-VALUE: (MAKE-HASH-TABLE)

VARIABLE: *DO+CHK/ERROR?*

  • SCOPE: EXTERNAL
  • INITIAL-VALUE: T

DO+CHK macro treats Tcl error status as raising Lisp error conditions, not just returning error message strings. (T means raise lisp errors))

VARIABLE: *INTERP-TRACE-CB-COUNTER*

  • SCOPE: INTERNAL
  • INITIAL-VALUE: 0

VARIABLE: *INTERP-TRACE-CB-HT*

  • SCOPE: INTERNAL
  • INITIAL-VALUE: (MAKE-HASH-TABLE)

VARIABLE: *INTERP-TRACE-CB-LOCK*

  • SCOPE: INTERNAL
  • INITIAL-VALUE: (BT2:MAKE-LOCK :NAME "*interp-trace-cb-lock*")

VARIABLE: *STRINGIFY-FOR-TCL-OBJ-FUNC*

  • SCOPE: EXTERNAL
  • INITIAL-VALUE: (LAMBDA (TCLISH::V) (FORMAT NIL "~a" TCLISH::V))

VARIABLE: *TCL-CMD-CB-COUNTER*

  • SCOPE: INTERNAL
  • INITIAL-VALUE: 0

VARIABLE: *TCL-CMD-LOCK*

  • SCOPE: INTERNAL
  • INITIAL-VALUE: (BT2:MAKE-LOCK :NAME "*tcl-cmd-lock*")

VARIABLE: *TCL-CMD-OBJ-CB-HT*

  • SCOPE: INTERNAL
  • INITIAL-VALUE: (MAKE-HASH-TABLE)

VARIABLE: *TCL-CMD-STRING-CB-HT*

  • SCOPE: INTERNAL
  • INITIAL-VALUE: (MAKE-HASH-TABLE)

VARIABLE: *TCL-EV-QUEUE-CB-COUNTER*

  • SCOPE: INTERNAL
  • INITIAL-VALUE: 0

VARIABLE: *TCL-EV-QUEUE-CB-HT*

  • SCOPE: INTERNAL
  • INITIAL-VALUE: (MAKE-HASH-TABLE)

VARIABLE: *TCL-EV-QUEUE-LOCK*

  • SCOPE: INTERNAL
  • INITIAL-VALUE: (BT2:MAKE-LOCK :NAME "*tcl-ev-queue-lock*")

VARIABLE: *TCL-INTERP*

  • SCOPE: EXTERNAL
  • INITIAL-VALUE: NIL

VARIABLE: *TRACE-CMD-CB-COUNTER*

  • SCOPE: INTERNAL
  • INITIAL-VALUE: 0

VARIABLE: *TRACE-CMD-CB-HT*

  • SCOPE: INTERNAL
  • INITIAL-VALUE: (MAKE-HASH-TABLE)

VARIABLE: *TRACE-CMD-CB-LOCK*

  • SCOPE: INTERNAL
  • INITIAL-VALUE: (BT2:MAKE-LOCK :NAME "*trace-cmd-cb-lock*")

VARIABLE: *TRACE-VAR-CB-COUNTER*

  • SCOPE: INTERNAL
  • INITIAL-VALUE: 0

VARIABLE: *TRACE-VAR-CB-HT*

  • SCOPE: INTERNAL
  • INITIAL-VALUE: (MAKE-HASH-TABLE)

VARIABLE: *TRACE-VAR-CB-LOCK*

  • SCOPE: INTERNAL
  • INITIAL-VALUE: (BT2:MAKE-LOCK :NAME "*trace-var-cb-lock*")

VARIABLE: *VAR-FLAGS*

  • SCOPE: INTERNAL
  • INITIAL-VALUE: RAW-CFFI-TCL9:+TCL-LEAVE-ERR-MSG+

VARIABLE: +LINK/ARRAY-CFFI-TYPE-PLIST+

  • SCOPE: INTERNAL
  • INITIAL-VALUE: (APPEND TCLISH::+LINK/COMMON-CFFI-TYPE-PLIST+ (LIST RAW-CFFI-TCL9:+TCL-LINK-BINARY+ :UCHAR RAW-CFFI-TCL9:+TCL-LINK-CHARS+ :CHAR))

VARIABLE: +LINK/COMMON-CFFI-TYPE-PLIST+

  • SCOPE: INTERNAL
  • INITIAL-VALUE: (LIST RAW-CFFI-TCL9:+TCL-LINK-INT+ :INT RAW-CFFI-TCL9:+TCL-LINK-UINT+ :UINT RAW-CFFI-TCL9:+TCL-LINK-CHAR+ :CHAR RAW-CFFI-TCL9:+TCL-LINK-UCHAR+ :UCHAR RAW-CFFI-TCL9:+TCL-LINK-SHORT+ :SHORT RAW-CFFI-TCL9:+TCL-LINK-USHORT+ :USHORT RAW-CFFI-TCL9:+TCL-LINK-LONG+ :LONG RAW-CFFI-TCL9:+TCL-LINK-ULONG+ :ULONG RAW-CFFI-TCL9:+TCL-LINK-WIDE-INT+ :TCL-WIDE-INT RAW-CFFI-TCL9:+TCL-LINK-WIDE-UINT+ :TCL-WIDE-UINT RAW-CFFI-TCL9:+TCL-LINK-FLOAT+ :FLOAT RAW-CFFI-TCL9:+TCL-LINK-DOUBLE+ :DOUBLE RAW-CFFI-TCL9:+TCL-LINK-BOOLEAN+ :BOOLEAN)

VARIABLE: +LINK/VAR-CFFI-TYPE-PLIST+

  • SCOPE: INTERNAL
  • INITIAL-VALUE: (APPEND TCLISH::+LINK/COMMON-CFFI-TYPE-PLIST+ (LIST RAW-CFFI-TCL9:+TCL-LINK-STRING+ '(:POINTER :CHAR)))

VARIABLE: +TCL-TRACE-LEVEL-ANY+

  • SCOPE: EXTERNAL
  • INITIAL-VALUE: 0

VARIABLE: +TCL-TRACE-LEVEL-ONLY-TOP+

  • SCOPE: EXTERNAL
  • INITIAL-VALUE: 1

VARIABLE: +TCL-TRACE-LEVEL-ONLY-TOP-AND-ONE-MORE+

  • SCOPE: EXTERNAL
  • INITIAL-VALUE: 2

Generated with doqumen at 2026-05-19T16:24:40.092912+09:00 by https://github.com/ageldama

About

Much more Lispy(tm) Tcl/Tk 9.0

Topics

Resources

License

Stars

Watchers

Forks

Contributors