Skip to content

Instantly share code, notes, and snippets.

@phasetr
Last active October 11, 2021 00:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save phasetr/c11ea0fd4085f73cf1c62a2d2e2bca34 to your computer and use it in GitHub Desktop.
Save phasetr/c11ea0fd4085f73cf1c62a2d2e2bca34 to your computer and use it in GitHub Desktop.
素数夜曲P.651で突如出てきた `just?` は何者?
;;; P.648
(define (collatz n)
(cond ((= n 1) '(1))
((even? n) (cons n (collatz (/ n 2))))
(else (cons n (collatz (+ (* 3 n) 1))))))
;;; P.650
(define (peak n)
(map (lambda (i) (apply max (collatz i)))
(iota 1 n)))
;;; P.651
;;; `just?` は何なのか?
(length (filter (just? 9232 (peak 999))))
;;; 代わりに書いたコード: 本にある `353` を出力してくれる
(length (filter (lambda (x) (equal? 9232 x)) (peak 999)))
;;; 関連コード
(define adjust-of
(lambda (x)
(let ((digit 1000)
(slide (if (positive? x) 1/2 -1/2)))
(/ (truncate (+ slide (* digit x))) digit))))
(define iota
(lambda lst
(let* ((x (length lst))
(max (if (= 1 x) (car lst) (cadr lst)))
(min (if (< 1 x) (car lst) 1))
(step (if (= 3 x) (caddr lst) 1)))
(let loop ((i (- min step)) (tmp '()))
(if (< (- max step) i)
(reverse tmp)
(loop (+ i step)
(cons (adjust-of (+ i step)) tmp)))))))
@phasetr
Copy link
Author

phasetr commented Oct 10, 2021

Twitterでのつぶやきに頂いたコメントを転記。

言語仕様には無いです。
SRFI-189 で定義されているものはありますが、これのことでしょうか?
https://srfi.schemers.org/srfi-189/srfi-189.html

素数夜曲はsrfi-189より前なので全く同じものではないでしょうが、maybeモナドをnothingとjustの和で表すのは慣習なので、自分でmaybe的なものを書いたらjust?という表記は自然に使いそうに思います。素数夜曲はぱらぱらとしか見てないのでどこに出てきたか見つけられないんですが、どこにありました?

@phasetr
Copy link
Author

phasetr commented Oct 10, 2021

手元にある素数夜曲は2021/6/28の第1版第1刷発行。

@phasetr
Copy link
Author

phasetr commented Oct 11, 2021

追加コメント。

私は素数夜曲を持ってないので前後の文脈がわかりませんがモナドは無関係で、単に = の部分適用版みたいなものを意図していそうに見えます。
つまり
(define (just? x) (lambda(y) (= x y)))
みたいな。

私も(just? x) ≡ (lambda (y) (= x y)) だと思います。当初定義も示して使っていたけど改稿時にやめしたが一部直し忘れてた、みたいな感じかもしれません。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment