Lisp Scheme Part41 (856レス)
前次1-
抽出解除 レス栞

リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
553
(2): デフォルトの名無しさん [sage] 2023/01/09(月) 03:51:35.47 ID:0CyucYY1(1/3) AAS
触ったことないのでeclがどの程度cltl/ANSI/clhs等の標準をリスペクトしてるのかも分からないのだが
とりあえずgoogle play storeからeclのandroidポートらしいeql5 replを入れてみた

(list ;; attempt to shadow cl:cons
(flet ((cons (x y) (cons y x)))
(cons 'co '?ns))
(let ((cons (lambda (x y) (cons y x))))
(funcall cons 'co 'ns)))

((CO . NS) (NS . CO))

fletは謎挙動だね…
* shadowしない名前(xcons)ならok
* (flet ((cons (x) (1+ x))) (cons 42))がアリティ不一致で怒られる
から推測するに、普通cl packageの関数なんて弄られないだろうと踏んで、関数の名前解決を手抜きして最適化してるんだろう

値の名前解決は特に弄る意義もないので、scheme風にlambdaをletで値として束縛して呼べば問題ない
clを名乗る以上はオプションで切れるくらいの配慮はあるだろうから、eclにこだわるならマニュアル読んでみては

少なくともclhsはリスペクトしてないね
...flet can locally shadow a global function name, ...
http://www.lispworks.com/documentation/HyperSpec/Body/s_flet_.htm
557
(2): デフォルトの名無しさん [sage] 2023/01/10(火) 02:33:32.35 ID:/i8qCr3o(1/2) AAS
>>553
特定の名前の解決を決め打つ言語は多いし、そういうポリシーもありだと思う
普通でないのはcondition(warning)を挙げないところ

決め打つ名前(locked package?)が分かってる限りは、flet/labelsのレキシカル束縛リストから拾った名前がbody内の呼び出しformのcarに存在するか、ランタイムコストの無い自明な静的解析でconditionを挙げられるはず
558: デフォルトの名無しさん [sage] 2023/01/10(火) 03:18:54.37 ID:/i8qCr3o(2/2) AAS
>>550
等価と思って良いよ
伝統的なlisp(とcl)のように(let ((x '())) ...)を(let (x) ...)と略記できない、だとか細かい差異はあるけど

百聞は一見にしかずなので、構文の対応を見るのが手っ取り早い
あとeclのname collisionの件、consの例(>>553)はさすがにcontrived-exampleだと思うので、ついでにeclで破綻するように

letrec/nlet/labels で定義するラベルとして、所謂accumulatorイディオムにloop(他にはlp, iterとか)を使うのが慣例だけど、eclではcl:loopと読まれるのでは?と予想

;;; cl -- ok: cmucl, sbcl, clisp, gcl err:ecl (的中)
(defun fact (n)
(labels ((loop (k acc)
(if (= k 0)
acc
(loop (1- k) (* k acc)))))
(loop n 1)))

;;; scheme -- ok: guile
(define (fact n)
(letrec ((loop (lambda (k acc)
(if (= k 0)
acc
(loop (1- k) (* k acc))))))
(loop n 1)))

pcでテストはしたけど、スマホから手打ちなので変だったらごめん
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.039s