1

tmux で実行されている clojure repl に複数の関数定義を貼り付けるのに問題があります。(一般的なケースは、大量のコードを貼り付けることです)

次の clojure 定義を (1 回の貼り付け操作として) tmux で実行されていない clojure repl に手動で貼り付けると、うまく貼り付けられます。

しかし、tslime から、または clojure repl を実行している tmux に直接貼り付けると、最終的な定義の一部でテキストが文字化けし、一部の定義のみが適切に完成します。(make-exponentiation defの周りでめちゃくちゃになります)

他の誰かがこれを経験したり、何が起こっているのかについて何か考えがありますか?


; Some expiriments and exercises for 
; Lecture 3B of SICP


(ns deriv)

(defn variable? 
  [x] 
  (symbol? x))

(defn same-variable?
  [v1 v2]
  (and (variable? v1) (variable? v2) (= v1 v2))) 

(defn sum? 
  [x] 
  (and (seq? x) (= (first x) '+)))

(defn make-sum
  [a1 a2] 
  (cond 
    (= a1 0) a2 
    (= a2 0) a1
    (and (number? a1) (number? a2)) (+ a1 a2)
    :else (list '+ a1 a2)))

(defn make-product
  [a1 a2] 
  (cond 
    (or (= a1 0) (= a2 0)) 0
    (= a1 1) a2 
    (= a2 1) a1
    (and (number? a1) (number? a2)) (* a1 a2)
    :else (list '* a1 a2)))

(defn product?
  [x] 
  (and (seq? x) (= (first x) '*)))

(defn addend 
  [[op addend & augend]]
    addend)

(defn augend
  [[op addend & augend]] 
  (if (next augend)
    (conj augend '+)
    (first augend)))

(defn multiplier 
  [[op multiplier & multiplicand]]
    multiplier)

(defn multiplicand
  [[op multiplier & multiplicand]]
  (if (next multiplicand)
    (conj multiplicand '*)
    (first multiplicand)))


(defn exponentiation? 
  [x]
  (and (seq? x) (= (first x) '**)))

(defn base 
  [[op base exponent]] 
  base)

(defn exponent
  [[op base exponent]] 
  exponent)

(defn make-exponentiation
  [base exponent]
  (cond 
    (= exponent 0) 1
    (= exponent 1) base
    :else (list '** base exponent)))



(defn deriv
  [exp var] 
  (cond 
    (number? exp) 0
    (variable? exp) (if
                      (same-variable? exp var)
                      1
                      0)
    (sum? exp) (make-sum
                 (deriv (addend exp) var)
                 (deriv (augend exp) var))
    (product? exp) (make-sum
                     (make-product (multiplier exp)
                                   (deriv (multiplicand exp) var))
                     (make-product (multiplicand exp)
                                   (deriv (multiplier exp) var)))
    (exponentiation? exp) (make-product 
                            (deriv (base exp) var)
                            (make-product 
                              (exponent exp) 
                              (make-exponentiation 
                                (base exp)
                                (- (exponent exp) 1))))
    :else
      (throw (Exception. (str "unknown expression type -- DERIV " exp)))))


4

1 に答える 1

1

私はほぼ毎日tmuxを使用しています。私は通常、emacs + swank/slime を使用していますが、問題はありません。JLine もこの問題を回避しているようです。代わりに rlwrap を試してみたところ、同様の動作に気付きました。これは間違いなくrlwrapの問題のようです。使用しているのと同じ REPL を維持したい場合は、JLine を試してみることをお勧めします。jar をダウンロードしてパスに配置するか、Leiningen の依存関係として宣言するだけです。次に、次のように JLine サポートを使用して REPL を開始できます。

java -cp "lib/*:lib/dev/*" jline.ConsoleRunner clojure.main

その後、あなたは行く準備ができているはずです。

于 2011-04-12T12:37:05.920 に答える