個人的には、これは重要性の悪い例だと思いますしlocal
、質問の重要性を完全に理解していないと思います。そのため、私が行うことは、注意すべき概念を調べてから、あなたの例を調べて、最後により良い例を挙げてください。
概念
まず、ここでのローカルの考え方は (他の多くのことの中でも) 、コードのスニペットの意味を明確にすることです。
あなたの例
あなたの例を考えてみましょm
う。正しいと思われるローカル定数を定義します。ただし、手紙m
には重要な意味がないため、解決策が不明確に見えます。では、どのように解決策を修正できますか?
何を表すのかを明確に識別m
できる名前を付ける必要があります。そこで、何が何を表しているかを直接考えることから始めます。m
m
(maxi (rest alon))
簡単(maxi (rest alon))
に言うと、最大数を見つける(rest alon)
だから、名前を変更しましょm
うfind-max
コードは次のようになります。
;; maxi : non-empty-lon -> number
;; to determine the largest number on alon
(define (maxi alon)
(cond
[(empty? (rest alon)) (first alon)]
[else (local ((define find-max (maxi (rest alon))))
(cond
[(> (first alon) find-max) (first alon)]
[(> find-max (first (rest alon))) find-max]
[else (first (rest alon))]))]))
に置き換えるm
とfind-max
、コードがより明確になります。経験則を残して、定数に意味のある名前を付けます。
私の例
さらに明確にするために、2 つの点を消費し、2 つの点を結ぶことによって作成される線分の勾配を生成する関数を考えてみましょう。最初のアプローチは次のとおりです。
;;where x1,y1 belong to point 1 and x2,y2 belong to point 2
(define (find-slope x1 y1 x2 y2)
(sqrt (+ (sqr (- x2 x1))) (sqr (- y2 y1))))
しかし、次を使用してより明確にすることができますlocal
。
(define (find-slope x1 y1 x2 y2)
(local
[(define delta-x (- x2 x1))
(define delta-y (- y2 y1))]
(sqrt (+ (sqr delta-x)) (sqr delta-y))))
関数がその部分で何をするかをデルタがどのように説明しているかに注目してください。x または y の変化を見つけます。したがって、ここで学ぶ必要があるのは、最初のソリューションは使用するコードが少ないかもしれませんが、2 番目のソリューションは何をしているかを説明しており、簡単に読むことができるということです。それが質問の全体的な考え方であり、ばかげているように見えるかもしれませんが、学術的な設定でスキームを学ぶときに強調する傾向がある慣習です.
1 番目と 2 番目のソリューションの効率に関しては、(Racket がどのように式を評価するかを見た後で) 明らかな理由で 2 番目のソリューションの方がはるかに高速であることは間違いありませんが、それは質問の主な目的ではありませんでした。
お役に立てれば