Lisp vs Scheme (помогите прошарить)

Модератор: Модераторы разделов

adav84
Сообщения: 41

Lisp vs Scheme

Сообщение adav84 »

Код: Выделить всё

[adav@localhost ~]$ petite
Petite Chez Scheme Version 8.2
Copyright (c) 1985-2010 Cadence Research Systems

> (define (mycons x y)
    (lambda (m) (m x y)))
> (define (mycar z)
    (z (lambda (p q) p)))
> (define (mycdr z)
    (z (lambda (p q) q)))
> (mycar (mycons 1 (mycons 2 (mycons 3 4))))
1
> (mycar (mycdr (mycons 1 (mycons 2 (mycons 3 4)))))
2
> (mycar (mycdr (mycdr (mycons 1 (mycons 2 (mycons 3 4))))))
3
> (mycdr (mycdr (mycdr (mycons 1 (mycons 2 (mycons 3 4))))))
4
>
[adav@localhost ~]$ clisp
  i i i i i i i       ooooo    o        ooooooo   ooooo   ooooo
  I I I I I I I      8     8   8           8     8     o  8    8
  I  \ `+' /  I      8         8           8     8        8    8
   \  `-+-'  /       8         8           8      ooooo   8oooo
    `-__|__-'        8         8           8           8  8
        |            8     o   8           8     o     8  8
  ------+------       ooooo    8oooooo  ooo8ooo   ooooo   8

Welcome to GNU CLISP 2.49 (2010-07-07) <http://clisp.cons.org/>

Copyright (c) Bruno Haible, Michael Stoll 1992, 1993
Copyright (c) Bruno Haible, Marcus Daniels 1994-1997
Copyright (c) Bruno Haible, Pierpaolo Bernardi, Sam Steingold 1998
Copyright (c) Bruno Haible, Sam Steingold 1999-2000
Copyright (c) Sam Steingold, Bruno Haible 2001-2010

Type :h and hit Enter for context help.

[1]> (defun mycons (x y)
  (lambda (m) (m x y)))
MYCONS
[2]> (defun mycar (z)
  (z (lambda (p q) p)))
MYCAR
[3]> (defun mycdr (z)
  (z (lambda (p q) q)))
MYCDR
[4]> (mycar (mycons 1 (mycons 2 (mycons 3 4))))

*** - EVAL: undefined function Z
The following restarts are available:
USE-VALUE      :R1      Input a value to be used instead of (FDEFINITION 'Z).
RETRY          :R2      Retry
STORE-VALUE    :R3      Input a new value for (FDEFINITION 'Z).
ABORT          :R4      Abort main loop
Break 1 [5]>
[6]>


в связи с этим вопрос:

1) почему работает в Scheme и не работает в Lisp?
2) почему работает в Scheme? что такое (z) и откуда Scheme знает, что должно получиться, н̶е̶ ̶в̶ы̶ч̶и̶с̶л̶я̶я̶ ̶z̶?

EDIT z вычисляется. это унарная функция, которую возвращает cons и которая должна вызвать переданную ей car или cdr бинарную функцию, которая возвращает один из своих аргументов. как-то так:)
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: Lisp vs Scheme

Сообщение Crazy »

вроде в Lisp вызов lambda-функции делается через funcall

Desipere in loco
Спасибо сказали:
adav84
Сообщения: 41

Re: Lisp vs Scheme

Сообщение adav84 »

Crazy писал(а):
26.04.2011 08:15
вроде в Lisp вызов lambda-функции делается через funcall

хм, точно.

Код: Выделить всё

(defun mycons (x y)
  (lambda (m) (funcall m x y)))
(defun mycar (z)
  (funcall z (lambda (p q) p)))
(defun mycdr (z)
  (funcall z (lambda (p q) q)))

стормозил:)
но второй вопрос в силе - я что-то не допру, как это работает:)
Спасибо сказали:
adav84
Сообщения: 41

Re: Lisp vs Scheme

Сообщение adav84 »

Код: Выделить всё

<html>
<head>
<script type="text/javascript">
<!--
function cons(x,y){
  return function(m){ return m(x,y); };
}

function car(z){
  return z(function(p,q){ return p; });
}

function cdr(z){
  return z(function(p,q){ return q; });
}

alert(
car(cons(1,cons(2,cons(3,4))))+"\n"+
car(cdr(cons(1,cons(2,cons(3,4)))))+"\n"+
car(cdr(cdr(cons(1,cons(2,cons(3,4))))))+"\n"+
cdr(cdr(cdr(cons(1,cons(2,cons(3,4))))))+"\n"
);
-->
</script>
</head>
<body>
</body>
</html>


ох....
Спасибо сказали:
adav84
Сообщения: 41

Re: Lisp vs Scheme

Сообщение adav84 »

всё. понял.

Код: Выделить всё

alert((function(m) { return m(3,4); })(function(p,q){return p;}));

Спасибо сказали: