tacit programming(ポイントフリープログラミングとも呼ばれます)をLispで使用/実装することはできますか?そして答えがイエスならば、それは終わったのですか?Lispでの暗黙のプログラミング
答えて
このプログラミングスタイルはCLでは原則として可能ですが、Lisp-2の場合、#'
とfuncall
をいくつか追加する必要があります。また、例えばHaskellとは対照的に、関数はCLでカレー化されておらず、暗黙の部分的なアプリケーションはありません。一般的に、私はそのようなスタイルはあまり慣用的ではないと思う。
たとえば、あなたはこのように部分的なアプリケーションと構成を定義することができます。
(defun partial (function &rest args)
(lambda (&rest args2) (apply function (append args args2))))
(defun comp (&rest functions)
(flet ((step (f g) (lambda (x) (funcall f (funcall g x)))))
(reduce #'step functions :initial-value #'identity)))
(それらは私が手早くだけ迅速例です - 彼らは本当にテストまたは良く考えスルー異なるユースケースのためにされていません。これら付)
、Haskellではmap ((*2) . (+1)) xs
のようなものは次のようになります。
CL-USER> (mapcar (comp (partial #'* 2) #'1+) '(1 2 3))
(4 6 8)
sum
例:
CL-USER> (defparameter *sum* (partial #'reduce #'+))
*SUM*
CL-USER> (funcall *sum* '(1 2 3))
6
(この例では、あなたはまた、funcallのを回避するために、値のセル内の関数を格納するのではなく、シンボルの関数セルを設定することができます。)
をEmacs Lispには、によってところで、部分的なアプリケーションはapply-partially
のように組み込まれています。チー/シェンで
は、関数はカリー化されており、暗黙の部分のアプリケーションは、(関数は一つの引数で呼び出されたときに)サポートされています:
(41-) (define comp F G -> (/. X (F (G X))))
comp
(42-) ((comp (* 2) (+ 1)) 1)
4
(43-) (map (comp (* 2) (+ 1)) [1 2 3])
[4 6 8]
の似た感じを与えるのClojureでの構文スレッドシュガーもあります"パイプライン化":
user=> (-> 0 inc (* 2))
2
はい、これは一般的に正しい機能で可能です。例えば、ここではWikipediaのページからsum
を実装ラケットの例である:
#lang racket
(define sum (curry foldr + 0))
手順は、デフォルトではカリー化されていないので、それはcurry
を使用するか、または明示的カリースタイルであなたの関数を作成するのに役立ちます。 curryingを使用する新しいdefine
マクロでこれを抽象化することができます。
はい、@ダンリーイはすでに説明しました。 Paul Grahamの第6章でANSI Common Lispという本のいくつかの例を追加します。関数ビルダーで6:
あなたはこのような関数ビルダーを定義することができます。
(defun compose (&rest fns)
(destructuring-bind (fn1 . rest) (reverse fns)
#'(lambda (&rest args)
(reduce #'(lambda (v f) (funcall f v))
rest
:initial-value (apply fn1 args)))))
(defun curry (fn &rest args)
#'(lambda (&rest args2)
(apply fn (append args args2))))
この
(mapcar (compose #'list #'round #'sqrt)
'(4 9 16 25))
戻り
((2) (3) (4) (5))
compose
関数呼び出しのようにそれを使用します。
(compose #'a #'b #'c)
は
#'(lambda (&rest args) (a (b (apply #'c args))))
にこれはコンええ、任意の数の引数を取ることができることを意味equlvalentです。
引数に3を追加する機能行います
(curry #'+ 3)
は本の中でより多くを参照してください。
しかしそれほど意味をなさない。それは悪いコードにつながります。読み込みとデバッグが難しい。プラス - ほとんどすべてのCLコンパイラは、そのための遅いコードを生成します(cons argリストなど)。 –
@RainerJoswigあなたはそうです。これは、どのように柔軟なCLであるか、どのようなクロージャが私たちを助けるかもしれないかを示すことができます... o_O – juanitofatas
あなたの 'compose'の例も私のバージョンで動作します。私はちょうど今修正された 'comp'(' step'の関数呼び出しの間違った順序、REPLの作業版)に小さなコピー&ペーストエラーやタイプミスがありました。また、Rainerが正しいと思う:CLでこれを行うことができるのは良いことだが、あまり慣れない。ハスケルは、このプログラミングスタイルにもっと役立ちます。(グラハムのスタイル、btwは、多くのCLプログラマーによってかなり独特のものと考えられています。) – danlei
次のようなものを使用することができます(これはないですもう少しClojureの で->
より):
(defmacro -> (obj &rest forms)
"Similar to the -> macro from clojure, but with a tweak: if there is
a $ symbol somewhere in the form, the object is not added as the
first argument to the form, but instead replaces the $ symbol."
(if forms
(if (consp (car forms))
(let* ((first-form (first forms))
(other-forms (rest forms))
(pos (position '$ first-form)))
(if pos
`(-> ,(append (subseq first-form 0 pos)
(list obj)
(subseq first-form (1+ pos)))
,@other-forms)
`(-> ,(list* (first first-form) obj (rest first-form))
,@other-forms)))
`(-> ,(list (car forms) obj)
,@(cdr forms)))
obj))
(あなたが->
を置いたも にパッケージからシンボル$
をエクスポートするために注意しなければなりません - さんは、そのパッケージtacit
を呼びましょう - )とあなたが->
を使用する予定のパッケージなので、->
と$
が継承されるのuse
句で tacit
を入れ
例:
(-> "TEST"
string-downcase
reverse)
(-> "TEST"
reverse
(elt $ 1))
これは、より多くのF#の|>
(およびシェルパイプ)のようなHaskellの.
よりもですが、彼らは は私が|>
を好む(ほとんど同じことですが、これは問題です個人的な好み)。
->
が何をしているかを確認するには、わずか3回(SLIMEで、これは一例では最初(
にカーソルを置くとC-c RET
3回入力することによって達成される)最後の例をマクロ展開しました。
- 1. 暗黙のパラメータ
- 2. 暗いテキスト(暗黙でない)のプレースホルダー
- 3. DateTimeから暗黙的に暗黙的に暗黙的に暗黙的に暗黙的に暗黙的に暗黙的に暗黙変換に変換することができません
- 4. 暗黙のクラス対形質への暗黙の変換
- 5. Common Lispの豊富なプログラミング?
- 6. 暗黙ConfigurationElementCollectionのセクション
- 7. Android暗黙のインテント
- 8. 暗黙のMakefileは
- 9. OpenMP暗黙のバリア
- 10. Common Lisp並列プログラミング
- 11. メソッドハンドラの暗黙のキャスト?
- 12. UNIXコマンドの暗黙のシステムコール
- 13. 暗黙のテンプレートメソッドのインスタンス
- 14. matlabの暗黙のインターフェイス
- 15. 暗黙の変換エラーが
- 16. 暗黙の実数エラー
- 17. XUL暗黙の要素
- 18. Ruby on Railsの暗黙テーブル
- 19. 暗黙のパラメータと関数
- 20. CALayers暗黙のアニメーション(回転)?
- 21. Typdefsと暗黙のキャスト
- 22. C暗黙の変換?
- 23. スカラー暗黙の原因StackOverflowError
- 24. Java暗黙のtry-with-resources
- 25. 暗黙の変換は、ARC
- 26. 暗黙の宣言は、C99
- 27. 回避暗黙のグローバル(JSlint)
- 28. スカラ暗黙の最終クラス
- 29. テンプレートの暗黙的パラメータ
- 30. 暗黙の宣言C99
質問はCommon Lispに関するものですが、この回答はSchemeには正しいですが、CLについては正しくありません –
まあ、実際は質問は一般にLispに関するものでした。私はタグとしてCLを追加しました。なぜなら、それは私が最もよく知っているLisp方言ですが、Schemeを使ったこの答えは同様に便利です。 – paldepind