🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

1 total messages Started by KURODA Hisao / くろだ ひさお Mon, 30 Mar 1998 00:00
Re: MS-DOS 動作可能な LISP を探しています。
#157
Author: KURODA Hisao / くろだ ひさお
Date: Mon, 30 Mar 1998 00:00
63 lines
2912 bytes
In article <01bd599f$6612eb70$618bf7ca@melchior> "Seiji Mizumoto" <ayanami0@kt.rim.or.jp> writes:

 | > > (defun p () (p))
 | > P
 | > > (p)
 | > error: evaluation stack overflow
 | 
 | 上記の記述でFreeBSDの世界でもスタックオーバーフローを起こすのですか...

Common Lisp系のインタープリタだと末尾再帰は見てくれないと思いますので、
スタックオーバーフローになります。大抵のCommon Lispではコンパイラにか
ければ末尾再帰処理をしてくれますが、640M環境では求めるのが無理なような
気がします。
しっかり実装されたSchemeならば末尾再帰を見てくれますので、次のようなプ
ログラムは無限ループになります。

SCM version 5b2, Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997 Free Software Foundation.

> (define (p) (p))
;Evaluation took 0 mSec (0 in gc) 18 cells work, 33 bytes other
#<unspecified>
> (p)

 | 再帰処理を行うのが奇麗なコーティングだと思っているのですが、この場合、
 | プログラムのループ処理等の使用には(DO (....)) とかのループ処理を行う関数を
 | 用いた方が良いのでしょうか?  u-n?!

このあたりをエレガントにやりたいならば、末尾再帰を見てくれるSchemeにノ
リカエるのをお薦めします^^。

 | 	(setq  xx  '(  A1  A2  A3  A4   .....))
 | 
 | でxxのリスト(?)のA1/A2/A3......の値をA1をB1/A2をB2/A3をB3に置き換えを行う
 | 場合についてどの様に行えば良いのでしょうか?(イメージは通常の配列処理です)
 | 
 | A1については
 | 
 | 	(setq  xx  (cons  'B1  '(cdr  xx)) ) 
 | 
 | で、xxのリストは(B1 A2 A3 A4
 | ....)となるのは、理解できたのですが、関数として
 | A2または、A3....の置き換えを実現する場合、どの様に考えれば良いのか悩んで
 | います。  お手数ですが、ヒントを教えて頂けましたら幸いです。

「置き換え」が破壊的かそうで無いかで違ってきますが、

> (setq xx '(a1 a2 a3))
(A1 A2 A3)
> (rplaca (cdr xx) 'b2)
(B2 A3)
> xx
(A1 B2 A3)
> (rplaca (cddr xx) 'b3)
(B3)
> xx
(A1 B2 B3)
> 
とかでは駄目ですか?

;;; $Id: .signature,v 1.3 1996/09/20 07:06:26 kuroda Exp $
(define (くろだ ひさお)
  (email kuroda@msi.co.jp))
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads