ASDF をローカルに持ってきて quicklisp でロード対象にする。
ASDF こっから clone
する。
(ql:uninstall 'asdf)
で ASDF 自体をアンインストールする。
asdf.asd
のショーットカットを作成して自分の好きなところに配置して (ql:quickload :asdf)
を実行してインストール(っていうの?)する。
場所を確認して成功を確認。
CL-USER> (ql:where-is-system :asdf) #P"C:/Users/yanqi/prj/asdf/"
バージョンは 3.2.1
でした。
CL-USER> (asdf:asdf-version) "3.2.1"
UIOPのバージョン(かな?)も同じ模様。
CL-USER> uiop:*uiop-version* "3.2.1"
run-program を眺めてみる。
(defun run-program (command &rest keys &key ignore-error-status (force-shell nil force-shell-suppliedp) input (if-input-does-not-exist :error) output (if-output-exists :supersede) error-output (if-error-output-exists :supersede) (element-type #-clozure *default-stream-element-type* #+clozure 'character) (external-format *utf-8-external-format*) &allow-other-keys) (declare (ignorable input output error-output if-input-does-not-exist if-output-exists if-error-output-exists element-type external-format ignore-error-status)) (apply (if (or force-shell (and (stringp command) (or (not force-shell-suppliedp)))) '%use-system '%use-launch-program) command keys))
UIOP/RUN-PROGRAM::%USE-LAUNCH-PROGRAM
をコールしている模様。
%USE-LAUNCH-PROGRAM を眺めてみる。
うーん長いね。。。。
(defun %use-launch-program (command &rest keys &key input output error-output ignore-error-status &allow-other-keys) (when (member :stream (list input output error-output)) (parameter-error "~S: ~S is not allowed as synchronous I/O redirection argument" 'run-program :stream)) (let* ((active-input-p (%active-io-specifier-p input)) (active-output-p (%active-io-specifier-p output)) (active-error-output-p (%active-io-specifier-p error-output)) (activity (cond (active-output-p :output) (active-input-p :input) (active-error-output-p :error-output) (t nil))) output-result error-output-result exit-code process-info) (with-program-output ((reduced-output output-activity) output :keys keys :setf output-result :stream-easy-p t :active (eq activity :output)) (with-program-error-output ((reduced-error-output error-output-activity) error-output :keys keys :setf error-output-result :stream-easy-p t :active (eq activity :error-output)) (with-program-input ((reduced-input input-activity) input :keys keys :stream-easy-p t :active (eq activity :input)) (setf process-info (apply 'launch-program command :input reduced-input :output reduced-output :error-output (if (eq error-output :output) :output reduced-error-output) keys)) (labels ((get-stream (stream-name &optional fallbackp) (or (slot-value process-info stream-name) (when fallbackp (slot-value process-info 'bidir-stream)))) (run-activity (activity stream-name &optional fallbackp) (if-let (stream (get-stream stream-name fallbackp)) (funcall activity stream) (error 'subprocess-error :code `(:missing ,stream-name) :command command :process process-info)))) (unwind-protect (ecase activity ((nil)) (:input (run-activity input-activity 'input-stream t)) (:output (run-activity output-activity 'output-stream t)) (:error-output (run-activity error-output-activity 'error-output-stream))) (close-streams process-info) (setf exit-code (wait-process process-info))))))) (%check-result exit-code :command command :process process-info :ignore-error-status ignore-error-status) (values output-result error-output-result exit-code)))
一旦動かしてみる。
読むのが面倒なので一度 (ql:quickload :trivial-ssh)
してみる。。。。。っと通りました。。。。
CL-USER> (ql:quickload :trivial-ssh) To load "trivial-ssh": Load 1 ASDF system: trivial-ssh ; Loading "trivial-ssh" (:TRIVIAL-SSH)
おしまい。
なんかバージョンが古いだけ問題っぽいですね。
とりあえずイケたので、これはこれで良しとします。
次回でバージョンを確認しようかな。