LINUX.ORG.RU

А какой язык умеет так?


0

5

Возврат нескольких значений из функции [псевдокод на С]:


(double, double, int) foo()
{
    double a = 10;
    double b = 15;
    int c = 20;
    
    return (a,b,c);
}

int main(int argc, char** argv)
{
    double x, y;
    int z;

    (x,y,z) = foo();
    
    return 0;
}

P.S. Как сделать подобное в Си я прекрасно знаю. Интересуют языки, которые могут сделать все именно так, как это описано в псевдокоде.

★★★★★

Последнее исправление: trex6 (всего исправлений: 1)

Ответ на: комментарий от jessey

> Возвращаем тапл - снова одно значение.

А питон умеет так:

Кури матчасть, return 'a', 'b', 'c' — возврат самого настоящего тапла.

>>> def ololo():
...     return 'a', 'b', 'c'
... 
>>> type(ololo())
<type 'tuple'>
PolarFox ★★★★★
()
Ответ на: комментарий от PolarFox

Кури матчасть, return 'a', 'b', 'c' — возврат самого настоящего тапла.

Посыпанного сахарком. Пусть распаковка этого тапла происходит неявно, но это ближе к псевдокоду ТС формально.

jessey
()

Scala. В точности как ты описал.

vertexua ★★★★★
()
Ответ на: комментарий от KRoN73

норма даже возврат переменного числа аргументов

За переменные стековые эффекты обычно по головке не гладят :)

buddhist ★★★★★
()
Ответ на: комментарий от KRoN73

А еще, принято считать, что в конкатенативных стековых языках все функции принимают один аргумент и возвращают один результат — стек.

buddhist ★★★★★
()
Ответ на: комментарий от KRoN73

extract(foo());

За такое убивать надо!

anonymous
()
Ответ на: комментарий от Deleted

На Форте — много пишут. Остальные (тот же Joy) больше для теоретических исследований.

buddhist ★★★★★
()

По идее, любой язык, где есть tuple.

pevzi ★★★★★
()
Ответ на: комментарий от buddhist

За переменные стековые эффекты обычно по головке не гладят :)

Здрасьте. Это норма ядра любой версии Форта. И переменное число аргументов и переменное число результатов. От ?DUP ( n — n n | 0 — 0 ) до OPEN-FILE ( addr u mode — -1 | handle 0 )

Собственно, последний вариант вообще часто бывает, чтобы при if ... then или throw стек не чистить.

KRoN73 ★★★★★
()
Ответ на: комментарий от buddhist

Я когда продумывал JBForth2 (так и не реализованный в итоге) то очень долго ломал голову, сохранить ли мне идеологическую совместимость с Фортом в плане переменного числа возвращаемых аргументов или отказаться, что сильно упрощало всякое выведение типов и т.п. :)



Но факт есть факт, в классическом Форте — это обычное дело :)

KRoN73 ★★★★★
()
Ответ на: комментарий от jessey

Извини, но ты не прав. В Python из функции возвращается как раз кортеж (тапл, тьюпл) объектов, а не несколько объектов. И это легко доказать.

Virtuos86 ★★★★★
()

OCaml ещё не назвали :)

# let f = fun x y -> x*y, x+y;;
val f : int -> int -> int * int = <fun>
# f 3 4;;
- : int * int = (12, 7)
invy ★★★★★
()
Ответ на: комментарий от buddhist

Ну это как парсящие и зависящие от состояния форт-машины слова :)

А вот от этого стали отказываться, чуть ли, не в 83-м стандарте :)

KRoN73 ★★★★★
()

Если речь именно о возврате нескольких значений, а не о возврате одного тупла/структуры - то любой ЯП с обязательным CPS. В этом случае возврат нескольких значений семантически эквивалентен вызову продолжения с несколькими аргументами, в чем нет ничего странного и сложного. Короче, надо курить в сторону scheme, больше нигде полноценной поддержки таких вещей, вроде бы, нет.

anonymous
()

В Octave (Matlab) можно даже узнать сколько параметров считывается и в зависимости от этого выдавать разные значения, например.

т.е.

a,b = f(x)

a,b,c,d = f(x)

может быть легальным кодом

anonymous
()

в плюсах можно создать класс в котором два дабла и инт. и егойный экземпляр возвращать.

или вобще структ объявить и возвращать его. тоже для плюсов сойдёт.

mmarkk
()
Ответ на: комментарий от Deleted

Паскаль умеет record (аналог сишного struct) в качестве типа возвращаемого значения функции. Годится ли такой подход в данном случае - спорный вопрос.

amomymous ★★★
()
Ответ на: комментарий от KRoN73

Из реально нужных state-smart слов я пока могу припомнить только «interpret/compile:»

buddhist ★★★★★
()

В общелиспе даже круче есть - values:

(defun foo ()
  (values 1 "oh dear"))

(+ (foo) 2) => 3

(format t "foo: ~a~%" (foo)) -> "foo: 1"

(multiple-value-bind (result comment)
    (foo)
  (format t "foo: ~a (~a)~%" result comment)) => "foo: 1 (oh dear)"

(apply #'format t "foo: ~a (~a)~%" (multiple-value-list (foo))) => "foo: 1 (oh dear)"

(format t "comment: ~a~%" (nth-value 1 (foo))) => "comment: oh dear"

mv ★★★★★
()
Ответ на: комментарий от yvv
aedeph@aedeph-laptop:~/tmp2$ cat tmp.f 
       program main
       integer x, y, z
       call abc(x,y,z)
       write(*,*) x,y,z
       end

       subroutine abc(x,y,z)
       integer x,y,z
       x=1
       y=2
       z=3
       end
aedeph@aedeph-laptop:~/tmp2$ f77 tmp.f -o tmp.out
   MAIN main:
   abc:
aedeph@aedeph-laptop:~/tmp2$ ./tmp.out 
 1 2 3
aedeph@aedeph-laptop:~/tmp2$ 
aedeph_ ★★
()
Ответ на: комментарий от aedeph_

Intent(out) - это несколько про другое.

Это означает, что компилятор выдаст ошибку, если внутри процедуры переменной не присвоено значение. В фортране 77 этого нет.

yvv ★★☆
()
Ответ на: комментарий от yvv
aedeph@aedeph-laptop:~/tmp2$ cat tmp.f
       program main
       integer x, y, z
       call abc(x,y,z)
       write(*,*) x,y,z
       end

       subroutine abc(x,y,z)
       integer, intent(out) :: x,y,z
       x=1
       y=2
     
       end
aedeph@aedeph-laptop:~/tmp2$ gfortran tmp.f -o tmp.out
aedeph@aedeph-laptop:~/tmp2$ ./tmp.out 
           1           2     2290224
aedeph_ ★★
()
Ответ на: комментарий от yvv

В действительности в стандарте написано совсем другое.

aedeph_ ★★
()
Ответ на: комментарий от Virtuos86

В Python из функции возвращается как раз кортеж

В питоне из функции возвращается все что угодно, но что то одно. В т.ч. может быть и кортеж;-)

AIv ★★★★★
()

Любой, поддерживающий кортежи.

Zenom ★★★
()
#!/usr/bin/perl -w

use strict;

sub foo {
    return (10, 15, 20);
}

my ($x, $y, $z) = &foo ();

Yay! А типы можно строго указывать в шестом перле, но он еще не готов.

IceAlchemist
()

Зачем? Ты язык выбираешь по шашечкам, а не по задачам?

anonymous
()
Ответ на: комментарий от AIv

Подловил :). Я ещё когда набирал, думал, подколет кто или нет. ЛОР меня не подвёл.

Virtuos86 ★★★★★
()
Ответ на: комментарий от pseudo-cat

ой, не то написал...

(defun f (a)
    (values a 'and 2 "is"  "three"))

(multiple-value-bind (a b c) (f "one")
    ...)
pseudo-cat ★★★
()

Интересуют языки

asm же

q11q11 ★★★★★
()

Перл уже советовали? Правда там типизация не жесткая.

DELIRIUM ☆☆☆☆☆
()
Ответ на: комментарий от Svoloch

Забоксенный инт уже не инт.

Это формальность. Не мешает же коробка нам значение возвращать

RedPossum ★★★★★
()

руби.

1.9.2p290 :003 > def ff; return 1,2,3 end; a, b, c = ff
 => [1, 2, 3]
kelyar ★★★★★
()

JavaScript. Который 1.8.

function fu() { return [1, 2, 3]; }
let [a, b, c] = fu(); // a = 1, b = 2, c = 3
let [, d, e] = fu(); // d = 2, e = 3
let [,,f] = fu(); // f = 3
let [g, h] = fu(); // g = 1, h = 2

anonymous
()

perl:

sub foo {
  my ($a, $b, $c);
  $a = 10;
  $b = 15;
  $c = 20;
  return ($a, $b, $c);
}

my ($x, $y, $z) = foo();
print $x, $y, $z;

Lua

function foo()
  a = 10
  b = 15
  c = 20
  return a, b, c
end
x, y, z = foo()
print (x, y, z)

AnDoR ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.