diff --git a/src/cl-jupyter/kernel.lisp b/src/cl-jupyter/kernel.lisp index 45a3872e..d6f252fc 100644 --- a/src/cl-jupyter/kernel.lisp +++ b/src/cl-jupyter/kernel.lisp @@ -47,7 +47,8 @@ (bordeaux-threads:make-thread (lambda () (jupyter:inform :info k "Loading CLHS map") - (load-clhs-map)))) + (load-clhs-map)) + :name "Jupyter Kernel Startup")) (defclass debug-environment (jupyter:debug-environment) @@ -393,7 +394,7 @@ (defun read-evaluated-form () (format *query-io* "~&Type a form to be evaluated:~%") - (jupyter:handling-comm-errors + (jupyter:with-debugger () (multiple-value-list (eval-in-frame (read *query-io*) jupyter:*debug-frame*)))) @@ -404,7 +405,6 @@ #+ecl (si:eval-with-env form (cdr data)) #+sbcl (sb-di:eval-in-frame data form)) - (defmacro debugging-errors (&body body) `(unwind-protect (prog ((*debugger-hook* #'debugger-hook) @@ -427,7 +427,7 @@ (restart-bind ((eval (lambda (&rest results) - (jupyter:handling-comm-errors + (jupyter:with-debugger () (dolist (result results) (jupyter:display result))) (jupyter:debug-enter-loop)) @@ -684,7 +684,7 @@ next (when (multiple-value-call #'jupyter:evaluate-form jupyter:*kernel* stream source-path breakpoints - (source-line-column source-path)) + (source-line-column source-path 0)) (go next)))) #+clasp (with-open-file (stream source-path) @@ -737,10 +737,8 @@ (when (jupyter:evaluate-form jupyter:*kernel* stream nil breakpoints) (go repeat))))))) - (defmethod jupyter:evaluate-code ((k kernel) code &optional source-path breakpoints) (if (jupyter:kernel-debugger-started jupyter:*kernel*) - (debugging-errors (repl code source-path breakpoints)) - #+(or)(jupyter:handling-errors (repl code source-path breakpoints)) - (with-simple-restart (abort "Exit debugger, returning to top level.") - (repl code source-path breakpoints)))) + (debugging-errors (repl code source-path breakpoints)) + (jupyter:with-debugger (:internal t) + (repl code source-path breakpoints)))) diff --git a/src/cl-jupyter/utils.lisp b/src/cl-jupyter/utils.lisp index 62bf574a..d6057bba 100644 --- a/src/cl-jupyter/utils.lisp +++ b/src/cl-jupyter/utils.lisp @@ -187,7 +187,8 @@ (setf right (file-position stream)) (go next)))))) -(defun source-line-column (pathname position1 #+(or cmucl sbcl) position2) +(defun source-line-column (pathname position1 &optional position2) + (declare (ignorable position2)) (handler-case #+(or cmucl sbcl) (values-list (elt (elt (get-source-map pathname) position1) position2)) #+(or ccl ecl) (let ((record (find-if (lambda (record) diff --git a/src/heartbeat.lisp b/src/heartbeat.lisp index 0e1a0cb2..2c2d2e51 100644 --- a/src/heartbeat.lisp +++ b/src/heartbeat.lisp @@ -25,5 +25,5 @@ (unless (zerop (pzmq:poll items +zmq-poll-timeout+)) (send-heartbeat hb (recv-heartbeat hb))) (bordeaux-threads:thread-yield) - (go poll)))))))) - + (go poll)))) + :name "Jupyter Heartbeat")))) diff --git a/src/iopub.lisp b/src/iopub.lisp index 64e6911e..0c36212f 100644 --- a/src/iopub.lisp +++ b/src/iopub.lisp @@ -8,7 +8,7 @@ (defclass iopub-channel (channel) ((name :initarg :name - :initform "stdout" + :initform '*standard-output* :accessor iopub-channel-name) (value :initarg :value :initform (make-array *iopub-stream-size* @@ -104,16 +104,19 @@ (message-send iopub (make-message (channel-session iopub) "stream" (list :object-plist - "name" stream-name + "name" (ecase stream-name + (*standard-output* "stdout") + (*error-output* "stderr")) "text" data)))) (defun iopub-write-char (iopub name char) (with-accessors ((current-name iopub-channel-name) (value iopub-channel-value) + (column iopub-channel-column) (prompt-prefix iopub-channel-prompt-prefix) (prompt-suffix iopub-channel-prompt-suffix)) iopub - (unless (string= current-name name) + (unless (eq current-name name) (when (plusp (length value)) (send-stream iopub current-name value) (setf (fill-pointer value) 0)) @@ -149,7 +152,7 @@ (value iopub-channel-value)) iopub (when (and (or (null name) - (string= current-name name)) + (eq current-name name)) (plusp (length value))) (send-stream iopub current-name value) (setf (fill-pointer value) 0)))) diff --git a/src/kernel.lisp b/src/kernel.lisp index 2f51dad1..2a1b751e 100644 --- a/src/kernel.lisp +++ b/src/kernel.lisp @@ -2,7 +2,6 @@ (defvar *payload* nil) -(defvar *debugger* t) (defvar *markdown-output* nil) (defvar *html-output* nil) (defvar *thread-id* nil) @@ -12,14 +11,11 @@ (defconstant +max-thread-count+ (ash 1 +thread-bits+)) (defconstant +thread-mask+ (1- +max-thread-count+)) - (defvar *page-output* nil "Output stream sent to Jupyter pager. Available during calls to evaluate-code.") - (defconstant +zmq-poll-timeout+ 500) - (defclass thread () ((queue :reader thread-queue @@ -667,6 +663,92 @@ (values)))) +(defun control-debugger-hook (condition me-or-my-encapsulation) + (declare (ignore me-or-my-encapsulation)) + (inform (if (typep condition 'warning) + :warning + :error) + "[~S] ~A~%" (type-of condition) condition) + (abort)) + +(defun shell-debugger-hook (condition me-or-my-encapsulation) + (declare (ignore me-or-my-encapsulation)) + (let ((stream (if (typep condition 'warning) + *standard-output* + *error-output*))) + (format stream "[~S] ~A~%" (type-of condition) condition) + (finish-output stream) + (abort))) + +(defun debugger-type () + (cond #+(or clasp sbcl) + (#+clasp (core:debugger-disabled-p) + #+sbcl (eq sb-ext:*invoke-debugger-hook* 'sb-debug::debugger-disabled-hook) + :none) + #+(or clasp sbcl) + (#+clasp ext:*invoke-debugger-hook* + #+sbcl sb-ext:*invoke-debugger-hook* + :external) + (t + :interal))) + +(defun builtin-debugger-p () + (and *builtin-debugger* + #+clasp (not (core:debugger-disabled-p)) + #+sbcl (not (eq sb-ext:*invoke-debugger-hook* 'sb-debug::debugger-disabled-hook)))) + +(defun external-debugger-p () + (and #+sbcl sb-ext:*invoke-debugger-hook* + #+ccl ccl:*break-hook* + #+ecl ext:*invoke-debugger-hook* + #+clasp ext:*invoke-debugger-hook* + #+abcl sys::*invoke-debugger-hook* + #+clisp sys::*break-driver* + #+allegro excl::*break-hook* + #+lispworks dbg::*debugger-wrapper-list* + #+mezzano mezzano.debug:*global-debugger* + #-(or sbcl ccl ecl clasp abcl clisp allegro lispworks mezzano) + nil + t)) + +(defmacro with-debugger ((&key control internal) &body body) + (let ((debugger-hook (if control + 'control-debugger-hook + 'shell-debugger-hook))) + `(flet ((body-func () + (with-simple-restart + (abort "Exit debugger, returning to top level.") + ,@body))) + (case (debugger-type) + (:external + (body-func)) + ,@(when internal + #+clasp + `((:internal + (catch sys::*quit-tag* + (body-func)))) + #-clasp + `((:internal + (body-func)))) + (otherwise + (let ((*debugger-hook* ',debugger-hook) + #+sbcl (sb-ext:*invoke-debugger-hook* ',debugger-hook) + #+ccl (ccl:*break-hook* ',debugger-hook) + #+ecl (ext:*invoke-debugger-hook* ',debugger-hook) + #+clasp (ext:*invoke-debugger-hook* ',debugger-hook) + #+abcl (sys::*invoke-debugger-hook* ',debugger-hook) + #+clisp (sys::*break-driver* (lambda (continuable &optional condition print) + (declare (ignore continuable print)) + (,debugger-hook condition nil))) + #+allegro (excl::*break-hook* (lambda (&rest args) + (,debugger-hook (fifth args)))) + #+lispworks (dbg::*debugger-wrapper-list* (lambda (function condition) + (declare (ignore function)) + (,debugger-hook condition nil))) + #+mezzano (mezzano.debug:*global-debugger* (lambda (condition) + (,debugger-hook condition nil)))) + (body-func))))))) + (defun debug-enter-loop () "Re-enter the debug loop after a restart which implements a debugger command." (throw 'enter-loop t)) @@ -680,7 +762,7 @@ (finish-output *html-output*) (finish-output) (finish-output *error-output*) - (handling-comm-errors + (with-debugger () (with-slots (stopped queue) (aref (kernel-threads *kernel*) *thread-id*) (setf stopped t) @@ -815,8 +897,8 @@ (make-pathname :directory '(:relative "common-lisp-jupyter") :name language-name :type "history"))) - error-output (make-iopub-stream iopub "stderr") - standard-output (make-iopub-stream iopub "stdout") + error-output (make-iopub-stream iopub '*error-output*) + standard-output (make-iopub-stream iopub '*standard-output*) standard-input (make-stdin-stream stdin iopub)) (start mac) (start hb) @@ -830,7 +912,7 @@ (setf (kernel-shell-thread k) (bordeaux-threads:make-thread (lambda () (run-shell k)) - :name "SHELL Thread")))) + :name "Jupyter Shell")))) ;; Stop all channels and destroy the control. @@ -936,7 +1018,7 @@ (when (zerop (pzmq:poll items +zmq-poll-timeout+)) #+cmucl (bordeaux-threads:thread-yield) (go poll)) - (handling-control-errors + (with-debugger (:control t) (setf *message* (message-recv control) msg-type (format nil "~A~@[/~A~]" (gethash "msg_type" (message-header *message*)) @@ -996,6 +1078,8 @@ (let ((kernel (make-instance kernel-class :connection-file connection-file :control-thread (bordeaux-threads:current-thread)))) + #+sbcl (setf (sb-thread:thread-name (bordeaux-threads:current-thread)) + "Jupyter Control") (add-thread kernel) (start kernel) (unwind-protect @@ -1554,7 +1638,7 @@ (defun handle-comm-open () (inform :info *kernel* "Handling comm_open message") - (handling-comm-errors + (with-debugger () (let* ((content (message-content *message*)) (metadata (message-metadata *message*)) (buffers (message-buffers *message*)) @@ -1572,7 +1656,7 @@ (defun handle-comm-message () (inform :info *kernel* "Handling comm_msg message") - (handling-comm-errors + (with-debugger () (let* ((content (message-content *message*)) (metadata (message-metadata *message*)) (buffers (message-buffers *message*)) @@ -1586,7 +1670,7 @@ (defun handle-comm-close () (inform :info *kernel* "Handling comm_close") - (handling-comm-errors + (with-debugger () (with-slots (comms iopub) *kernel* (let* ((content (message-content *message*)) @@ -1671,4 +1755,3 @@ (defun clear (&optional (wait nil)) "Send clear output message to frontend." (send-clear-output (kernel-iopub *kernel*) wait)) - diff --git a/src/packages.lisp b/src/packages.lisp index 30d00a39..fc023d41 100644 --- a/src/packages.lisp +++ b/src/packages.lisp @@ -4,146 +4,145 @@ (:nicknames :j) (:documentation "Core package for Jupyter support including kernel and installer abstract classes.") (:export #:make-object - ; log - #:inform - ; mime-bundle - #:display - #:execute-result - #:file - #:gif-file - #:html - #:inline-result - #:javascript - #:jpeg - #:jpeg-file - #:json - #:json-file - #:latex - #:markdown - #:make-mime-bundle - #:mime-bundle-data - #:mime-bundle-metadata - #:pdf-file - #:png - #:png-file - #:ps-file - #:result - #:svg - #:svg-file - #:text - #:vega - #:vega-file - #:vega-lite - #:vega-lite-file - ; matches - #:match-set-add - #:make-offset-match-set - #:make-substring-match-set - ; kernel - #:add-thread - #:clear - #:code-is-complete - #:comm - #:comm-id - #:complete-code - #:create-comm - #:debug-abort - #:debug-activate-breakpoints - #:debug-breakpoint - #:debug-breakpoint-data - #:debug-breakpoint-line - #:debug-continue - #:debug-dump-cell - #:debug-enter-loop - #:*debug-environment* - #:debug-environment - #:debug-environment-condition - #:debug-environment-restarts - #:debug-evaluate-code - #:debug-evaluate-form - #:*debug-frame* - #:debug-frame - #:*debugger* - #:debug-in - #:debug-initialize - #:debug-inspect-variables - #:debug-new-breakpoint - #:debug-next - #:debug-module - #:debug-modules - #:debug-object - #:debug-object-children - #:debug-object-children-resolve - #:debug-object-column - #:debug-object-data - #:debug-object-environment - #:debug-object-id - #:debug-object-line - #:debug-object-name - #:debug-object-parent - #:debug-object-source - #:debug-object-type - #:debug-object-value - #:debug-out - #:debug-remove-breakpoint - #:debug-scope - #:debug-source - #:debug-source-name - #:debug-source-path - #:debug-stop - #:debug-variable - #:edit - #:enqueue-input - #:evaluate-code - #:evaluate-form - #:get-comm - #:handling-comm-errors - #:handling-errors - #:*html-output* - #:inform - #:inspect-code - #:*kernel* - #:kernel - #:kernel-debugger-started - #:kernel-prompt-prefix - #:kernel-prompt-suffix - #:make-uuid - #:*markdown-output* - #:on-comm-close - #:on-comm-message - #:on-comm-open - #:*page-output* - #:quit - #:remove-debug-object - #:remove-thread - #:run-kernel - #:send-comm-close - #:send-comm-message - #:send-comm-open - #:send-debug-event - #:start - #:stop - #:*thread-id* - #:user-thread-p - ; installer - #:command-line - #:install - #:installer - #:installer-class - #:installer-display-name - #:installer-implementation - #:installer-kernel-name - #:installer-language - #:installer-local - #:installer-local-systems - #:installer-path - #:installer-prefix - #:installer-resources - #:installer-systems - #:system-installer - #:system-bundle-installer - #:user-image-installer - #:user-installer)) + ;; log + #:inform + ;; mime-bundle + #:display + #:execute-result + #:file + #:gif-file + #:html + #:inline-result + #:javascript + #:jpeg + #:jpeg-file + #:json + #:json-file + #:latex + #:markdown + #:make-mime-bundle + #:mime-bundle-data + #:mime-bundle-metadata + #:pdf-file + #:png + #:png-file + #:ps-file + #:result + #:svg + #:svg-file + #:text + #:vega + #:vega-file + #:vega-lite + #:vega-lite-file + ;; matches + #:match-set-add + #:make-offset-match-set + #:make-substring-match-set + ;; kernel + #:*debug-environment* + #:*debug-frame* + #:*html-output* + #:*kernel* + #:*markdown-output* + #:*page-output* + #:*thread-id* + #:add-thread + #:clear + #:code-is-complete + #:comm + #:comm-id + #:complete-code + #:create-comm + #:debug-abort + #:debug-activate-breakpoints + #:debug-breakpoint + #:debug-breakpoint-data + #:debug-breakpoint-line + #:debug-continue + #:debug-dump-cell + #:debug-enter-loop + #:debug-environment + #:debug-environment-condition + #:debug-environment-restarts + #:debug-evaluate-code + #:debug-evaluate-form + #:debug-frame + #:debug-in + #:debug-initialize + #:debug-inspect-variables + #:debug-module + #:debug-modules + #:debug-new-breakpoint + #:debug-next + #:debug-object + #:debug-object-children + #:debug-object-children-resolve + #:debug-object-column + #:debug-object-data + #:debug-object-environment + #:debug-object-id + #:debug-object-line + #:debug-object-name + #:debug-object-parent + #:debug-object-source + #:debug-object-type + #:debug-object-value + #:debug-out + #:debug-remove-breakpoint + #:debug-scope + #:debug-source + #:debug-source-name + #:debug-source-path + #:debug-stop + #:debug-variable + #:debugger-type + #:edit + #:enqueue-input + #:evaluate-code + #:evaluate-form + #:get-comm + #:inform + #:inspect-code + #:kernel + #:kernel-debugger-started + #:kernel-prompt-prefix + #:kernel-prompt-suffix + #:make-uuid + #:on-comm-close + #:on-comm-message + #:on-comm-open + #:quit + #:remove-debug-object + #:remove-thread + #:run-kernel + #:send-comm-close + #:send-comm-message + #:send-comm-open + #:send-debug-event + #:start + #:stop + #:user-thread-p + #:with-debugger + ;; installer + #:command-line + #:install + #:installer + #:installer-class + #:installer-display-name + #:installer-implementation + #:installer-kernel-name + #:installer-language + #:installer-local + #:installer-local-systems + #:installer-path + #:installer-prefix + #:installer-resources + #:installer-systems + #:system-installer + #:system-bundle-installer + #:user-image-installer + #:user-installer)) (defpackage #:jupyter/markdown-formatter @@ -151,9 +150,9 @@ (:nicknames :mdf) (:documentation "Various format extensions for markdown") (:export #:code - #:*indent-level* - #:pre - #:text)) + #:*indent-level* + #:pre + #:text)) (defpackage #:jupyter/widgets @@ -161,216 +160,216 @@ (:nicknames :jw :jupyter-widgets) (:documentation "Package for core Jupyter Widget support.") (:export #:accordion - #:audio - #:blur - #:bounded-float-text - #:bounded-int-text - #:box - #:button - #:button-style - #:checkbox - #:checkbox-style - #:color-picker - #:combobox - #:controller - #:controller-axis - #:controller-button - #:date-picker - #:defwidget - #:description-style - #:directional-link - #:dom-widget - #:dropdown - #:file-upload - #:float-log-slider - #:float-progress - #:float-range-slider - #:float-slider - #:float-text - #:focus - #:grid-box - #:h-box - #:has-traits - #:html - #:html-math - #:html-math-style - #:html-style - #:image - #:int-progress - #:int-range-slider - #:int-slider - #:int-text - #:label - #:label-style - #:layout - #:link - #:make-output-widget-stream - #:notify-trait-change - #:observe - #:on-button-click - #:on-custom-message - #:on-trait-change - #:output - #:password - #:play - #:progress-style - #:radio-buttons - #:register-widgets - #:select - #:select-multiple - #:selection-range-slider - #:selection-slider - #:send-custom - #:sidecar - #:slider-style - #:style - #:styled-widget - #:tab - #:text - #:text-area - #:text-style - #:toggle-button - #:toggle-button-style - #:toggle-buttons - #:toggle-buttons-style - #:trait-metaclass - #:v-box - #:valid - #:video - #:widget - #:widget-%dom-classes - #:widget-%module-module - #:widget-%module-module-version - #:widget-%module-name - #:widget-%options-labels - #:widget-%playing - #:widget-%repeat - #:widget-%titles - #:widget-%view-module - #:widget-%view-module-version - #:widget-%view-name - #:widget-accept - #:widget-align-content - #:widget-align-items - #:widget-align-self - #:widget-autoplay - #:widget-axes - #:widget-background - #:widget-bar-color - #:widget-bar-style - #:widget-base - #:widget-border - #:widget-border-bottom - #:widget-border-left - #:widget-border-right - #:widget-border-top - #:widget-bottom - #:widget-box-style - #:widget-button-color - #:widget-button-style - #:widget-button-width - #:widget-buttons - #:widget-children - #:widget-concise - #:widget-connected - #:widget-continuous-update - #:widget-controls - #:widget-data - #:widget-description - #:widget-description-tooltip - #:widget-description-width - #:widget-disabled - #:widget-display - #:widget-ensure-option - #:widget-error - #:widget-flex - #:widget-flex-flow - #:widget-font-color - #:widget-font-family - #:widget-font-size - #:widget-font-style - #:widget-font-variant - #:widget-font-weight - #:widget-format - #:widget-grid-area - #:widget-grid-auto-columns - #:widget-grid-auto-flow - #:widget-grid-auto-rows - #:widget-grid-column - #:widget-grid-gap - #:widget-grid-row - #:widget-grid-template-areas - #:widget-grid-template-columns - #:widget-grid-template-rows - #:widget-handle-color - #:widget-height - #:widget-icon - #:widget-icons - #:widget-indent - #:widget-index - #:widget-interval - #:widget-justify-content - #:widget-justify-items - #:widget-layout - #:widget-left - #:widget-loop - #:widget-mapping - #:widget-margin - #:widget-max - #:widget-max-height - #:widget-max-width - #:widget-metadata - #:widget-min - #:widget-min-height - #:widget-min-width - #:widget-msg-id - #:widget-multiple - #:widget-name - #:widget-object-fit - #:widget-object-position - #:widget-on-trait-change - #:widget-options - #:widget-order - #:widget-orientation - #:widget-outputs - #:widget-overflow - #:widget-padding - #:widget-placeholder - #:widget-pressed - #:widget-readout - #:widget-readout-format - #:widget-right - #:widget-rows - #:widget-selected-index - #:widget-show-repeat - #:widget-source - #:widget-step - #:widget-style - #:widget-tabbable - #:widget-target - #:widget-text-decoration - #:widget-timestamp - #:widget-tooltip - #:widget-tooltips - #:widget-top - #:widget-value - #:widget-visibility - #:widget-width - #:with-output - ;; interactive - #:make-interactive-alist - #:make-interactive-hash-table - #:make-interactive-plist)) + #:audio + #:blur + #:bounded-float-text + #:bounded-int-text + #:box + #:button + #:button-style + #:checkbox + #:checkbox-style + #:color-picker + #:combobox + #:controller + #:controller-axis + #:controller-button + #:date-picker + #:defwidget + #:description-style + #:directional-link + #:dom-widget + #:dropdown + #:file-upload + #:float-log-slider + #:float-progress + #:float-range-slider + #:float-slider + #:float-text + #:focus + #:grid-box + #:h-box + #:has-traits + #:html + #:html-math + #:html-math-style + #:html-style + #:image + #:int-progress + #:int-range-slider + #:int-slider + #:int-text + #:label + #:label-style + #:layout + #:link + #:make-output-widget-stream + #:notify-trait-change + #:observe + #:on-button-click + #:on-custom-message + #:on-trait-change + #:output + #:password + #:play + #:progress-style + #:radio-buttons + #:register-widgets + #:select + #:select-multiple + #:selection-range-slider + #:selection-slider + #:send-custom + #:sidecar + #:slider-style + #:style + #:styled-widget + #:tab + #:text + #:text-area + #:text-style + #:toggle-button + #:toggle-button-style + #:toggle-buttons + #:toggle-buttons-style + #:trait-metaclass + #:v-box + #:valid + #:video + #:widget + #:widget-%dom-classes + #:widget-%module-module + #:widget-%module-module-version + #:widget-%module-name + #:widget-%options-labels + #:widget-%playing + #:widget-%repeat + #:widget-%titles + #:widget-%view-module + #:widget-%view-module-version + #:widget-%view-name + #:widget-accept + #:widget-align-content + #:widget-align-items + #:widget-align-self + #:widget-autoplay + #:widget-axes + #:widget-background + #:widget-bar-color + #:widget-bar-style + #:widget-base + #:widget-border + #:widget-border-bottom + #:widget-border-left + #:widget-border-right + #:widget-border-top + #:widget-bottom + #:widget-box-style + #:widget-button-color + #:widget-button-style + #:widget-button-width + #:widget-buttons + #:widget-children + #:widget-concise + #:widget-connected + #:widget-continuous-update + #:widget-controls + #:widget-data + #:widget-description + #:widget-description-tooltip + #:widget-description-width + #:widget-disabled + #:widget-display + #:widget-ensure-option + #:widget-error + #:widget-flex + #:widget-flex-flow + #:widget-font-color + #:widget-font-family + #:widget-font-size + #:widget-font-style + #:widget-font-variant + #:widget-font-weight + #:widget-format + #:widget-grid-area + #:widget-grid-auto-columns + #:widget-grid-auto-flow + #:widget-grid-auto-rows + #:widget-grid-column + #:widget-grid-gap + #:widget-grid-row + #:widget-grid-template-areas + #:widget-grid-template-columns + #:widget-grid-template-rows + #:widget-handle-color + #:widget-height + #:widget-icon + #:widget-icons + #:widget-indent + #:widget-index + #:widget-interval + #:widget-justify-content + #:widget-justify-items + #:widget-layout + #:widget-left + #:widget-loop + #:widget-mapping + #:widget-margin + #:widget-max + #:widget-max-height + #:widget-max-width + #:widget-metadata + #:widget-min + #:widget-min-height + #:widget-min-width + #:widget-msg-id + #:widget-multiple + #:widget-name + #:widget-object-fit + #:widget-object-position + #:widget-on-trait-change + #:widget-options + #:widget-order + #:widget-orientation + #:widget-outputs + #:widget-overflow + #:widget-padding + #:widget-placeholder + #:widget-pressed + #:widget-readout + #:widget-readout-format + #:widget-right + #:widget-rows + #:widget-selected-index + #:widget-show-repeat + #:widget-source + #:widget-step + #:widget-style + #:widget-tabbable + #:widget-target + #:widget-text-decoration + #:widget-timestamp + #:widget-tooltip + #:widget-tooltips + #:widget-top + #:widget-value + #:widget-visibility + #:widget-width + #:with-output + ;; interactive + #:make-interactive-alist + #:make-interactive-hash-table + #:make-interactive-plist)) (defpackage #:jupyter/common-lisp (:nicknames :cl-jupyter :clj :common-lisp-jupyter) (:use #:common-lisp) (:documentation "Provides Common Lisp kernel support.") (:export #:debug-environment - #:install - #:install-image - #:install-roswell - #:kernel)) + #:install + #:install-image + #:install-roswell + #:kernel)) (defpackage #:jupyter/convert (:use #:common-lisp)